From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id BB34640619 for ; Wed, 22 Dec 2021 01:21:02 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CE9B468AF34; Wed, 22 Dec 2021 03:20:59 +0200 (EET) Received: from mail-ua1-f51.google.com (mail-ua1-f51.google.com [209.85.222.51]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6519268AE9C for ; Wed, 22 Dec 2021 03:20:53 +0200 (EET) Received: by mail-ua1-f51.google.com with SMTP id r15so1560470uao.3 for ; Tue, 21 Dec 2021 17:20:53 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=n0hjwkhXl0R9aR61xnQJlLRsD9PW26GFaLF5sr1RGVo=; b=MA1KKhy1AYwrQGGHVBrWnD8QevxQQXZJ1pTQpGpzFUw3unnSCTxc39hYq3tqkO68/5 j7F7i+z2vQLZU3NCoCKU/7n44pl+FbxinYoDbPLnh2RzfhGb6rSEIDhT0fFxOzC1QiOE QVyABGeKOFKjI8dy8zSY2zrLS1e1M3BS7DGTmSb4FeDu9YNy8fsmKwwBU9NN/ddy7v8z CuPqwPtrHLYWX0rWS48x8Mvp25a7KPMPDtWscUVHpU7ODWElSCzeUg0IvlRBxJXez/Us kBsmn1dqsi8itPTZQD0FzJ9AACy5dX9YJG7pT3GQ3eMegYOWRD3ibpHb+71SUlbAX4cl ZGJQ== X-Gm-Message-State: AOAM531Y02uo189LCIQ6yjxE7uCLa5zgTQfCAdrytcTJ5ZmlD/MkcZSr nasO//dKQAVW98xxvGsauOXqXhtOTMY84/4eBB75/YEKJpQ= X-Google-Smtp-Source: ABdhPJw2rdA4oQ1UWZWjzMko7LljqpW1hAmTCXNq9Ja1brkToLAqCVlrk2WUD5mRDveI/MmbFKMY6Pzw5vF/H2ZU2Cg= X-Received: by 2002:a05:6102:548b:: with SMTP id bk11mr290702vsb.0.1640136051100; Tue, 21 Dec 2021 17:20:51 -0800 (PST) MIME-Version: 1.0 References: <20211222000725.38266-1-rcombs@rcombs.me> <20211222000725.38266-7-rcombs@rcombs.me> In-Reply-To: <20211222000725.38266-7-rcombs@rcombs.me> From: Aman Karmani Date: Tue, 21 Dec 2021 17:20:39 -0800 Message-ID: To: FFmpeg development discussions and patches X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: Re: [FFmpeg-devel] [PATCH 7/7] lavfi/metal: fix build with pre-10.11 deployment targets X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On Tue, Dec 21, 2021 at 4:15 PM rcombs wrote: > - Ensure the yadif .metal compiles when targeting any Metal runtime version > - Use some preprocessor awkwardness to ensure Core Video's Metal-specific > functionality is exposed regardless of our deployment target (this works > around what seems to be an SDK header bug, filed as FB9816002) > - Ensure all direct references to Metal functions and classes are gated > behind runtime version checks (this satisfies clang's deployment-target > violation warnings provided by -Wunguarded-availability). > --- > libavfilter/metal/utils.h | 28 +++++++- > libavfilter/metal/vf_yadif_videotoolbox.metal | 11 ++- > libavfilter/vf_yadif_videotoolbox.m | 67 ++++++++++++++++--- > 3 files changed, 94 insertions(+), 12 deletions(-) > Patchset LGTM. Thanks for your work on this. > > diff --git a/libavfilter/metal/utils.h b/libavfilter/metal/utils.h > index bd0319f63c..7350d42a35 100644 > --- a/libavfilter/metal/utils.h > +++ b/libavfilter/metal/utils.h > @@ -20,16 +20,40 @@ > #define AVFILTER_METAL_UTILS_H > > #include > + > +#include > + > +// CoreVideo accidentally(?) preprocessor-gates Metal functionality > +// on MAC_OS_X_VERSION_MIN_REQUIRED >= 101100 (FB9816002). > +// There doesn't seem to be any particular reason for this, > +// so here we temporarily redefine it to at least that value > +// so CV will give us CVMetalTextureRef and the related functions. > + > +#if defined(MAC_OS_X_VERSION_MIN_REQUIRED) && > (MAC_OS_X_VERSION_MIN_REQUIRED < 101100) > +#define ORIG_MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_MIN_REQUIRED > +#undef MAC_OS_X_VERSION_MIN_REQUIRED > +#define MAC_OS_X_VERSION_MIN_REQUIRED 101100 > +#endif > + > #include > > +#ifdef ORIG_MAC_OS_X_VERSION_MIN_REQUIRED > +#undef MAC_OS_X_VERSION_MIN_REQUIRED > +#define MAC_OS_X_VERSION_MIN_REQUIRED ORIG_MAC_OS_X_VERSION_MIN_REQUIRED > +#undef ORIG_MAC_OS_X_VERSION_MIN_REQUIRED > +#endif > + > void ff_metal_compute_encoder_dispatch(id device, > id > pipeline, > id > encoder, > - NSUInteger width, NSUInteger > height); > + NSUInteger width, NSUInteger > height) > + API_AVAILABLE(macos(10.11), > ios(8.0)); > > CVMetalTextureRef ff_metal_texture_from_pixbuf(void *avclass, > CVMetalTextureCacheRef > textureCache, > CVPixelBufferRef pixbuf, > int plane, > - MTLPixelFormat format); > + MTLPixelFormat format) > + > API_AVAILABLE(macos(10.11), ios(8.0)); > + > #endif /* AVFILTER_METAL_UTILS_H */ > diff --git a/libavfilter/metal/vf_yadif_videotoolbox.metal > b/libavfilter/metal/vf_yadif_videotoolbox.metal > index 50783f2ffe..8a3d41a30f 100644 > --- a/libavfilter/metal/vf_yadif_videotoolbox.metal > +++ b/libavfilter/metal/vf_yadif_videotoolbox.metal > @@ -26,6 +26,15 @@ > > using namespace metal; > > +/* > + * Version compat shims > + */ > + > +#if __METAL_VERSION__ < 210 > +#define max3(x, y, z) max(x, max(y, z)) > +#define min3(x, y, z) min(x, min(y, z)) > +#endif > + > /* > * Parameters > */ > @@ -44,7 +53,7 @@ struct deintParams { > */ > > #define accesstype access::sample > -const sampler s(coord::pixel); > +constexpr sampler s(coord::pixel); > > template > T tex2D(texture2d tex, uint x, uint y) > diff --git a/libavfilter/vf_yadif_videotoolbox.m > b/libavfilter/vf_yadif_videotoolbox.m > index 65f155982e..455745817f 100644 > --- a/libavfilter/vf_yadif_videotoolbox.m > +++ b/libavfilter/vf_yadif_videotoolbox.m > @@ -26,10 +26,12 @@ > #include "libavutil/hwcontext.h" > #include "libavutil/objc.h" > > +#include > + > extern char ff_vf_yadif_videotoolbox_metallib_data[]; > extern unsigned int ff_vf_yadif_videotoolbox_metallib_len; > > -typedef struct YADIFVTContext { > +typedef struct API_AVAILABLE(macos(10.11), ios(8.0)) YADIFVTContext { > YADIFContext yadif; > > AVBufferRef *device_ref; > @@ -44,7 +46,12 @@ typedef struct YADIFVTContext { > id mtlParamsBuffer; > > CVMetalTextureCacheRef textureCache; > -} YADIFVTContext; > +} YADIFVTContext API_AVAILABLE(macos(10.11), ios(8.0)); > + > +// Using sizeof(YADIFVTContext) outside of an availability check will > error > +// if we're targeting an older OS version, so we need to calculate the > size ourselves > +// (we'll statically verify it's correct in yadif_videotoolbox_init > behind a check) > +#define YADIF_VT_CTX_SIZE (sizeof(YADIFContext) + sizeof(void*) * 10) > > struct mtlYadifParams { > uint channels; > @@ -62,7 +69,7 @@ static void call_kernel(AVFilterContext *ctx, > id next, > int channels, > int parity, > - int tff) > + int tff) API_AVAILABLE(macos(10.11), ios(8.0)) > { > YADIFVTContext *s = ctx->priv; > id buffer = s->mtlQueue.commandBuffer; > @@ -93,7 +100,7 @@ static void call_kernel(AVFilterContext *ctx, > } > > static void filter(AVFilterContext *ctx, AVFrame *dst, > - int parity, int tff) > + int parity, int tff) API_AVAILABLE(macos(10.11), > ios(8.0)) > { > YADIFVTContext *s = ctx->priv; > YADIFContext *y = &s->yadif; > @@ -162,7 +169,7 @@ exit: > return; > } > > -static av_cold void yadif_videotoolbox_uninit(AVFilterContext *ctx) > +static av_cold void do_uninit(AVFilterContext *ctx) > API_AVAILABLE(macos(10.11), ios(8.0)) > { > YADIFVTContext *s = ctx->priv; > YADIFContext *y = &s->yadif; > @@ -188,7 +195,15 @@ static av_cold void > yadif_videotoolbox_uninit(AVFilterContext *ctx) > } > } > > -static av_cold int yadif_videotoolbox_init(AVFilterContext *ctx) > + > +static av_cold void yadif_videotoolbox_uninit(AVFilterContext *ctx) > +{ > + if (@available(macOS 10.11, iOS 8.0, *)) { > + do_uninit(ctx); > + } > +} > + > +static av_cold int do_init(AVFilterContext *ctx) > API_AVAILABLE(macos(10.11), ios(8.0)) > { > YADIFVTContext *s = ctx->priv; > NSError *err = nil; > @@ -261,7 +276,19 @@ fail: > return AVERROR_EXTERNAL; > } > > -static int config_input(AVFilterLink *inlink) > +static av_cold int yadif_videotoolbox_init(AVFilterContext *ctx) > +{ > + if (@available(macOS 10.11, iOS 8.0, *)) { > + // Ensure we calculated YADIF_VT_CTX_SIZE correctly > + static_assert(YADIF_VT_CTX_SIZE == sizeof(YADIFVTContext), > "Incorrect YADIF_VT_CTX_SIZE value!"); > + return do_init(ctx); > + } else { > + av_log(ctx, AV_LOG_ERROR, "Metal is not available on this OS > version\n"); > + return AVERROR(ENOSYS); > + } > +} > + > +static int do_config_input(AVFilterLink *inlink) > API_AVAILABLE(macos(10.11), ios(8.0)) > { > AVFilterContext *ctx = inlink->dst; > YADIFVTContext *s = ctx->priv; > @@ -283,7 +310,18 @@ static int config_input(AVFilterLink *inlink) > return 0; > } > > -static int config_output(AVFilterLink *link) > +static int config_input(AVFilterLink *inlink) > +{ > + AVFilterContext *ctx = inlink->dst; > + if (@available(macOS 10.11, iOS 8.0, *)) { > + return do_config_input(inlink); > + } else { > + av_log(ctx, AV_LOG_ERROR, "Metal is not available on this OS > version\n"); > + return AVERROR(ENOSYS); > + } > +} > + > +static int do_config_output(AVFilterLink *link) > API_AVAILABLE(macos(10.11), ios(8.0)) > { > AVHWFramesContext *output_frames; > AVFilterContext *ctx = link->src; > @@ -347,6 +385,17 @@ exit: > return ret; > } > > +static int config_output(AVFilterLink *link) > +{ > + AVFilterContext *ctx = link->src; > + if (@available(macOS 10.11, iOS 8.0, *)) { > + return do_config_output(link); > + } else { > + av_log(ctx, AV_LOG_ERROR, "Metal is not available on this OS > version\n"); > + return AVERROR(ENOSYS); > + } > +} > + > #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM > #define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, > {.i64=val}, INT_MIN, INT_MAX, FLAGS, unit } > > @@ -394,7 +443,7 @@ static const AVFilterPad yadif_videotoolbox_outputs[] > = { > AVFilter ff_vf_yadif_videotoolbox = { > .name = "yadif_videotoolbox", > .description = NULL_IF_CONFIG_SMALL("YADIF for VideoToolbox frames > using Metal compute"), > - .priv_size = sizeof(YADIFVTContext), > + .priv_size = YADIF_VT_CTX_SIZE, > .priv_class = &yadif_videotoolbox_class, > .init = yadif_videotoolbox_init, > .uninit = yadif_videotoolbox_uninit, > -- > 2.33.1 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".