diff --git a/src/gui/rhi/qrhimetal.mm b/src/gui/rhi/qrhimetal.mm index 6e469f5b6d4..187b6005d6e 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 buffer; } stagingBuffer; + struct { + id pipelineState; + id depthStencilState; + } pipeline; }; }; QVector releaseQueue; @@ -2219,6 +2224,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; } @@ -3282,17 +3291,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); }