diff --git a/qrenderdoc/Windows/BufferViewer.cpp b/qrenderdoc/Windows/BufferViewer.cpp index 3fa36d0c3..7a0ef7e74 100644 --- a/qrenderdoc/Windows/BufferViewer.cpp +++ b/qrenderdoc/Windows/BufferViewer.cpp @@ -2200,7 +2200,7 @@ void BufferViewer::stageRowMenu(MeshDataStage stage, QMenu *menu, const QPoint & menu->clear(); - if(m_MeshView && stage != MeshDataStage::GSOut && m_Ctx.CurPipelineState().IsCaptureD3D11()) + if(m_MeshView && stage != MeshDataStage::GSOut && m_Ctx.APIProps().shaderDebugging) { menu->addAction(m_DebugVert); menu->addSeparator(); diff --git a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp index 2830a50f9..e599fcf94 100644 --- a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp @@ -35,8 +35,6 @@ #include "PipelineStateViewer.h" #include "ui_D3D12PipelineStateViewer.h" -#define D3D12SHADERDEBUG_THREAD 0 - struct D3D12VBIBTag { D3D12VBIBTag() { offset = 0; } @@ -1796,9 +1794,9 @@ void D3D12PipelineStateViewer::setState() ui->stencils->clearSelection(); ui->stencils->endUpdate(); -#if D3D12SHADERDEBUG_THREAD != 0 // set up thread debugging inputs - if(state.computeShader.reflection && draw && (draw->flags & DrawFlags::Dispatch)) + if(m_Ctx.APIProps().shaderDebugging && state.computeShader.reflection && draw && + (draw->flags & DrawFlags::Dispatch)) { ui->groupX->setEnabled(true); ui->groupY->setEnabled(true); @@ -1829,7 +1827,6 @@ void D3D12PipelineStateViewer::setState() } } else -#endif { ui->groupX->setEnabled(false); ui->groupY->setEnabled(false); @@ -3125,16 +3122,11 @@ void D3D12PipelineStateViewer::on_meshView_clicked() ToolWindowManager::raiseToolWindow(m_Ctx.GetMeshPreview()->Widget()); } -#if D3D12SHADERDEBUG_THREAD == 0 - void D3D12PipelineStateViewer::on_debugThread_clicked() { -} + if(!m_Ctx.APIProps().shaderDebugging) + return; -#else - -void D3D12PipelineStateViewer::on_debugThread_clicked() -{ if(!m_Ctx.IsCaptureLoaded()) return; @@ -3182,7 +3174,7 @@ void D3D12PipelineStateViewer::on_debugThread_clicked() m_Ctx.Replay().AsyncInvoke([&trace, &done, thread](IReplayController *r) { trace = r->DebugThread(thread.g, thread.t); - if(trace->states.isEmpty()) + if(trace->debugger == NULL) { r->FreeTrace(trace); trace = NULL; @@ -3220,5 +3212,3 @@ void D3D12PipelineStateViewer::on_debugThread_clicked() m_Ctx.AddDockWindow(s->Widget(), DockReference::AddTo, this); } - -#endif // D3D12SHADERDEBUG_THREAD diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index aa9d6312c..b8a54d1f7 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -486,9 +486,8 @@ void TextureViewer::UI_UpdateCachedTexture() m_CachedTexture = m_Ctx.GetTexture(id); - ui->debugPixelContext->setEnabled(m_Ctx.CurPipelineState().IsCaptureD3D11() && - m_CachedTexture != NULL); - ui->pixelHistory->setEnabled(m_Ctx.CurPipelineState().IsCaptureD3D11() && m_CachedTexture != NULL); + ui->debugPixelContext->setEnabled(m_Ctx.APIProps().shaderDebugging && m_CachedTexture != NULL); + ui->pixelHistory->setEnabled(m_Ctx.APIProps().pixelHistory && m_CachedTexture != NULL); } TextureViewer::TextureViewer(ICaptureContext &ctx, QWidget *parent) @@ -2767,7 +2766,7 @@ void TextureViewer::OnCaptureLoaded() ui->locationGoto->setEnabled(true); ui->viewTexBuffer->setEnabled(true); - if(m_Ctx.CurPipelineState().IsCaptureD3D11()) + if(m_Ctx.APIProps().pixelHistory) { ui->pixelHistory->setEnabled(true); ui->pixelHistory->setToolTip(QString()); @@ -2778,7 +2777,7 @@ void TextureViewer::OnCaptureLoaded() ui->pixelHistory->setToolTip(tr("Pixel History not implemented on this API")); } - if(m_Ctx.CurPipelineState().IsCaptureD3D11()) + if(m_Ctx.APIProps().shaderDebugging) { ui->debugPixelContext->setEnabled(true); ui->debugPixelContext->setToolTip(QString()); diff --git a/renderdoc/api/replay/data_types.h b/renderdoc/api/replay/data_types.h index bd732b34d..2de84f1f4 100644 --- a/renderdoc/api/replay/data_types.h +++ b/renderdoc/api/replay/data_types.h @@ -1423,6 +1423,12 @@ worked around by re-sorting bindings. )"); bool shadersMutable = false; + DOCUMENT("(``True`` if the API supports shader debugging."); + bool shaderDebugging = false; + + DOCUMENT("(``True`` if the API supports viewing pixel history."); + bool pixelHistory = false; + DOCUMENT("``True`` if the driver and system are configured to allow creating RGP captures."); bool rgpCapture = false; diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index b3e8912f6..a1ebf1a80 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -561,6 +561,8 @@ APIProperties D3D11Replay::GetAPIProperties() ret.vendor = m_DriverInfo.vendor; ret.degraded = m_WARP; ret.shadersMutable = false; + ret.shaderDebugging = true; + ret.pixelHistory = true; return ret; } diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index ac1282a6c..4a33a0d55 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -32,6 +32,7 @@ #include "maths/formatpacking.h" #include "maths/matrix.h" #include "serialise/rdcfile.h" +#include "strings/string_utils.h" #include "d3d12_command_queue.h" #include "d3d12_debug.h" #include "d3d12_device.h" @@ -271,6 +272,11 @@ APIProperties D3D12Replay::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("d3d12ShaderDebugging")); + if(!strcmp(setting.c_str(), "true") || setting == "1") + ret.shaderDebugging = true; + return ret; } diff --git a/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp b/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp index 41330bbf5..5b8048aba 100644 --- a/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp +++ b/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp @@ -30,9 +30,6 @@ #include "d3d12_resources.h" #include "d3d12_shader_cache.h" -#define D3D12SHADERDEBUG_PIXEL 0 -#define D3D12SHADERDEBUG_THREAD 0 - struct DebugHit { uint32_t numHits; @@ -1144,20 +1141,15 @@ ShaderDebugTrace *D3D12Replay::DebugVertex(uint32_t eventId, uint32_t vertid, ui return new ShaderDebugTrace(); } -#if D3D12SHADERDEBUG_PIXEL == 0 - ShaderDebugTrace *D3D12Replay::DebugPixel(uint32_t eventId, uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive) { - RDCUNIMPLEMENTED("Pixel debugging not yet implemented for D3D12"); - return new ShaderDebugTrace(); -} + if(!GetAPIProperties().shaderDebugging) + { + RDCUNIMPLEMENTED("Pixel debugging not yet implemented for D3D12"); + return new ShaderDebugTrace(); + } -#else - -ShaderDebugTrace *D3D12Replay::DebugPixel(uint32_t eventId, uint32_t x, uint32_t y, uint32_t sample, - uint32_t primitive) -{ using namespace DXBC; using namespace DXBCBytecode; using namespace DXBCDebug; @@ -1669,22 +1661,15 @@ void ExtractInputsPS(PSInput IN, float4 debug_pixelPos : SV_Position, uint prim return ret; } -#endif // D3D12SHADERDEBUG_PIXEL - -#if D3D12SHADERDEBUG_THREAD == 0 - ShaderDebugTrace *D3D12Replay::DebugThread(uint32_t eventId, const uint32_t groupid[3], const uint32_t threadid[3]) { - RDCUNIMPLEMENTED("Compute shader debugging not yet implemented for D3D12"); - return new ShaderDebugTrace(); -} + if(!GetAPIProperties().shaderDebugging) + { + RDCUNIMPLEMENTED("Compute shader debugging not yet implemented for D3D12"); + return new ShaderDebugTrace(); + } -#else - -ShaderDebugTrace *D3D12Replay::DebugThread(uint32_t eventId, const uint32_t groupid[3], - const uint32_t threadid[3]) -{ using namespace DXBCBytecode; using namespace DXBCDebug; @@ -1789,8 +1774,6 @@ ShaderDebugTrace *D3D12Replay::DebugThread(uint32_t eventId, const uint32_t grou return ret; } -#endif // D3D12SHADERDEBUG_THREAD - rdcarray D3D12Replay::ContinueDebug(ShaderDebugger *debugger) { DXBCDebug::InterpretDebugger *interpreter = (DXBCDebug::InterpretDebugger *)debugger; diff --git a/renderdoc/replay/renderdoc_serialise.inl b/renderdoc/replay/renderdoc_serialise.inl index bc269a7de..7e048107d 100644 --- a/renderdoc/replay/renderdoc_serialise.inl +++ b/renderdoc/replay/renderdoc_serialise.inl @@ -486,13 +486,16 @@ void DoSerialise(SerialiserType &ser, APIProperties &el) SERIALISE_MEMBER(degraded); SERIALISE_MEMBER(shadersMutable); + SERIALISE_MEMBER(shaderDebugging); + SERIALISE_MEMBER(pixelHistory); + SERIALISE_MEMBER(ShaderLinkage); SERIALISE_MEMBER(YUVTextures); SERIALISE_MEMBER(SparseResources); SERIALISE_MEMBER(MultiGPU); SERIALISE_MEMBER(D3D12Bundle); - SIZE_CHECK(20); + SIZE_CHECK(24); } template