I'm creating a MTLTexture
from CVImageBuffer
s (from camera and players) using CVMetalTextureCacheCreateTextureFromImage
to get a CVMetalTexture
and then CVMetalTextureGetTexture
to get the MTLTexture
.
The problem I'm seeing is that when I later render the texture using Metal, I occasionally see video frames rendered out of order (visually it stutters back and forth in time), presumably because CoreVideo is modifying the underlying CVImageBuffer
storage and the MTLTexture
is just pointing there.
Is there any way to make CoreVideo not touch that buffer and use another one from its pool until I release the MTLTexture
object?
My current workaround is blitting the texture using a MTLBlitCommandEncoder
but since I just need to hold on to the texture for ~30 milliseconds that seems unnecessary.
I recently ran into this exact same issue. The problem is that the MTLTexture is not valid unless it's owning CVMetalTextureRef is still alive. You must keep a reference to the CVMetalTextureRef the entire time you're using the MTLTexture (all the way until the end of the current rendering cycle).