From 69a27aea40d2b0f1b7c4741be48637b03988f7b3 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 26 Aug 2021 12:06:25 +0100 Subject: [PATCH] Handle MakeResident/Evict being refcounted, and handle placed resources * Placed resources aren't directly resident or non-resident, it's the underlying heap that needs to be made resident or evicted. --- renderdoc/driver/d3d12/d3d12_common.h | 11 ++-------- renderdoc/driver/d3d12/d3d12_device_wrap.cpp | 18 +++++++++------- renderdoc/driver/d3d12/d3d12_device_wrap3.cpp | 4 ++-- renderdoc/driver/d3d12/d3d12_device_wrap4.cpp | 2 +- renderdoc/driver/d3d12/d3d12_device_wrap8.cpp | 2 ++ renderdoc/driver/d3d12/d3d12_initstate.cpp | 4 ++-- renderdoc/driver/d3d12/d3d12_resources.cpp | 2 -- renderdoc/driver/d3d12/d3d12_resources.h | 21 +++++++++++++++++++ 8 files changed, 40 insertions(+), 24 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_common.h b/renderdoc/driver/d3d12/d3d12_common.h index 56dc80101..699809d9d 100644 --- a/renderdoc/driver/d3d12/d3d12_common.h +++ b/renderdoc/driver/d3d12/d3d12_common.h @@ -152,8 +152,7 @@ class RefCounter12 { private: unsigned int m_iRefcount; - unsigned int m_InternalRefcount : 30; - unsigned int resident : 1; + unsigned int m_InternalRefcount : 31; unsigned int m_SelfDeleting : 1; protected: @@ -165,11 +164,7 @@ protected: public: RefCounter12(RealType *real, bool selfDelete = true) - : m_pReal(real), - m_iRefcount(1), - m_InternalRefcount(0), - resident(1), - m_SelfDeleting(selfDelete ? 1 : 0) + : m_pReal(real), m_iRefcount(1), m_InternalRefcount(0), m_SelfDeleting(selfDelete ? 1 : 0) { } virtual ~RefCounter12() {} @@ -179,8 +174,6 @@ public: // add them here and they're subtracted from return values void AddInternalRef() { m_InternalRefcount++; } void ReleaseInternalRef() { m_InternalRefcount--; } - bool Resident() { return resident != 0; } - void SetResident(bool r) { resident = r ? 1 : 0; } ////////////////////////////// // implement IUnknown HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp index e77607d2b..c7b34310e 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp @@ -1569,7 +1569,7 @@ HRESULT WrappedID3D12Device::CreateCommittedResource(const D3D12_HEAP_PROPERTIES pOptimizedClearValue, riidResource, (void **)&wrapped); if(HeapFlags & D3D12_HEAP_FLAG_CREATE_NOT_RESIDENT) - wrapped->SetResident(false); + wrapped->Evict(); D3D12ResourceRecord *record = GetResourceManager()->AddResourceRecord(wrapped->GetResourceID()); record->type = Resource_Resource; @@ -1697,7 +1697,7 @@ HRESULT WrappedID3D12Device::CreateHeap(const D3D12_HEAP_DESC *pDesc, REFIID rii Serialise_CreateHeap(ser, pDesc, riid, (void **)&wrapped); if(pDesc->Flags & D3D12_HEAP_FLAG_CREATE_NOT_RESIDENT) - wrapped->SetResident(false); + wrapped->Evict(); D3D12ResourceRecord *record = GetResourceManager()->AddResourceRecord(wrapped->GetResourceID()); record->type = Resource_Heap; @@ -1868,6 +1868,8 @@ HRESULT WrappedID3D12Device::CreatePlacedResource(ID3D12Heap *pHeap, UINT64 Heap { WrappedID3D12Resource *wrapped = new WrappedID3D12Resource(real, this); + wrapped->SetHeap(pHeap); + if(IsCaptureMode(m_State)) { CACHE_THREAD_SERIALISER(); @@ -3053,7 +3055,7 @@ HRESULT WrappedID3D12Device::OpenSharedHandleInternal(D3D12Chunk chunkType, WrappedID3D12Resource *wrapped = new WrappedID3D12Resource(real, this); if(HeapFlags & D3D12_HEAP_FLAG_CREATE_NOT_RESIDENT) - wrapped->SetResident(false); + wrapped->Evict(); wrappedDeviceChild = wrapped; @@ -3098,7 +3100,7 @@ HRESULT WrappedID3D12Device::OpenSharedHandleInternal(D3D12Chunk chunkType, WrappedID3D12Heap *wrapped = new WrappedID3D12Heap(real, this); if(HeapFlags & D3D12_HEAP_FLAG_CREATE_NOT_RESIDENT) - wrapped->SetResident(false); + wrapped->Evict(); wrappedDeviceChild = wrapped; @@ -3144,13 +3146,13 @@ HRESULT WrappedID3D12Device::MakeResident(UINT NumObjects, ID3D12Pageable *const if(WrappedID3D12DescriptorHeap::IsAlloc(ppObjects[i])) { WrappedID3D12DescriptorHeap *heap = (WrappedID3D12DescriptorHeap *)ppObjects[i]; - heap->SetResident(true); + heap->MakeResident(); unwrapped[i] = heap->GetReal(); } else if(WrappedID3D12Resource::IsAlloc(ppObjects[i])) { WrappedID3D12Resource *res = (WrappedID3D12Resource *)ppObjects[i]; - res->SetResident(true); + res->MakeResident(); unwrapped[i] = res->GetReal(); } else @@ -3171,13 +3173,13 @@ HRESULT WrappedID3D12Device::Evict(UINT NumObjects, ID3D12Pageable *const *ppObj if(WrappedID3D12DescriptorHeap::IsAlloc(ppObjects[i])) { WrappedID3D12DescriptorHeap *heap = (WrappedID3D12DescriptorHeap *)ppObjects[i]; - heap->SetResident(false); + heap->Evict(); unwrapped[i] = heap->GetReal(); } else if(WrappedID3D12Resource::IsAlloc(ppObjects[i])) { WrappedID3D12Resource *res = (WrappedID3D12Resource *)ppObjects[i]; - res->SetResident(false); + res->Evict(); unwrapped[i] = res->GetReal(); } else diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap3.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap3.cpp index fd04970c8..fa628e450 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap3.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap3.cpp @@ -178,13 +178,13 @@ HRESULT WrappedID3D12Device::EnqueueMakeResident(D3D12_RESIDENCY_FLAGS Flags, UI if(WrappedID3D12DescriptorHeap::IsAlloc(ppObjects[i])) { WrappedID3D12DescriptorHeap *heap = (WrappedID3D12DescriptorHeap *)ppObjects[i]; - heap->SetResident(true); + heap->MakeResident(); unwrapped[i] = heap->GetReal(); } else if(WrappedID3D12Resource::IsAlloc(ppObjects[i])) { WrappedID3D12Resource *res = (WrappedID3D12Resource *)ppObjects[i]; - res->SetResident(true); + res->MakeResident(); unwrapped[i] = res->GetReal(); } else diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap4.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap4.cpp index 29b7da1b5..6e5743bce 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap4.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap4.cpp @@ -509,7 +509,7 @@ HRESULT WrappedID3D12Device::CreateHeap1(const D3D12_HEAP_DESC *pDesc, Serialise_CreateHeap1(ser, pDesc, pProtectedSession, riid, (void **)&wrapped); if(pDesc->Flags & D3D12_HEAP_FLAG_CREATE_NOT_RESIDENT) - wrapped->SetResident(false); + wrapped->Evict(); D3D12ResourceRecord *record = GetResourceManager()->AddResourceRecord(wrapped->GetResourceID()); record->type = Resource_Heap; diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap8.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap8.cpp index 6f406dbb0..0167d4156 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap8.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap8.cpp @@ -413,6 +413,8 @@ HRESULT WrappedID3D12Device::CreatePlacedResource1(ID3D12Heap *pHeap, UINT64 Hea { WrappedID3D12Resource *wrapped = new WrappedID3D12Resource(real, this); + wrapped->SetHeap(pHeap); + if(IsCaptureMode(m_State)) { CACHE_THREAD_SERIALISER(); diff --git a/renderdoc/driver/d3d12/d3d12_initstate.cpp b/renderdoc/driver/d3d12/d3d12_initstate.cpp index dfe56dcb9..20c94d395 100644 --- a/renderdoc/driver/d3d12/d3d12_initstate.cpp +++ b/renderdoc/driver/d3d12/d3d12_initstate.cpp @@ -51,10 +51,10 @@ bool D3D12ResourceManager::Prepare_InitialState(ID3D12DeviceChild *res) else if(type == Resource_Resource) { WrappedID3D12Resource *r = (WrappedID3D12Resource *)res; - ID3D12Pageable *pageable = r; + ID3D12Pageable *pageable = r->ResidencyPageable(); bool nonresident = false; - if(!r->Resident()) + if(!r->IsResident()) nonresident = true; D3D12_RESOURCE_DESC desc = r->GetDesc(); diff --git a/renderdoc/driver/d3d12/d3d12_resources.cpp b/renderdoc/driver/d3d12/d3d12_resources.cpp index 5627c38ab..226fd3531 100644 --- a/renderdoc/driver/d3d12/d3d12_resources.cpp +++ b/renderdoc/driver/d3d12/d3d12_resources.cpp @@ -357,8 +357,6 @@ WrappedID3D12DescriptorHeap::WrappedID3D12DescriptorHeap(ID3D12DescriptorHeap *r realCPUBase = real->GetCPUDescriptorHandleForHeapStart(); realGPUBase = real->GetGPUDescriptorHandleForHeapStart(); - SetResident(true); - increment = device->GetUnwrappedDescriptorIncrement(desc.Type); numDescriptors = UnpatchedNumDescriptors; diff --git a/renderdoc/driver/d3d12/d3d12_resources.h b/renderdoc/driver/d3d12/d3d12_resources.h index e05a1f45e..cb14fba72 100644 --- a/renderdoc/driver/d3d12/d3d12_resources.h +++ b/renderdoc/driver/d3d12/d3d12_resources.h @@ -68,6 +68,7 @@ class WrappedDeviceChild12 : public RefCounter12, { protected: WrappedID3D12Device *m_pDevice; + int32_t m_Resident = 1; WrappedDeviceChild12(NestedType *real, WrappedID3D12Device *device) : RefCounter12(real), m_pDevice(device) @@ -105,6 +106,9 @@ protected: public: typedef NestedType InnerType; + bool IsResident() { return m_Resident > 0; } + void MakeResident() { Atomic::Inc32(&m_Resident); } + void Evict() { Atomic::Dec32(&m_Resident); } NestedType *GetReal() { return m_pReal; } ULONG STDMETHODCALLTYPE AddRef() { return RefCounter12::SoftRef(m_pDevice); } ULONG STDMETHODCALLTYPE Release() { return RefCounter12::SoftRelease(m_pDevice); } @@ -915,9 +919,26 @@ class WrappedID3D12Resource WriteSerialiser &GetThreadSerialiser(); + WrappedID3D12Heap *m_Heap = NULL; + public: ALLOCATE_WITH_WRAPPED_POOL(WrappedID3D12Resource, false); + bool IsResident() + { + if(m_Heap) + return m_Heap->IsResident(); + return WrappedDeviceChild12::IsResident(); + } + + ID3D12Pageable *ResidencyPageable() + { + if(m_Heap) + return m_Heap; + return this; + } + + void SetHeap(ID3D12Heap *heap) { m_Heap = (WrappedID3D12Heap *)heap; } static void RefBuffers(D3D12ResourceManager *rm); static rdcarray AddRefBuffersBeforeCapture(D3D12ResourceManager *rm);