blob: 5e1a00498cd505a950f83f714d6a6173ba6542eb [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;
sfricke-samsung7fac88a2022-01-26 11:44:22 -080087 bool InstrumentShader(const VkShaderModuleCreateInfo* pCreateInfo, std::vector<uint32_t>& new_pgm, uint32_t* unique_shader_id);
Tony-LunarG04717522019-10-17 10:41:17 -060088 void PreCallRecordCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo,
89 const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -070090 void* csm_state_data) override;
Tony-LunarGb5fae462020-03-05 12:43:25 -070091 std::vector<DPFSubstring> ParseFormatString(std::string format_string);
sfricke-samsung7fac88a2022-01-26 11:44:22 -080092 std::string FindFormatString(std::vector<uint32_t> pgm, uint32_t string_id);
Tony-LunarG7de10e82020-11-24 11:31:55 -070093 void AnalyzeAndGenerateMessages(VkCommandBuffer command_buffer, VkQueue queue, DPFBufferInfo &buffer_info,
Tony-LunarG1dce2392019-10-23 16:49:29 -060094 uint32_t operation_index, uint32_t* const debug_output_buffer);
Tony-LunarG04717522019-10-17 10:41:17 -060095 void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -070096 uint32_t firstInstance) override;
Tony-LunarG745150c2021-07-02 15:07:31 -060097 void PreCallRecordCmdDrawMultiEXT(VkCommandBuffer commandBuffer, uint32_t drawCount, const VkMultiDrawInfoEXT* pVertexInfo,
98 uint32_t instanceCount, uint32_t firstInstance, uint32_t stride) override;
Tony-LunarG04717522019-10-17 10:41:17 -060099 void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700100 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) override;
Tony-LunarG745150c2021-07-02 15:07:31 -0600101 void PreCallRecordCmdDrawMultiIndexedEXT(VkCommandBuffer commandBuffer, uint32_t drawCount,
102 const VkMultiDrawIndexedInfoEXT* pIndexInfo, uint32_t instanceCount,
103 uint32_t firstInstance, uint32_t stride, const int32_t* pVertexOffset) override;
Tony-LunarG04717522019-10-17 10:41:17 -0600104 void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700105 uint32_t stride) override;
Tony-LunarG04717522019-10-17 10:41:17 -0600106 void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700107 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600108 void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
109 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700110 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600111 void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
112 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700113 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600114 void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
115 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700116 uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600117 void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
118 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700119 uint32_t stride) override;
Tony-LunarG54176fb2020-12-02 10:47:22 -0700120 void PreCallRecordCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanceCount, uint32_t firstInstance,
121 VkBuffer counterBuffer, VkDeviceSize counterBufferOffset, uint32_t counterOffset,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700122 uint32_t vertexStride) override;
123 void PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600124 void PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700125 uint32_t drawCount, uint32_t stride) override;
Tony-LunarG2fb8ff02020-06-11 12:45:07 -0600126 void PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
127 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700128 uint32_t stride) override;
129 void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) override;
130 void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) override;
Tony-LunarGd13f9b52020-09-08 15:45:45 -0600131 void PreCallRecordCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700132 uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ) override;
Tony-LunarG52c8c602020-09-10 16:29:56 -0600133 void PreCallRecordCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700134 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
135 uint32_t groupCountZ) override;
Tony-LunarG04717522019-10-17 10:41:17 -0600136 void PreCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
137 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
138 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
139 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
140 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
141 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700142 uint32_t width, uint32_t height, uint32_t depth) override;
sourav parmarcd5fb182020-07-17 12:58:44 -0700143 void PreCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
144 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
145 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
146 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
147 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, uint32_t width,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700148 uint32_t height, uint32_t depth) override;
Tony-LunarG1dce2392019-10-23 16:49:29 -0600149 void PreCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700150 const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
151 const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
152 const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
Shannon McPherson54e1f892020-11-27 11:04:19 -0700153 const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
Mark Lobodzinski7a42ff02020-12-03 14:55:57 -0700154 VkDeviceAddress indirectDeviceAddress) override;
sfricke-samsungf91881c2022-03-31 01:12:00 -0500155 void PreCallRecordCmdTraceRaysIndirect2KHR(VkCommandBuffer commandBuffer, VkDeviceAddress indirectDeviceAddress) override;
Tony-LunarGb5fae462020-03-05 12:43:25 -0700156 void AllocateDebugPrintfResources(const VkCommandBuffer cmd_buffer, const VkPipelineBindPoint bind_point);
Jeremy Gebben3d22d582021-08-11 15:37:58 -0600157
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600158 std::shared_ptr<CMD_BUFFER_STATE> CreateCmdBufferState(VkCommandBuffer cb, const VkCommandBufferAllocateInfo* create_info,
Jeremy Gebbencd7fa282021-10-27 10:25:32 -0600159 const COMMAND_POOL_STATE* pool) final;
Jeremy Gebbenf6bb4bb2021-08-11 15:41:09 -0600160
161 void DestroyBuffer(DPFBufferInfo& buffer_info);
Jeremy Gebben14499e82022-03-17 11:03:10 -0600162
Jeremy Gebben5160e032022-03-28 14:57:43 -0600163 private:
Jeremy Gebben14499e82022-03-17 11:03:10 -0600164 bool verbose = false;
165 bool use_stdout = false;
Tony-LunarG04717522019-10-17 10:41:17 -0600166};