blob: 7674f94b609c0ccab3d5a2e8d483e8c9bd3313f1 [file] [log] [blame]
Tony-LunarG4c253372022-01-18 13:51:07 -07001/* Copyright (c) 2020-2022 The Khronos Group Inc.
2 * Copyright (c) 2020-2022 Valve Corporation
3 * Copyright (c) 2020-2022 LunarG, Inc.
Tony-LunarG04717522019-10-17 10:41:17 -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 *
17 * Author: Tony Barbour <tony@lunarg.com>
18 */
19
20#pragma once
21
Tony-LunarGb5fae462020-03-05 12:43:25 -070022#include "gpu_utils.h"
Tony-LunarGb5fae462020-03-05 12:43:25 -070023class DebugPrintf;
Tony-LunarG04717522019-10-17 10:41:17 -060024
Tony-LunarGb5fae462020-03-05 12:43:25 -070025struct DPFDeviceMemoryBlock {
Tony-LunarG04717522019-10-17 10:41:17 -060026 VkBuffer buffer;
27 VmaAllocation allocation;
28};
29
Tony-LunarGb5fae462020-03-05 12:43:25 -070030struct DPFBufferInfo {
31 DPFDeviceMemoryBlock output_mem_block;
Tony-LunarG04717522019-10-17 10:41:17 -060032 VkDescriptorSet desc_set;
33 VkDescriptorPool desc_pool;
34 VkPipelineBindPoint pipeline_bind_point;
Tony-LunarGb5fae462020-03-05 12:43:25 -070035 DPFBufferInfo(DPFDeviceMemoryBlock output_mem_block, VkDescriptorSet desc_set, VkDescriptorPool desc_pool,
Tony-LunarG04717522019-10-17 10:41:17 -060036 VkPipelineBindPoint pipeline_bind_point)
37 : output_mem_block(output_mem_block), desc_set(desc_set), desc_pool(desc_pool), pipeline_bind_point(pipeline_bind_point){};
38};
Tony-LunarG04717522019-10-17 10:41:17 -060039
Tony-LunarG04717522019-10-17 10:41:17 -060040enum vartype { varsigned, varunsigned, varfloat };
Tony-LunarGb5fae462020-03-05 12:43:25 -070041struct DPFSubstring {
Tony-LunarG04717522019-10-17 10:41:17 -060042 std::string string;
43 bool needs_value;
44 vartype type;
45 uint64_t longval = 0;
46};
47
Tony-LunarGb5fae462020-03-05 12:43:25 -070048struct DPFOutputRecord {
Tony-LunarG04717522019-10-17 10:41:17 -060049 uint32_t size;
50 uint32_t shader_id;
51 uint32_t instruction_position;
52 uint32_t stage;
53 uint32_t stage_word_1;
54 uint32_t stage_word_2;
55 uint32_t stage_word_3;
56 uint32_t format_string_id;
57 uint32_t values;
58};
59
Jeremy Gebben37c5c5d2022-03-21 07:16:03 -060060namespace debug_printf_state {
Jeremy Gebben5ca80b32022-04-11 10:58:39 -060061class CommandBuffer : public gpu_utils_state::CommandBuffer {
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -060062 public:
63 std::vector<DPFBufferInfo> buffer_infos;
64
Jeremy Gebben37c5c5d2022-03-21 07:16:03 -060065 CommandBuffer(DebugPrintf* dp, VkCommandBuffer cb, const VkCommandBufferAllocateInfo* create_info,
66 const COMMAND_POOL_STATE* pool);
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -060067
Jeremy Gebben5ca80b32022-04-11 10:58:39 -060068 bool NeedsProcessing() const final { return !buffer_infos.empty(); }
69
70 void Process(VkQueue queue) final;
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -060071 void Reset() final;
72};
Jeremy Gebben37c5c5d2022-03-21 07:16:03 -060073}; // namespace debug_printf_state
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -060074
Jeremy Gebben37c5c5d2022-03-21 07:16:03 -060075VALSTATETRACK_DERIVED_STATE_OBJECT(VkCommandBuffer, debug_printf_state::CommandBuffer, CMD_BUFFER_STATE);
Jeremy Gebben78684b12022-02-23 17:31:56 -070076
Jeremy Gebben5160e032022-03-28 14:57:43 -060077class DebugPrintf : public GpuAssistedBase {
Tony-LunarG1dce2392019-10-23 16:49:29 -060078 public:
Jeremy Gebben5160e032022-03-28 14:57:43 -060079 DebugPrintf() {
80 setup_vuid = "UNASSIGNED-DEBUG-PRINTF";
81 container_type = LayerObjectTypeDebugPrintf;
82 desired_features.vertexPipelineStoresAndAtomics = true;
83 desired_features.fragmentStoresAndAtomics = true;
84 }
Mark Lobodzinski0dcb87d2020-03-30 16:09:24 -060085
Jeremy Gebben36a3b832022-03-23 10:54:18 -060086 void CreateDevice(const VkDeviceCreateInfo* pCreateInfo) override;
Tony-LunarG04717522019-10-17 10:41:17 -060087 bool PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents,
88 VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
89 uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers,
90 uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -070091 uint32_t imageMemoryBarrierCount,
92 const VkImageMemoryBarrier* pImageMemoryBarriers) const override;
Jeremy Gebbena3705f42021-01-19 16:47:43 -070093 bool PreCallValidateCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents,
94 const VkDependencyInfoKHR* pDependencyInfos) const override;
Tony-LunarG1364cf52021-11-17 16:10:11 -070095 bool PreCallValidateCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents,
96 const VkDependencyInfo* pDependencyInfos) const override;
sfricke-samsung7fac88a2022-01-26 11:44:22 -080097 bool InstrumentShader(const VkShaderModuleCreateInfo* pCreateInfo, std::vector<uint32_t>& new_pgm, uint32_t* unique_shader_id);
Tony-LunarG04717522019-10-17 10:41:17 -060098 void PreCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo,
99 const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700100 void* csm_state_data) override;
Tony-LunarGb5fae462020-03-05 12:43:25 -0700101 std::vector<DPFSubstring> ParseFormatString(std::string format_string);
sfricke-samsung7fac88a2022-01-26 11:44:22 -0800102 std::string FindFormatString(std::vector<uint32_t> pgm, uint32_t string_id);
Tony-LunarG7de10e82020-11-24 11:31:55 -0700103 void AnalyzeAndGenerateMessages(VkCommandBuffer command_buffer, VkQueue queue, DPFBufferInfo &buffer_info,
Tony-LunarG1dce2392019-10-23 16:49:29 -0600104 uint32_t operation_index, uint32_t* const debug_output_buffer);
Tony-LunarG04717522019-10-17 10:41:17 -0600105 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700106 uint32_t firstInstance) override;
Tony-LunarG745150c2021-07-02 15:07:31 -0600107 void PreCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount, const VkMultiDrawInfoEXT* pVertexInfo,
108 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride) override;
Tony-LunarG04717522019-10-17 10:41:17 -0600109 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700110 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
Tony-LunarG745150c2021-07-02 15:07:31 -0600111 void PreCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
112 const VkMultiDrawIndexedInfoEXT* pIndexInfo, uint32_t instanceCount,
113 uint32_t firstInstance, uint32_t stride, const int32_t* pVertexOffset) override;
Tony-LunarG04717522019-10-17 10:41:17 -0600114 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700115 uint32_t stride) override;
Tony-LunarG04717522019-10-17 10:41:17 -0600116 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700117 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600118 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
119 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700120 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600121 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
122 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700123 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600124 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
125 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700126 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600127 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
128 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700129 uint32_t stride) override;
Tony-LunarG54176fb2020-12-02 10:47:22 -0700130 void PreCallRecordCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanceCount, uint32_t firstInstance,
131 VkBuffer counterBuffer, VkDeviceSize counterBufferOffset, uint32_t counterOffset,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700132 uint32_t vertexStride) override;
133 void PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600134 void PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700135 uint32_t drawCount, uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600136 void PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
137 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700138 uint32_t stride) override;
139 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
140 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
Tony-LunarGd13f9b52020-09-08 15:45:45 -0600141 void PreCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700142 uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) override;
Tony-LunarG52c8c602020-09-10 16:29:56 -0600143 void PreCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700144 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
145 uint32_t groupCountZ) override;
Tony-LunarG04717522019-10-17 10:41:17 -0600146 void PreCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
147 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
148 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
149 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
150 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
151 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700152 uint32_t width, uint32_t height, uint32_t depth) override;
Tony-LunarG04717522019-10-17 10:41:17 -0600153 void PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
154 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
155 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
156 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
157 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
158 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700159 uint32_t width, uint32_t height, uint32_t depth) override;
sourav parmarcd5fb182020-07-17 12:58:44 -0700160 void PreCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
161 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
162 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
163 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
164 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, uint32_t width,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700165 uint32_t height, uint32_t depth) override;
sourav parmarcd5fb182020-07-17 12:58:44 -0700166 void PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
167 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
168 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
169 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
170 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, uint32_t width,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700171 uint32_t height, uint32_t depth) override;
Tony-LunarG1dce2392019-10-23 16:49:29 -0600172 void PreCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700173 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
174 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
175 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
Shannon McPherson54e1f892020-11-27 11:04:19 -0700176 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700177 VkDeviceAddress indirectDeviceAddress) override;
Tony-LunarG1dce2392019-10-23 16:49:29 -0600178 void PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700179 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
180 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
181 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
Shannon McPherson54e1f892020-11-27 11:04:19 -0700182 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700183 VkDeviceAddress indirectDeviceAddress) override;
Tony-LunarGb5fae462020-03-05 12:43:25 -0700184 void AllocateDebugPrintfResources(const VkCommandBuffer cmd_buffer, const VkPipelineBindPoint bind_point);
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600185
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600186 std::shared_ptr<CMD_BUFFER_STATE> CreateCmdBufferState(VkCommandBuffer cb, const VkCommandBufferAllocateInfo* create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -0600187 const COMMAND_POOL_STATE* pool) final;
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600188
189 void DestroyBuffer(DPFBufferInfo& buffer_info);
Jeremy Gebben14499e82022-03-17 11:03:10 -0600190
Jeremy Gebben5160e032022-03-28 14:57:43 -0600191 private:
Jeremy Gebben14499e82022-03-17 11:03:10 -0600192 bool verbose = false;
193 bool use_stdout = false;
Tony-LunarG04717522019-10-17 10:41:17 -0600194};