aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/scenegraph
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@theqtcompany.com>2016-05-02 22:37:45 +0200
committerLaszlo Agocs <laszlo.agocs@theqtcompany.com>2016-05-03 10:12:45 +0000
commite96fe44ff09703fe3033d6e90d787d2fb68c9e63 (patch)
tree64e36dc09499aa3137cc8d6a4df0eef03abf2430 /src/plugins/scenegraph
parent0ea01a229b42eacee340cd1dc6895a7de99ea895 (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>
Diffstat (limited to 'src/plugins/scenegraph')
-rw-r--r--src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp17
-rw-r--r--src/plugins/scenegraph/d3d12/qsgd3d12engine_p_p.h3
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);