blob: 3ae26c02432e9af5f30c45285c9265fa6c46ccdc [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;
Tony-LunarG0e564722019-03-19 16:09:14 -060028
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060029struct GpuAssistedDeviceMemoryBlock {
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060030 VkBuffer buffer;
Tony-LunarG0e564722019-03-19 16:09:14 -060031 VmaAllocation allocation;
Jeremy Gebbencbf22862021-03-03 12:01:22 -070032 layer_data::unordered_map<uint32_t, const cvdescriptorset::Descriptor*> update_at_submit;
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060033};
34
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060035struct GpuAssistedPreDrawResources {
36 VkDescriptorPool desc_pool;
37 VkDescriptorSet desc_set;
Tony-LunarGf0d4e2b2021-04-14 11:52:28 -060038 VkBuffer buffer;
39 VkDeviceSize offset;
40 uint32_t stride;
41 VkDeviceSize buf_size;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060042};
43
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060044struct GpuAssistedBufferInfo {
45 GpuAssistedDeviceMemoryBlock output_mem_block;
46 GpuAssistedDeviceMemoryBlock di_input_mem_block; // Descriptor Indexing input
47 GpuAssistedDeviceMemoryBlock bda_input_mem_block; // Buffer Device Address input
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060048 GpuAssistedPreDrawResources pre_draw_resources;
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060049 VkDescriptorSet desc_set;
50 VkDescriptorPool desc_pool;
Jason Macnak67407e72019-07-11 11:05:09 -070051 VkPipelineBindPoint pipeline_bind_point;
Tony-LunarG7de10e82020-11-24 11:31:55 -070052 CMD_TYPE cmd_type;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060053 GpuAssistedBufferInfo(GpuAssistedDeviceMemoryBlock output_mem_block, GpuAssistedDeviceMemoryBlock di_input_mem_block,
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060054 GpuAssistedDeviceMemoryBlock bda_input_mem_block, GpuAssistedPreDrawResources pre_draw_resources,
55 VkDescriptorSet desc_set, VkDescriptorPool desc_pool, VkPipelineBindPoint pipeline_bind_point,
56 CMD_TYPE cmd_type)
Jason Macnak67407e72019-07-11 11:05:09 -070057 : output_mem_block(output_mem_block),
Tony-LunarG8eb5a002019-07-25 16:49:00 -060058 di_input_mem_block(di_input_mem_block),
59 bda_input_mem_block(bda_input_mem_block),
Tony-LunarGa3ec16c2021-04-06 12:19:57 -060060 pre_draw_resources(pre_draw_resources),
Jason Macnak67407e72019-07-11 11:05:09 -070061 desc_set(desc_set),
62 desc_pool(desc_pool),
Tony-LunarG7de10e82020-11-24 11:31:55 -070063 pipeline_bind_point(pipeline_bind_point),
64 cmd_type(cmd_type){};
Mark Lobodzinski2a3ee4a2019-03-13 13:11:39 -060065};
66
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060067struct GpuAssistedShaderTracker {
68 VkPipeline pipeline;
69 VkShaderModule shader_module;
sfricke-samsung7fac88a2022-01-26 11:44:22 -080070 std::vector<uint32_t> pgm;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060071};
72
Tony-LunarG7de10e82020-11-24 11:31:55 -070073struct GpuVuid {
74 const char* uniform_access_oob = kVUIDUndefined;
75 const char* storage_access_oob = kVUIDUndefined;
Tony-LunarG64aeaf72021-04-14 11:13:35 -060076 const char* count_exceeds_bufsize_1 = kVUIDUndefined;
77 const char* count_exceeds_bufsize = kVUIDUndefined;
Tony-LunarG1a7c9f92021-04-29 16:04:42 -060078 const char* count_exceeds_device_limit = kVUIDUndefined;
Tony-LunarG3723a3a2021-05-04 14:52:39 -060079 const char* first_instance_not_zero = kVUIDUndefined;
Tony-LunarG7de10e82020-11-24 11:31:55 -070080};
81
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060082struct GpuAssistedAccelerationStructureBuildValidationBufferInfo {
Jason Macnak83cfd582019-07-31 10:14:24 -070083 // The acceleration structure that is being built.
84 VkAccelerationStructureNV acceleration_structure = VK_NULL_HANDLE;
85
86 // The descriptor pool and descriptor set being used to validate a given build.
87 VkDescriptorPool descriptor_pool = VK_NULL_HANDLE;
88 VkDescriptorSet descriptor_set = VK_NULL_HANDLE;
89
90 // The storage buffer used by the validating compute shader whichcontains info about
91 // the valid handles and which is written to communicate found invalid handles.
92 VkBuffer validation_buffer = VK_NULL_HANDLE;
93 VmaAllocation validation_buffer_allocation = VK_NULL_HANDLE;
94};
95
Tony-LunarG2ba1cb32019-09-25 15:16:11 -060096struct GpuAssistedAccelerationStructureBuildValidationState {
Jason Macnak83cfd582019-07-31 10:14:24 -070097 bool initialized = false;
98
99 VkPipeline pipeline = VK_NULL_HANDLE;
100 VkPipelineLayout pipeline_layout = VK_NULL_HANDLE;
101
102 VkAccelerationStructureNV replacement_as = VK_NULL_HANDLE;
103 VmaAllocation replacement_as_allocation = VK_NULL_HANDLE;
104 uint64_t replacement_as_handle = 0;
105
Jason Macnak83cfd582019-07-31 10:14:24 -0700106};
107
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600108struct GpuAssistedPreDrawValidationState {
109 bool globals_created = false;
110 VkShaderModule validation_shader_module = VK_NULL_HANDLE;
111 VkDescriptorSetLayout validation_ds_layout = VK_NULL_HANDLE;
112 VkPipelineLayout validation_pipeline_layout = VK_NULL_HANDLE;
Tony-LunarG463bae32022-02-25 09:31:17 -0700113 VkPipeline dyn_rendering_pipeline = VK_NULL_HANDLE;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600114 layer_data::unordered_map <VkRenderPass, VkPipeline> renderpass_to_pipeline;
115};
116
117struct GpuAssistedCmdDrawIndirectState {
118 VkBuffer buffer;
119 VkDeviceSize offset;
Tony-LunarG3723a3a2021-05-04 14:52:39 -0600120 uint32_t drawCount;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600121 uint32_t stride;
122 VkBuffer count_buffer;
123 VkDeviceSize count_buffer_offset;
124};
125
Jeremy Gebben135550d2022-03-21 07:15:07 -0600126namespace gpuav_state {
127class CommandBuffer : public CMD_BUFFER_STATE {
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600128 public:
129 std::vector<GpuAssistedBufferInfo> gpuav_buffer_list;
130 std::vector<GpuAssistedAccelerationStructureBuildValidationBufferInfo> as_validation_buffers;
131
Jeremy Gebben135550d2022-03-21 07:15:07 -0600132 CommandBuffer(GpuAssisted* ga, VkCommandBuffer cb, const VkCommandBufferAllocateInfo* pCreateInfo,
133 const COMMAND_POOL_STATE* pool);
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600134
135 void Reset() final;
136};
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
Tony-LunarG99b880b2019-09-26 11:19:52 -0600141class GpuAssisted : public ValidationStateTracker {
Tony-LunarG1dce2392019-10-23 16:49:29 -0600142 public:
Mark Lobodzinski0dcb87d2020-03-30 16:09:24 -0600143 GpuAssisted() { container_type = LayerObjectTypeGpuAssisted; }
144
Mark Lobodzinskia8151b02020-02-27 13:38:08 -0700145 template <typename T>
146 void ReportSetupProblem(T object, const char* const specific_message) const;
Tony-LunarG5c38b182020-06-10 16:15:32 -0600147 bool CheckForDescriptorIndexing(DeviceFeatures enabled_features) const;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600148 void PreCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700149 const VkAllocationCallbacks* pAllocator, VkDevice* pDevice, void* modified_create_info) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600150 void PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700151 const VkAllocationCallbacks* pAllocator, VkDevice* pDevice, VkResult result) override;
Mike Schuchardt2df08912020-12-15 16:28:09 -0800152 void PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo* pInfo,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700153 VkDeviceAddress address) override;
Mike Schuchardt2df08912020-12-15 16:28:09 -0800154 void PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo* pInfo,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700155 VkDeviceAddress address) override;
Mike Schuchardt2df08912020-12-15 16:28:09 -0800156 void PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfo* pInfo,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700157 VkDeviceAddress address) override;
158 void PreCallRecordDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks* pAllocator) override;
159 void PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks* pAllocator) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600160 void PostCallRecordBindAccelerationStructureMemoryNV(VkDevice device, uint32_t bindInfoCount,
161 const VkBindAccelerationStructureMemoryInfoNV* pBindInfos,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700162 VkResult result) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600163 void PreCallRecordCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo,
164 const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700165 void* cpl_state_data) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600166 void PostCallRecordCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo,
167 const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700168 VkResult result) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600169 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents,
170 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
171 uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers,
172 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700173 uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) const override;
Jeremy Gebbena3705f42021-01-19 16:47:43 -0700174 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents,
175 const VkDependencyInfoKHR* pDependencyInfos) const override;
Tony-LunarG1364cf52021-11-17 16:10:11 -0700176 bool PreCallValidateCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents,
177 const VkDependencyInfo* pDependencyInfos) const override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600178 void PreCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700179 VkBuffer* pBuffer, void* cb_state_data) override;
James Rumble2f6e7bb2021-07-13 15:21:20 +0100180 void PostCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
181 VkBuffer* pBuffer, VkResult result) override;
Jeremy Gebben21782012022-03-15 16:23:27 -0600182 void CreateAccelerationStructureBuildValidationState();
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600183 void DestroyAccelerationStructureBuildValidationState();
184 void PreCallRecordCmdBuildAccelerationStructureNV(VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV* pInfo,
185 VkBuffer instanceData, VkDeviceSize instanceOffset, VkBool32 update,
186 VkAccelerationStructureNV dst, VkAccelerationStructureNV src,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700187 VkBuffer scratch, VkDeviceSize scratchOffset) override;
Jeremy Gebben135550d2022-03-21 07:15:07 -0600188 void ProcessAccelerationStructureBuildValidationBuffer(VkQueue queue, gpuav_state::CommandBuffer* cb_node);
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600189 void PreCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
190 const VkGraphicsPipelineCreateInfo* pCreateInfos,
191 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700192 void* cgpl_state_data) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600193 void PreCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
194 const VkComputePipelineCreateInfo* pCreateInfos,
195 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700196 void* ccpl_state_data) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600197 void PreCallRecordCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
198 const VkRayTracingPipelineCreateInfoNV* pCreateInfos,
199 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700200 void* crtpl_state_data) override;
sourav parmarcd5fb182020-07-17 12:58:44 -0700201 void PreCallRecordCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
202 VkPipelineCache pipelineCache, uint32_t count,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500203 const VkRayTracingPipelineCreateInfoKHR* pCreateInfos,
204 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700205 void* crtpl_state_data) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600206 void PostCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
207 const VkGraphicsPipelineCreateInfo* pCreateInfos,
208 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines, VkResult result,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700209 void* cgpl_state_data) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600210 void PostCallRecordCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
211 const VkComputePipelineCreateInfo* pCreateInfos,
212 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines, VkResult result,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700213 void* ccpl_state_data) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600214 void PostCallRecordCreateRayTracingPipelinesNV(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
215 const VkRayTracingPipelineCreateInfoNV* pCreateInfos,
216 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines, VkResult result,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700217 void* crtpl_state_data) override;
sourav parmarcd5fb182020-07-17 12:58:44 -0700218 void PostCallRecordCreateRayTracingPipelinesKHR(VkDevice device, VkDeferredOperationKHR deferredOperation,
219 VkPipelineCache pipelineCache, uint32_t count,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500220 const VkRayTracingPipelineCreateInfoKHR* pCreateInfos,
221 const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700222 VkResult result, void* crtpl_state_data) override;
223 void PreCallRecordDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator) override;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600224 void PreCallRecordDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) override;
sfricke-samsung7fac88a2022-01-26 11:44:22 -0800225 bool InstrumentShader(const VkShaderModuleCreateInfo* pCreateInfo, std::vector<uint32_t>& new_pgm, uint32_t* unique_shader_id);
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600226 void PreCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo,
227 const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700228 void* csm_state_data) override;
Tony-LunarG7de10e82020-11-24 11:31:55 -0700229 void AnalyzeAndGenerateMessages(VkCommandBuffer command_buffer, VkQueue queue, GpuAssistedBufferInfo &buffer_info,
230 uint32_t operation_index, uint32_t* const debug_output_buffer);
sfricke-samsung7fac88a2022-01-26 11:44:22 -0800231
Tony-LunarGc28e28a2020-08-14 10:37:48 -0600232 void SetDescriptorInitialized(uint32_t* pData, uint32_t index, const cvdescriptorset::Descriptor* descriptor);
Jeremy Gebben135550d2022-03-21 07:15:07 -0600233 void UpdateInstrumentationBuffer(gpuav_state::CommandBuffer* cb_node);
Tony-LunarG7de10e82020-11-24 11:31:55 -0700234 const GpuVuid& GetGpuVuid(CMD_TYPE cmd_type) const;
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700235 void PreCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600236 void PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700237 VkResult result) override;
Jeremy Gebbena3705f42021-01-19 16:47:43 -0700238 void PreCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR* pSubmits,
239 VkFence fence) override;
Tony-LunarG26fe2842021-11-16 14:07:59 -0700240 void PreCallRecordQueueSubmit2(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2* pSubmits, VkFence fence) override;
241 void RecordQueueSubmit2(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR* pSubmits, VkFence fence, VkResult result);
Jeremy Gebbena3705f42021-01-19 16:47:43 -0700242 void PostCallRecordQueueSubmit2KHR(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2KHR* pSubmits, VkFence fence,
243 VkResult result) override;
Tony-LunarG26fe2842021-11-16 14:07:59 -0700244 void PostCallRecordQueueSubmit2(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2* pSubmits, VkFence fence,
245 VkResult result) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600246 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700247 uint32_t firstInstance) override;
Tony-LunarG745150c2021-07-02 15:07:31 -0600248 void PreCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount, const VkMultiDrawInfoEXT* pVertexInfo,
249 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600250 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700251 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
Tony-LunarG745150c2021-07-02 15:07:31 -0600252 void PreCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
253 const VkMultiDrawIndexedInfoEXT* pIndexInfo, uint32_t instanceCount,
254 uint32_t firstInstance, uint32_t stride, const int32_t* pVertexOffset) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600255 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700256 uint32_t stride) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600257 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700258 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600259 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
260 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700261 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600262 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
263 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700264 uint32_t stride) override;
Tony-LunarG54176fb2020-12-02 10:47:22 -0700265 void PreCallRecordCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanceCount, uint32_t firstInstance,
266 VkBuffer counterBuffer, VkDeviceSize counterBufferOffset, uint32_t counterOffset,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700267 uint32_t vertexStride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600268 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
269 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700270 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600271 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
272 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700273 uint32_t stride) override;
274 void PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600275 void PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700276 uint32_t drawCount, uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600277 void PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
278 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700279 uint32_t stride) override;
280 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
281 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
Tony-LunarGd13f9b52020-09-08 15:45:45 -0600282 void PreCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700283 uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) override;
Tony-LunarG52c8c602020-09-10 16:29:56 -0600284 void PreCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700285 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
286 uint32_t groupCountZ) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600287 void PreCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
288 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
289 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
290 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
291 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
292 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700293 uint32_t width, uint32_t height, uint32_t depth) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600294 void PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
295 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
296 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
297 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
298 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
299 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700300 uint32_t width, uint32_t height, uint32_t depth) override;
sourav parmarcd5fb182020-07-17 12:58:44 -0700301 void PreCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
302 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
303 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
304 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
305 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, uint32_t width,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700306 uint32_t height, uint32_t depth) override;
sourav parmarcd5fb182020-07-17 12:58:44 -0700307 void PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
308 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
309 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
310 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
311 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, uint32_t width,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700312 uint32_t height, uint32_t depth) override;
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500313 void PreCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700314 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
315 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
316 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
Shannon McPherson54e1f892020-11-27 11:04:19 -0700317 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700318 VkDeviceAddress indirectDeviceAddress) override;
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500319 void PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700320 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
321 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
322 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
Shannon McPherson54e1f892020-11-27 11:04:19 -0700323 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700324 VkDeviceAddress indirectDeviceAddress) override;
Tony-LunarGa3ec16c2021-04-06 12:19:57 -0600325 void AllocateValidationResources(const VkCommandBuffer cmd_buffer, const VkPipelineBindPoint bind_point, CMD_TYPE cmd, const GpuAssistedCmdDrawIndirectState *cdic_state = nullptr);
326 void AllocatePreDrawValidationResources(GpuAssistedDeviceMemoryBlock output_block, GpuAssistedPreDrawResources& resources,
327 const LAST_BOUND_STATE& state, VkPipeline *pPipeline, const GpuAssistedCmdDrawIndirectState *cdic_state);
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600328 void PostCallRecordGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700329 VkPhysicalDeviceProperties* pPhysicalDeviceProperties) override;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600330 void PostCallRecordGetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
Mark Lobodzinskib8e22b52020-12-03 15:22:35 -0700331 VkPhysicalDeviceProperties2* pPhysicalDeviceProperties2) override;
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600332
Jeremy Gebben9f537102021-10-05 16:37:12 -0600333 std::shared_ptr<SHADER_MODULE_STATE> GetShaderModuleState(VkShaderModule shader_module) {
334 return Get<SHADER_MODULE_STATE>(shader_module);
335 }
336 std::shared_ptr<const SHADER_MODULE_STATE> GetShaderModuleState(VkShaderModule shader_module) const {
337 return Get<SHADER_MODULE_STATE>(shader_module);
338 }
339 std::shared_ptr<const PIPELINE_STATE> GetPipelineState(VkPipeline pipeline) const { return Get<PIPELINE_STATE>(pipeline); }
340 std::shared_ptr<PIPELINE_STATE> GetPipelineState(VkPipeline pipeline) { return Get<PIPELINE_STATE>(pipeline); }
341
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600342 const std::vector<GpuAssistedBufferInfo>& GetBufferInfo(const CMD_BUFFER_STATE* cb_node) const {
343 assert(cb_node);
Jeremy Gebben135550d2022-03-21 07:15:07 -0600344 return static_cast<const gpuav_state::CommandBuffer*>(cb_node)->gpuav_buffer_list;
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600345 }
346
347 std::vector<GpuAssistedBufferInfo>& GetBufferInfo(CMD_BUFFER_STATE* cb_node) {
348 assert(cb_node);
Jeremy Gebben135550d2022-03-21 07:15:07 -0600349 return static_cast<gpuav_state::CommandBuffer*>(cb_node)->gpuav_buffer_list;
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600350 }
351
352 std::shared_ptr<CMD_BUFFER_STATE> CreateCmdBufferState(VkCommandBuffer cb, const VkCommandBufferAllocateInfo* create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -0600353 const COMMAND_POOL_STATE* pool) final;
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600354
355 void DestroyBuffer(GpuAssistedBufferInfo& buffer_info);
356 void DestroyBuffer(GpuAssistedAccelerationStructureBuildValidationBufferInfo& buffer_info);
Jeremy Gebben14499e82022-03-17 11:03:10 -0600357
358 private:
359 void PreRecordCommandBuffer(VkCommandBuffer command_buffer);
360 bool CommandBufferNeedsProcessing(VkCommandBuffer command_buffer);
361 void ProcessCommandBuffer(VkQueue queue, VkCommandBuffer command_buffer);
362
363 VkPhysicalDeviceFeatures supported_features;
364 VkBool32 shaderInt64;
365 uint32_t unique_shader_module_id = 0;
366 uint32_t output_buffer_size;
367 bool buffer_oob_enabled;
368 bool validate_draw_indirect;
369 std::map<VkDeviceAddress, VkDeviceSize> buffer_map;
370 GpuAssistedAccelerationStructureBuildValidationState acceleration_structure_validation_state;
371 GpuAssistedPreDrawValidationState pre_draw_validation_state;
372
373 public:
374 bool aborted = false;
375 bool descriptor_indexing = false;
376 uint32_t adjusted_max_desc_sets;
377 uint32_t desc_set_bind_index;
378 VkDescriptorSetLayout debug_desc_layout = VK_NULL_HANDLE;
379 VkDescriptorSetLayout dummy_desc_layout = VK_NULL_HANDLE;
380 std::unique_ptr<UtilDescriptorSetManager> desc_set_manager;
381 layer_data::unordered_map<uint32_t, GpuAssistedShaderTracker> shader_map;
382 PFN_vkSetDeviceLoaderData vkSetDeviceLoaderData;
383 VmaAllocator vmaAllocator = {};
384 std::map<VkQueue, UtilQueueBarrierCommandInfo> queue_barrier_command_infos;
Tony-LunarG2ba1cb32019-09-25 15:16:11 -0600385};