blob: 497ed9dec98633e77eeff0bdccd0c4b80690dbb9 [file] [log] [blame]
Tony-LunarG4c253372022-01-18 13:51:07 -07001/* Copyright (c) 2018-2022 The Khronos Group Inc.
2 * Copyright (c) 2018-2022 Valve Corporation
3 * Copyright (c) 2018-2022 LunarG, Inc.
Karl Schultz7b024b42018-08-30 16:18:18 -06004 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060017 * Author: Karl Schultz <karl@lunarg.com>
18 * Author: Tony Barbour <tony@lunarg.com>
Karl Schultz7b024b42018-08-30 16:18:18 -060019 */
20
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060021#pragma once
22
Tony-LunarGb5fae462020-03-05 12:43:25 -070023#include "gpu_utils.h"
Jeremy Gebben5160e032022-03-28 14:57:43 -060024
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060025class GpuAssisted;
Tony-LunarG0e564722019-03-19 16:09:14 -060026
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060027struct GpuAssistedDeviceMemoryBlock {
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060028 VkBuffer buffer;
Tony-LunarG0e564722019-03-19 16:09:14 -060029 VmaAllocation allocation;
Jeremy Gebbenf4816f72022-07-15 08:56:06 -060030 layer_data::unordered_map<uint32_t, const cvdescriptorset::DescriptorBinding*> update_at_submit;
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060031};
32
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060033struct GpuAssistedPreDrawResources {
sjfricke43b340c2022-08-04 22:18:38 +090034 VkDescriptorPool desc_pool = VK_NULL_HANDLE;
35 VkDescriptorSet desc_set = VK_NULL_HANDLE;
36 VkBuffer buffer = VK_NULL_HANDLE;
37 VkDeviceSize offset = 0;
38 uint32_t stride = 0;
39 VkDeviceSize buf_size = 0;
40 static const uint32_t push_constant_words = 4;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060041};
42
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060043struct GpuAssistedBufferInfo {
44 GpuAssistedDeviceMemoryBlock output_mem_block;
45 GpuAssistedDeviceMemoryBlock di_input_mem_block; // Descriptor Indexing input
46 GpuAssistedDeviceMemoryBlock bda_input_mem_block; // Buffer Device Address input
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060047 GpuAssistedPreDrawResources pre_draw_resources;
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060048 VkDescriptorSet desc_set;
49 VkDescriptorPool desc_pool;
Jason Macnak67407e72019-07-11 11:05:09 -070050 VkPipelineBindPoint pipeline_bind_point;
Tony-LunarG7de10e82020-11-24 11:31:55 -070051 CMD_TYPE cmd_type;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060052 GpuAssistedBufferInfo(GpuAssistedDeviceMemoryBlock output_mem_block, GpuAssistedDeviceMemoryBlock di_input_mem_block,
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060053 GpuAssistedDeviceMemoryBlock bda_input_mem_block, GpuAssistedPreDrawResources pre_draw_resources,
54 VkDescriptorSet desc_set, VkDescriptorPool desc_pool, VkPipelineBindPoint pipeline_bind_point,
55 CMD_TYPE cmd_type)
Jason Macnak67407e72019-07-11 11:05:09 -070056 : output_mem_block(output_mem_block),
Tony-LunarG8eb5a002019-07-25 16:49:00 -060057 di_input_mem_block(di_input_mem_block),
58 bda_input_mem_block(bda_input_mem_block),
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060059 pre_draw_resources(pre_draw_resources),
Jason Macnak67407e72019-07-11 11:05:09 -070060 desc_set(desc_set),
61 desc_pool(desc_pool),
Tony-LunarG7de10e82020-11-24 11:31:55 -070062 pipeline_bind_point(pipeline_bind_point),
63 cmd_type(cmd_type){};
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060064};
65
Tony-LunarG7de10e82020-11-24 11:31:55 -070066struct GpuVuid {
67 const char* uniform_access_oob = kVUIDUndefined;
68 const char* storage_access_oob = kVUIDUndefined;
Tony-LunarG64aeaf72021-04-14 11:13:35 -060069 const char* count_exceeds_bufsize_1 = kVUIDUndefined;
70 const char* count_exceeds_bufsize = kVUIDUndefined;
Tony-LunarG1a7c9f92021-04-29 16:04:42 -060071 const char* count_exceeds_device_limit = kVUIDUndefined;
Tony-LunarG3723a3a2021-05-04 14:52:39 -060072 const char* first_instance_not_zero = kVUIDUndefined;
Tony-LunarG7de10e82020-11-24 11:31:55 -070073};
74
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060075struct GpuAssistedAccelerationStructureBuildValidationBufferInfo {
Jason Macnak83cfd582019-07-31 10:14:24 -070076 // The acceleration structure that is being built.
77 VkAccelerationStructureNV acceleration_structure = VK_NULL_HANDLE;
78
79 // The descriptor pool and descriptor set being used to validate a given build.
80 VkDescriptorPool descriptor_pool = VK_NULL_HANDLE;
81 VkDescriptorSet descriptor_set = VK_NULL_HANDLE;
82
83 // The storage buffer used by the validating compute shader whichcontains info about
84 // the valid handles and which is written to communicate found invalid handles.
sjfricke43b340c2022-08-04 22:18:38 +090085 VkBuffer buffer = VK_NULL_HANDLE;
86 VmaAllocation buffer_allocation = VK_NULL_HANDLE;
Jason Macnak83cfd582019-07-31 10:14:24 -070087};
88
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060089struct GpuAssistedAccelerationStructureBuildValidationState {
Jason Macnak83cfd582019-07-31 10:14:24 -070090 bool initialized = false;
91
92 VkPipeline pipeline = VK_NULL_HANDLE;
93 VkPipelineLayout pipeline_layout = VK_NULL_HANDLE;
94
95 VkAccelerationStructureNV replacement_as = VK_NULL_HANDLE;
96 VmaAllocation replacement_as_allocation = VK_NULL_HANDLE;
97 uint64_t replacement_as_handle = 0;
98
Jason Macnak83cfd582019-07-31 10:14:24 -070099};
100
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600101struct GpuAssistedPreDrawValidationState {
102 bool globals_created = false;
sjfricke43b340c2022-08-04 22:18:38 +0900103 VkShaderModule shader_module = VK_NULL_HANDLE;
104 VkDescriptorSetLayout ds_layout = VK_NULL_HANDLE;
105 VkPipelineLayout pipeline_layout = VK_NULL_HANDLE;
Jeremy Gebbenbba39212022-03-29 16:39:06 -0600106 vl_concurrent_unordered_map <VkRenderPass, VkPipeline> renderpass_to_pipeline;
sjfricke43b340c2022-08-04 22:18:38 +0900107
108 void Destroy(VkDevice device);
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600109};
110
111struct GpuAssistedCmdDrawIndirectState {
112 VkBuffer buffer;
113 VkDeviceSize offset;
sjfricke43b340c2022-08-04 22:18:38 +0900114 uint32_t draw_count;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600115 uint32_t stride;
116 VkBuffer count_buffer;
117 VkDeviceSize count_buffer_offset;
118};
119
Jeremy Gebben135550d2022-03-21 07:15:07 -0600120namespace gpuav_state {
Jeremy Gebben5ca80b32022-04-11 10:58:39 -0600121class CommandBuffer : public gpu_utils_state::CommandBuffer {
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600122 public:
123 std::vector<GpuAssistedBufferInfo> gpuav_buffer_list;
124 std::vector<GpuAssistedAccelerationStructureBuildValidationBufferInfo> as_validation_buffers;
125
Jeremy Gebben135550d2022-03-21 07:15:07 -0600126 CommandBuffer(GpuAssisted* ga, VkCommandBuffer cb, const VkCommandBufferAllocateInfo* pCreateInfo,
127 const COMMAND_POOL_STATE* pool);
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600128
Jeremy Gebben5ca80b32022-04-11 10:58:39 -0600129 bool NeedsProcessing() const final { return !gpuav_buffer_list.empty() || hasBuildAccelerationStructureCmd; }
130
131 void Process(VkQueue queue) final;
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600132 void Reset() final;
Jeremy Gebben5ca80b32022-04-11 10:58:39 -0600133
134 private:
135 void ProcessAccelerationStructure(VkQueue queue);
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600136};
Jeremy Gebben135550d2022-03-21 07:15:07 -0600137}; // namespace gpuav_state
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600138
Jeremy Gebben135550d2022-03-21 07:15:07 -0600139VALSTATETRACK_DERIVED_STATE_OBJECT(VkCommandBuffer, gpuav_state::CommandBuffer, CMD_BUFFER_STATE);
Jeremy Gebben78684b12022-02-23 17:31:56 -0700140
Jeremy Gebben5160e032022-03-28 14:57:43 -0600141class GpuAssisted : public GpuAssistedBase {
Tony-LunarG1dce2392019-10-23 16:49:29 -0600142 public:
Jeremy Gebben5160e032022-03-28 14:57:43 -0600143 GpuAssisted() {
144 setup_vuid = "UNASSIGNED-GPU-Assisted-Validation";
145 container_type = LayerObjectTypeGpuAssisted;
146 desired_features.vertexPipelineStoresAndAtomics = true;
147 desired_features.fragmentStoresAndAtomics = true;
148 desired_features.shaderInt64 = true;
149 }
Mark Lobodzinski0dcb87d2020-03-30 16:09:24 -0600150
Tony-LunarG5c38b182020-06-10 16:15:32 -0600151 bool CheckForDescriptorIndexing(DeviceFeatures enabled_features) const;
Jeremy Gebben36a3b832022-03-23 10:54:18 -0600152 void CreateDevice(const VkDeviceCreateInfo* pCreateInfo) override;
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700153 void PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks* pAllocator) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600154 void PostCallRecordBindAccelerationStructureMemoryNV(VkDevice device, uint32_t bindInfoCount,
155 const VkBindAccelerationStructureMemoryInfoNV* pBindInfos,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700156 VkResult result) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600157 void PreCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700158 VkBuffer* pBuffer, void* cb_state_data) override;
Jeremy Gebben21782012022-03-15 16:23:27 -0600159 void CreateAccelerationStructureBuildValidationState();
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600160 void DestroyAccelerationStructureBuildValidationState();
161 void PreCallRecordCmdBuildAccelerationStructureNV(VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV* pInfo,
162 VkBuffer instanceData, VkDeviceSize instanceOffset, VkBool32 update,
163 VkAccelerationStructureNV dst, VkAccelerationStructureNV src,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700164 VkBuffer scratch, VkDeviceSize scratchOffset) override;
Jeremy Gebben135550d2022-03-21 07:15:07 -0600165 void ProcessAccelerationStructureBuildValidationBuffer(VkQueue queue, gpuav_state::CommandBuffer* cb_node);
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600166 void PreCallRecordDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) override;
sfricke-samsung7fac88a2022-01-26 11:44:22 -0800167 bool InstrumentShader(const VkShaderModuleCreateInfo* pCreateInfo, std::vector<uint32_t>& new_pgm, uint32_t* unique_shader_id);
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600168 void PreCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo,
169 const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700170 void* csm_state_data) override;
Tony-LunarG7de10e82020-11-24 11:31:55 -0700171 void AnalyzeAndGenerateMessages(VkCommandBuffer command_buffer, VkQueue queue, GpuAssistedBufferInfo &buffer_info,
172 uint32_t operation_index, uint32_t* const debug_output_buffer);
sfricke-samsung7fac88a2022-01-26 11:44:22 -0800173
Jeremy Gebbenf4816f72022-07-15 08:56:06 -0600174 void SetBindingState(uint32_t* data, uint32_t index, const cvdescriptorset::DescriptorBinding* binding);
Jeremy Gebben135550d2022-03-21 07:15:07 -0600175 void UpdateInstrumentationBuffer(gpuav_state::CommandBuffer* cb_node);
Tony-LunarG7de10e82020-11-24 11:31:55 -0700176 const GpuVuid& GetGpuVuid(CMD_TYPE cmd_type) const;
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700177 void PreCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence) override;
Jeremy Gebbena3705f42021-01-19 16:47:43 -0700178 void PreCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR* pSubmits,
179 VkFence fence) override;
Tony-LunarG26fe2842021-11-16 14:07:59 -0700180 void PreCallRecordQueueSubmit2(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2* pSubmits, VkFence fence) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600181 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700182 uint32_t firstInstance) override;
Tony-LunarG745150c2021-07-02 15:07:31 -0600183 void PreCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount, const VkMultiDrawInfoEXT* pVertexInfo,
184 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600185 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700186 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
Tony-LunarG745150c2021-07-02 15:07:31 -0600187 void PreCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
188 const VkMultiDrawIndexedInfoEXT* pIndexInfo, uint32_t instanceCount,
189 uint32_t firstInstance, uint32_t stride, const int32_t* pVertexOffset) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600190 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700191 uint32_t stride) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600192 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700193 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600194 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
195 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700196 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600197 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
198 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700199 uint32_t stride) override;
Tony-LunarG54176fb2020-12-02 10:47:22 -0700200 void PreCallRecordCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanceCount, uint32_t firstInstance,
201 VkBuffer counterBuffer, VkDeviceSize counterBufferOffset, uint32_t counterOffset,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700202 uint32_t vertexStride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600203 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
204 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700205 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600206 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
207 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700208 uint32_t stride) override;
209 void PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600210 void PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700211 uint32_t drawCount, uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600212 void PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
213 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700214 uint32_t stride) override;
215 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
216 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
Tony-LunarGd13f9b52020-09-08 15:45:45 -0600217 void PreCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700218 uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) override;
Tony-LunarG52c8c602020-09-10 16:29:56 -0600219 void PreCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700220 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
221 uint32_t groupCountZ) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600222 void PreCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
223 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
224 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
225 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
226 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
227 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700228 uint32_t width, uint32_t height, uint32_t depth) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600229 void PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
230 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
231 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
232 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
233 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
234 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700235 uint32_t width, uint32_t height, uint32_t depth) override;
sourav parmarcd5fb182020-07-17 12:58:44 -0700236 void PreCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
237 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
238 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
239 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
240 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, uint32_t width,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700241 uint32_t height, uint32_t depth) override;
sourav parmarcd5fb182020-07-17 12:58:44 -0700242 void PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
243 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
244 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
245 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
246 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, uint32_t width,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700247 uint32_t height, uint32_t depth) override;
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500248 void PreCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700249 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
250 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
251 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
Shannon McPherson54e1f892020-11-27 11:04:19 -0700252 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700253 VkDeviceAddress indirectDeviceAddress) override;
sfricke-samsungf91881c2022-03-31 01:12:00 -0500254 void PreCallRecordCmdTraceRaysIndirect2KHR(VkCommandBuffer commandBuffer, VkDeviceAddress indirectDeviceAddress) override;
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500255 void PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700256 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
257 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
258 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
Shannon McPherson54e1f892020-11-27 11:04:19 -0700259 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700260 VkDeviceAddress indirectDeviceAddress) override;
sjfricke43b340c2022-08-04 22:18:38 +0900261 void AllocateValidationResources(const VkCommandBuffer cmd_buffer, const VkPipelineBindPoint bind_point, CMD_TYPE cmd,
262 const GpuAssistedCmdDrawIndirectState* cdi_state = nullptr);
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600263 void AllocatePreDrawValidationResources(GpuAssistedDeviceMemoryBlock output_block, GpuAssistedPreDrawResources& resources,
sjfricke43b340c2022-08-04 22:18:38 +0900264 const LAST_BOUND_STATE& state, VkPipeline* pPipeline,
265 const GpuAssistedCmdDrawIndirectState* cdi_state);
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600266 void PostCallRecordGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700267 VkPhysicalDeviceProperties* pPhysicalDeviceProperties) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600268 void PostCallRecordGetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700269 VkPhysicalDeviceProperties2* pPhysicalDeviceProperties2) override;
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600270
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600271 std::shared_ptr<CMD_BUFFER_STATE> CreateCmdBufferState(VkCommandBuffer cb, const VkCommandBufferAllocateInfo* create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -0600272 const COMMAND_POOL_STATE* pool) final;
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600273
274 void DestroyBuffer(GpuAssistedBufferInfo& buffer_info);
275 void DestroyBuffer(GpuAssistedAccelerationStructureBuildValidationBufferInfo& buffer_info);
Jeremy Gebben14499e82022-03-17 11:03:10 -0600276
277 private:
278 void PreRecordCommandBuffer(VkCommandBuffer command_buffer);
Jeremy Gebbenbba39212022-03-29 16:39:06 -0600279 VkPipeline GetValidationPipeline(VkRenderPass rp);
Jeremy Gebben14499e82022-03-17 11:03:10 -0600280
Jeremy Gebben14499e82022-03-17 11:03:10 -0600281 VkBool32 shaderInt64;
Jeremy Gebben14499e82022-03-17 11:03:10 -0600282 bool buffer_oob_enabled;
283 bool validate_draw_indirect;
Tony-LunarG20d18a72022-04-19 11:01:47 -0600284 VmaPool output_buffer_pool = VK_NULL_HANDLE;
Jeremy Gebben14499e82022-03-17 11:03:10 -0600285 GpuAssistedAccelerationStructureBuildValidationState acceleration_structure_validation_state;
286 GpuAssistedPreDrawValidationState pre_draw_validation_state;
287
Jeremy Gebben14499e82022-03-17 11:03:10 -0600288 bool descriptor_indexing = false;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600289};