Defer release of QMetalGraphicsPipeline objects

Change-Id: Ia7ee1a1b13a8b5ac1ef4859330150f0558793dfe
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
(cherry picked from commit 3f450a6ba04ccfb14db7399305e54add172e4d81)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Andy Nichols 2022-08-03 14:00:26 +02:00 committed by Qt Cherry-pick Bot
parent 6040dece1f
commit cf89e21bde

View File

@ -132,7 +132,8 @@ struct QRhiMetalData
RenderBuffer, RenderBuffer,
Texture, Texture,
Sampler, Sampler,
StagingBuffer StagingBuffer,
Pipeline
}; };
Type type; Type type;
int lastActiveFrameSlot; // -1 if not used otherwise 0..FRAMES_IN_FLIGHT-1 int lastActiveFrameSlot; // -1 if not used otherwise 0..FRAMES_IN_FLIGHT-1
@ -154,6 +155,10 @@ struct QRhiMetalData
struct { struct {
id<MTLBuffer> buffer; id<MTLBuffer> buffer;
} stagingBuffer; } stagingBuffer;
struct {
id<MTLRenderPipelineState> pipelineState;
id<MTLDepthStencilState> depthStencilState;
} pipeline;
}; };
}; };
QVector<DeferredReleaseEntry> releaseQueue; QVector<DeferredReleaseEntry> releaseQueue;
@ -2219,6 +2224,10 @@ void QRhiMetal::executeDeferredReleases(bool forced)
case QRhiMetalData::DeferredReleaseEntry::StagingBuffer: case QRhiMetalData::DeferredReleaseEntry::StagingBuffer:
[e.stagingBuffer.buffer release]; [e.stagingBuffer.buffer release];
break; break;
case QRhiMetalData::DeferredReleaseEntry::Pipeline:
[e.pipeline.depthStencilState release];
[e.pipeline.pipelineState release];
break;
default: default:
break; break;
} }
@ -3282,17 +3291,17 @@ void QMetalGraphicsPipeline::destroy()
d->vs.destroy(); d->vs.destroy();
d->fs.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; d->ds = nil;
if (!d->ps)
return;
[d->ps release];
d->ps = nil; d->ps = nil;
QRHI_RES_RHI(QRhiMetal); QRHI_RES_RHI(QRhiMetal);
if (rhiD) if (rhiD)
rhiD->d->releaseQueue.append(e);
rhiD->unregisterResource(this); rhiD->unregisterResource(this);
} }