From c4037e9246678cb29f6ebaac50b0add6fbb56dec Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 13 Feb 2020 11:31:58 +0000 Subject: [PATCH] Enable vulkan shader debugging on a hidden config setting --- renderdoc/driver/shaders/spirv/spirv_debug.h | 14 ++++++++++++-- .../shaders/spirv/spirv_debug_setup.cpp | 6 +++++- renderdoc/driver/vulkan/vk_core.h | 3 ++- renderdoc/driver/vulkan/vk_replay.cpp | 5 +++++ renderdoc/driver/vulkan/vk_shaderdebug.cpp | 19 +++++++++++++++++-- 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_debug.h b/renderdoc/driver/shaders/spirv/spirv_debug.h index 8214ce1af..90ca01b9f 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug.h +++ b/renderdoc/driver/shaders/spirv/spirv_debug.h @@ -30,6 +30,13 @@ namespace rdcspv { +class DebugAPIWrapper +{ +public: + virtual ~DebugAPIWrapper() {} + virtual void AddDebugMessage(MessageCategory c, MessageSeverity sv, MessageSource src, rdcstr d) = 0; +}; + struct GlobalState { public: @@ -69,8 +76,8 @@ public: Debugger(); ~Debugger(); virtual void Parse(const rdcarray &spirvWords); - ShaderDebugTrace *BeginDebug(const ShaderStage stage, const rdcstr &entryPoint, - const rdcarray &specInfo, + ShaderDebugTrace *BeginDebug(DebugAPIWrapper *apiWrapper, const ShaderStage stage, + const rdcstr &entryPoint, const rdcarray &specInfo, const std::map &instructionLines, uint32_t activeIndex); @@ -83,6 +90,8 @@ private: virtual void PostParse(); virtual void RegisterOp(Iter it); + DebugAPIWrapper *apiWrapper = NULL; + GlobalState global; rdcarray workgroup; @@ -90,6 +99,7 @@ private: rdcarray instructionOffsets; uint32_t activeLaneIndex = 0; + ShaderStage stage; int steps = 0; diff --git a/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp b/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp index b4618760a..610050d02 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp @@ -41,6 +41,7 @@ Debugger::Debugger() Debugger::~Debugger() { + SAFE_DELETE(apiWrapper); } void Debugger::Parse(const rdcarray &spirvWords) @@ -48,7 +49,8 @@ void Debugger::Parse(const rdcarray &spirvWords) Processor::Parse(spirvWords); } -ShaderDebugTrace *Debugger::BeginDebug(const ShaderStage stage, const rdcstr &entryPoint, +ShaderDebugTrace *Debugger::BeginDebug(DebugAPIWrapper *apiWrapper, const ShaderStage stage, + const rdcstr &entryPoint, const rdcarray &specInfo, const std::map &instructionLines, uint32_t activeIndex) @@ -56,6 +58,8 @@ ShaderDebugTrace *Debugger::BeginDebug(const ShaderStage stage, const rdcstr &en ShaderDebugTrace *ret = new ShaderDebugTrace; ret->debugger = this; this->activeLaneIndex = activeIndex; + this->stage = stage; + this->apiWrapper = apiWrapper; int workgroupSize = stage == ShaderStage::Pixel ? 4 : 1; for(int i = 0; i < workgroupSize; i++) diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index f93dabb13..d9fb065b5 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -275,7 +275,6 @@ private: rdcarray GetDebugMessages(); void AddDebugMessage(DebugMessage msg); - void AddDebugMessage(MessageCategory c, MessageSeverity sv, MessageSource src, rdcstr d); CaptureState m_State; bool m_AppControlledCapture = false; @@ -962,6 +961,8 @@ public: uint32_t GetQueueFamilyIndex() const { return m_QueueFamilyIdx; } bool ReleaseResource(WrappedVkRes *res); + void AddDebugMessage(MessageCategory c, MessageSeverity sv, MessageSource src, rdcstr d); + ReplayStatus Initialise(VkInitParams ¶ms, uint64_t sectionVersion, const ReplayOptions &opts); uint64_t GetLogVersion() { return m_SectionVersion; } void SetStructuredExport(uint64_t sectionVersion) diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index ef1154764..319103602 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -187,6 +187,11 @@ APIProperties VulkanReplay::GetAPIProperties() ret.rgpCapture = m_DriverInfo.vendor == GPUVendor::AMD && m_RGP != NULL && m_RGP->DriverSupportsInterop(); + // Enable shader debugging if specified in the config + rdcstr setting = strlower(RenderDoc::Inst().GetConfigSetting("vulkanShaderDebugging")); + if(!strcmp(setting.c_str(), "true") || setting == "1") + ret.shaderDebugging = true; + return ret; } diff --git a/renderdoc/driver/vulkan/vk_shaderdebug.cpp b/renderdoc/driver/vulkan/vk_shaderdebug.cpp index 632b1318d..5ace678fc 100644 --- a/renderdoc/driver/vulkan/vk_shaderdebug.cpp +++ b/renderdoc/driver/vulkan/vk_shaderdebug.cpp @@ -26,6 +26,20 @@ #include "vk_core.h" #include "vk_replay.h" +class VulkanAPIWrapper : public rdcspv::DebugAPIWrapper +{ +public: + VulkanAPIWrapper(WrappedVulkan *vk) { m_pDriver = vk; } + virtual void AddDebugMessage(MessageCategory c, MessageSeverity sv, MessageSource src, + rdcstr d) override + { + m_pDriver->AddDebugMessage(c, sv, src, d); + } + +private: + WrappedVulkan *m_pDriver = NULL; +}; + ShaderDebugTrace *VulkanReplay::DebugVertex(uint32_t eventId, uint32_t vertid, uint32_t instid, uint32_t idx) { @@ -49,11 +63,12 @@ ShaderDebugTrace *VulkanReplay::DebugVertex(uint32_t eventId, uint32_t vertid, u shader.GetReflection(entryPoint, state.graphics.pipeline); shadRefl.PopulateDisassembly(shader.spirv); + VulkanAPIWrapper *apiWrapper = new VulkanAPIWrapper(m_pDriver); rdcspv::Debugger *debugger = new rdcspv::Debugger; debugger->Parse(shader.spirv.GetSPIRV()); - ShaderDebugTrace *ret = - debugger->BeginDebug(ShaderStage::Vertex, entryPoint, spec, shadRefl.instructionLines, 0); + ShaderDebugTrace *ret = debugger->BeginDebug(apiWrapper, ShaderStage::Vertex, entryPoint, spec, + shadRefl.instructionLines, 0); return ret; }