From dd408e68ed57fa5130bef976751e58a5d6e42f75 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 30 Jun 2017 12:27:15 +0200 Subject: d3d: make DXVA2 support optional This partially reverts the change from a longer time ago to always build DXVA2 and D3D11VA together. To make it simpler, we change the following: - building with ANGLE headers is now required to build D3D hwaccels - if DXVA2 is enabled, D3D11VA is still forcibly built - the CLI vo_opengl ANGLE backend is now under --egl-angle-win32 This is done to reduce the dependency mess slightly. --- options/options.c | 2 +- video/decode/d3d.c | 7 ++++++- video/decode/vd_lavc.c | 3 +++ video/out/opengl/context.c | 2 +- video/out/opengl/hwdec.c | 6 +++--- wscript | 28 +++++++++++++++++++++++----- wscript_build.py | 14 +++++++------- 7 files changed, 44 insertions(+), 18 deletions(-) diff --git a/options/options.c b/options/options.c index 02dc5e94dd..db63efa9d2 100644 --- a/options/options.c +++ b/options/options.c @@ -699,7 +699,7 @@ const m_option_t mp_opts[] = { OPT_SUBSTRUCT("", gl_video_opts, gl_video_conf, 0), #endif -#if HAVE_EGL_ANGLE +#if HAVE_EGL_ANGLE_WIN32 OPT_SUBSTRUCT("", angle_opts, angle_conf, 0), #endif diff --git a/video/decode/d3d.c b/video/decode/d3d.c index d81f481e7c..3e6e1accc8 100644 --- a/video/decode/d3d.c +++ b/video/decode/d3d.c @@ -377,9 +377,12 @@ AVBufferRef *d3d9_wrap_device_ref(struct IDirect3DDevice9 *device) { return NULL #else /* !HAVE_D3D_HWACCEL_NEW */ #include -#include #include +#if HAVE_D3D9_HWACCEL +#include +#endif + void d3d_hwframes_refine(struct lavc_ctx *ctx, AVBufferRef *hw_frames_ctx) { AVHWFramesContext *fctx = (void *)hw_frames_ctx->data; @@ -400,11 +403,13 @@ void d3d_hwframes_refine(struct lavc_ctx *ctx, AVBufferRef *hw_frames_ctx) fctx->width = FFALIGN(fctx->width, alignment); fctx->height = FFALIGN(fctx->height, alignment); +#if HAVE_D3D9_HWACCEL if (fctx->format == AV_PIX_FMT_DXVA2_VLD) { AVDXVA2FramesContext *hwctx = fctx->hwctx; hwctx->surface_type = DXVA2_VideoDecoderRenderTarget; } +#endif if (fctx->format == AV_PIX_FMT_D3D11) { AVD3D11VAFramesContext *hwctx = fctx->hwctx; diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c index 226fd30bd3..a36adbf334 100644 --- a/video/decode/vd_lavc.c +++ b/video/decode/vd_lavc.c @@ -265,8 +265,11 @@ static const struct vd_lavc_hwdec *const hwdec_list[] = { #endif #if HAVE_D3D_HWACCEL &mp_vd_lavc_d3d11va, + + #if HAVE_D3D9_HWACCEL &mp_vd_lavc_dxva2, &mp_vd_lavc_dxva2_copy, + #endif &mp_vd_lavc_d3d11va_copy, #endif #if HAVE_ANDROID diff --git a/video/out/opengl/context.c b/video/out/opengl/context.c index 72311e11fa..a3b92ac8b4 100644 --- a/video/out/opengl/context.c +++ b/video/out/opengl/context.c @@ -56,7 +56,7 @@ static const struct mpgl_driver *const backends[] = { #if HAVE_GL_COCOA &mpgl_driver_cocoa, #endif -#if HAVE_EGL_ANGLE +#if HAVE_EGL_ANGLE_WIN32 &mpgl_driver_angle, #endif #if HAVE_GL_WIN32 diff --git a/video/out/opengl/hwdec.c b/video/out/opengl/hwdec.c index 60a6ee82a9..346493671f 100644 --- a/video/out/opengl/hwdec.c +++ b/video/out/opengl/hwdec.c @@ -51,15 +51,15 @@ static const struct gl_hwdec_driver *const mpgl_hwdec_drivers[] = { &gl_hwdec_videotoolbox, #endif #if HAVE_D3D_HWACCEL -#if HAVE_EGL_ANGLE &gl_hwdec_d3d11egl, &gl_hwdec_d3d11eglrgb, + #if HAVE_D3D9_HWACCEL &gl_hwdec_dxva2egl, + #endif #endif -#if HAVE_GL_DXINTEROP +#if HAVE_GL_DXINTEROP_D3D9 &gl_hwdec_dxva2gldx, #endif -#endif #if HAVE_CUDA_HWACCEL &gl_hwdec_cuda, #endif diff --git a/wscript b/wscript index 3fbcf1db88..99263b7ee5 100644 --- a/wscript +++ b/wscript @@ -619,7 +619,7 @@ video_output_features = [ check_statement('d3d9.h', 'IDirect3D9Ex *d')) } , { 'name': '--egl-angle', - 'desc': 'OpenGL Win32 ANGLE Backend', + 'desc': 'OpenGL ANGLE headers', 'deps_any': [ 'os-win32', 'os-cygwin' ], 'groups': [ 'gl' ], 'func': check_statement(['EGL/egl.h', 'EGL/eglext.h'], @@ -635,6 +635,12 @@ video_output_features = [ '-DANGLE_NO_ALIASES', '-DANGLE_EXPORT='], lib=['EGL', 'GLESv2', 'dxguid', 'd3d9', 'gdi32', 'stdc++']) + }, { + 'name': '--egl-angle-win32', + 'desc': 'OpenGL Win32 ANGLE Backend', + 'deps': [ 'egl-angle', 'win32-desktop' ], + 'groups': [ 'gl' ], + 'func': check_true, } , { 'name': '--vdpau', 'desc': 'VDPAU acceleration', @@ -736,7 +742,7 @@ video_output_features = [ 'name': 'egl-helpers', 'desc': 'EGL helper functions', 'deps_any': [ 'egl-x11', 'mali-fbdev', 'rpi', 'gl-wayland', 'egl-drm', - 'egl-angle' ], + 'egl-angle-win32' ], 'func': check_true } ] @@ -794,13 +800,14 @@ hwaccel_features = [ ' ? 1 : -1]', use='libav'), }, { + # (conflated with ANGLE for easier deps) 'name': '--d3d-hwaccel', - 'desc': 'DXVA2 and D3D11VA hwaccel', - 'deps': [ 'win32-desktop' ], + 'desc': 'D3D11VA hwaccel (plus ANGLE)', + 'deps': [ 'os-win32', 'egl-angle' ], 'func': check_true, }, { 'name': '--d3d-hwaccel-new', - 'desc': 'DXVA2 and D3D11VA hwaccel (new API)', + 'desc': 'D3D11VA hwaccel (new API)', 'func': check_statement('libavcodec/version.h', 'int x[(LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(58, 4, 0) && ' ' LIBAVCODEC_VERSION_MICRO < 100) ||' @@ -809,6 +816,17 @@ hwaccel_features = [ ' ? 1 : -1]', use='libav'), 'deps': [ 'd3d-hwaccel' ], + }, { + 'name': '--d3d9-hwaccel', + 'desc': 'DXVA2 hwaccel (plus ANGLE)', + 'deps': [ 'd3d-hwaccel', 'egl-angle-win32' ], + 'func': check_true, + }, { + 'name': '--gl-dxinterop-d3d9', + 'desc': 'OpenGL/DirectX Interop Backend DXVA2 interop', + 'deps': [ 'gl-dxinterop', 'd3d9-hwaccel' ], + 'groups': [ 'gl' ], + 'func': check_true, }, { 'name': '--cuda-hwaccel', 'desc': 'CUDA hwaccel', diff --git a/wscript_build.py b/wscript_build.py index 3a98cf96ac..7ecd14bd9f 100644 --- a/wscript_build.py +++ b/wscript_build.py @@ -325,10 +325,10 @@ def build(ctx): ( "video/vdpau.c", "vdpau" ), ( "video/vdpau_mixer.c", "vdpau" ), ( "video/vt.c", "videotoolbox-hwaccel" ), - ( "video/decode/d3d.c", "win32-desktop" ), + ( "video/decode/d3d.c", "d3d-hwaccel" ), ( "video/decode/dec_video.c"), ( "video/decode/hw_cuda.c", "cuda-hwaccel" ), - ( "video/decode/hw_dxva2.c", "d3d-hwaccel" ), + ( "video/decode/hw_dxva2.c", "d3d9-hwaccel" ), ( "video/decode/hw_d3d11va.c", "d3d-hwaccel" ), ( "video/decode/hw_videotoolbox.c", "videotoolbox-hwaccel" ), ( "video/decode/vd_lavc.c" ), @@ -366,7 +366,7 @@ def build(ctx): ( "video/out/opengl/angle_dynamic.c", "egl-angle" ), ( "video/out/opengl/common.c", "gl" ), ( "video/out/opengl/context.c", "gl" ), - ( "video/out/opengl/context_angle.c", "egl-angle" ), + ( "video/out/opengl/context_angle.c", "egl-angle-win32" ), ( "video/out/opengl/context_cocoa.c", "gl-cocoa" ), ( "video/out/opengl/context_drm_egl.c", "egl-drm" ), ( "video/out/opengl/context_dxinterop.c","gl-dxinterop" ), @@ -382,10 +382,10 @@ def build(ctx): ( "video/out/opengl/formats.c", "gl" ), ( "video/out/opengl/hwdec.c", "gl" ), ( "video/out/opengl/hwdec_cuda.c", "cuda-hwaccel" ), - ( "video/out/opengl/hwdec_d3d11egl.c", "egl-angle" ), - ( "video/out/opengl/hwdec_d3d11eglrgb.c","egl-angle" ), - ( "video/out/opengl/hwdec_dxva2gldx.c", "gl-dxinterop" ), - ( "video/out/opengl/hwdec_dxva2egl.c", "egl-angle" ), + ( "video/out/opengl/hwdec_d3d11egl.c", "d3d-hwaccel" ), + ( "video/out/opengl/hwdec_d3d11eglrgb.c","d3d-hwaccel" ), + ( "video/out/opengl/hwdec_dxva2gldx.c", "gl-dxinterop-d3d9" ), + ( "video/out/opengl/hwdec_dxva2egl.c", "d3d9-hwaccel" ), ( "video/out/opengl/hwdec_osx.c", "videotoolbox-gl" ), ( "video/out/opengl/hwdec_ios.m", "ios-gl" ), ( "video/out/opengl/hwdec_rpi.c", "rpi" ), -- cgit v1.2.3