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.