diff options
author | Andy Nichols <nezticle@gmail.com> | 2022-08-03 14:00:26 +0200 |
---|---|---|
committer | Andy Nichols <nezticle@gmail.com> | 2022-08-03 20:46:30 +0200 |
commit | 3f450a6ba04ccfb14db7399305e54add172e4d81 (patch) | |
tree | add1c8c8dc4b1f6b549148107fb32889241a9704 /src/gui/rhi/qrhimetal.mm | |
parent | 84ab6c1aa1fe4051edb9f96714f0f691d639b725 (diff) |
Defer release of QMetalGraphicsPipeline objects
Pick-to: 6.4
Change-Id: Ia7ee1a1b13a8b5ac1ef4859330150f0558793dfe
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'src/gui/rhi/qrhimetal.mm')
-rw-r--r-- | src/gui/rhi/qrhimetal.mm | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/gui/rhi/qrhimetal.mm b/src/gui/rhi/qrhimetal.mm index ed416feb7c..e68851d3bc 100644 --- a/src/gui/rhi/qrhimetal.mm +++ b/src/gui/rhi/qrhimetal.mm @@ -132,7 +132,8 @@ struct QRhiMetalData RenderBuffer, Texture, Sampler, - StagingBuffer + StagingBuffer, + Pipeline }; Type type; int lastActiveFrameSlot; // -1 if not used otherwise 0..FRAMES_IN_FLIGHT-1 @@ -154,6 +155,10 @@ struct QRhiMetalData struct { id<MTLBuffer> buffer; } stagingBuffer; + struct { + id<MTLRenderPipelineState> pipelineState; + id<MTLDepthStencilState> depthStencilState; + } pipeline; }; }; QVector<DeferredReleaseEntry> releaseQueue; @@ -2221,6 +2226,10 @@ 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]; + break; default: break; } @@ -3284,17 +3293,17 @@ void QMetalGraphicsPipeline::destroy() d->vs.destroy(); d->fs.destroy(); - [d->ds release]; + QRhiMetalData::DeferredReleaseEntry e; + e.type = QRhiMetalData::DeferredReleaseEntry::Pipeline; + e.lastActiveFrameSlot = lastActiveFrameSlot; + e.pipeline.depthStencilState = d->ds; + e.pipeline.pipelineState = d->ps; d->ds = nil; - - if (!d->ps) - return; - - [d->ps release]; d->ps = nil; QRHI_RES_RHI(QRhiMetal); if (rhiD) + rhiD->d->releaseQueue.append(e); rhiD->unregisterResource(this); } |