summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2022-08-04 15:11:44 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-08-05 16:18:03 +0000
commit8531129c0af71539f60d05a78f5435e94090732a (patch)
tree366584e852898dfcc0e750529836969ffc7651be
parent9aa4dca6edb3747d7357b84b37603ec30e214468 (diff)
rhi: metal: Defer also compute pipeline releasing
Change-Id: Idca8020b5acc026e19beaa297017731deb92e1bb Reviewed-by: Andy Nichols <andy.nichols@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> (cherry picked from commit 800465a7c4754cc56a67fb5bea58993369132f1e) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/gui/rhi/qrhimetal.mm38
1 files changed, 27 insertions, 11 deletions
diff --git a/src/gui/rhi/qrhimetal.mm b/src/gui/rhi/qrhimetal.mm
index 187b6005d6..2ae90bdb0e 100644
--- a/src/gui/rhi/qrhimetal.mm
+++ b/src/gui/rhi/qrhimetal.mm
@@ -133,7 +133,8 @@ struct QRhiMetalData
Texture,
Sampler,
StagingBuffer,
- Pipeline
+ GraphicsPipeline,
+ ComputePipeline
};
Type type;
int lastActiveFrameSlot; // -1 if not used otherwise 0..FRAMES_IN_FLIGHT-1
@@ -158,7 +159,10 @@ struct QRhiMetalData
struct {
id<MTLRenderPipelineState> pipelineState;
id<MTLDepthStencilState> depthStencilState;
- } pipeline;
+ } graphicsPipeline;
+ struct {
+ id<MTLComputePipelineState> pipelineState;
+ } computePipeline;
};
};
QVector<DeferredReleaseEntry> releaseQueue;
@@ -2224,9 +2228,12 @@ void QRhiMetal::executeDeferredReleases(bool forced)
case QRhiMetalData::DeferredReleaseEntry::StagingBuffer:
[e.stagingBuffer.buffer release];
break;
- case QRhiMetalData::DeferredReleaseEntry::Pipeline:
- [e.pipeline.depthStencilState release];
- [e.pipeline.pipelineState release];
+ case QRhiMetalData::DeferredReleaseEntry::GraphicsPipeline:
+ [e.graphicsPipeline.depthStencilState release];
+ [e.graphicsPipeline.pipelineState release];
+ break;
+ case QRhiMetalData::DeferredReleaseEntry::ComputePipeline:
+ [e.computePipeline.pipelineState release];
break;
default:
break;
@@ -3291,18 +3298,22 @@ void QMetalGraphicsPipeline::destroy()
d->vs.destroy();
d->fs.destroy();
+ if (!d->ps)
+ return;
+
QRhiMetalData::DeferredReleaseEntry e;
- e.type = QRhiMetalData::DeferredReleaseEntry::Pipeline;
+ e.type = QRhiMetalData::DeferredReleaseEntry::GraphicsPipeline;
e.lastActiveFrameSlot = lastActiveFrameSlot;
- e.pipeline.depthStencilState = d->ds;
- e.pipeline.pipelineState = d->ps;
+ e.graphicsPipeline.depthStencilState = d->ds;
+ e.graphicsPipeline.pipelineState = d->ps;
d->ds = nil;
d->ps = nil;
QRHI_RES_RHI(QRhiMetal);
- if (rhiD)
+ if (rhiD) {
rhiD->d->releaseQueue.append(e);
rhiD->unregisterResource(this);
+ }
}
static inline MTLVertexFormat toMetalAttributeFormat(QRhiVertexInputAttribute::Format format)
@@ -3806,12 +3817,17 @@ void QMetalComputePipeline::destroy()
if (!d->ps)
return;
- [d->ps release];
+ QRhiMetalData::DeferredReleaseEntry e;
+ e.type = QRhiMetalData::DeferredReleaseEntry::ComputePipeline;
+ e.lastActiveFrameSlot = lastActiveFrameSlot;
+ e.computePipeline.pipelineState = d->ps;
d->ps = nil;
QRHI_RES_RHI(QRhiMetal);
- if (rhiD)
+ if (rhiD) {
+ rhiD->d->releaseQueue.append(e);
rhiD->unregisterResource(this);
+ }
}
bool QMetalComputePipeline::create()