| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "libavutil/log.h" |
| #include "utils.h" |
|
|
| void ff_metal_compute_encoder_dispatch(id<MTLDevice> device, |
| id<MTLComputePipelineState> pipeline, |
| id<MTLComputeCommandEncoder> encoder, |
| NSUInteger width, NSUInteger height) |
| { |
| [encoder setComputePipelineState:pipeline]; |
| NSUInteger w = pipeline.threadExecutionWidth; |
| NSUInteger h = pipeline.maxTotalThreadsPerThreadgroup / w; |
| MTLSize threadsPerThreadgroup = MTLSizeMake(w, h, 1); |
| BOOL fallback = YES; |
| // MAC_OS_X_VERSION_10_15 is only defined on SDKs new enough to include its functionality (including iOS, tvOS, etc) |
| #ifdef MAC_OS_X_VERSION_10_15 |
| if (@available(macOS 10.15, iOS 11, tvOS 14.5, *)) { |
| if ([device supportsFamily:MTLGPUFamilyCommon3]) { |
| MTLSize threadsPerGrid = MTLSizeMake(width, height, 1); |
| [encoder dispatchThreads:threadsPerGrid threadsPerThreadgroup:threadsPerThreadgroup]; |
| fallback = NO; |
| } |
| } |
| #endif |
| if (fallback) { |
| MTLSize threadgroups = MTLSizeMake((width + w - 1) / w, |
| (height + h - 1) / h, |
| 1); |
| [encoder dispatchThreadgroups:threadgroups threadsPerThreadgroup:threadsPerThreadgroup]; |
| } |
| } |
|
|
| CVMetalTextureRef ff_metal_texture_from_pixbuf(void *ctx, |
| CVMetalTextureCacheRef textureCache, |
| CVPixelBufferRef pixbuf, |
| int plane, |
| MTLPixelFormat format) |
| { |
| CVMetalTextureRef tex = NULL; |
| CVReturn ret; |
|
|
| ret = CVMetalTextureCacheCreateTextureFromImage( |
| NULL, |
| textureCache, |
| pixbuf, |
| NULL, |
| format, |
| CVPixelBufferGetWidthOfPlane(pixbuf, plane), |
| CVPixelBufferGetHeightOfPlane(pixbuf, plane), |
| plane, |
| &tex |
| ); |
| if (ret != kCVReturnSuccess) { |
| av_log(ctx, AV_LOG_ERROR, "Failed to create CVMetalTexture from image: %d\n", ret); |
| return NULL; |
| } |
|
|
| return tex; |
| } |
|
|