I'm trying to figure out how the ownership works with the function CVMetalTextureGetTexture:
CVMetalTextureRef textureRef;
// ... textureRef is created
id<MTLTexture> texture = CVMetalTextureGetTexture(_textureRef);
CVBufferRelease(textureRef); // Releasing the existing texture
// Is texture still valid here?
Is texture still valid after releasing textureRef? If not, can I somehow transfer ownership from textureRef to texture (ARC), so I don't have to call CVBufferRelease later when texture is released?
The same question for swift:
var texture: MTLTexture
do {
var textureRef: CVMetalTexture
// ... textureRef is created
texture = CVMetalTextureGetTexture(textureRef)!
// end of scope, textureRef is released
}
// Is texture still valid here?
This is an excellent question since this kind of breaks the Create Rule, but it seems like this method indeed retains the underlying object. I guess this rule doesn't apply for Core Foundation -> ARC methods...
You can see in this Apple Demo that they do release the ref after converting it to an id<MTLTexture>. They do it in the more implicit Swifty version so it's easily missed.
We have also made another experiment before I see your question:
in a loop, CVMetalTextureRef created from CVPixelBuffer comes from Camera.
static void *texturePtr;
/** AVCaptureVideoDataOutputSampleBufferDelegate, as a loop */
{
CVMetalTextureRef textureRef;
// ... textureRef is created
id<MTLTexture> texture = CVMetalTextureGetTexture(_textureRef);
CVBufferRelease(textureRef); // Releasing the existing texture
texturePtr= (__bridge_retained void*)texture;
// no releasing the texturePtr
// (__bridge_transfer id<MTLTexture>)texturePtr;
}
I found that I did not release the texturePtr, but still no memory leak occurs. What's more, texturePtr is valid in sometime and before we replace it with the new var.
So I think maybe this is linked to your question.
My reply is more like an argument other than an answer.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With