blob: 2b5b8aa7a7f0df3eeac794eb3736251c81cf609d [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 Gebbencbf22862021-03-03 12:01:22 -070030 layer_data::unordered_map<uint32_t, const cvdescriptorset::Descriptor*> update_at_submit;
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060031};
32
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060033struct GpuAssistedPreDrawResources {
34 VkDescriptorPool desc_pool;
35 VkDescriptorSet desc_set;
Tony-LunarGf0d4e2b2021-04-14 11:52:28 -060036 VkBuffer buffer;
37 VkDeviceSize offset;
38 uint32_t stride;
39 VkDeviceSize buf_size;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060040};
41
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060042struct GpuAssistedBufferInfo {
43 GpuAssistedDeviceMemoryBlock output_mem_block;
44 GpuAssistedDeviceMemoryBlock di_input_mem_block; // Descriptor Indexing input
45 GpuAssistedDeviceMemoryBlock bda_input_mem_block; // Buffer Device Address input
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060046 GpuAssistedPreDrawResources pre_draw_resources;
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060047 VkDescriptorSet desc_set;
48 VkDescriptorPool desc_pool;
Jason Macnak67407e72019-07-11 11:05:09 -070049 VkPipelineBindPoint pipeline_bind_point;
Tony-LunarG7de10e82020-11-24 11:31:55 -070050 CMD_TYPE cmd_type;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060051 GpuAssistedBufferInfo(GpuAssistedDeviceMemoryBlock output_mem_block, GpuAssistedDeviceMemoryBlock di_input_mem_block,
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060052 GpuAssistedDeviceMemoryBlock bda_input_mem_block, GpuAssistedPreDrawResources pre_draw_resources,
53 VkDescriptorSet desc_set, VkDescriptorPool desc_pool, VkPipelineBindPoint pipeline_bind_point,
54 CMD_TYPE cmd_type)
Jason Macnak67407e72019-07-11 11:05:09 -070055 : output_mem_block(output_mem_block),
Tony-LunarG8eb5a002019-07-25 16:49:00 -060056 di_input_mem_block(di_input_mem_block),
57 bda_input_mem_block(bda_input_mem_block),
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060058 pre_draw_resources(pre_draw_resources),
Jason Macnak67407e72019-07-11 11:05:09 -070059 desc_set(desc_set),
60 desc_pool(desc_pool),
Tony-LunarG7de10e82020-11-24 11:31:55 -070061 pipeline_bind_point(pipeline_bind_point),
62 cmd_type(cmd_type){};
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060063};
64
Tony-LunarG7de10e82020-11-24 11:31:55 -070065struct GpuVuid {
66 const char* uniform_access_oob = kVUIDUndefined;
67 const char* storage_access_oob = kVUIDUndefined;
Tony-LunarG64aeaf72021-04-14 11:13:35 -060068 const char* count_exceeds_bufsize_1 = kVUIDUndefined;
69 const char* count_exceeds_bufsize = kVUIDUndefined;
Tony-LunarG1a7c9f92021-04-29 16:04:42 -060070 const char* count_exceeds_device_limit = kVUIDUndefined;
Tony-LunarG3723a3a2021-05-04 14:52:39 -060071 const char* first_instance_not_zero = kVUIDUndefined;
Tony-LunarG7de10e82020-11-24 11:31:55 -070072};
73
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060074struct GpuAssistedAccelerationStructureBuildValidationBufferInfo {
Jason Macnak83cfd582019-07-31 10:14:24 -070075 // The acceleration structure that is being built.
76 VkAccelerationStructureNV acceleration_structure = VK_NULL_HANDLE;
77
78 // The descriptor pool and descriptor set being used to validate a given build.
79 VkDescriptorPool descriptor_pool = VK_NULL_HANDLE;
80 VkDescriptorSet descriptor_set = VK_NULL_HANDLE;
81
82 // The storage buffer used by the validating compute shader whichcontains info about
83 // the valid handles and which is written to communicate found invalid handles.
84 VkBuffer validation_buffer = VK_NULL_HANDLE;
85 VmaAllocation validation_buffer_allocation = VK_NULL_HANDLE;
86};
87
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060088struct GpuAssistedAccelerationStructureBuildValidationState {
Jason Macnak83cfd582019-07-31 10:14:24 -070089 bool initialized = false;
90
91 VkPipeline pipeline = VK_NULL_HANDLE;
92 VkPipelineLayout pipeline_layout = VK_NULL_HANDLE;
93
94 VkAccelerationStructureNV replacement_as = VK_NULL_HANDLE;
95 VmaAllocation replacement_as_allocation = VK_NULL_HANDLE;
96 uint64_t replacement_as_handle = 0;
97
Jason Macnak83cfd582019-07-31 10:14:24 -070098};
99
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600100struct GpuAssistedPreDrawValidationState {
101 bool globals_created = false;
102 VkShaderModule validation_shader_module = VK_NULL_HANDLE;
103 VkDescriptorSetLayout validation_ds_layout = VK_NULL_HANDLE;
104 VkPipelineLayout validation_pipeline_layout = VK_NULL_HANDLE;
Jeremy Gebbenbba39212022-03-29 16:39:06 -0600105 vl_concurrent_unordered_map <VkRenderPass, VkPipeline> renderpass_to_pipeline;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600106};
107
108struct GpuAssistedCmdDrawIndirectState {
109 VkBuffer buffer;
110 VkDeviceSize offset;
Tony-LunarG3723a3a2021-05-04 14:52:39 -0600111 uint32_t drawCount;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600112 uint32_t stride;
113 VkBuffer count_buffer;
114 VkDeviceSize count_buffer_offset;
115};
116
Jeremy Gebben135550d2022-03-21 07:15:07 -0600117namespace gpuav_state {
Jeremy Gebben5ca80b32022-04-11 10:58:39 -0600118class CommandBuffer : public gpu_utils_state::CommandBuffer {
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600119 public:
120 std::vector<GpuAssistedBufferInfo> gpuav_buffer_list;
121 std::vector<GpuAssistedAccelerationStructureBuildValidationBufferInfo> as_validation_buffers;
122
Jeremy Gebben135550d2022-03-21 07:15:07 -0600123 CommandBuffer(GpuAssisted* ga, VkCommandBuffer cb, const VkCommandBufferAllocateInfo* pCreateInfo,
124 const COMMAND_POOL_STATE* pool);
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600125
Jeremy Gebben5ca80b32022-04-11 10:58:39 -0600126 bool NeedsProcessing() const final { return !gpuav_buffer_list.empty() || hasBuildAccelerationStructureCmd; }
127
128 void Process(VkQueue queue) final;
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600129 void Reset() final;
Jeremy Gebben5ca80b32022-04-11 10:58:39 -0600130
131 private:
132 void ProcessAccelerationStructure(VkQueue queue);
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600133};
Jeremy Gebben135550d2022-03-21 07:15:07 -0600134}; // namespace gpuav_state
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600135
Jeremy Gebben135550d2022-03-21 07:15:07 -0600136VALSTATETRACK_DERIVED_STATE_OBJECT(VkCommandBuffer, gpuav_state::CommandBuffer, CMD_BUFFER_STATE);
Jeremy Gebben78684b12022-02-23 17:31:56 -0700137
Jeremy Gebben5160e032022-03-28 14:57:43 -0600138class GpuAssisted : public GpuAssistedBase {
Tony-LunarG1dce2392019-10-23 16:49:29 -0600139 public:
Jeremy Gebben5160e032022-03-28 14:57:43 -0600140 GpuAssisted() {
141 setup_vuid = "UNASSIGNED-GPU-Assisted-Validation";
142 container_type = LayerObjectTypeGpuAssisted;
143 desired_features.vertexPipelineStoresAndAtomics = true;
144 desired_features.fragmentStoresAndAtomics = true;
145 desired_features.shaderInt64 = true;
146 }
Mark Lobodzinski0dcb87d2020-03-30 16:09:24 -0600147
Tony-LunarG5c38b182020-06-10 16:15:32 -0600148 bool CheckForDescriptorIndexing(DeviceFeatures enabled_features) const;
Jeremy Gebben36a3b832022-03-23 10:54:18 -0600149 void CreateDevice(const VkDeviceCreateInfo* pCreateInfo) override;
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700150 void PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks* pAllocator) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600151 void PostCallRecordBindAccelerationStructureMemoryNV(VkDevice device, uint32_t bindInfoCount,
152 const VkBindAccelerationStructureMemoryInfoNV* pBindInfos,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700153 VkResult result) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600154 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents,
155 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
156 uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers,
157 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700158 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) const override;
Jeremy Gebbena3705f42021-01-19 16:47:43 -0700159 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents,
160 const VkDependencyInfoKHR* pDependencyInfos) const override;
Tony-LunarG1364cf52021-11-17 16:10:11 -0700161 bool PreCallValidateCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents,
162 const VkDependencyInfo* pDependencyInfos) const override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600163 void PreCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700164 VkBuffer* pBuffer, void* cb_state_data) override;
Jeremy Gebben21782012022-03-15 16:23:27 -0600165 void CreateAccelerationStructureBuildValidationState();
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600166 void DestroyAccelerationStructureBuildValidationState();
167 void PreCallRecordCmdBuildAccelerationStructureNV(VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV* pInfo,
168 VkBuffer instanceData, VkDeviceSize instanceOffset, VkBool32 update,
169 VkAccelerationStructureNV dst, VkAccelerationStructureNV src,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700170 VkBuffer scratch, VkDeviceSize scratchOffset) override;
Jeremy Gebben135550d2022-03-21 07:15:07 -0600171 void ProcessAccelerationStructureBuildValidationBuffer(VkQueue queue, gpuav_state::CommandBuffer* cb_node);
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600172 void PreCallRecordDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) override;
sfricke-samsung7fac88a2022-01-26 11:44:22 -0800173 bool InstrumentShader(const VkShaderModuleCreateInfo* pCreateInfo, std::vector<uint32_t>& new_pgm, uint32_t* unique_shader_id);
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600174 void PreCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo,
175 const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700176 void* csm_state_data) override;
Tony-LunarG7de10e82020-11-24 11:31:55 -0700177 void AnalyzeAndGenerateMessages(VkCommandBuffer command_buffer, VkQueue queue, GpuAssistedBufferInfo &buffer_info,
178 uint32_t operation_index, uint32_t* const debug_output_buffer);
sfricke-samsung7fac88a2022-01-26 11:44:22 -0800179
Tony-LunarGc28e28a2020-08-14 10:37:48 -0600180 void SetDescriptorInitialized(uint32_t* pData, uint32_t index, const cvdescriptorset::Descriptor* descriptor);
Jeremy Gebben135550d2022-03-21 07:15:07 -0600181 void UpdateInstrumentationBuffer(gpuav_state::CommandBuffer* cb_node);
Tony-LunarG7de10e82020-11-24 11:31:55 -0700182 const GpuVuid& GetGpuVuid(CMD_TYPE cmd_type) const;
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700183 void PreCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence) override;
Jeremy Gebbena3705f42021-01-19 16:47:43 -0700184 void PreCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR* pSubmits,
185 VkFence fence) override;
Tony-LunarG26fe2842021-11-16 14:07:59 -0700186 void PreCallRecordQueueSubmit2(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2* pSubmits, VkFence fence) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600187 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700188 uint32_t firstInstance) override;
Tony-LunarG745150c2021-07-02 15:07:31 -0600189 void PreCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount, const VkMultiDrawInfoEXT* pVertexInfo,
190 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600191 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700192 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
Tony-LunarG745150c2021-07-02 15:07:31 -0600193 void PreCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
194 const VkMultiDrawIndexedInfoEXT* pIndexInfo, uint32_t instanceCount,
195 uint32_t firstInstance, uint32_t stride, const int32_t* pVertexOffset) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600196 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700197 uint32_t stride) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600198 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700199 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600200 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
201 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700202 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600203 void PreCallRecordCmdDrawIndirectCount(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-LunarG54176fb2020-12-02 10:47:22 -0700206 void PreCallRecordCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanceCount, uint32_t firstInstance,
207 VkBuffer counterBuffer, VkDeviceSize counterBufferOffset, uint32_t counterOffset,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700208 uint32_t vertexStride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600209 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
210 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700211 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600212 void PreCallRecordCmdDrawIndexedIndirectCount(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 PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600216 void PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700217 uint32_t drawCount, uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600218 void PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
219 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700220 uint32_t stride) override;
221 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
222 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
Tony-LunarGd13f9b52020-09-08 15:45:45 -0600223 void PreCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700224 uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) override;
Tony-LunarG52c8c602020-09-10 16:29:56 -0600225 void PreCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700226 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
227 uint32_t groupCountZ) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600228 void PreCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
229 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
230 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
231 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
232 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
233 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700234 uint32_t width, uint32_t height, uint32_t depth) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600235 void PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
236 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
237 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
238 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
239 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
240 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700241 uint32_t width, uint32_t height, uint32_t depth) override;
sourav parmarcd5fb182020-07-17 12:58:44 -0700242 void PreCallRecordCmdTraceRaysKHR(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;
sourav parmarcd5fb182020-07-17 12:58:44 -0700248 void PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
249 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
250 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
251 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
252 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, uint32_t width,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700253 uint32_t height, uint32_t depth) override;
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500254 void PreCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700255 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
256 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
257 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
Shannon McPherson54e1f892020-11-27 11:04:19 -0700258 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700259 VkDeviceAddress indirectDeviceAddress) override;
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500260 void PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700261 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
262 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
263 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
Shannon McPherson54e1f892020-11-27 11:04:19 -0700264 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700265 VkDeviceAddress indirectDeviceAddress) override;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600266 void AllocateValidationResources(const VkCommandBuffer cmd_buffer, const VkPipelineBindPoint bind_point, CMD_TYPE cmd, const GpuAssistedCmdDrawIndirectState *cdic_state = nullptr);
267 void AllocatePreDrawValidationResources(GpuAssistedDeviceMemoryBlock output_block, GpuAssistedPreDrawResources& resources,
268 const LAST_BOUND_STATE& state, VkPipeline *pPipeline, const GpuAssistedCmdDrawIndirectState *cdic_state);
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600269 void PostCallRecordGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700270 VkPhysicalDeviceProperties* pPhysicalDeviceProperties) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600271 void PostCallRecordGetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700272 VkPhysicalDeviceProperties2* pPhysicalDeviceProperties2) override;
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600273
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600274 std::shared_ptr<CMD_BUFFER_STATE> CreateCmdBufferState(VkCommandBuffer cb, const VkCommandBufferAllocateInfo* create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -0600275 const COMMAND_POOL_STATE* pool) final;
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600276
277 void DestroyBuffer(GpuAssistedBufferInfo& buffer_info);
278 void DestroyBuffer(GpuAssistedAccelerationStructureBuildValidationBufferInfo& buffer_info);
Jeremy Gebben14499e82022-03-17 11:03:10 -0600279
280 private:
281 void PreRecordCommandBuffer(VkCommandBuffer command_buffer);
Jeremy Gebbenbba39212022-03-29 16:39:06 -0600282 VkPipeline GetValidationPipeline(VkRenderPass rp);
Jeremy Gebben14499e82022-03-17 11:03:10 -0600283
Jeremy Gebben14499e82022-03-17 11:03:10 -0600284 VkBool32 shaderInt64;
Jeremy Gebben14499e82022-03-17 11:03:10 -0600285 bool buffer_oob_enabled;
286 bool validate_draw_indirect;
Tony-LunarG20d18a72022-04-19 11:01:47 -0600287 VmaPool output_buffer_pool = VK_NULL_HANDLE;
Jeremy Gebben14499e82022-03-17 11:03:10 -0600288 GpuAssistedAccelerationStructureBuildValidationState acceleration_structure_validation_state;
289 GpuAssistedPreDrawValidationState pre_draw_validation_state;
290
Jeremy Gebben14499e82022-03-17 11:03:10 -0600291 bool descriptor_indexing = false;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600292};