From 1ab434d9836931a825484dcec8b1b15e4eccdc15 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 19 Mar 2025 12:55:08 +0000 Subject: [PATCH] Work around NV driver bug miscompiling quadSwizzleHelper() in some cases --- renderdoc/driver/d3d11/d3d11_shaderdebug.cpp | 1 + renderdoc/driver/d3d12/d3d12_shaderdebug.cpp | 3 +++ renderdoc/driver/shaders/dxbc/dx_debug.cpp | 10 +++++++++- renderdoc/driver/shaders/dxbc/dx_debug.h | 1 + 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp b/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp index 4176a8b4a..6844956d5 100644 --- a/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp +++ b/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp @@ -1863,6 +1863,7 @@ ShaderDebugTrace *D3D11Replay::DebugPixel(uint32_t eventId, uint32_t x, uint32_t cfg.x = x; cfg.y = y; + cfg.waveOps = false; cfg.maxWaveSize = 4; ID3D11DepthStencilView *depthView = NULL; diff --git a/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp b/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp index e9d67da04..33927c794 100644 --- a/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp +++ b/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp @@ -2235,6 +2235,7 @@ ShaderDebugTrace *D3D12Replay::DebugVertex(uint32_t eventId, uint32_t vertid, ui cfg.vert = sv_vertid; cfg.inst = instid; cfg.uavslot = 1; + cfg.waveOps = m_pDevice->GetOpts1().WaveOps != FALSE; cfg.maxWaveSize = m_pDevice->GetOpts1().WaveLaneCountMax; DXDebug::CreateInputFetcher(dxbc, NULL, cfg, fetcher); @@ -2821,6 +2822,7 @@ ShaderDebugTrace *D3D12Replay::DebugPixel(uint32_t eventId, uint32_t x, uint32_t cfg.x = x; cfg.y = y; cfg.uavslot = 1; + cfg.waveOps = m_pDevice->GetOpts1().WaveOps != FALSE; cfg.maxWaveSize = 4; cfg.outputSampleCount = RDCMAX(1U, pipeDesc.SampleDesc.Count); @@ -3474,6 +3476,7 @@ ShaderDebugTrace *D3D12Replay::DebugThread(uint32_t eventId, groupid[2] * threadDim[2] + threadid[2], }; cfg.uavslot = 1; + cfg.waveOps = m_pDevice->GetOpts1().WaveOps != FALSE; cfg.maxWaveSize = m_pDevice->GetOpts1().WaveLaneCountMax; DXDebug::CreateInputFetcher(dxbc, NULL, cfg, fetcher); diff --git a/renderdoc/driver/shaders/dxbc/dx_debug.cpp b/renderdoc/driver/shaders/dxbc/dx_debug.cpp index 8bf867583..f23e5cdda 100644 --- a/renderdoc/driver/shaders/dxbc/dx_debug.cpp +++ b/renderdoc/driver/shaders/dxbc/dx_debug.cpp @@ -378,7 +378,15 @@ void CreateLegacyInputFetcher(const DXBC::DXBCContainer *dxbc, const InputFetche (sizeof(DXDebug::PSLaneData) + fetcher.laneDataBufferStride) * cfg.maxWaveSize; fetcher.laneDataBufferStride = 0; - fetcher.hlsl += GetEmbeddedResource(quadswizzle_hlsl); + bool dxil = dxbc->GetDXILByteCode() != NULL; + + // work around NV driver bug - it miscompiles the quad swizzle helper sometimes, so use the wave op instead + if(!dxil || !cfg.waveOps) + fetcher.hlsl += GetEmbeddedResource(quadswizzle_hlsl); + else + fetcher.hlsl += + "#define quadSwizzleHelper(value, quadLaneIndex, readIndex) " + "QuadReadLaneAt(value, readIndex)\n"; fetcher.hlsl += R"( struct LaneData diff --git a/renderdoc/driver/shaders/dxbc/dx_debug.h b/renderdoc/driver/shaders/dxbc/dx_debug.h index 5c2c89b34..3e79ca374 100644 --- a/renderdoc/driver/shaders/dxbc/dx_debug.h +++ b/renderdoc/driver/shaders/dxbc/dx_debug.h @@ -182,6 +182,7 @@ struct InputFetcherConfig uint32_t uavslot = 0; uint32_t uavspace = 0; uint32_t maxWaveSize = 64; + bool waveOps = false; uint32_t outputSampleCount = 1; };