mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-09-24 06:36:08 +00:00
Fix handling of base vertex in D3D11. Closes #1862
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<D3D12_INPUT_ELEMENT_DESC> 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 =
|
||||
|
||||
Reference in New Issue
Block a user