Skip to content

Commit 9fe8cb8

Browse files
committed
Fix invalid query used if primitive indices are duplicated
1 parent cca9def commit 9fe8cb8

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

renderdoc/driver/d3d12/d3d12_pixelhistory.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2570,8 +2570,7 @@ struct D3D12PixelHistoryDiscardedFragmentsCallback : D3D12PixelHistoryCallback
25702570

25712571
for(uint32_t i = 0; i < primIds.size(); i++)
25722572
{
2573-
uint32_t queryId = (uint32_t)m_OcclusionQueries.size();
2574-
cmd->BeginQuery(m_OcclusionQueryHeap, D3D12_QUERY_TYPE_OCCLUSION, queryId);
2573+
cmd->BeginQuery(m_OcclusionQueryHeap, D3D12_QUERY_TYPE_OCCLUSION, m_CurQuery);
25752574

25762575
uint32_t primId = primIds[i];
25772576
ActionDescription action = *m_pDevice->GetAction(eid);
@@ -2584,9 +2583,10 @@ struct D3D12PixelHistoryDiscardedFragmentsCallback : D3D12PixelHistoryCallback
25842583
// TODO replay with a dummy index buffer so that all primitives other than the target
25852584
// one are degenerate - that way the vertex index etc is still the same as it should be.
25862585
m_pDevice->ReplayDraw(cmd, action);
2587-
cmd->EndQuery(m_OcclusionQueryHeap, D3D12_QUERY_TYPE_OCCLUSION, queryId);
2586+
cmd->EndQuery(m_OcclusionQueryHeap, D3D12_QUERY_TYPE_OCCLUSION, m_CurQuery);
25882587

2589-
m_OcclusionQueries[make_rdcpair<uint32_t, uint32_t>(eid, primId)] = queryId;
2588+
m_OcclusionQueries[make_rdcpair<uint32_t, uint32_t>(eid, primId)] = m_CurQuery;
2589+
m_CurQuery++;
25902590
}
25912591

25922592
state = prevState;
@@ -2608,7 +2608,7 @@ struct D3D12PixelHistoryDiscardedFragmentsCallback : D3D12PixelHistoryCallback
26082608
D3D12_RESOURCE_DESC bufDesc;
26092609
bufDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
26102610
bufDesc.Alignment = 0;
2611-
bufDesc.Width = sizeof(uint64_t) * m_OcclusionQueries.size();
2611+
bufDesc.Width = sizeof(uint64_t) * m_CurQuery;
26122612
bufDesc.Height = 1;
26132613
bufDesc.DepthOrArraySize = 1;
26142614
bufDesc.MipLevels = 1;
@@ -2633,8 +2633,8 @@ struct D3D12PixelHistoryDiscardedFragmentsCallback : D3D12PixelHistoryCallback
26332633
if(!list)
26342634
return;
26352635

2636-
list->ResolveQueryData(m_OcclusionQueryHeap, D3D12_QUERY_TYPE_OCCLUSION, 0,
2637-
(UINT)m_OcclusionQueries.size(), readbackBuf, 0);
2636+
list->ResolveQueryData(m_OcclusionQueryHeap, D3D12_QUERY_TYPE_OCCLUSION, 0, m_CurQuery,
2637+
readbackBuf, 0);
26382638

26392639
list->Close();
26402640

@@ -2655,7 +2655,7 @@ struct D3D12PixelHistoryDiscardedFragmentsCallback : D3D12PixelHistoryCallback
26552655
return;
26562656
}
26572657

2658-
m_OcclusionResults.resize(m_OcclusionQueries.size());
2658+
m_OcclusionResults.resize(m_CurQuery);
26592659
for(size_t i = 0; i < m_OcclusionResults.size(); ++i)
26602660
m_OcclusionResults[i] = data[i];
26612661

@@ -2728,6 +2728,7 @@ struct D3D12PixelHistoryDiscardedFragmentsCallback : D3D12PixelHistoryCallback
27282728
}
27292729

27302730
std::map<rdcpair<uint32_t, uint32_t>, uint32_t> m_OcclusionQueries;
2731+
uint32_t m_CurQuery = 0;
27312732
rdcarray<uint64_t> m_OcclusionResults;
27322733

27332734
rdcarray<ID3D12PipelineState *> m_PSOsToDestroy;

0 commit comments

Comments
 (0)