diff options
author | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2016-05-02 22:37:45 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2016-05-03 10:12:45 +0000 |
commit | e96fe44ff09703fe3033d6e90d787d2fb68c9e63 (patch) | |
tree | 64e36dc09499aa3137cc8d6a4df0eef03abf2430 | |
parent | 0ea01a229b42eacee340cd1dc6895a7de99ea895 (diff) |
D3D12: Fix incorrect descriptor heap types in deferred releases
The type is not always CBV_SRV_UAV, it can also be RTV or DSV when
offscreen render targets are in use.
Change-Id: I2d154fbf48e8372bd415be0acbee8e563f972140
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
-rw-r--r-- | src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp | 17 | ||||
-rw-r--r-- | src/plugins/scenegraph/d3d12/qsgd3d12engine_p_p.h | 3 |
2 files changed, 11 insertions, 9 deletions
diff --git a/src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp b/src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp index 62acb8d679..7445a8bb40 100644 --- a/src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp +++ b/src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp @@ -1272,7 +1272,7 @@ void QSGD3D12EnginePrivate::beginFrame() e.descHeap = nullptr; if (e.cpuDescriptorPtr) { D3D12_CPU_DESCRIPTOR_HANDLE h = { e.cpuDescriptorPtr }; - cpuDescHeapManager.release(h, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + cpuDescHeapManager.release(h, e.descHeapType); } } pfd.deleteQueue.clear(); @@ -2263,7 +2263,7 @@ void QSGD3D12EnginePrivate::queueTextureResize(uint id, const QSize &size) return; } - deferredDelete(t.srv); + deferredDelete(t.srv, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); t.srv = cpuDescHeapManager.allocate(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; @@ -2453,9 +2453,9 @@ void QSGD3D12EnginePrivate::releaseTexture(uint id) if (t.texture) { deferredDelete(t.texture); - deferredDelete(t.srv); + deferredDelete(t.srv, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); for (D3D12_CPU_DESCRIPTOR_HANDLE h : t.mipUAVs) - deferredDelete(h); + deferredDelete(h, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); } QSet<PersistentFrameData::PendingRelease> *pendingReleasesSet = inFrame @@ -2657,10 +2657,11 @@ void QSGD3D12EnginePrivate::deferredDelete(ComPtr<ID3D12DescriptorHeap> dh) (*dq) << e; } -void QSGD3D12EnginePrivate::deferredDelete(D3D12_CPU_DESCRIPTOR_HANDLE h) +void QSGD3D12EnginePrivate::deferredDelete(D3D12_CPU_DESCRIPTOR_HANDLE h, D3D12_DESCRIPTOR_HEAP_TYPE type) { PersistentFrameData::DeleteQueueEntry e; e.cpuDescriptorPtr = h.ptr; + e.descHeapType = type; QVector<PersistentFrameData::DeleteQueueEntry> *dq = inFrame ? &pframeData[currentPFrameIndex].deleteQueue : &pframeData[(currentPFrameIndex + 1) % frameInFlightCount].outOfFrameDeleteQueue; @@ -2745,13 +2746,13 @@ void QSGD3D12EnginePrivate::releaseRenderTarget(uint id) if (rt.color) { deferredDelete(rt.color); rt.color = nullptr; - deferredDelete(rt.rtv); - deferredDelete(rt.srv); + deferredDelete(rt.rtv, D3D12_DESCRIPTOR_HEAP_TYPE_RTV); + deferredDelete(rt.srv, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); } if (rt.ds) { deferredDelete(rt.ds); rt.ds = nullptr; - deferredDelete(rt.dsv); + deferredDelete(rt.dsv, D3D12_DESCRIPTOR_HEAP_TYPE_DSV); } rt.flags &= ~RenderTarget::EntryInUse; diff --git a/src/plugins/scenegraph/d3d12/qsgd3d12engine_p_p.h b/src/plugins/scenegraph/d3d12/qsgd3d12engine_p_p.h index 86e71ace0c..cedcebd6d2 100644 --- a/src/plugins/scenegraph/d3d12/qsgd3d12engine_p_p.h +++ b/src/plugins/scenegraph/d3d12/qsgd3d12engine_p_p.h @@ -222,6 +222,7 @@ private: ComPtr<ID3D12Resource> res; ComPtr<ID3D12DescriptorHeap> descHeap; SIZE_T cpuDescriptorPtr = 0; + D3D12_DESCRIPTOR_HEAP_TYPE descHeapType = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; }; QVector<DeleteQueueEntry> deleteQueue; QVector<DeleteQueueEntry> outOfFrameDeleteQueue; @@ -245,7 +246,7 @@ private: void deferredDelete(ComPtr<ID3D12Resource> res); void deferredDelete(ComPtr<ID3D12DescriptorHeap> dh); - void deferredDelete(D3D12_CPU_DESCRIPTOR_HANDLE h); + void deferredDelete(D3D12_CPU_DESCRIPTOR_HANDLE h, D3D12_DESCRIPTOR_HEAP_TYPE type); struct Buffer; void ensureBuffer(Buffer *buf); |