Fix handling of base vertex in D3D11. Closes #1862

This commit is contained in:
baldurk
2020-05-12 19:04:57 +01:00
parent a8f1bc3881
commit e9b92a5ca7
4 changed files with 8 additions and 48 deletions
+2 -22
View File
@@ -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
+3 -1
View File
@@ -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 =
+2 -22
View File
@@ -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
+1 -3
View File
@@ -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 =