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>
This commit is contained in:
Laszlo Agocs 2022-08-04 15:11:44 +02:00 committed by Qt Cherry-pick Bot
parent 9aa4dca6ed
commit 8531129c0a

View File

@ -133,7 +133,8 @@ struct QRhiMetalData
Texture, Texture,
Sampler, Sampler,
StagingBuffer, StagingBuffer,
Pipeline GraphicsPipeline,
ComputePipeline
}; };
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
@ -158,7 +159,10 @@ struct QRhiMetalData
struct { struct {
id<MTLRenderPipelineState> pipelineState; id<MTLRenderPipelineState> pipelineState;
id<MTLDepthStencilState> depthStencilState; id<MTLDepthStencilState> depthStencilState;
} pipeline; } graphicsPipeline;
struct {
id<MTLComputePipelineState> pipelineState;
} computePipeline;
}; };
}; };
QVector<DeferredReleaseEntry> releaseQueue; QVector<DeferredReleaseEntry> releaseQueue;
@ -2224,9 +2228,12 @@ 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: case QRhiMetalData::DeferredReleaseEntry::GraphicsPipeline:
[e.pipeline.depthStencilState release]; [e.graphicsPipeline.depthStencilState release];
[e.pipeline.pipelineState release]; [e.graphicsPipeline.pipelineState release];
break;
case QRhiMetalData::DeferredReleaseEntry::ComputePipeline:
[e.computePipeline.pipelineState release];
break; break;
default: default:
break; break;
@ -3291,18 +3298,22 @@ void QMetalGraphicsPipeline::destroy()
d->vs.destroy(); d->vs.destroy();
d->fs.destroy(); d->fs.destroy();
if (!d->ps)
return;
QRhiMetalData::DeferredReleaseEntry e; QRhiMetalData::DeferredReleaseEntry e;
e.type = QRhiMetalData::DeferredReleaseEntry::Pipeline; e.type = QRhiMetalData::DeferredReleaseEntry::GraphicsPipeline;
e.lastActiveFrameSlot = lastActiveFrameSlot; e.lastActiveFrameSlot = lastActiveFrameSlot;
e.pipeline.depthStencilState = d->ds; e.graphicsPipeline.depthStencilState = d->ds;
e.pipeline.pipelineState = d->ps; e.graphicsPipeline.pipelineState = d->ps;
d->ds = nil; d->ds = nil;
d->ps = nil; d->ps = nil;
QRHI_RES_RHI(QRhiMetal); QRHI_RES_RHI(QRhiMetal);
if (rhiD) if (rhiD) {
rhiD->d->releaseQueue.append(e); rhiD->d->releaseQueue.append(e);
rhiD->unregisterResource(this); rhiD->unregisterResource(this);
}
} }
static inline MTLVertexFormat toMetalAttributeFormat(QRhiVertexInputAttribute::Format format) static inline MTLVertexFormat toMetalAttributeFormat(QRhiVertexInputAttribute::Format format)
@ -3806,12 +3817,17 @@ void QMetalComputePipeline::destroy()
if (!d->ps) if (!d->ps)
return; return;
[d->ps release]; QRhiMetalData::DeferredReleaseEntry e;
e.type = QRhiMetalData::DeferredReleaseEntry::ComputePipeline;
e.lastActiveFrameSlot = lastActiveFrameSlot;
e.computePipeline.pipelineState = d->ps;
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);
}
} }
bool QMetalComputePipeline::create() bool QMetalComputePipeline::create()