diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2024-04-18 12:44:58 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2024-04-26 18:59:54 +0200 |
commit | 94e83aa7d7d05cf0b6636bdfac5cdcb38706aa73 (patch) | |
tree | 442f77792604e7bcf72459af86fd83ad744946d5 | |
parent | da508c2c241aa52c22a8355c541819ea45969d48 (diff) |
metal: Tie drawable's MTLTexture lifetime to MTLCommandBuffer
By default we define QRHI_METAL_COMMAND_BUFFERS_WITH_UNRETAINED_REFERENCES,
which means we create MTLCommandBuffer via commandBufferWithUnretainedReferences.
In this case, if Metal API validation diagnostics is enabled in Xcode,
the texture is released before the command buffer is done with it, so
we manually ensure the lifetime of the texture extends until the command
buffer is complete.
Pick-to: 6.7
Change-Id: I9b9efa96b4a004f43e0b72144aafc4b440c7fbb4
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
-rw-r--r-- | src/gui/rhi/qrhimetal.mm | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/gui/rhi/qrhimetal.mm b/src/gui/rhi/qrhimetal.mm index 1c7b397193..b99afc596c 100644 --- a/src/gui/rhi/qrhimetal.mm +++ b/src/gui/rhi/qrhimetal.mm @@ -2402,6 +2402,16 @@ QRhi::FrameOpResult QRhiMetal::endFrame(QRhiSwapChain *swapChain, QRhi::EndFrame dispatch_semaphore_signal(swapChainD->d->sem[thisFrameSlot]); }]; +#ifdef QRHI_METAL_COMMAND_BUFFERS_WITH_UNRETAINED_REFERENCES + // When Metal API validation diagnostics is enabled in Xcode the texture is + // released before the command buffer is done with it. Manually keep it alive + // to work around this. + id<MTLTexture> drawableTexture = [swapChainD->d->curDrawable.texture retain]; + [swapChainD->cbWrapper.d->cb addCompletedHandler:^(id<MTLCommandBuffer>) { + [drawableTexture release]; + }]; +#endif + const bool needsPresent = !flags.testFlag(QRhi::SkipPresent); const bool presentsWithTransaction = swapChainD->d->layer.presentsWithTransaction; if (!presentsWithTransaction && needsPresent) { |