From 95e63cb96567cb7e849960116d46006422d76d8e Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 15 May 2019 10:57:11 +0100 Subject: [PATCH] Remove pending-dirty operations, mark resources dirty immediately * Now that the dirty list is only read once at the start of the frame we can mark resources dirty mid-frame freely and don't have to defer that. The internal resource manager locking prevents us from adding to the list while it is being modified. --- renderdoc/core/resource_manager.cpp | 3 - renderdoc/core/resource_manager.h | 46 +------- renderdoc/driver/d3d11/d3d11_context.cpp | 11 -- renderdoc/driver/d3d11/d3d11_context.h | 2 - .../driver/d3d11/d3d11_context1_wrap.cpp | 12 +-- renderdoc/driver/d3d11/d3d11_context_wrap.cpp | 72 +++++-------- renderdoc/driver/d3d11/d3d11_device.cpp | 2 - .../driver/d3d12/d3d12_command_queue_wrap.cpp | 18 +--- renderdoc/driver/d3d12/d3d12_device.cpp | 4 - renderdoc/driver/d3d12/d3d12_device_wrap.cpp | 32 +----- renderdoc/driver/d3d12/d3d12_device_wrap4.cpp | 8 +- renderdoc/driver/gl/gl_driver.cpp | 10 -- renderdoc/driver/gl/gl_driver.h | 3 - renderdoc/driver/gl/gl_manager.cpp | 3 - renderdoc/driver/gl/gl_manager.h | 4 - renderdoc/driver/gl/gl_renderstate.cpp | 5 +- renderdoc/driver/gl/gl_renderstate.h | 2 +- .../driver/gl/wrappers/gl_buffer_funcs.cpp | 44 +++----- .../driver/gl/wrappers/gl_draw_funcs.cpp | 4 +- .../gl/wrappers/gl_framebuffer_funcs.cpp | 93 +++------------- .../driver/gl/wrappers/gl_shader_funcs.cpp | 1 - .../driver/gl/wrappers/gl_texture_funcs.cpp | 81 +++++--------- renderdoc/driver/vulkan/vk_core.cpp | 8 +- renderdoc/driver/vulkan/vk_manager.h | 1 - .../vulkan/wrappers/vk_descriptor_funcs.cpp | 12 +-- .../driver/vulkan/wrappers/vk_queue_funcs.cpp | 101 +++++------------- .../vulkan/wrappers/vk_resource_funcs.cpp | 49 +-------- 27 files changed, 134 insertions(+), 497 deletions(-) diff --git a/renderdoc/core/resource_manager.cpp b/renderdoc/core/resource_manager.cpp index c0e36ae03..8833015af 100644 --- a/renderdoc/core/resource_manager.cpp +++ b/renderdoc/core/resource_manager.cpp @@ -170,10 +170,7 @@ void ResourceRecord::Delete(ResourceRecordHandler *mgr) DeleteChunks(); if(ResID != ResourceId()) - { - mgr->MarkCleanResource(ResID); mgr->RemoveResourceRecord(ResID); - } mgr->DestroyResourceRecord(this); } diff --git a/renderdoc/core/resource_manager.h b/renderdoc/core/resource_manager.h index 6d7416485..4e7dc0e96 100644 --- a/renderdoc/core/resource_manager.h +++ b/renderdoc/core/resource_manager.h @@ -199,8 +199,6 @@ class ResourceRecordHandler { public: virtual void MarkDirtyResource(ResourceId id) = 0; - virtual void MarkCleanResource(ResourceId id) = 0; - virtual void MarkPendingDirty(ResourceId id) = 0; virtual void RemoveResourceRecord(ResourceId id) = 0; virtual void MarkResourceFrameReferenced(ResourceId id, FrameRefType refType) = 0; virtual void DestroyResourceRecord(ResourceRecord *record) = 0; @@ -492,14 +490,6 @@ public: // of the frame. inline void MarkDirtyResource(ResourceId res); - // for use when we might be mid-capture, this will get flushed to dirty state before the - // next frame but is safe to use mid-capture - void MarkPendingDirty(ResourceId res); - void FlushPendingDirty(); - - // this can be used when the resource is cleared or similar and it's in a known state - void MarkCleanResource(ResourceId res); - // returns if the resource has been marked as dirty bool IsResourceDirty(ResourceId res); @@ -603,7 +593,6 @@ protected: // used during capture - holds resources marked as dirty, needing initial contents set m_DirtyResources; - set m_PendingDirtyResources; struct InitialContentDataOrChunk { @@ -717,26 +706,6 @@ void ResourceManager::MarkDirtyResource(ResourceId res) m_DirtyResources.insert(res); } -template -void ResourceManager::MarkPendingDirty(ResourceId res) -{ - SCOPED_LOCK(m_Lock); - - if(res == ResourceId()) - return; - - m_PendingDirtyResources.insert(res); -} - -template -void ResourceManager::FlushPendingDirty() -{ - SCOPED_LOCK(m_Lock); - - m_DirtyResources.insert(m_PendingDirtyResources.begin(), m_PendingDirtyResources.end()); - m_PendingDirtyResources.clear(); -} - template bool ResourceManager::IsResourceDirty(ResourceId res) { @@ -748,20 +717,6 @@ bool ResourceManager::IsResourceDirty(ResourceId res) return m_DirtyResources.find(res) != m_DirtyResources.end(); } -template -void ResourceManager::MarkCleanResource(ResourceId res) -{ - SCOPED_LOCK(m_Lock); - - if(res == ResourceId()) - return; - - if(IsResourceDirty(res)) - { - m_DirtyResources.erase(res); - } -} - template void ResourceManager::SetInitialContents(ResourceId id, InitialContentData contents) { @@ -1431,6 +1386,7 @@ void ResourceManager::ReleaseCurrentResource(ResourceId id) RDCASSERT(m_CurrentResourceMap.find(id) != m_CurrentResourceMap.end(), id); m_CurrentResourceMap.erase(id); + m_DirtyResources.erase(id); } template diff --git a/renderdoc/driver/d3d11/d3d11_context.cpp b/renderdoc/driver/d3d11/d3d11_context.cpp index 7515df67a..113d0f7d2 100644 --- a/renderdoc/driver/d3d11/d3d11_context.cpp +++ b/renderdoc/driver/d3d11/d3d11_context.cpp @@ -621,14 +621,6 @@ void WrappedID3D11DeviceContext::CleanupCapture() m_ContextRecord->UnlockChunks(); m_ContextRecord->FreeParents(m_pDevice->GetResourceManager()); - - for(auto it = m_MissingTracks.begin(); it != m_MissingTracks.end(); ++it) - { - if(m_pDevice->GetResourceManager()->HasResourceRecord(*it)) - MarkDirtyResource(*it); - } - - m_MissingTracks.clear(); } void WrappedID3D11DeviceContext::BeginFrame() @@ -642,9 +634,6 @@ void WrappedID3D11DeviceContext::BeginFrame() void WrappedID3D11DeviceContext::EndFrame() { DrainAnnotationQueue(); - - if(IsBackgroundCapturing(m_State)) - m_pDevice->GetResourceManager()->FlushPendingDirty(); } bool WrappedID3D11DeviceContext::IsFL11_1() diff --git a/renderdoc/driver/d3d11/d3d11_context.h b/renderdoc/driver/d3d11/d3d11_context.h index d7566417d..5488aacb0 100644 --- a/renderdoc/driver/d3d11/d3d11_context.h +++ b/renderdoc/driver/d3d11/d3d11_context.h @@ -161,8 +161,6 @@ private: map m_MapResourceRecordAllocs; - set m_MissingTracks; - ResourceId m_ResourceID; D3D11ResourceRecord *m_ContextRecord; diff --git a/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp b/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp index 1476d187c..41e433f89 100644 --- a/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_context1_wrap.cpp @@ -379,7 +379,7 @@ void WrappedID3D11DeviceContext::UpdateSubresource1(ID3D11Resource *pDstResource MarkResourceReferenced(GetIDForResource(pDstResource), eFrameRef_PartialWrite); - m_MissingTracks.insert(GetIDForResource(pDstResource)); + MarkDirtyResource(GetIDForResource(pDstResource)); m_ContextRecord->AddChunk(scope.Get()); } @@ -463,7 +463,7 @@ void WrappedID3D11DeviceContext::CopySubresourceRegion1(ID3D11Resource *pDstReso Serialise_CopySubresourceRegion1(ser, pDstResource, DstSubresource, DstX, DstY, DstZ, pSrcResource, SrcSubresource, pSrcBox, CopyFlags); - m_MissingTracks.insert(GetIDForResource(pDstResource)); + MarkDirtyResource(GetIDForResource(pDstResource)); m_ContextRecord->AddChunk(scope.Get()); } @@ -621,7 +621,7 @@ void WrappedID3D11DeviceContext::ClearView(ID3D11View *pView, const FLOAT Color[ ID3D11Resource *viewRes = NULL; pView->GetResource(&viewRes); - m_MissingTracks.insert(GetIDForResource(viewRes)); + MarkDirtyResource(GetIDForResource(viewRes)); MarkResourceReferenced(GetIDForResource(viewRes), eFrameRef_PartialWrite); SAFE_RELEASE(viewRes); @@ -1768,7 +1768,7 @@ void WrappedID3D11DeviceContext::DiscardResource(ID3D11Resource *pResource) SERIALISE_ELEMENT(m_ResourceID).Named("Context").TypedAs("ID3D11DeviceContext *"); Serialise_DiscardResource(ser, pResource); - m_MissingTracks.insert(GetIDForResource(pResource)); + MarkDirtyResource(GetIDForResource(pResource)); MarkResourceReferenced(GetIDForResource(pResource), eFrameRef_PartialWrite); m_ContextRecord->AddChunk(scope.Get()); @@ -1924,7 +1924,7 @@ void WrappedID3D11DeviceContext::DiscardView(ID3D11View *pResourceView) ID3D11Resource *viewRes = NULL; pResourceView->GetResource(&viewRes); - m_MissingTracks.insert(GetIDForResource(viewRes)); + MarkDirtyResource(GetIDForResource(viewRes)); MarkResourceReferenced(GetIDForResource(viewRes), eFrameRef_PartialWrite); SAFE_RELEASE(viewRes); @@ -2092,7 +2092,7 @@ void WrappedID3D11DeviceContext::DiscardView1(ID3D11View *pResourceView, const D ID3D11Resource *viewRes = NULL; pResourceView->GetResource(&viewRes); - m_MissingTracks.insert(GetIDForResource(viewRes)); + MarkDirtyResource(GetIDForResource(viewRes)); MarkResourceReferenced(GetIDForResource(viewRes), eFrameRef_PartialWrite); SAFE_RELEASE(viewRes); diff --git a/renderdoc/driver/d3d11/d3d11_context_wrap.cpp b/renderdoc/driver/d3d11/d3d11_context_wrap.cpp index 102b3d68f..36fbeec8e 100644 --- a/renderdoc/driver/d3d11/d3d11_context_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_context_wrap.cpp @@ -2274,15 +2274,9 @@ void WrappedID3D11DeviceContext::SOSetTargets(UINT NumBuffers, ID3D11Buffer *con // to avoid having to track "possibly" dirty resources. // Besides, it's unlikely an application will set an output then not draw to it if(IsActiveCapturing(m_State)) - { MarkResourceReferenced(GetIDForResource(ppSOTargets[i]), eFrameRef_PartialWrite); - m_MissingTracks.insert(GetIDForResource(ppSOTargets[i])); - } - else if(IsBackgroundCapturing(m_State)) - { - MarkDirtyResource(GetIDForResource(ppSOTargets[i])); - } + MarkDirtyResource(GetIDForResource(ppSOTargets[i])); bufs[i] = UNWRAP(WrappedID3D11Buffer, ppSOTargets[i]); } } @@ -3209,10 +3203,7 @@ void WrappedID3D11DeviceContext::OMSetRenderTargets(UINT NumViews, // technically this isn't dirty until the draw call, but let's be conservative // to avoid having to track "possibly" dirty resources. // Besides, it's unlikely an application will set an output then not draw to it - if(IsBackgroundCapturing(m_State)) - MarkDirtyResource(GetViewResourceResID(ppRenderTargetViews[i])); - else if(IsActiveCapturing(m_State)) - m_MissingTracks.insert(GetViewResourceResID(ppRenderTargetViews[i])); + MarkDirtyResource(GetViewResourceResID(ppRenderTargetViews[i])); } RTs[i] = UNWRAP(WrappedID3D11RenderTargetView1, ppRenderTargetViews[i]); @@ -3221,10 +3212,7 @@ void WrappedID3D11DeviceContext::OMSetRenderTargets(UINT NumViews, if(pDepthStencilView && IsCaptureMode(m_State)) { - if(IsBackgroundCapturing(m_State)) - MarkDirtyResource(GetViewResourceResID(pDepthStencilView)); - else if(IsActiveCapturing(m_State)) - m_MissingTracks.insert(GetViewResourceResID(pDepthStencilView)); + MarkDirtyResource(GetViewResourceResID(pDepthStencilView)); } if(IsActiveCapturing(m_State)) @@ -3605,10 +3593,7 @@ void WrappedID3D11DeviceContext::OMSetRenderTargetsAndUnorderedAccessViews( // technically this isn't dirty until the draw call, but let's be conservative // to avoid having to track "possibly" dirty resources. // Besides, it's unlikely an application will set an output then not draw to it - if(IsBackgroundCapturing(m_State)) - MarkDirtyResource(GetViewResourceResID(ppRenderTargetViews[i])); - else if(IsActiveCapturing(m_State)) - m_MissingTracks.insert(GetViewResourceResID(ppRenderTargetViews[i])); + MarkDirtyResource(GetViewResourceResID(ppRenderTargetViews[i])); } RTs[i] = UNWRAP(WrappedID3D11RenderTargetView1, ppRenderTargetViews[i]); @@ -3619,10 +3604,7 @@ void WrappedID3D11DeviceContext::OMSetRenderTargetsAndUnorderedAccessViews( { if(ppUnorderedAccessViews[i] && IsCaptureMode(m_State)) { - if(IsBackgroundCapturing(m_State)) - MarkDirtyResource(GetViewResourceResID(ppUnorderedAccessViews[i])); - else if(IsActiveCapturing(m_State)) - m_MissingTracks.insert(GetViewResourceResID(ppUnorderedAccessViews[i])); + MarkDirtyResource(GetViewResourceResID(ppUnorderedAccessViews[i])); } UAVs[i] = UNWRAP(WrappedID3D11UnorderedAccessView1, ppUnorderedAccessViews[i]); @@ -3630,10 +3612,7 @@ void WrappedID3D11DeviceContext::OMSetRenderTargetsAndUnorderedAccessViews( if(pDepthStencilView && IsCaptureMode(m_State)) { - if(IsBackgroundCapturing(m_State)) - MarkDirtyResource(GetViewResourceResID(pDepthStencilView)); - else if(IsActiveCapturing(m_State)) - m_MissingTracks.insert(GetViewResourceResID(pDepthStencilView)); + MarkDirtyResource(GetViewResourceResID(pDepthStencilView)); } VerifyState(); @@ -4765,16 +4744,13 @@ void WrappedID3D11DeviceContext::CSSetUnorderedAccessViews( { if(ppUnorderedAccessViews[i] && IsCaptureMode(m_State)) { - if(IsBackgroundCapturing(m_State)) + if(IsActiveCapturing(m_State)) { - MarkDirtyResource(GetViewResourceResID(ppUnorderedAccessViews[i])); - } - else if(IsActiveCapturing(m_State)) - { - m_MissingTracks.insert(GetViewResourceResID(ppUnorderedAccessViews[i])); MarkResourceReferenced(GetIDForResource(ppUnorderedAccessViews[i]), eFrameRef_Read); MarkResourceReferenced(GetViewResourceResID(ppUnorderedAccessViews[i]), eFrameRef_Read); } + + MarkDirtyResource(GetViewResourceResID(ppUnorderedAccessViews[i])); } UAVs[i] = UNWRAP(WrappedID3D11UnorderedAccessView1, ppUnorderedAccessViews[i]); @@ -5280,9 +5256,6 @@ void WrappedID3D11DeviceContext::ExecuteCommandList(ID3D11CommandList *pCommandL cmdListRecord->AddResourceReferences(m_pDevice->GetResourceManager()); } - // still update dirty resources for subsequent captures - wrapped->MarkDirtyResources(m_MissingTracks); - { // insert a chunk to let us know on replay that we finished the command list's // chunks and we can restore the state @@ -5658,7 +5631,8 @@ void WrappedID3D11DeviceContext::CopySubresourceRegion(ID3D11Resource *pDstResou m_ContextRecord->AddChunk(scope.Get()); - m_MissingTracks.insert(GetIDForResource(pDstResource)); + MarkDirtyResource(GetIDForResource(pDstResource)); + // assume partial update MarkResourceReferenced(GetIDForResource(pDstResource), eFrameRef_Read); MarkResourceReferenced(GetIDForResource(pDstResource), eFrameRef_PartialWrite); @@ -5802,7 +5776,8 @@ void WrappedID3D11DeviceContext::CopyResource(ID3D11Resource *pDstResource, m_ContextRecord->AddChunk(scope.Get()); - m_MissingTracks.insert(GetIDForResource(pDstResource)); + MarkDirtyResource(GetIDForResource(pDstResource)); + MarkResourceReferenced(GetIDForResource(pDstResource), eFrameRef_PartialWrite); MarkResourceReferenced(GetIDForResource(pSrcResource), eFrameRef_Read); } @@ -5957,7 +5932,7 @@ void WrappedID3D11DeviceContext::UpdateSubresource(ID3D11Resource *pDstResource, MarkResourceReferenced(GetIDForResource(pDstResource), eFrameRef_PartialWrite); - m_MissingTracks.insert(GetIDForResource(pDstResource)); + MarkDirtyResource(GetIDForResource(pDstResource)); m_ContextRecord->AddChunk(scope.Get()); } @@ -6236,7 +6211,8 @@ void WrappedID3D11DeviceContext::CopyStructureCount(ID3D11Buffer *pDstBuffer, m_ContextRecord->AddChunk(scope.Get()); - m_MissingTracks.insert(GetIDForResource(pDstBuffer)); + MarkDirtyResource(GetIDForResource(pDstBuffer)); + MarkResourceReferenced(GetIDForResource(pDstBuffer), eFrameRef_Read); MarkResourceReferenced(GetIDForResource(pDstBuffer), eFrameRef_PartialWrite); @@ -6256,7 +6232,7 @@ void WrappedID3D11DeviceContext::CopyStructureCount(ID3D11Buffer *pDstBuffer, record->AddParent(srcRecord); - MarkDirtyResource(GetViewResourceResID(pSrcView)); + MarkDirtyResource(GetIDForResource(pDstBuffer)); } } @@ -6350,7 +6326,7 @@ void WrappedID3D11DeviceContext::ResolveSubresource(ID3D11Resource *pDstResource m_ContextRecord->AddChunk(scope.Get()); - m_MissingTracks.insert(GetIDForResource(pDstResource)); + MarkDirtyResource(GetIDForResource(pDstResource)); MarkResourceReferenced(GetIDForResource(pDstResource), eFrameRef_Read); MarkResourceReferenced(GetIDForResource(pDstResource), eFrameRef_PartialWrite); MarkResourceReferenced(GetIDForResource(pSrcResource), eFrameRef_Read); @@ -6430,7 +6406,7 @@ void WrappedID3D11DeviceContext::GenerateMips(ID3D11ShaderResourceView *pShaderR ResourceId id = GetViewResourceResID(pShaderResourceView); - m_MissingTracks.insert(id); + MarkDirtyResource(id); MarkResourceReferenced(id, eFrameRef_Read); MarkResourceReferenced(id, eFrameRef_PartialWrite); @@ -6556,7 +6532,7 @@ void WrappedID3D11DeviceContext::ClearRenderTargetView(ID3D11RenderTargetView *p MarkResourceReferenced(GetIDForResource(pRenderTargetView), eFrameRef_Read); } - m_MissingTracks.insert(GetViewResourceResID(pRenderTargetView)); + MarkDirtyResource(GetViewResourceResID(pRenderTargetView)); m_ContextRecord->AddChunk(scope.Get()); } @@ -6636,7 +6612,7 @@ void WrappedID3D11DeviceContext::ClearUnorderedAccessViewUint( MarkResourceReferenced(GetIDForResource(pUnorderedAccessView), eFrameRef_Read); } - m_MissingTracks.insert(GetViewResourceResID(pUnorderedAccessView)); + MarkDirtyResource(GetViewResourceResID(pUnorderedAccessView)); m_ContextRecord->AddChunk(scope.Get()); } @@ -6716,7 +6692,7 @@ void WrappedID3D11DeviceContext::ClearUnorderedAccessViewFloat( MarkResourceReferenced(GetIDForResource(pUnorderedAccessView), eFrameRef_Read); } - m_MissingTracks.insert(GetViewResourceResID(pUnorderedAccessView)); + MarkDirtyResource(GetViewResourceResID(pUnorderedAccessView)); m_ContextRecord->AddChunk(scope.Get()); } @@ -6809,7 +6785,7 @@ void WrappedID3D11DeviceContext::ClearDepthStencilView(ID3D11DepthStencilView *p MarkResourceReferenced(GetIDForResource(pDepthStencilView), eFrameRef_Read); } - m_MissingTracks.insert(GetViewResourceResID(pDepthStencilView)); + MarkDirtyResource(GetViewResourceResID(pDepthStencilView)); m_ContextRecord->AddChunk(scope.Get()); } @@ -7600,7 +7576,7 @@ HRESULT WrappedID3D11DeviceContext::Map(ID3D11Resource *pResource, UINT Subresou } else { - m_MissingTracks.insert(GetIDForResource(pResource)); + GetResourceManager()->MarkDirtyResource(GetIDForResource(pResource)); // create a chunk purely for the user's benefit USE_SCRATCH_SERIALISER(); diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index 35c61ffca..5895533c7 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -2402,8 +2402,6 @@ void WrappedID3D11Device::ReleaseResource(ID3D11DeviceChild *res) SCOPED_LOCK(m_D3DLock); - GetResourceManager()->MarkCleanResource(idx); - if(WrappedID3D11DeviceContext::IsAlloc(res)) RemoveDeferredContext((WrappedID3D11DeviceContext *)res); diff --git a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp index 9316ce2b6..1efb93766 100644 --- a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp @@ -375,18 +375,10 @@ void WrappedID3D12CommandQueue::ExecuteCommandListsInternal(UINT NumCommandLists // the submit chunk to the frame record don't have to be protected. // Only the decision of whether we're inframe or not, and marking // dirty. - if(capframe) - { - for(auto it = record->bakedCommands->cmdInfo->dirtied.begin(); - it != record->bakedCommands->cmdInfo->dirtied.end(); ++it) - GetResourceManager()->MarkPendingDirty(*it); - } - else - { - for(auto it = record->bakedCommands->cmdInfo->dirtied.begin(); - it != record->bakedCommands->cmdInfo->dirtied.end(); ++it) - GetResourceManager()->MarkDirtyResource(*it); - } + + for(auto it = record->bakedCommands->cmdInfo->dirtied.begin(); + it != record->bakedCommands->cmdInfo->dirtied.end(); ++it) + GetResourceManager()->MarkDirtyResource(*it); if(capframe) { @@ -521,7 +513,7 @@ void WrappedID3D12CommandQueue::ExecuteCommandListsInternal(UINT NumCommandLists // update comparison shadow for next time memcpy(ref, res->GetMap(subres), size); - GetResourceManager()->MarkPendingDirty(res->GetResourceID()); + GetResourceManager()->MarkDirtyResource(res->GetResourceID()); } else { diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index 0173f6c25..ff246303a 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -1855,8 +1855,6 @@ bool WrappedID3D12Device::EndFrameCapture(void *dev, void *wnd) GetResourceManager()->FreeInitialContents(); - GetResourceManager()->FlushPendingDirty(); - FlushPendingDescriptorWrites(); return true; @@ -1901,8 +1899,6 @@ bool WrappedID3D12Device::DiscardFrameCapture(void *dev, void *wnd) GetResourceManager()->FreeInitialContents(); - GetResourceManager()->FlushPendingDirty(); - FlushPendingDescriptorWrites(); return true; diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp index 4c3b0e0b6..c1f7b4211 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp @@ -764,13 +764,7 @@ HRESULT WrappedID3D12Device::CreateDescriptorHeap(const D3D12_DESCRIPTOR_HEAP_DE record->AddChunk(scope.Get()); - { - SCOPED_READLOCK(m_CapTransitionLock); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(wrapped->GetResourceID()); - else - GetResourceManager()->MarkPendingDirty(wrapped->GetResourceID()); - } + GetResourceManager()->MarkDirtyResource(wrapped->GetResourceID()); } else { @@ -1346,13 +1340,7 @@ HRESULT WrappedID3D12Device::CreateCommittedResource(const D3D12_HEAP_PROPERTIES record->AddChunk(scope.Get()); - { - SCOPED_READLOCK(m_CapTransitionLock); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(wrapped->GetResourceID()); - else - GetResourceManager()->MarkPendingDirty(wrapped->GetResourceID()); - } + GetResourceManager()->MarkDirtyResource(wrapped->GetResourceID()); } else { @@ -1616,13 +1604,7 @@ HRESULT WrappedID3D12Device::CreatePlacedResource(ID3D12Heap *pHeap, UINT64 Heap record->AddParent(GetRecord(pHeap)); record->AddChunk(scope.Get()); - { - SCOPED_READLOCK(m_CapTransitionLock); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(wrapped->GetResourceID()); - else - GetResourceManager()->MarkPendingDirty(wrapped->GetResourceID()); - } + GetResourceManager()->MarkDirtyResource(wrapped->GetResourceID()); } else { @@ -2338,13 +2320,7 @@ HRESULT WrappedID3D12Device::OpenSharedHandle(HANDLE NTHandle, REFIID riid, void record->AddChunk(scope.Get()); - { - SCOPED_READLOCK(m_CapTransitionLock); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(wrapped->GetResourceID()); - else - GetResourceManager()->MarkPendingDirty(wrapped->GetResourceID()); - } + GetResourceManager()->MarkDirtyResource(wrapped->GetResourceID()); { SCOPED_LOCK(m_ResourceStatesLock); diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap4.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap4.cpp index 8d75648b4..fa5dfab3f 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap4.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap4.cpp @@ -359,13 +359,7 @@ HRESULT WrappedID3D12Device::CreateCommittedResource1( record->AddChunk(scope.Get()); - { - SCOPED_READLOCK(m_CapTransitionLock); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(wrapped->GetResourceID()); - else - GetResourceManager()->MarkPendingDirty(wrapped->GetResourceID()); - } + GetResourceManager()->MarkDirtyResource(wrapped->GetResourceID()); } else { diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 86089957b..f1b3c8917 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -1677,8 +1677,6 @@ void WrappedOpenGL::SwapBuffers(void *windowHandle) m_FrameCounter++; // first present becomes frame #1, this function is at the end of the frame - GetResourceManager()->FlushPendingDirty(); - ContextData &ctxdata = GetCtxData(); // we only handle context-window associations here as it's too common to @@ -2360,14 +2358,6 @@ void WrappedOpenGL::CleanupCapture() { CleanupResourceRecord(it->second.m_ContextDataRecord, true); } - - for(auto it = m_MissingTracks.begin(); it != m_MissingTracks.end(); ++it) - { - if(GetResourceManager()->HasResourceRecord(*it)) - GetResourceManager()->MarkDirtyResource(*it); - } - - m_MissingTracks.clear(); } void WrappedOpenGL::FreeCaptureData() diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index ca5a9bbf4..2b0174f05 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -164,8 +164,6 @@ private: ResourceId m_ContextResourceID; GLResourceRecord *m_ContextRecord; - set m_MissingTracks; - GLResourceManager *m_ResourceManager; SDFile *m_StructuredFile; @@ -564,7 +562,6 @@ public: void RegisterDebugCallback(); bool IsUnsafeDraw(uint32_t eventId) { return m_UnsafeDraws.find(eventId) != m_UnsafeDraws.end(); } - void AddMissingTrack(ResourceId id) { m_MissingTracks.insert(id); } // replay interface void Initialise(GLInitParams ¶ms, uint64_t sectionVersion); void ReplayLog(uint32_t startEventID, uint32_t endEventID, ReplayLogType replayType); diff --git a/renderdoc/driver/gl/gl_manager.cpp b/renderdoc/driver/gl/gl_manager.cpp index d9e0012ad..85858c46e 100644 --- a/renderdoc/driver/gl/gl_manager.cpp +++ b/renderdoc/driver/gl/gl_manager.cpp @@ -128,10 +128,7 @@ void GLResourceManager::SetInternalResource(GLResource res) bool GLResourceManager::ResourceTypeRelease(GLResource res) { if(HasCurrentResource(res)) - { - MarkCleanResource(res); UnregisterResource(res); - } m_Driver->QueueResourceRelease(res); return true; diff --git a/renderdoc/driver/gl/gl_manager.h b/renderdoc/driver/gl/gl_manager.h index 0b2fae1cf..6c756c334 100644 --- a/renderdoc/driver/gl/gl_manager.h +++ b/renderdoc/driver/gl/gl_manager.h @@ -110,7 +110,6 @@ public: { ++count; ResourceId res = it->second; - MarkCleanResource(res); if(HasResourceRecord(res)) GetResourceRecord(res)->Delete(this); ReleaseCurrentResource(it->second); @@ -216,9 +215,6 @@ public: using ResourceManager::MarkDirtyResource; void MarkDirtyResource(GLResource res) { return ResourceManager::MarkDirtyResource(GetID(res)); } - using ResourceManager::MarkCleanResource; - - void MarkCleanResource(GLResource res) { return ResourceManager::MarkCleanResource(GetID(res)); } void RegisterSync(ContextPair &ctx, GLsync sync, GLuint &name, ResourceId &id) { name = (GLuint)Atomic::Inc64(&m_SyncName); diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index a7541ecda..5f2d45a6d 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -475,7 +475,6 @@ void GLRenderState::MarkReferenced(WrappedOpenGL *driver, bool initial) const { manager->MarkResourceFrameReferenced(Images[i].res, initial ? eFrameRef_None : eFrameRef_ReadBeforeWrite); - driver->AddMissingTrack(manager->GetID(Images[i].res)); } manager->MarkVAOReferenced(VAO, initial ? eFrameRef_None : eFrameRef_Read, true); @@ -517,9 +516,11 @@ void GLRenderState::MarkReferenced(WrappedOpenGL *driver, bool initial) const // if same FBO is bound to both targets, treat it as draw only if(ReadFBO != DrawFBO) manager->MarkFBOReferenced(ReadFBO, initial ? eFrameRef_None : eFrameRef_Read); + + MarkDirty(driver); } -void GLRenderState::MarkDirty(WrappedOpenGL *driver) +void GLRenderState::MarkDirty(WrappedOpenGL *driver) const { GLResourceManager *manager = driver->GetResourceManager(); diff --git a/renderdoc/driver/gl/gl_renderstate.h b/renderdoc/driver/gl/gl_renderstate.h index 0f3096cf9..595d316a3 100644 --- a/renderdoc/driver/gl/gl_renderstate.h +++ b/renderdoc/driver/gl/gl_renderstate.h @@ -78,7 +78,7 @@ struct GLRenderState void Clear(); void MarkReferenced(WrappedOpenGL *driver, bool initial) const; - void MarkDirty(WrappedOpenGL *driver); + void MarkDirty(WrappedOpenGL *driver) const; enum { diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index 3e96c9d90..e1c2aa6dd 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -384,10 +384,7 @@ void WrappedOpenGL::glBindBuffer(GLenum target, GLuint buffer) if(target == eGL_TRANSFORM_FEEDBACK_BUFFER || target == eGL_SHADER_STORAGE_BUFFER || target == eGL_ATOMIC_COUNTER_BUFFER) { - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(r->GetResourceID()); - else - m_MissingTracks.insert(r->GetResourceID()); + GetResourceManager()->MarkDirtyResource(r->GetResourceID()); } } else @@ -932,7 +929,7 @@ void WrappedOpenGL::glNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsi if(IsActiveCapturing(m_State)) { GetContextRecord()->AddChunk(chunk); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_ReadBeforeWrite); } @@ -985,7 +982,7 @@ void WrappedOpenGL::glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr s if(IsActiveCapturing(m_State)) { GetContextRecord()->AddChunk(chunk); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_ReadBeforeWrite); } @@ -1066,7 +1063,7 @@ void WrappedOpenGL::glNamedCopyBufferSubDataEXT(GLuint readBuffer, GLuint writeB if(IsActiveCapturing(m_State)) { GetContextRecord()->AddChunk(chunk); - m_MissingTracks.insert(writerecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(writerecord->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(writerecord->GetResourceID(), eFrameRef_ReadBeforeWrite); } @@ -1127,7 +1124,7 @@ void WrappedOpenGL::glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, G if(IsActiveCapturing(m_State)) { GetContextRecord()->AddChunk(chunk); - m_MissingTracks.insert(writerecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(writerecord->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(writerecord->GetResourceID(), eFrameRef_ReadBeforeWrite); } @@ -1257,10 +1254,7 @@ void WrappedOpenGL::glBindBufferBase(GLenum target, GLuint index, GLuint buffer) if(r && (target == eGL_TRANSFORM_FEEDBACK_BUFFER || target == eGL_SHADER_STORAGE_BUFFER || target == eGL_ATOMIC_COUNTER_BUFFER)) { - if(IsActiveCapturing(m_State)) - m_MissingTracks.insert(r->GetResourceID()); - else - GetResourceManager()->MarkDirtyResource(BufferRes(GetCtx(), buffer)); + GetResourceManager()->MarkDirtyResource(BufferRes(GetCtx(), buffer)); } if(IsActiveCapturing(m_State)) @@ -1389,10 +1383,7 @@ void WrappedOpenGL::glBindBufferRange(GLenum target, GLuint index, GLuint buffer if(r && (target == eGL_TRANSFORM_FEEDBACK_BUFFER || target == eGL_SHADER_STORAGE_BUFFER || target == eGL_ATOMIC_COUNTER_BUFFER)) { - if(IsActiveCapturing(m_State)) - m_MissingTracks.insert(r->GetResourceID()); - else - GetResourceManager()->MarkDirtyResource(BufferRes(GetCtx(), buffer)); + GetResourceManager()->MarkDirtyResource(BufferRes(GetCtx(), buffer)); } if(IsActiveCapturing(m_State)) @@ -1480,7 +1471,7 @@ void WrappedOpenGL::glBindBuffersBase(GLenum target, GLuint first, GLsizei count { ResourceId id = GetResourceManager()->GetID(BufferRes(GetCtx(), buffers[i])); GetResourceManager()->MarkResourceFrameReferenced(id, eFrameRef_ReadBeforeWrite); - m_MissingTracks.insert(id); + GetResourceManager()->MarkDirtyResource(id); } } @@ -1679,7 +1670,7 @@ void WrappedOpenGL::glBindBuffersRange(GLenum target, GLuint first, GLsizei coun { ResourceId id = GetResourceManager()->GetID(BufferRes(GetCtx(), buffers[i])); GetResourceManager()->MarkResourceFrameReferenced(id, eFrameRef_ReadBeforeWrite); - m_MissingTracks.insert(id); + GetResourceManager()->MarkDirtyResource(id); } } @@ -1774,20 +1765,14 @@ void WrappedOpenGL::glInvalidateBufferData(GLuint buffer) { GL.glInvalidateBufferData(buffer); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(BufferRes(GetCtx(), buffer)); - else - m_MissingTracks.insert(GetResourceManager()->GetID(BufferRes(GetCtx(), buffer))); + GetResourceManager()->MarkDirtyResource(BufferRes(GetCtx(), buffer)); } void WrappedOpenGL::glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length) { GL.glInvalidateBufferSubData(buffer, offset, length); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(BufferRes(GetCtx(), buffer)); - else - m_MissingTracks.insert(GetResourceManager()->GetID(BufferRes(GetCtx(), buffer))); + GetResourceManager()->MarkDirtyResource(BufferRes(GetCtx(), buffer)); } #pragma endregion @@ -2348,7 +2333,7 @@ GLboolean WrappedOpenGL::glUnmapNamedBufferEXT(GLuint buffer) if(IsActiveCapturing(m_State)) { - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_ReadBeforeWrite); } @@ -2550,7 +2535,7 @@ void WrappedOpenGL::glFlushMappedNamedBufferRangeEXT(GLuint buffer, GLintptr off { if(record) { - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_ReadBeforeWrite); @@ -2836,7 +2821,6 @@ void WrappedOpenGL::glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids) GLResource res = FeedbackRes(GetCtx(), ids[i]); if(GetResourceManager()->HasCurrentResource(res)) { - GetResourceManager()->MarkCleanResource(res); if(GetResourceManager()->HasResourceRecord(res)) GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); GetResourceManager()->UnregisterResource(res); @@ -4742,7 +4726,6 @@ void WrappedOpenGL::glDeleteBuffers(GLsizei n, const GLuint *buffers) record->FreeShadowStorage(); } - GetResourceManager()->MarkCleanResource(res); if(GetResourceManager()->HasResourceRecord(res)) GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); GetResourceManager()->UnregisterResource(res); @@ -4759,7 +4742,6 @@ void WrappedOpenGL::glDeleteVertexArrays(GLsizei n, const GLuint *arrays) GLResource res = VertexArrayRes(GetCtx(), arrays[i]); if(GetResourceManager()->HasCurrentResource(res)) { - GetResourceManager()->MarkCleanResource(res); if(GetResourceManager()->HasResourceRecord(res)) GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); GetResourceManager()->UnregisterResource(res); diff --git a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp index 74c839873..2cd4aaeaf 100644 --- a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp @@ -4427,7 +4427,7 @@ void WrappedOpenGL::glClearTexImage(GLuint texture, GLint level, GLenum format, Serialise_glClearTexImage(ser, texture, level, format, type, data); GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } else if(IsBackgroundCapturing(m_State)) { @@ -4544,7 +4544,7 @@ void WrappedOpenGL::glClearTexSubImage(GLuint texture, GLint level, GLint xoffse depth, format, type, data); GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } else if(IsBackgroundCapturing(m_State)) { diff --git a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp index c09a99d6a..e33fb1203 100644 --- a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp @@ -191,12 +191,7 @@ void WrappedOpenGL::glNamedFramebufferTextureEXT(GLuint framebuffer, GLenum atta if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) { - ResourceRecord *texrecord = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(texrecord->GetResourceID()); - else - m_MissingTracks.insert(texrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && @@ -249,12 +244,7 @@ void WrappedOpenGL::glFramebufferTexture(GLenum target, GLenum attachment, GLuin if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) { - ResourceRecord *texrecord = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(texrecord->GetResourceID()); - else - m_MissingTracks.insert(texrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && @@ -335,12 +325,7 @@ void WrappedOpenGL::glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum at if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) { - ResourceRecord *texrecord = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(texrecord->GetResourceID()); - else - m_MissingTracks.insert(texrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && @@ -394,12 +379,7 @@ void WrappedOpenGL::glFramebufferTexture1D(GLenum target, GLenum attachment, GLe if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) { - ResourceRecord *texrecord = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(texrecord->GetResourceID()); - else - m_MissingTracks.insert(texrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && @@ -481,12 +461,7 @@ void WrappedOpenGL::glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum at if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) { - ResourceRecord *texrecord = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(texrecord->GetResourceID()); - else - m_MissingTracks.insert(texrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && @@ -540,12 +515,7 @@ void WrappedOpenGL::glFramebufferTexture2D(GLenum target, GLenum attachment, GLe if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) { - ResourceRecord *texrecord = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(texrecord->GetResourceID()); - else - m_MissingTracks.insert(texrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && @@ -651,12 +621,7 @@ void WrappedOpenGL::glFramebufferTexture2DMultisampleEXT(GLenum target, GLenum a if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) { - ResourceRecord *texrecord = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(texrecord->GetResourceID()); - else - m_MissingTracks.insert(texrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && @@ -742,12 +707,7 @@ void WrappedOpenGL::glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum at if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) { - ResourceRecord *texrecord = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(texrecord->GetResourceID()); - else - m_MissingTracks.insert(texrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && @@ -803,12 +763,7 @@ void WrappedOpenGL::glFramebufferTexture3D(GLenum target, GLenum attachment, GLe if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) { - ResourceRecord *texrecord = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(texrecord->GetResourceID()); - else - m_MissingTracks.insert(texrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && @@ -1021,12 +976,7 @@ void WrappedOpenGL::glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) { - ResourceRecord *texrecord = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(texrecord->GetResourceID()); - else - m_MissingTracks.insert(texrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && @@ -1080,12 +1030,7 @@ void WrappedOpenGL::glFramebufferTextureLayer(GLenum target, GLenum attachment, if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) { - ResourceRecord *texrecord = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(texrecord->GetResourceID()); - else - m_MissingTracks.insert(texrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && @@ -1188,12 +1133,7 @@ void WrappedOpenGL::glFramebufferTextureMultiviewOVR(GLenum target, GLenum attac if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) { - ResourceRecord *texrecord = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(texrecord->GetResourceID()); - else - m_MissingTracks.insert(texrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && @@ -1307,12 +1247,7 @@ void WrappedOpenGL::glFramebufferTextureMultisampleMultiviewOVR(GLenum target, G if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) { - ResourceRecord *texrecord = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(texrecord->GetResourceID()); - else - m_MissingTracks.insert(texrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && @@ -2044,7 +1979,6 @@ void WrappedOpenGL::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers) GLResource res = FramebufferRes(GetCtx(), framebuffers[i]); if(GetResourceManager()->HasCurrentResource(res)) { - GetResourceManager()->MarkCleanResource(res); if(GetResourceManager()->HasResourceRecord(res)) GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); GetResourceManager()->UnregisterResource(res); @@ -2198,7 +2132,6 @@ void WrappedOpenGL::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers GLResource res = RenderbufferRes(GetCtx(), renderbuffers[i]); if(GetResourceManager()->HasCurrentResource(res)) { - GetResourceManager()->MarkCleanResource(res); if(GetResourceManager()->HasResourceRecord(res)) GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); GetResourceManager()->UnregisterResource(res); diff --git a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp index 7045fc93c..da86c0e65 100644 --- a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp @@ -1266,7 +1266,6 @@ void WrappedOpenGL::glDeleteProgram(GLuint program) GLResource res = ProgramRes(GetCtx(), program); if(GetResourceManager()->HasCurrentResource(res)) { - GetResourceManager()->MarkCleanResource(res); if(GetResourceManager()->HasResourceRecord(res)) GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); GetResourceManager()->UnregisterResource(res); diff --git a/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp index 7a4ce189e..9c75ad1cc 100644 --- a/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp @@ -226,7 +226,6 @@ void WrappedOpenGL::glDeleteTextures(GLsizei n, const GLuint *textures) GLResource res = TextureRes(GetCtx(), textures[i]); if(GetResourceManager()->HasCurrentResource(res)) { - GetResourceManager()->MarkCleanResource(res); if(GetResourceManager()->HasResourceRecord(res)) GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); GetResourceManager()->UnregisterResource(res); @@ -748,10 +747,7 @@ void WrappedOpenGL::glTextureView(GLuint texture, GLenum target, GLuint origtext // mark the underlying resource as dirty to avoid tracking dirty across // aliased resources etc. - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(origrecord->GetResourceID()); - else - m_MissingTracks.insert(origrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(origrecord->GetResourceID()); } { @@ -836,7 +832,7 @@ void WrappedOpenGL::Common_glGenerateTextureMipmapEXT(GLResourceRecord *record, Serialise_glGenerateTextureMipmapEXT(ser, record->Resource.name, target); GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_ReadBeforeWrite); } @@ -891,10 +887,7 @@ void WrappedOpenGL::glInvalidateTexImage(GLuint texture, GLint level) { SERIALISE_TIME_CALL(GL.glInvalidateTexImage(texture, level)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); - else - m_MissingTracks.insert(GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } void WrappedOpenGL::glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, @@ -904,10 +897,7 @@ void WrappedOpenGL::glInvalidateTexSubImage(GLuint texture, GLint level, GLint x SERIALISE_TIME_CALL( GL.glInvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth)); - if(IsBackgroundCapturing(m_State)) - GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); - else - m_MissingTracks.insert(GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); + GetResourceManager()->MarkDirtyResource(TextureRes(GetCtx(), texture)); } template @@ -1008,7 +998,7 @@ void WrappedOpenGL::glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint s srcDepth); GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(dstrecord->GetResourceID()); + GetResourceManager()->MarkDirtyResource(dstrecord->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(dstrecord->GetResourceID(), eFrameRef_CompleteWrite); GetResourceManager()->MarkResourceFrameReferenced(srcrecord->GetResourceID(), eFrameRef_Read); @@ -1107,7 +1097,7 @@ void WrappedOpenGL::Common_glCopyTextureSubImage1DEXT(GLResourceRecord *record, width); GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_PartialWrite); } @@ -1212,7 +1202,7 @@ void WrappedOpenGL::Common_glCopyTextureSubImage2DEXT(GLResourceRecord *record, yoffset, x, y, width, height); GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_PartialWrite); } @@ -1315,7 +1305,6 @@ void WrappedOpenGL::Common_glCopyTextureSubImage3DEXT(GLResourceRecord *record, if(IsBackgroundCapturing(m_State)) { GetResourceManager()->MarkDirtyResource(record->GetResourceID()); - m_MissingTracks.insert(record->GetResourceID()); } else if(IsActiveCapturing(m_State)) { @@ -1325,7 +1314,7 @@ void WrappedOpenGL::Common_glCopyTextureSubImage3DEXT(GLResourceRecord *record, yoffset, zoffset, x, y, width, height); GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_PartialWrite); } @@ -2251,10 +2240,7 @@ void WrappedOpenGL::Common_glTextureImage1DEXT(ResourceId texId, GLenum target, // illegal to re-type textures record->VerifyDataType(target); - if(IsActiveCapturing(m_State)) - m_MissingTracks.insert(record->GetResourceID()); - else if(fromunpackbuf) - GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); } } @@ -2498,10 +2484,7 @@ void WrappedOpenGL::Common_glTextureImage2DEXT(ResourceId texId, GLenum target, // illegal to re-type textures record->VerifyDataType(target); - if(IsActiveCapturing(m_State)) - m_MissingTracks.insert(record->GetResourceID()); - else if(fromunpackbuf) - GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); } } @@ -2727,10 +2710,7 @@ void WrappedOpenGL::Common_glTextureImage3DEXT(ResourceId texId, GLenum target, // illegal to re-type textures record->VerifyDataType(target); - if(IsActiveCapturing(m_State)) - m_MissingTracks.insert(record->GetResourceID()); - else if(fromunpackbuf) - GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); } } @@ -2957,10 +2937,7 @@ void WrappedOpenGL::Common_glCompressedTextureImage1DEXT(ResourceId texId, GLenu // illegal to re-type textures record->VerifyDataType(target); - if(IsActiveCapturing(m_State)) - m_MissingTracks.insert(record->GetResourceID()); - else if(fromunpackbuf) - GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); } } @@ -3310,10 +3287,7 @@ void WrappedOpenGL::Common_glCompressedTextureImage2DEXT(ResourceId texId, GLenu // illegal to re-type textures record->VerifyDataType(target); - if(IsActiveCapturing(m_State)) - m_MissingTracks.insert(record->GetResourceID()); - else if(fromunpackbuf) - GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); } } @@ -3547,10 +3521,7 @@ void WrappedOpenGL::Common_glCompressedTextureImage3DEXT(ResourceId texId, GLenu // illegal to re-type textures record->VerifyDataType(target); - if(IsActiveCapturing(m_State)) - m_MissingTracks.insert(record->GetResourceID()); - else if(fromunpackbuf) - GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); } } @@ -3725,7 +3696,7 @@ void WrappedOpenGL::Common_glCopyTextureImage1DEXT(GLResourceRecord *record, GLe y, width, border); GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_PartialWrite); } @@ -3879,7 +3850,7 @@ void WrappedOpenGL::Common_glCopyTextureImage2DEXT(GLResourceRecord *record, GLe y, width, height, border); GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_PartialWrite); } @@ -4836,7 +4807,7 @@ void WrappedOpenGL::Common_glTextureSubImage1DEXT(GLResourceRecord *record, GLen if(IsActiveCapturing(m_State)) { GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_PartialWrite); } @@ -5049,7 +5020,7 @@ void WrappedOpenGL::Common_glTextureSubImage2DEXT(GLResourceRecord *record, GLen if(IsActiveCapturing(m_State)) { GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_PartialWrite); } @@ -5270,7 +5241,7 @@ void WrappedOpenGL::Common_glTextureSubImage3DEXT(GLResourceRecord *record, GLen if(IsActiveCapturing(m_State)) { GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_PartialWrite); } @@ -5472,7 +5443,7 @@ void WrappedOpenGL::Common_glCompressedTextureSubImage1DEXT(GLResourceRecord *re if(IsActiveCapturing(m_State)) { GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_PartialWrite); } @@ -5686,7 +5657,7 @@ void WrappedOpenGL::Common_glCompressedTextureSubImage2DEXT(GLResourceRecord *re if(IsActiveCapturing(m_State)) { GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_PartialWrite); } @@ -5906,7 +5877,7 @@ void WrappedOpenGL::Common_glCompressedTextureSubImage3DEXT(GLResourceRecord *re if(IsActiveCapturing(m_State)) { GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_PartialWrite); } @@ -6082,12 +6053,12 @@ void WrappedOpenGL::Common_glTextureBufferRangeEXT(ResourceId texId, GLenum targ if(IsActiveCapturing(m_State)) { GetContextRecord()->AddChunk(scope.Get()); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); if(bufid != ResourceId()) { - m_MissingTracks.insert(bufid); + GetResourceManager()->MarkDirtyResource(bufid); GetResourceManager()->MarkResourceFrameReferenced(bufid, eFrameRef_Read); } } @@ -6258,12 +6229,12 @@ void WrappedOpenGL::Common_glTextureBufferEXT(ResourceId texId, GLenum target, if(IsActiveCapturing(m_State)) { GetContextRecord()->AddChunk(chunk); - m_MissingTracks.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); if(bufid != ResourceId()) { - m_MissingTracks.insert(bufid); + GetResourceManager()->MarkDirtyResource(bufid); GetResourceManager()->MarkResourceFrameReferenced(bufid, eFrameRef_Read); } } diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 7a35f2cf7..d1af1f424 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1879,8 +1879,6 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd) GetResourceManager()->FreeInitialContents(); - GetResourceManager()->FlushPendingDirty(); - FreeAllMemory(MemoryScope::InitialContents); return true; @@ -1930,8 +1928,6 @@ bool WrappedVulkan::DiscardFrameCapture(void *dev, void *wnd) GetResourceManager()->FreeInitialContents(); - GetResourceManager()->FlushPendingDirty(); - FreeAllMemory(MemoryScope::InitialContents); return true; @@ -1940,10 +1936,8 @@ bool WrappedVulkan::DiscardFrameCapture(void *dev, void *wnd) void WrappedVulkan::AdvanceFrame() { if(IsBackgroundCapturing(m_State)) - { RenderDoc::Inst().Tick(); - GetResourceManager()->FlushPendingDirty(); - } + m_FrameCounter++; // first present becomes frame #1, this function is at the end of the frame } diff --git a/renderdoc/driver/vulkan/vk_manager.h b/renderdoc/driver/vulkan/vk_manager.h index 7e19b2c6a..c5e6e0584 100644 --- a/renderdoc/driver/vulkan/vk_manager.h +++ b/renderdoc/driver/vulkan/vk_manager.h @@ -326,7 +326,6 @@ public: if(IsReplayMode(m_State)) ResourceManager::RemoveWrapper(ToTypedHandle(Unwrap(obj))); - ResourceManager::MarkCleanResource(id); ResourceManager::ReleaseCurrentResource(id); VkResourceRecord *record = GetRecord(obj); if(record) diff --git a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp index a214dbc70..2fd0acf8f 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp @@ -506,21 +506,11 @@ VkResult WrappedVulkan::vkAllocateDescriptorSets(VkDevice device, record->AddParent(poolrecord); record->AddParent(GetResourceManager()->GetResourceRecord(layoutID)); - bool capframe = false; - // just always treat descriptor sets as dirty - { - SCOPED_LOCK(m_CapTransitionLock); - capframe = IsActiveCapturing(m_State); - } - // only mark descriptor set as dirty if it's not a push descriptor layout if((layoutRecord->descInfo->layout->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR) == 0) { - if(capframe) - GetResourceManager()->MarkPendingDirty(id); - else - GetResourceManager()->MarkDirtyResource(id); + GetResourceManager()->MarkDirtyResource(id); } record->descInfo = new DescriptorSetData(); diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index d77b4a5c4..08effd7c5 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -781,6 +781,11 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, bool capframe = false; bool present = false; + { + SCOPED_LOCK(m_CapTransitionLock); + capframe = IsActiveCapturing(m_State); + } + set refdIDs; VkResourceRecord *queueRecord = GetRecord(queue); @@ -801,80 +806,32 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, m_ImageLayouts); } - // need to lock the whole section of code, not just the check on - // m_State, as we also need to make sure we don't check the state, - // start marking dirty resources then while we're doing so the - // state becomes capframe. - // the next sections where we mark resources referenced and add - // the submit chunk to the frame record don't have to be protected. - // Only the decision of whether we're inframe or not, and marking - // dirty. + for(auto it = record->bakedCommands->cmdInfo->dirtied.begin(); + it != record->bakedCommands->cmdInfo->dirtied.end(); ++it) { - SCOPED_LOCK(m_CapTransitionLock); - if(IsActiveCapturing(m_State)) + if(GetResourceManager()->HasCurrentResource(*it)) + GetResourceManager()->MarkDirtyResource(*it); + } + + // with EXT_descriptor_indexing a binding might have been updated after + // vkCmdBindDescriptorSets, so we need to track dirtied here at the last second. + for(auto it = record->bakedCommands->cmdInfo->boundDescSets.begin(); + it != record->bakedCommands->cmdInfo->boundDescSets.end(); ++it) + { + VkResourceRecord *setrecord = GetRecord(*it); + + SCOPED_LOCK(setrecord->descInfo->refLock); + + const std::map> &frameRefs = + setrecord->descInfo->bindFrameRefs; + + for(auto refit = frameRefs.begin(); refit != frameRefs.end(); ++refit) { - for(auto it = record->bakedCommands->cmdInfo->dirtied.begin(); - it != record->bakedCommands->cmdInfo->dirtied.end(); ++it) + if(refit->second.second == eFrameRef_PartialWrite || + refit->second.second == eFrameRef_ReadBeforeWrite) { - if(GetResourceManager()->HasCurrentResource(*it)) - GetResourceManager()->MarkPendingDirty(*it); - } - - // with EXT_descriptor_indexing a binding might have been updated after - // vkCmdBindDescriptorSets, so we need to track dirtied here at the last second. - for(auto it = record->bakedCommands->cmdInfo->boundDescSets.begin(); - it != record->bakedCommands->cmdInfo->boundDescSets.end(); ++it) - { - VkResourceRecord *setrecord = GetRecord(*it); - - SCOPED_LOCK(setrecord->descInfo->refLock); - - const std::map> &frameRefs = - setrecord->descInfo->bindFrameRefs; - - for(auto refit = frameRefs.begin(); refit != frameRefs.end(); ++refit) - { - if(refit->second.second == eFrameRef_PartialWrite || - refit->second.second == eFrameRef_ReadBeforeWrite) - { - if(GetResourceManager()->HasCurrentResource(refit->first)) - GetResourceManager()->MarkPendingDirty(refit->first); - } - } - } - - capframe = true; - } - else - { - for(auto it = record->bakedCommands->cmdInfo->dirtied.begin(); - it != record->bakedCommands->cmdInfo->dirtied.end(); ++it) - { - if(GetResourceManager()->HasCurrentResource(*it)) - GetResourceManager()->MarkDirtyResource(*it); - } - - // with EXT_descriptor_indexing a binding might have been updated after - // vkCmdBindDescriptorSets, so we need to track dirtied here at the last second. - for(auto it = record->bakedCommands->cmdInfo->boundDescSets.begin(); - it != record->bakedCommands->cmdInfo->boundDescSets.end(); ++it) - { - VkResourceRecord *setrecord = GetRecord(*it); - - SCOPED_LOCK(setrecord->descInfo->refLock); - - const std::map> &frameRefs = - setrecord->descInfo->bindFrameRefs; - - for(auto refit = frameRefs.begin(); refit != frameRefs.end(); ++refit) - { - if(refit->second.second == eFrameRef_PartialWrite || - refit->second.second == eFrameRef_ReadBeforeWrite) - { - if(GetResourceManager()->HasCurrentResource(refit->first)) - GetResourceManager()->MarkDirtyResource(refit->first); - } - } + if(GetResourceManager()->HasCurrentResource(refit->first)) + GetResourceManager()->MarkDirtyResource(refit->first); } } } @@ -1030,7 +987,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, state.mapFlushed = false; } - GetResourceManager()->MarkPendingDirty(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); } else { diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index 367eff774..df5dd3ba3 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -917,17 +917,7 @@ VkResult WrappedVulkan::vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkD AddForcedReference(GetResID(memory), eFrameRef_ReadBeforeWrite); // the memory is immediately dirty because we have no way of tracking writes to it - bool capframe = false; - - { - SCOPED_LOCK(m_CapTransitionLock); - capframe = IsActiveCapturing(m_State); - } - - if(capframe) - GetResourceManager()->MarkPendingDirty(GetResID(memory)); - else - GetResourceManager()->MarkDirtyResource(GetResID(memory)); + GetResourceManager()->MarkDirtyResource(GetResID(memory)); } } @@ -1171,18 +1161,7 @@ VkResult WrappedVulkan::vkCreateBuffer(VkDevice device, const VkBufferCreateInfo // buffers are always bound opaquely and in arbitrary divisions, sparse residency // only means not all the buffer needs to be bound, which is not that interesting for // our purposes. We just need to make sure sparse buffers are dirty. - - bool capframe = false; - - { - SCOPED_LOCK(m_CapTransitionLock); - capframe = IsActiveCapturing(m_State); - } - - if(capframe) - GetResourceManager()->MarkPendingDirty(id); - else - GetResourceManager()->MarkDirtyResource(id); + GetResourceManager()->MarkDirtyResource(id); } if(isSparse || isExternal) @@ -1656,17 +1635,7 @@ VkResult WrappedVulkan::vkCreateImage(VkDevice device, const VkImageCreateInfo * { record->resInfo = new ResourceInfo(); - bool capframe = false; - - { - SCOPED_LOCK(m_CapTransitionLock); - capframe = IsActiveCapturing(m_State); - } - - if(capframe) - GetResourceManager()->MarkPendingDirty(id); - else - GetResourceManager()->MarkDirtyResource(id); + GetResourceManager()->MarkDirtyResource(id); // pre-populate memory requirements ObjDisp(device)->GetImageMemoryRequirements(Unwrap(device), Unwrap(*pImage), @@ -2005,17 +1974,7 @@ VkResult WrappedVulkan::vkBindBufferMemory2(VkDevice device, uint32_t bindInfoCo AddForcedReference(GetResID(pBindInfos[i].memory), eFrameRef_ReadBeforeWrite); // the memory is immediately dirty because we have no way of tracking writes to it - bool capframe = false; - - { - SCOPED_LOCK(m_CapTransitionLock); - capframe = IsActiveCapturing(m_State); - } - - if(capframe) - GetResourceManager()->MarkPendingDirty(GetResID(pBindInfos[i].memory)); - else - GetResourceManager()->MarkDirtyResource(GetResID(pBindInfos[i].memory)); + GetResourceManager()->MarkDirtyResource(GetResID(pBindInfos[i].memory)); } } }