From 3b37816a8ba9e46dfe219ffed8bed4299b30f897 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 25 Jul 2019 12:25:58 +0100 Subject: [PATCH] Fix structure stride calculation for array inputs * This could cause multiple primitive data to be incorrect --- renderdoc/driver/d3d11/d3d11_shaderdebug.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp b/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp index 587e75105..b1de81d6b 100644 --- a/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp +++ b/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp @@ -1337,9 +1337,6 @@ ShaderDebugTrace D3D11Replay::DebugPixel(uint32_t eventId, uint32_t x, uint32_t (dxbc->m_InputSig[i].regChannelMask & 0x4 ? 1 : 0) + (dxbc->m_InputSig[i].regChannelMask & 0x8 ? 1 : 0); - if(included) - structureStride += 4 * numCols; - std::string name = dxbc->m_InputSig[i].semanticIdxName; // arrays of interpolators are handled really weirdly. They use cbuffer @@ -1398,6 +1395,12 @@ ShaderDebugTrace D3D11Replay::DebugPixel(uint32_t eventId, uint32_t x, uint32_t make_rdcpair(dxbc->m_InputSig[i].semanticIndex, nextIdx - 1))); } + if(included) + { + // in UAV structs, arrays are packed tightly, so just multiply by arrayLength + structureStride += 4 * numCols * RDCMAX(1, arrayLength); + } + // as another side effect of the above, an element declared as a 1-length array won't be // detected but it WILL be put in its own register (not packed together), so detect this // case too.