diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2022-08-04 15:11:44 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-08-05 16:18:03 +0000 |
commit | 8531129c0af71539f60d05a78f5435e94090732a (patch) | |
tree | 366584e852898dfcc0e750529836969ffc7651be | |
parent | 9aa4dca6edb3747d7357b84b37603ec30e214468 (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.mm | 38 |
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() |