From e9b92a5ca76c6638ce0485b99b2095681177b764 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 12 May 2020 18:33:09 +0100 Subject: [PATCH] Fix handling of base vertex in D3D11. Closes #1862 --- renderdoc/driver/d3d11/d3d11_postvs.cpp | 24 ++------------------ renderdoc/driver/d3d11/d3d11_shaderdebug.cpp | 4 +++- renderdoc/driver/d3d12/d3d12_postvs.cpp | 24 ++------------------ renderdoc/driver/d3d12/d3d12_shaderdebug.cpp | 4 +--- 4 files changed, 8 insertions(+), 48 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_postvs.cpp b/renderdoc/driver/d3d11/d3d11_postvs.cpp index f946211e3..0a0108811 100644 --- a/renderdoc/driver/d3d11/d3d11_postvs.cpp +++ b/renderdoc/driver/d3d11/d3d11_postvs.cpp @@ -361,23 +361,11 @@ void D3D11Replay::InitPostVSBuffers(uint32_t eventId) uint32_t numIndices = RDCMIN(uint32_t(index16 ? idxdata.size() / 2 : idxdata.size() / 4), drawcall->numIndices); - uint32_t idxclamp = 0; - if(drawcall->baseVertex < 0) - idxclamp = uint32_t(-drawcall->baseVertex); - // grab all unique vertex indices referenced for(uint32_t i = 0; i < numIndices; i++) { uint32_t i32 = index16 ? uint32_t(idx16[i]) : idx32[i]; - // apply baseVertex but clamp to 0 (don't allow index to become negative) - if(i32 < idxclamp) - i32 = 0; - else if(drawcall->baseVertex < 0) - i32 -= idxclamp; - else if(drawcall->baseVertex > 0) - i32 += drawcall->baseVertex; - auto it = std::lower_bound(indices.begin(), indices.end(), i32); if(it != indices.end() && *it == i32) @@ -448,9 +436,9 @@ void D3D11Replay::InitPostVSBuffers(uint32_t eventId) if(drawcall->flags & DrawFlags::Instanced) m_pImmediateContext->DrawIndexedInstanced((UINT)indices.size(), drawcall->numInstances, 0, - 0, drawcall->instanceOffset); + drawcall->baseVertex, drawcall->instanceOffset); else - m_pImmediateContext->DrawIndexed((UINT)indices.size(), 0, 0); + m_pImmediateContext->DrawIndexed((UINT)indices.size(), 0, drawcall->baseVertex); m_pImmediateContext->End(m_SOStatsQueries[0]); @@ -464,14 +452,6 @@ void D3D11Replay::InitPostVSBuffers(uint32_t eventId) if(i32 == (index16 ? 0xffff : 0xffffffff)) continue; - // apply baseVertex but clamp to 0 (don't allow index to become negative) - if(i32 < idxclamp) - i32 = 0; - else if(drawcall->baseVertex < 0) - i32 -= idxclamp; - else if(drawcall->baseVertex > 0) - i32 += drawcall->baseVertex; - if(index16) idx16[i] = uint16_t(indexRemap[i32]); else diff --git a/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp b/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp index 799ea8ad5..c9837122c 100644 --- a/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp +++ b/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp @@ -2076,7 +2076,9 @@ ShaderDebugTrace *D3D11Replay::DebugVertex(uint32_t eventId, uint32_t vertid, ui uint32_t sv_vertid = vertid; if(draw->flags & DrawFlags::Indexed) - sv_vertid = idx; + { + sv_vertid = idx - draw->baseVertex; + } if(dxbc->GetReflection()->InputSig[i].varType == VarType::Float) state.inputs[i].value.f.x = state.inputs[i].value.f.y = state.inputs[i].value.f.z = diff --git a/renderdoc/driver/d3d12/d3d12_postvs.cpp b/renderdoc/driver/d3d12/d3d12_postvs.cpp index c7300ff80..dcb400d0b 100644 --- a/renderdoc/driver/d3d12/d3d12_postvs.cpp +++ b/renderdoc/driver/d3d12/d3d12_postvs.cpp @@ -413,23 +413,11 @@ void D3D12Replay::InitPostVSBuffers(uint32_t eventId) uint32_t numIndices = RDCMIN(uint32_t(idxdata.size() / RDCMAX(1, rs.ibuffer.bytewidth)), drawcall->numIndices); - uint32_t idxclamp = 0; - if(drawcall->baseVertex < 0) - idxclamp = uint32_t(-drawcall->baseVertex); - // grab all unique vertex indices referenced for(uint32_t i = 0; i < numIndices; i++) { uint32_t i32 = rs.ibuffer.bytewidth == 2 ? uint32_t(idx16[i]) : idx32[i]; - // apply baseVertex but clamp to 0 (don't allow index to become negative) - if(i32 < idxclamp) - i32 = 0; - else if(drawcall->baseVertex < 0) - i32 -= idxclamp; - else if(drawcall->baseVertex > 0) - i32 += drawcall->baseVertex; - auto it = std::lower_bound(indices.begin(), indices.end(), i32); if(it != indices.end() && *it == i32) @@ -516,8 +504,8 @@ void D3D12Replay::InitPostVSBuffers(uint32_t eventId) list->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST); - list->DrawIndexedInstanced((UINT)indices.size(), drawcall->numInstances, 0, 0, - drawcall->instanceOffset); + list->DrawIndexedInstanced((UINT)indices.size(), drawcall->numInstances, 0, + drawcall->baseVertex, drawcall->instanceOffset); uint32_t stripCutValue = 0; if(psoDesc.IBStripCutValue == D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFF) @@ -535,14 +523,6 @@ void D3D12Replay::InitPostVSBuffers(uint32_t eventId) if(stripCutValue && i32 == stripCutValue) continue; - // apply baseVertex but clamp to 0 (don't allow index to become negative) - if(i32 < idxclamp) - i32 = 0; - else if(drawcall->baseVertex < 0) - i32 -= idxclamp; - else if(drawcall->baseVertex > 0) - i32 += drawcall->baseVertex; - if(rs.ibuffer.bytewidth == 2) idx16[i] = uint16_t(indexRemap[i32]); else diff --git a/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp b/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp index 201d1f9ef..5cbcb5b5f 100644 --- a/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp +++ b/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp @@ -1730,8 +1730,6 @@ ShaderDebugTrace *D3D12Replay::DebugVertex(uint32_t eventId, uint32_t vertid, ui const DrawcallDescription *draw = m_pDevice->GetDrawcall(eventId); - pso->graphics->InputLayout; - rdcarray inputlayout; uint32_t numElements = pso->graphics->InputLayout.NumElements; inputlayout.reserve(numElements); @@ -2024,7 +2022,7 @@ ShaderDebugTrace *D3D12Replay::DebugVertex(uint32_t eventId, uint32_t vertid, ui uint32_t sv_vertid = vertid; if(draw->flags & DrawFlags::Indexed) - sv_vertid = idx; + sv_vertid = idx - draw->baseVertex; if(dxbc->GetReflection()->InputSig[i].varType == VarType::Float) state.inputs[i].value.f.x = state.inputs[i].value.f.y = state.inputs[i].value.f.z =