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:
parent
9aa4dca6ed
commit
8531129c0a
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user