mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-06 01:50:38 +00:00
Fix an issue with obj references stacking up on def contexts. Refs #924
This commit is contained in:
@@ -3110,7 +3110,7 @@ void WrappedID3D11DeviceContext::OMSetRenderTargets(UINT NumViews,
|
||||
|
||||
m_CurrentPipelineState->CacheViewportPartial();
|
||||
|
||||
if(IsCaptureMode(m_State))
|
||||
if(IsActiveCapturing(m_State))
|
||||
{
|
||||
// make sure to mark resources referenced even if the OM state is invalid, so they aren't
|
||||
// eliminated from the capture (which might make this combination valid on replay without some
|
||||
@@ -3411,7 +3411,7 @@ void WrappedID3D11DeviceContext::OMSetRenderTargetsAndUnorderedAccessViews(
|
||||
m_CurrentPipelineState->ChangeRefWrite(m_CurrentPipelineState->OM.DepthView, pDepthStencilView);
|
||||
}
|
||||
|
||||
if(IsCaptureMode(m_State))
|
||||
if(IsActiveCapturing(m_State))
|
||||
{
|
||||
// make sure to mark resources referenced if the OM state is invalid, so they aren't
|
||||
// eliminated from the
|
||||
@@ -3450,6 +3450,21 @@ void WrappedID3D11DeviceContext::OMSetRenderTargetsAndUnorderedAccessViews(
|
||||
D3D11_1_UAV_SLOT_COUNT);
|
||||
m_CurrentPipelineState->Change(m_CurrentPipelineState->OM.UAVStartSlot, UAVStartSlot);
|
||||
}
|
||||
|
||||
if(IsActiveCapturing(m_State))
|
||||
{
|
||||
// make sure to mark resources referenced if the OM state is invalid, so they aren't
|
||||
// eliminated from the
|
||||
// log (which might make this combination valid on replay without some of the targets!)
|
||||
for(UINT i = 0; i < NumUAVs; i++)
|
||||
{
|
||||
if(UAVs && UAVs[i])
|
||||
{
|
||||
MarkResourceReferenced(GetIDForResource(UAVs[i]), eFrameRef_Read);
|
||||
MarkResourceReferenced(GetViewResourceResID(UAVs[i]), eFrameRef_Read);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// invalid case where UAV/RTV overlap, UAV seems to take precedence
|
||||
@@ -5280,6 +5295,20 @@ HRESULT WrappedID3D11DeviceContext::FinishCommandList(BOOL RestoreDeferredContex
|
||||
}
|
||||
m_ContextRecord->UnlockChunks();
|
||||
|
||||
// clear the references, and delete the resource records so they aren't kept around forever
|
||||
for(ResourceId id : m_DeferredReferences)
|
||||
{
|
||||
D3D11ResourceRecord *deferredRecord =
|
||||
m_pDevice->GetResourceManager()->GetResourceRecord(id);
|
||||
if(deferredRecord)
|
||||
deferredRecord->Delete(m_pDevice->GetResourceManager());
|
||||
}
|
||||
|
||||
m_DeferredReferences.clear();
|
||||
|
||||
// clear the dirty marks
|
||||
m_DeferredDirty.clear();
|
||||
|
||||
// It's now 'successful' again, being empty
|
||||
m_SuccessfulCapture = true;
|
||||
}
|
||||
@@ -5305,6 +5334,16 @@ HRESULT WrappedID3D11DeviceContext::FinishCommandList(BOOL RestoreDeferredContex
|
||||
// still need to propagate up dirty resources to the immediate context
|
||||
wrapped->SwapDirtyResources(m_DeferredDirty);
|
||||
|
||||
// clear the references and decref the resource records
|
||||
for(ResourceId id : m_DeferredReferences)
|
||||
{
|
||||
D3D11ResourceRecord *deferredRecord = m_pDevice->GetResourceManager()->GetResourceRecord(id);
|
||||
if(deferredRecord)
|
||||
deferredRecord->Delete(m_pDevice->GetResourceManager());
|
||||
}
|
||||
|
||||
m_DeferredReferences.clear();
|
||||
|
||||
RDCDEBUG(
|
||||
"Deferred Context %llu not capturing at the moment, Produced unsuccessful command list "
|
||||
"%llu.",
|
||||
|
||||
Reference in New Issue
Block a user