summaryrefslogtreecommitdiffstats
path: root/src/gui/rhi/qrhimetal.mm
diff options
context:
space:
mode:
authorAndy Nichols <nezticle@gmail.com>2022-08-03 14:00:26 +0200
committerAndy Nichols <nezticle@gmail.com>2022-08-03 20:46:30 +0200
commit3f450a6ba04ccfb14db7399305e54add172e4d81 (patch)
treeadd1c8c8dc4b1f6b549148107fb32889241a9704 /src/gui/rhi/qrhimetal.mm
parent84ab6c1aa1fe4051edb9f96714f0f691d639b725 (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.mm23
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);
}