blob: d79fc26659de052dbc537e365053a72c2e1ae008 [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
23#include "chassis.h"
24#include "state_tracker.h"
Tony-LunarG0e564722019-03-19 16:09:14 -060025#include "vk_mem_alloc.h"
Tony-LunarGb5fae462020-03-05 12:43:25 -070026#include "gpu_utils.h"
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060027class GpuAssisted;
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -060028class CMD_BUFFER_STATE_GPUAV;
Tony-LunarG0e564722019-03-19 16:09:14 -060029
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060030struct GpuAssistedDeviceMemoryBlock {
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060031 VkBuffer buffer;
Tony-LunarG0e564722019-03-19 16:09:14 -060032 VmaAllocation allocation;
Jeremy Gebbencbf22862021-03-03 12:01:22 -070033 layer_data::unordered_map<uint32_t, const cvdescriptorset::Descriptor*> update_at_submit;
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060034};
35
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060036struct GpuAssistedPreDrawResources {
37 VkDescriptorPool desc_pool;
38 VkDescriptorSet desc_set;
Tony-LunarGf0d4e2b2021-04-14 11:52:28 -060039 VkBuffer buffer;
40 VkDeviceSize offset;
41 uint32_t stride;
42 VkDeviceSize buf_size;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060043};
44
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060045struct GpuAssistedBufferInfo {
46 GpuAssistedDeviceMemoryBlock output_mem_block;
47 GpuAssistedDeviceMemoryBlock di_input_mem_block; // Descriptor Indexing input
48 GpuAssistedDeviceMemoryBlock bda_input_mem_block; // Buffer Device Address input
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060049 GpuAssistedPreDrawResources pre_draw_resources;
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060050 VkDescriptorSet desc_set;
51 VkDescriptorPool desc_pool;
Jason Macnak67407e72019-07-11 11:05:09 -070052 VkPipelineBindPoint pipeline_bind_point;
Tony-LunarG7de10e82020-11-24 11:31:55 -070053 CMD_TYPE cmd_type;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060054 GpuAssistedBufferInfo(GpuAssistedDeviceMemoryBlock output_mem_block, GpuAssistedDeviceMemoryBlock di_input_mem_block,
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060055 GpuAssistedDeviceMemoryBlock bda_input_mem_block, GpuAssistedPreDrawResources pre_draw_resources,
56 VkDescriptorSet desc_set, VkDescriptorPool desc_pool, VkPipelineBindPoint pipeline_bind_point,
57 CMD_TYPE cmd_type)
Jason Macnak67407e72019-07-11 11:05:09 -070058 : output_mem_block(output_mem_block),
Tony-LunarG8eb5a002019-07-25 16:49:00 -060059 di_input_mem_block(di_input_mem_block),
60 bda_input_mem_block(bda_input_mem_block),
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060061 pre_draw_resources(pre_draw_resources),
Jason Macnak67407e72019-07-11 11:05:09 -070062 desc_set(desc_set),
63 desc_pool(desc_pool),
Tony-LunarG7de10e82020-11-24 11:31:55 -070064 pipeline_bind_point(pipeline_bind_point),
65 cmd_type(cmd_type){};
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060066};
67
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060068struct GpuAssistedShaderTracker {
69 VkPipeline pipeline;
70 VkShaderModule shader_module;
sfricke-samsung7fac88a2022-01-26 11:44:22 -080071 std::vector<uint32_t> pgm;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060072};
73
Tony-LunarG7de10e82020-11-24 11:31:55 -070074struct GpuVuid {
75 const char* uniform_access_oob = kVUIDUndefined;
76 const char* storage_access_oob = kVUIDUndefined;
Tony-LunarG64aeaf72021-04-14 11:13:35 -060077 const char* count_exceeds_bufsize_1 = kVUIDUndefined;
78 const char* count_exceeds_bufsize = kVUIDUndefined;
Tony-LunarG1a7c9f92021-04-29 16:04:42 -060079 const char* count_exceeds_device_limit = kVUIDUndefined;
Tony-LunarG3723a3a2021-05-04 14:52:39 -060080 const char* first_instance_not_zero = kVUIDUndefined;
Tony-LunarG7de10e82020-11-24 11:31:55 -070081};
82
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060083struct GpuAssistedAccelerationStructureBuildValidationBufferInfo {
Jason Macnak83cfd582019-07-31 10:14:24 -070084 // The acceleration structure that is being built.
85 VkAccelerationStructureNV acceleration_structure = VK_NULL_HANDLE;
86
87 // The descriptor pool and descriptor set being used to validate a given build.
88 VkDescriptorPool descriptor_pool = VK_NULL_HANDLE;
89 VkDescriptorSet descriptor_set = VK_NULL_HANDLE;
90
91 // The storage buffer used by the validating compute shader whichcontains info about
92 // the valid handles and which is written to communicate found invalid handles.
93 VkBuffer validation_buffer = VK_NULL_HANDLE;
94 VmaAllocation validation_buffer_allocation = VK_NULL_HANDLE;
95};
96
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060097struct GpuAssistedAccelerationStructureBuildValidationState {
Jason Macnak83cfd582019-07-31 10:14:24 -070098 bool initialized = false;
99
100 VkPipeline pipeline = VK_NULL_HANDLE;
101 VkPipelineLayout pipeline_layout = VK_NULL_HANDLE;
102
103 VkAccelerationStructureNV replacement_as = VK_NULL_HANDLE;
104 VmaAllocation replacement_as_allocation = VK_NULL_HANDLE;
105 uint64_t replacement_as_handle = 0;
106
Jason Macnak83cfd582019-07-31 10:14:24 -0700107};
108
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600109struct GpuAssistedPreDrawValidationState {
110 bool globals_created = false;
111 VkShaderModule validation_shader_module = VK_NULL_HANDLE;
112 VkDescriptorSetLayout validation_ds_layout = VK_NULL_HANDLE;
113 VkPipelineLayout validation_pipeline_layout = VK_NULL_HANDLE;
Tony-LunarG463bae32022-02-25 09:31:17 -0700114 VkPipeline dyn_rendering_pipeline = VK_NULL_HANDLE;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600115 layer_data::unordered_map <VkRenderPass, VkPipeline> renderpass_to_pipeline;
116};
117
118struct GpuAssistedCmdDrawIndirectState {
119 VkBuffer buffer;
120 VkDeviceSize offset;
Tony-LunarG3723a3a2021-05-04 14:52:39 -0600121 uint32_t drawCount;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600122 uint32_t stride;
123 VkBuffer count_buffer;
124 VkDeviceSize count_buffer_offset;
125};
126
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600127class CMD_BUFFER_STATE_GPUAV : public CMD_BUFFER_STATE {
128 public:
129 std::vector<GpuAssistedBufferInfo> gpuav_buffer_list;
130 std::vector<GpuAssistedAccelerationStructureBuildValidationBufferInfo> as_validation_buffers;
131
132 CMD_BUFFER_STATE_GPUAV(GpuAssisted* ga, VkCommandBuffer cb, const VkCommandBufferAllocateInfo* pCreateInfo,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -0600133 const COMMAND_POOL_STATE* pool);
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600134
135 void Reset() final;
136};
137
Jeremy Gebben78684b12022-02-23 17:31:56 -0700138VALSTATETRACK_DERIVED_STATE_OBJECT(VkCommandBuffer, CMD_BUFFER_STATE_GPUAV, CMD_BUFFER_STATE);
139
Tony-LunarG99b880b2019-09-26 11:19:52 -0600140class GpuAssisted : public ValidationStateTracker {
Tony-LunarG1dce2392019-10-23 16:49:29 -0600141 public:
Mark Lobodzinski0dcb87d2020-03-30 16:09:24 -0600142 GpuAssisted() { container_type = LayerObjectTypeGpuAssisted; }
143
Mark Lobodzinskia8151b02020-02-27 13:38:08 -0700144 template <typename T>
145 void ReportSetupProblem(T object, const char* const specific_message) const;
Tony-LunarG5c38b182020-06-10 16:15:32 -0600146 bool CheckForDescriptorIndexing(DeviceFeatures enabled_features) const;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600147 void PreCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700148 const VkAllocationCallbacks* pAllocator, VkDevice* pDevice, void* modified_create_info) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600149 void PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700150 const VkAllocationCallbacks* pAllocator, VkDevice* pDevice, VkResult result) override;
Mike Schuchardt2df08912020-12-15 16:28:09 -0800151 void PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo* pInfo,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700152 VkDeviceAddress address) override;
Mike Schuchardt2df08912020-12-15 16:28:09 -0800153 void PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo* pInfo,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700154 VkDeviceAddress address) override;
Mike Schuchardt2df08912020-12-15 16:28:09 -0800155 void PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfo* pInfo,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700156 VkDeviceAddress address) override;
157 void PreCallRecordDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks* pAllocator) override;
158 void PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks* pAllocator) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600159 void PostCallRecordBindAccelerationStructureMemoryNV(VkDevice device, uint32_t bindInfoCount,
160 const VkBindAccelerationStructureMemoryInfoNV* pBindInfos,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700161 VkResult result) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600162 void PreCallRecordCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo,
163 const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700164 void* cpl_state_data) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600165 void PostCallRecordCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo,
166 const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700167 VkResult result) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600168 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents,
169 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
170 uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers,
171 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700172 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) const override;
Jeremy Gebbena3705f42021-01-19 16:47:43 -0700173 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents,
174 const VkDependencyInfoKHR* pDependencyInfos) const override;
Tony-LunarG1364cf52021-11-17 16:10:11 -0700175 bool PreCallValidateCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents,
176 const VkDependencyInfo* pDependencyInfos) const override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600177 void PreCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700178 VkBuffer* pBuffer, void* cb_state_data) override;
James Rumble2f6e7bb2021-07-13 15:21:20 +0100179 void PostCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
180 VkBuffer* pBuffer, VkResult result) override;
Jeremy Gebben21782012022-03-15 16:23:27 -0600181 void CreateAccelerationStructureBuildValidationState();
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600182 void DestroyAccelerationStructureBuildValidationState();
183 void PreCallRecordCmdBuildAccelerationStructureNV(VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV* pInfo,
184 VkBuffer instanceData, VkDeviceSize instanceOffset, VkBool32 update,
185 VkAccelerationStructureNV dst, VkAccelerationStructureNV src,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700186 VkBuffer scratch, VkDeviceSize scratchOffset) override;
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600187 void ProcessAccelerationStructureBuildValidationBuffer(VkQueue queue, CMD_BUFFER_STATE_GPUAV* cb_node);
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600188 void PreCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
189 const VkGraphicsPipelineCreateInfo* pCreateInfos,
190 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700191 void* cgpl_state_data) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600192 void PreCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
193 const VkComputePipelineCreateInfo* pCreateInfos,
194 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700195 void* ccpl_state_data) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600196 void PreCallRecordCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
197 const VkRayTracingPipelineCreateInfoNV* pCreateInfos,
198 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700199 void* crtpl_state_data) override;
sourav parmarcd5fb182020-07-17 12:58:44 -0700200 void PreCallRecordCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
201 VkPipelineCache pipelineCache, uint32_t count,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500202 const VkRayTracingPipelineCreateInfoKHR* pCreateInfos,
203 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700204 void* crtpl_state_data) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600205 void PostCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
206 const VkGraphicsPipelineCreateInfo* pCreateInfos,
207 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines, VkResult result,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700208 void* cgpl_state_data) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600209 void PostCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
210 const VkComputePipelineCreateInfo* pCreateInfos,
211 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines, VkResult result,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700212 void* ccpl_state_data) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600213 void PostCallRecordCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
214 const VkRayTracingPipelineCreateInfoNV* pCreateInfos,
215 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines, VkResult result,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700216 void* crtpl_state_data) override;
sourav parmarcd5fb182020-07-17 12:58:44 -0700217 void PostCallRecordCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
218 VkPipelineCache pipelineCache, uint32_t count,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500219 const VkRayTracingPipelineCreateInfoKHR* pCreateInfos,
220 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700221 VkResult result, void* crtpl_state_data) override;
222 void PreCallRecordDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator) override;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600223 void PreCallRecordDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) override;
sfricke-samsung7fac88a2022-01-26 11:44:22 -0800224 bool InstrumentShader(const VkShaderModuleCreateInfo* pCreateInfo, std::vector<uint32_t>& new_pgm, uint32_t* unique_shader_id);
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600225 void PreCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo,
226 const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700227 void* csm_state_data) override;
Tony-LunarG7de10e82020-11-24 11:31:55 -0700228 void AnalyzeAndGenerateMessages(VkCommandBuffer command_buffer, VkQueue queue, GpuAssistedBufferInfo &buffer_info,
229 uint32_t operation_index, uint32_t* const debug_output_buffer);
sfricke-samsung7fac88a2022-01-26 11:44:22 -0800230
Tony-LunarGc28e28a2020-08-14 10:37:48 -0600231 void SetDescriptorInitialized(uint32_t* pData, uint32_t index, const cvdescriptorset::Descriptor* descriptor);
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600232 void UpdateInstrumentationBuffer(CMD_BUFFER_STATE_GPUAV* cb_node);
Tony-LunarG7de10e82020-11-24 11:31:55 -0700233 const GpuVuid& GetGpuVuid(CMD_TYPE cmd_type) const;
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700234 void PreCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600235 void PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700236 VkResult result) override;
Jeremy Gebbena3705f42021-01-19 16:47:43 -0700237 void PreCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR* pSubmits,
238 VkFence fence) override;
Tony-LunarG26fe2842021-11-16 14:07:59 -0700239 void PreCallRecordQueueSubmit2(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2* pSubmits, VkFence fence) override;
240 void RecordQueueSubmit2(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR* pSubmits, VkFence fence, VkResult result);
Jeremy Gebbena3705f42021-01-19 16:47:43 -0700241 void PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR* pSubmits, VkFence fence,
242 VkResult result) override;
Tony-LunarG26fe2842021-11-16 14:07:59 -0700243 void PostCallRecordQueueSubmit2(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2* pSubmits, VkFence fence,
244 VkResult result) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600245 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700246 uint32_t firstInstance) override;
Tony-LunarG745150c2021-07-02 15:07:31 -0600247 void PreCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount, const VkMultiDrawInfoEXT* pVertexInfo,
248 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600249 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700250 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
Tony-LunarG745150c2021-07-02 15:07:31 -0600251 void PreCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
252 const VkMultiDrawIndexedInfoEXT* pIndexInfo, uint32_t instanceCount,
253 uint32_t firstInstance, uint32_t stride, const int32_t* pVertexOffset) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600254 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700255 uint32_t stride) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600256 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700257 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600258 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
259 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700260 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600261 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
262 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700263 uint32_t stride) override;
Tony-LunarG54176fb2020-12-02 10:47:22 -0700264 void PreCallRecordCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanceCount, uint32_t firstInstance,
265 VkBuffer counterBuffer, VkDeviceSize counterBufferOffset, uint32_t counterOffset,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700266 uint32_t vertexStride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600267 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
268 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700269 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600270 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
271 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700272 uint32_t stride) override;
273 void PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600274 void PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700275 uint32_t drawCount, uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600276 void PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
277 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700278 uint32_t stride) override;
279 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
280 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
Tony-LunarGd13f9b52020-09-08 15:45:45 -0600281 void PreCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700282 uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) override;
Tony-LunarG52c8c602020-09-10 16:29:56 -0600283 void PreCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700284 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
285 uint32_t groupCountZ) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600286 void PreCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
287 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
288 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
289 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
290 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
291 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700292 uint32_t width, uint32_t height, uint32_t depth) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600293 void PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
294 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
295 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
296 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
297 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
298 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700299 uint32_t width, uint32_t height, uint32_t depth) override;
sourav parmarcd5fb182020-07-17 12:58:44 -0700300 void PreCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
301 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
302 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
303 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
304 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, uint32_t width,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700305 uint32_t height, uint32_t depth) override;
sourav parmarcd5fb182020-07-17 12:58:44 -0700306 void PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
307 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
308 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
309 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
310 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, uint32_t width,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700311 uint32_t height, uint32_t depth) override;
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500312 void PreCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700313 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
314 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
315 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
Shannon McPherson54e1f892020-11-27 11:04:19 -0700316 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700317 VkDeviceAddress indirectDeviceAddress) override;
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500318 void PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700319 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
320 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
321 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
Shannon McPherson54e1f892020-11-27 11:04:19 -0700322 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700323 VkDeviceAddress indirectDeviceAddress) override;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600324 void AllocateValidationResources(const VkCommandBuffer cmd_buffer, const VkPipelineBindPoint bind_point, CMD_TYPE cmd, const GpuAssistedCmdDrawIndirectState *cdic_state = nullptr);
325 void AllocatePreDrawValidationResources(GpuAssistedDeviceMemoryBlock output_block, GpuAssistedPreDrawResources& resources,
326 const LAST_BOUND_STATE& state, VkPipeline *pPipeline, const GpuAssistedCmdDrawIndirectState *cdic_state);
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600327 void PostCallRecordGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700328 VkPhysicalDeviceProperties* pPhysicalDeviceProperties) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600329 void PostCallRecordGetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700330 VkPhysicalDeviceProperties2* pPhysicalDeviceProperties2) override;
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600331
Jeremy Gebben9f537102021-10-05 16:37:12 -0600332 std::shared_ptr<SHADER_MODULE_STATE> GetShaderModuleState(VkShaderModule shader_module) {
333 return Get<SHADER_MODULE_STATE>(shader_module);
334 }
335 std::shared_ptr<const SHADER_MODULE_STATE> GetShaderModuleState(VkShaderModule shader_module) const {
336 return Get<SHADER_MODULE_STATE>(shader_module);
337 }
338 std::shared_ptr<const PIPELINE_STATE> GetPipelineState(VkPipeline pipeline) const { return Get<PIPELINE_STATE>(pipeline); }
339 std::shared_ptr<PIPELINE_STATE> GetPipelineState(VkPipeline pipeline) { return Get<PIPELINE_STATE>(pipeline); }
340
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600341 const std::vector<GpuAssistedBufferInfo>& GetBufferInfo(const CMD_BUFFER_STATE* cb_node) const {
342 assert(cb_node);
343 return static_cast<const CMD_BUFFER_STATE_GPUAV*>(cb_node)->gpuav_buffer_list;
344 }
345
346 std::vector<GpuAssistedBufferInfo>& GetBufferInfo(CMD_BUFFER_STATE* cb_node) {
347 assert(cb_node);
348 return static_cast<CMD_BUFFER_STATE_GPUAV*>(cb_node)->gpuav_buffer_list;
349 }
350
351 std::shared_ptr<CMD_BUFFER_STATE> CreateCmdBufferState(VkCommandBuffer cb, const VkCommandBufferAllocateInfo* create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -0600352 const COMMAND_POOL_STATE* pool) final;
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600353
354 void DestroyBuffer(GpuAssistedBufferInfo& buffer_info);
355 void DestroyBuffer(GpuAssistedAccelerationStructureBuildValidationBufferInfo& buffer_info);
Jeremy Gebben14499e82022-03-17 11:03:10 -0600356
357 private:
358 void PreRecordCommandBuffer(VkCommandBuffer command_buffer);
359 bool CommandBufferNeedsProcessing(VkCommandBuffer command_buffer);
360 void ProcessCommandBuffer(VkQueue queue, VkCommandBuffer command_buffer);
361
362 VkPhysicalDeviceFeatures supported_features;
363 VkBool32 shaderInt64;
364 uint32_t unique_shader_module_id = 0;
365 uint32_t output_buffer_size;
366 bool buffer_oob_enabled;
367 bool validate_draw_indirect;
368 std::map<VkDeviceAddress, VkDeviceSize> buffer_map;
369 GpuAssistedAccelerationStructureBuildValidationState acceleration_structure_validation_state;
370 GpuAssistedPreDrawValidationState pre_draw_validation_state;
371
372 public:
373 bool aborted = false;
374 bool descriptor_indexing = false;
375 uint32_t adjusted_max_desc_sets;
376 uint32_t desc_set_bind_index;
377 VkDescriptorSetLayout debug_desc_layout = VK_NULL_HANDLE;
378 VkDescriptorSetLayout dummy_desc_layout = VK_NULL_HANDLE;
379 std::unique_ptr<UtilDescriptorSetManager> desc_set_manager;
380 layer_data::unordered_map<uint32_t, GpuAssistedShaderTracker> shader_map;
381 PFN_vkSetDeviceLoaderData vkSetDeviceLoaderData;
382 VmaAllocator vmaAllocator = {};
383 std::map<VkQueue, UtilQueueBarrierCommandInfo> queue_barrier_command_infos;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600384};