OSX MetalKit CVMetalTextureCacheCreateTextureFromImage не выполнен, статус: -6660 - PullRequest
2 голосов
/ 19 февраля 2020

Я пытаюсь сначала сделать CVPixelBuffer из RAW памяти, затем MTLTexture из CVPixelBuffer, но после запуска следующего кода у меня всегда появляется ошибка

CVMetalTextureCacheCreateTextureFromImage не выполнен, статус: -6660 0x0

Откуда появилась эта ошибка?

    id<MTLTexture> makeTextureWithBytes(id<MTLDevice> mtl_device, 
                                        int width, 
                                        int height, 
                                        void *baseAddress, int bytesPerRow)
    {

    CVMetalTextureCacheRef textureCache = NULL;

    CVReturn status = CVMetalTextureCacheCreate(kCFAllocatorDefault, nullptr, mtl_device, nullptr, &textureCache);
    if(status != kCVReturnSuccess || textureCache == NULL)
    {
        return nullptr;
    }

    NSDictionary* cvBufferProperties = @{
        (__bridge NSString*)kCVPixelBufferOpenGLCompatibilityKey : @YES,
        (__bridge NSString*)kCVPixelBufferMetalCompatibilityKey : @YES,
    };

    CVPixelBufferRef pxbuffer = NULL;

    status = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,
                                          width,
                                          height,
                                          kCVPixelFormatType_32BGRA,
                                          baseAddress,
                                          bytesPerRow,
                                          releaseCallback,
                                          NULL/*releaseRefCon*/,
                                          (__bridge CFDictionaryRef)cvBufferProperties,
                                          &pxbuffer);

    if(status != kCVReturnSuccess || pxbuffer == NULL)
    {
        return nullptr;
    }

    CVMetalTextureRef cvTexture = NULL;   

    status = CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
                                                       textureCache,
                                                       pxbuffer,
                                                       nullptr,
                                                       MTLPixelFormatBGRA8Unorm,
                                                       1920,
                                                       1080,
                                                       0,
                                                       &cvTexture);

    if(status != kCVReturnSuccess || cvTexture == NULL)
    {
        std::cout << "CVMetalTextureCacheCreateTextureFromImage failed, status: " << status << " " << cvTexture << std::endl;
        return nullptr;
    }
    id<MTLTexture> metalTexture = CVMetalTextureGetTexture(cvTexture);

    CFRelease(cvTexture);

    return metalTexture;
}
...