diff --git a/renderdoc/core/resource_manager.h b/renderdoc/core/resource_manager.h index 5d68cc24f..f781e7423 100644 --- a/renderdoc/core/resource_manager.h +++ b/renderdoc/core/resource_manager.h @@ -569,7 +569,6 @@ protected: virtual bool ResourceTypeRelease(WrappedResourceType res) = 0; - virtual bool Force_InitialState(WrappedResourceType res, bool prepare) = 0; virtual bool AllowDeletedResource_InitialState() { return false; } virtual bool Need_InitialStateChunk(WrappedResourceType res) = 0; virtual bool Prepare_InitialState(WrappedResourceType res) = 0; @@ -1052,22 +1051,6 @@ void ResourceManager::PrepareInitialContents() } RDCDEBUG("Prepared %u dirty resources", prepared); - - prepared = 0; - - for(auto it = m_CurrentResourceMap.begin(); it != m_CurrentResourceMap.end(); ++it) - { - if(it->second == (WrappedResourceType)RecordType::NullResource) - continue; - - if(Force_InitialState(it->second, true)) - { - prepared++; - Prepare_InitialState(it->second); - } - } - - RDCDEBUG("Force-prepared %u dirty resources", prepared); } template @@ -1160,36 +1143,6 @@ void ResourceManager::InsertInitialContentsChunks(WriteSerialiser } RDCDEBUG("Serialised %u resources, skipped %u unreferenced", dirty, skipped); - dirty = 0; - - for(auto it = m_CurrentResourceMap.begin(); it != m_CurrentResourceMap.end(); ++it) - { - if(it->second == (WrappedResourceType)RecordType::NullResource) - continue; - - if(Force_InitialState(it->second, false)) - { - dirty++; - - auto preparedChunk = m_InitialChunks.find(it->first); - if(preparedChunk != m_InitialChunks.end()) - { - preparedChunk->second->Write(ser); - m_InitialChunks.erase(preparedChunk); - } - else - { - uint64_t size = GetSize_InitialState(it->first, it->second); - - SCOPED_SERIALISE_CHUNK(SystemChunk::InitialContents, size); - - Serialise_InitialState(ser, it->first, it->second); - } - } - } - - RDCDEBUG("Force-serialised %u dirty resources", dirty); - } template diff --git a/renderdoc/driver/d3d11/d3d11_device_wrap.cpp b/renderdoc/driver/d3d11/d3d11_device_wrap.cpp index c90b00fbc..2750aefd0 100644 --- a/renderdoc/driver/d3d11/d3d11_device_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_device_wrap.cpp @@ -1016,6 +1016,14 @@ HRESULT WrappedID3D11Device::CreateUnorderedAccessView(ID3D11Resource *pResource record->AddParent(parent); record->AddChunk(chunk); + + // if this UAV has a hidden counter, immediately mark it as dirty so we force initial + // contents to fetch its counter + if(pDesc->ViewDimension == D3D11_UAV_DIMENSION_BUFFER && + (pDesc->Buffer.Flags & (D3D11_BUFFER_UAV_FLAG_COUNTER | D3D11_BUFFER_UAV_FLAG_APPEND)) != 0) + { + GetResourceManager()->MarkDirtyResource(id); + } } else { diff --git a/renderdoc/driver/d3d11/d3d11_manager.cpp b/renderdoc/driver/d3d11/d3d11_manager.cpp index b3d591504..85e69b4e2 100644 --- a/renderdoc/driver/d3d11/d3d11_manager.cpp +++ b/renderdoc/driver/d3d11/d3d11_manager.cpp @@ -72,11 +72,6 @@ bool D3D11ResourceManager::ResourceTypeRelease(ID3D11DeviceChild *res) return true; } -bool D3D11ResourceManager::Force_InitialState(ID3D11DeviceChild *res, bool prepare) -{ - return IdentifyTypeByPtr(res) == Resource_UnorderedAccessView; -} - bool D3D11ResourceManager::Need_InitialStateChunk(ID3D11DeviceChild *res) { return IdentifyTypeByPtr(res) != Resource_Buffer; diff --git a/renderdoc/driver/d3d11/d3d11_manager.h b/renderdoc/driver/d3d11/d3d11_manager.h index dabe6803a..b4b34d664 100644 --- a/renderdoc/driver/d3d11/d3d11_manager.h +++ b/renderdoc/driver/d3d11/d3d11_manager.h @@ -259,7 +259,6 @@ private: bool ResourceTypeRelease(ID3D11DeviceChild *res); - bool Force_InitialState(ID3D11DeviceChild *res, bool prepare); bool Need_InitialStateChunk(ID3D11DeviceChild *res); bool Prepare_InitialState(ID3D11DeviceChild *res); uint64_t GetSize_InitialState(ResourceId id, ID3D11DeviceChild *res); diff --git a/renderdoc/driver/d3d12/d3d12_initstate.cpp b/renderdoc/driver/d3d12/d3d12_initstate.cpp index 35cdc7a45..e8043d6ec 100644 --- a/renderdoc/driver/d3d12/d3d12_initstate.cpp +++ b/renderdoc/driver/d3d12/d3d12_initstate.cpp @@ -30,11 +30,6 @@ #include "d3d12_manager.h" #include "d3d12_resources.h" -bool D3D12ResourceManager::Force_InitialState(ID3D12DeviceChild *res, bool prepare) -{ - return false; -} - bool D3D12ResourceManager::Need_InitialStateChunk(ID3D12DeviceChild *res) { return true; diff --git a/renderdoc/driver/d3d12/d3d12_manager.h b/renderdoc/driver/d3d12/d3d12_manager.h index 49d9f99aa..3c39e42ac 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.h +++ b/renderdoc/driver/d3d12/d3d12_manager.h @@ -713,7 +713,6 @@ private: bool ResourceTypeRelease(ID3D12DeviceChild *res); - bool Force_InitialState(ID3D12DeviceChild *res, bool prepare); bool Need_InitialStateChunk(ID3D12DeviceChild *res); bool Prepare_InitialState(ID3D12DeviceChild *res); uint64_t GetSize_InitialState(ResourceId id, ID3D12DeviceChild *res); diff --git a/renderdoc/driver/d3d8/d3d8_manager.cpp b/renderdoc/driver/d3d8/d3d8_manager.cpp index 66420a6d6..cfe552cc8 100644 --- a/renderdoc/driver/d3d8/d3d8_manager.cpp +++ b/renderdoc/driver/d3d8/d3d8_manager.cpp @@ -45,11 +45,6 @@ bool D3D8ResourceManager::ResourceTypeRelease(IUnknown *res) return true; } -bool D3D8ResourceManager::Force_InitialState(IUnknown *res, bool prepare) -{ - return false; -} - bool D3D8ResourceManager::Need_InitialStateChunk(IUnknown *res) { return true; diff --git a/renderdoc/driver/d3d8/d3d8_manager.h b/renderdoc/driver/d3d8/d3d8_manager.h index 2aca56d46..a3932e0a4 100644 --- a/renderdoc/driver/d3d8/d3d8_manager.h +++ b/renderdoc/driver/d3d8/d3d8_manager.h @@ -74,7 +74,6 @@ private: bool ResourceTypeRelease(IUnknown *res); - bool Force_InitialState(IUnknown *res, bool prepare); bool Need_InitialStateChunk(IUnknown *res); bool Prepare_InitialState(IUnknown *res); uint64_t GetSize_InitialState(ResourceId id, IUnknown *res); diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 329c52603..9684cc50c 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -1999,6 +1999,10 @@ bool WrappedOpenGL::EndFrameCapture(void *dev, void *wnd) SERIALISE_ELEMENT(fbo); } + RDCDEBUG("Forcing inclusion of views"); + + GetResourceManager()->Force_ReferenceViews(); + RDCDEBUG("Inserting Resource Serialisers"); GetResourceManager()->InsertReferencedChunks(ser); diff --git a/renderdoc/driver/gl/gl_initstate.cpp b/renderdoc/driver/gl/gl_initstate.cpp index af6dab97b..aa0529f00 100644 --- a/renderdoc/driver/gl/gl_initstate.cpp +++ b/renderdoc/driver/gl/gl_initstate.cpp @@ -1020,42 +1020,37 @@ void GLResourceManager::PrepareTextureInitialContents(ResourceId liveid, Resourc SetInitialContents(origid, initContents); } -bool GLResourceManager::Force_InitialState(GLResource res, bool prepare) +void GLResourceManager::Force_ReferenceViews() { - if(res.Namespace != eResBuffer && res.Namespace != eResTexture) - return false; - // don't need to force anything if we're already including all resources if(RenderDoc::Inst().GetCaptureOptions().refAllResources) - return false; + return; - GLResourceRecord *record = GetResourceRecord(res); - - // if we have some viewers, check to see if they were referenced but we weren't, and force our own - // initial state inclusion. - if(record && !record->viewTextures.empty()) + for(auto recordit = m_ResourceRecords.begin(); recordit != m_ResourceRecords.end(); ++recordit) { - // need to prepare all such resources, just in case for the worst case. - if(prepare) - return true; + GLResourceRecord *record = recordit->second; - // if this data resource was referenced already, just skip - if(m_FrameReferencedResources.find(record->GetResourceID()) != m_FrameReferencedResources.end()) - return false; - - // see if any of our viewers were referenced - for(auto it = record->viewTextures.begin(); it != record->viewTextures.end(); ++it) + // if this resource has some viewers, check to see if they were referenced by the frame but we + // weren't, and force our own reference as well so that our initial states are included + if(record && !record->viewTextures.empty()) { - // if so, return true to force our inclusion, for the benefit of the view - if(m_FrameReferencedResources.find(*it) != m_FrameReferencedResources.end()) + // if this data resource was referenced already, just skip + if(m_FrameReferencedResources.find(record->GetResourceID()) != m_FrameReferencedResources.end()) + continue; + + // see if any of our viewers were referenced + for(auto it = record->viewTextures.begin(); it != record->viewTextures.end(); ++it) { - RDCDEBUG("Forcing inclusion of %llu for %llu", record->GetResourceID(), *it); - return true; + // if so, return true to force our inclusion, for the benefit of the view + if(m_FrameReferencedResources.find(*it) != m_FrameReferencedResources.end()) + { + RDCDEBUG("Forcing inclusion of %llu for %llu", record->GetResourceID(), *it); + MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_ReadBeforeWrite); + break; + } } } } - - return false; } uint64_t GLResourceManager::GetSize_InitialState(ResourceId resid, GLResource res) diff --git a/renderdoc/driver/gl/gl_manager.h b/renderdoc/driver/gl/gl_manager.h index 68b582c50..2132460d3 100644 --- a/renderdoc/driver/gl/gl_manager.h +++ b/renderdoc/driver/gl/gl_manager.h @@ -243,6 +243,8 @@ public: void MarkVAOReferenced(GLResource res, FrameRefType ref, bool allowFake0 = false); void MarkFBOReferenced(GLResource res, FrameRefType ref); + void Force_ReferenceViews(); + template bool Serialise_InitialState(SerialiserType &ser, ResourceId resid, GLResource res); @@ -256,7 +258,6 @@ public: private: bool ResourceTypeRelease(GLResource res); - bool Force_InitialState(GLResource res, bool prepare); bool Need_InitialStateChunk(GLResource res); bool Prepare_InitialState(GLResource res); uint64_t GetSize_InitialState(ResourceId resid, GLResource res); diff --git a/renderdoc/driver/vulkan/vk_manager.cpp b/renderdoc/driver/vulkan/vk_manager.cpp index 7548c4a20..3107d4579 100644 --- a/renderdoc/driver/vulkan/vk_manager.cpp +++ b/renderdoc/driver/vulkan/vk_manager.cpp @@ -723,11 +723,6 @@ MemRefs *VulkanResourceManager::FindMemRefs(ResourceId mem) return NULL; } -bool VulkanResourceManager::Force_InitialState(WrappedVkRes *res, bool prepare) -{ - return false; -} - bool VulkanResourceManager::Need_InitialStateChunk(WrappedVkRes *res) { return true; diff --git a/renderdoc/driver/vulkan/vk_manager.h b/renderdoc/driver/vulkan/vk_manager.h index f25c77422..4c60f53c2 100644 --- a/renderdoc/driver/vulkan/vk_manager.h +++ b/renderdoc/driver/vulkan/vk_manager.h @@ -435,7 +435,6 @@ public: private: bool ResourceTypeRelease(WrappedVkRes *res); - bool Force_InitialState(WrappedVkRes *res, bool prepare); bool AllowDeletedResource_InitialState() { return true; } bool Need_InitialStateChunk(WrappedVkRes *res); bool Prepare_InitialState(WrappedVkRes *res);