From 6c80d2f5f8a6689d19a9a4196b9ea4d50643ecfc Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Sun, 24 Mar 2024 22:39:20 +0900 Subject: [PATCH] d3d12: Allow building without WGC support Part-of: --- subprojects/gst-plugins-bad/meson_options.txt | 3 ++ .../sys/d3d12/gstd3d12screencapturesrc.cpp | 31 +++++++++++++++---- .../gst-plugins-bad/sys/d3d12/meson.build | 27 ++++++++++------ 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/subprojects/gst-plugins-bad/meson_options.txt b/subprojects/gst-plugins-bad/meson_options.txt index 15c354c82b..2a91898999 100644 --- a/subprojects/gst-plugins-bad/meson_options.txt +++ b/subprojects/gst-plugins-bad/meson_options.txt @@ -218,6 +218,9 @@ option('d3d11-math', type : 'feature', value : 'auto', description : 'Enable Dir option('d3d11-hlsl-precompile', type : 'feature', value : 'auto', description : 'Enable buildtime HLSL compile for d3d11 library/plugin') option('d3d11-wgc', type : 'feature', value : 'auto', description : 'Windows Graphics Capture API support in d3d11 plugin') +# D3D12 plugin options +option('d3d12-wgc', type : 'feature', value : 'auto', description : 'Windows Graphics Capture API support in d3d12 plugin') + # HLS plugin options option('hls', type : 'feature', value : 'auto', description : 'HTTP Live Streaming plugin') option('hls-crypto', type : 'combo', value : 'auto', choices : ['auto', 'nettle', 'libgcrypt', 'openssl'], diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12screencapturesrc.cpp b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12screencapturesrc.cpp index ab8859065e..f1a7e72c8b 100644 --- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12screencapturesrc.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12screencapturesrc.cpp @@ -36,7 +36,9 @@ #include "gstd3d12screencapturesrc.h" #include "gstd3d12dxgicapture.h" +#ifdef HAVE_WGC #include "gstd3d12graphicscapture.h" +#endif #include "gstd3d12pluginutils.h" #include #include @@ -78,6 +80,7 @@ enum GstD3D12WindowCaptureMode GST_D3D12_WINDOW_CAPTURE_CLIENT, }; +#ifdef HAVE_WGC /** * GstD3D11ScreenCaptureAPI: * @@ -148,6 +151,7 @@ gst_d3d11_window_capture_mode_get_type (void) return type; } +#endif #define DEFAULT_MONITOR_INDEX -1 #define DEFAULT_SHOW_CURSOR FALSE @@ -302,6 +306,7 @@ gst_d3d12_screen_capture_src_class_init (GstD3D12ScreenCaptureSrcClass * klass) 0, G_MAXUINT, 0, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); +#ifdef HAVE_WGC if (gst_d3d12_graphics_capture_load_library ()) { /** * GstD3D12ScreenCaptureSrc:window-handle: @@ -379,6 +384,7 @@ gst_d3d12_screen_capture_src_class_init (GstD3D12ScreenCaptureSrcClass * klass) gst_type_mark_as_plugin_api (GST_TYPE_D3D12_WINDOW_CAPTURE_MODE, (GstPluginAPIFlags) 0); } +#endif element_class->provide_clock = GST_DEBUG_FUNCPTR (gst_d3d12_screen_capture_src_provide_clock); @@ -472,11 +478,13 @@ gst_d3d12_screen_capture_src_set_property (GObject * object, guint prop_id, break; case PROP_SHOW_BORDER: priv->show_border = g_value_get_boolean (value); +#ifdef HAVE_WGC if (priv->capture && priv->capture_api == GST_D3D12_SCREEN_CAPTURE_API_WGC) { auto wgc = GST_D3D12_GRAPHICS_CAPTURE (priv->capture); gst_d3d12_graphics_capture_show_border (wgc, priv->show_border); } +#endif break; case PROP_CAPTURE_API: priv->capture_api = (GstD3D12ScreenCaptureAPI) g_value_get_enum (value); @@ -487,12 +495,14 @@ gst_d3d12_screen_capture_src_set_property (GObject * object, guint prop_id, case PROP_WINDOW_CAPTURE_MODE: priv->hwnd_capture_mode = (GstD3D12WindowCaptureMode) g_value_get_enum (value); +#ifdef HAVE_WGC if (priv->capture && priv->capture_api == GST_D3D12_SCREEN_CAPTURE_API_WGC) { auto wgc = GST_D3D12_GRAPHICS_CAPTURE (priv->capture); gst_d3d12_graphics_capture_set_client_only (wgc, priv->hwnd_capture_mode == GST_D3D12_WINDOW_CAPTURE_CLIENT); } +#endif break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -890,11 +900,13 @@ gst_d3d12_screen_capture_src_start (GstBaseSrc * bsrc) ("D3D12 device is not available"), (nullptr)); return FALSE; } - +#ifdef HAVE_WGC if (priv->selected_capture_api == GST_D3D12_SCREEN_CAPTURE_API_WGC) { capture = gst_d3d12_graphics_capture_new (self->device, priv->window_handle, monitor); - } else { + } else +#endif + { capture = gst_d3d12_dxgi_capture_new (self->device, monitor); } @@ -910,6 +922,7 @@ gst_d3d12_screen_capture_src_start (GstBaseSrc * bsrc) case GST_FLOW_OK: break; case GST_D3D12_SCREEN_CAPTURE_FLOW_UNSUPPORTED: +#ifdef HAVE_WGC if (priv->selected_capture_api == GST_D3D12_SCREEN_CAPTURE_API_DXGI) { gst_clear_object (&capture); GST_WARNING_OBJECT (self, "DXGI capture is not available"); @@ -921,6 +934,7 @@ gst_d3d12_screen_capture_src_start (GstBaseSrc * bsrc) break; } } +#endif goto unsupported; default: goto error; @@ -930,6 +944,7 @@ gst_d3d12_screen_capture_src_start (GstBaseSrc * bsrc) priv->latency = GST_CLOCK_TIME_NONE; priv->capture = capture; +#ifdef HAVE_WGC if (priv->selected_capture_api == GST_D3D12_SCREEN_CAPTURE_API_WGC) { auto wgc = GST_D3D12_GRAPHICS_CAPTURE (priv->capture); gst_d3d12_graphics_capture_show_cursor (wgc, priv->show_cursor); @@ -937,6 +952,7 @@ gst_d3d12_screen_capture_src_start (GstBaseSrc * bsrc) gst_d3d12_graphics_capture_set_client_only (wgc, priv->hwnd_capture_mode == GST_D3D12_WINDOW_CAPTURE_CLIENT); } +#endif if (priv->capture_api != priv->selected_capture_api) { priv->capture_api = priv->selected_capture_api; @@ -1055,6 +1071,7 @@ gst_d3d12_screen_capture_src_src_query (GstBaseSrc * bsrc, GstQuery * query) return GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query); } +#ifdef HAVE_WGC static GstFlowReturn gst_d3d12_screen_capture_src_wgc_capture (GstBaseSrc * bsrc, guint64 offset, guint size, GstBuffer ** buf) @@ -1188,6 +1205,7 @@ gst_d3d12_screen_capture_src_wgc_capture (GstBaseSrc * bsrc, return GST_FLOW_OK; } +#endif static GstFlowReturn gst_d3d12_screen_capture_src_dxgi_capture (GstBaseSrc * bsrc, @@ -1426,9 +1444,10 @@ gst_d3d12_screen_capture_src_create (GstBaseSrc * bsrc, guint64 offset, ("Couldn't configure capture object"), (nullptr)); return GST_FLOW_NOT_NEGOTIATED; } +#ifdef HAVE_WGC + if (priv->selected_capture_api == GST_D3D12_SCREEN_CAPTURE_API_WGC) + return gst_d3d12_screen_capture_src_wgc_capture (bsrc, offset, size, buf); +#endif - if (priv->selected_capture_api == GST_D3D12_SCREEN_CAPTURE_API_DXGI) - return gst_d3d12_screen_capture_src_dxgi_capture (bsrc, offset, size, buf); - - return gst_d3d12_screen_capture_src_wgc_capture (bsrc, offset, size, buf); + return gst_d3d12_screen_capture_src_dxgi_capture (bsrc, offset, size, buf); } diff --git a/subprojects/gst-plugins-bad/sys/d3d12/meson.build b/subprojects/gst-plugins-bad/sys/d3d12/meson.build index 128b02fdff..1f6b67a87f 100644 --- a/subprojects/gst-plugins-bad/sys/d3d12/meson.build +++ b/subprojects/gst-plugins-bad/sys/d3d12/meson.build @@ -20,7 +20,6 @@ d3d12_sources = [ 'gstd3d12encoderbufferpool.cpp', 'gstd3d12fencedatapool.cpp', 'gstd3d12format.cpp', - 'gstd3d12graphicscapture.cpp', 'gstd3d12h264dec.cpp', 'gstd3d12h264enc.cpp', 'gstd3d12h265dec.cpp', @@ -52,7 +51,10 @@ extra_args = [ '/wd4062', ] +extra_deps = [] + d3d12_option = get_option('d3d12') +d3d12_wgc_option = get_option('d3d12-wgc') if host_system != 'windows' or d3d12_option.disabled() subdir_done() endif @@ -68,22 +70,23 @@ d3d12_lib = cc.find_library('d3d12', required : d3d12_option) d3d11_lib = cc.find_library('d3d11', required : d3d12_option) d2d_dep = cc.find_library('d2d1', required: d3d12_option) dxgi_lib = cc.find_library('dxgi', required : d3d12_option) -dwmapi_lib = cc.find_library('dwmapi', required: d3d12_option) +dwmapi_lib = cc.find_library('dwmapi', required: d3d12_wgc_option) dx_headers_dep = dependency('DirectX-Headers', version: '>= 1.611', allow_fallback: true, required: d3d12_option) if not gstdxva_dep.found() or not d3d12_lib.found() or not dxgi_lib.found() \ - or not dx_headers_dep.found() or not gstd3dshader_dep.found() or not d2d_dep.found() \ - or not dwmapi_lib.found() + or not dx_headers_dep.found() or not gstd3dshader_dep.found() or not d2d_dep.found() if d3d12_option.enabled() error('The d3d12 was enabled explicitly, but required dependencies were not found.') endif subdir_done() endif -have_wgc = cxx.compiles(''' +have_wgc = false +if not d3d12_wgc_option.disabled() + have_wgc = cxx.compiles(''' #include #include #include @@ -102,11 +105,9 @@ have_wgc = cxx.compiles(''' ''', name: 'Windows Graphics Capture support in Windows SDK') -if not have_wgc - if d3d12_option.enabled() - error('Windows SDK does not support Windows Graphics Capture') + if d3d12_wgc_option.enabled() and not have_wgc + error('The Windows Graphics Capture feature is enabled but not supported by Windows SDK') endif - subdir_done() endif d3d12_headers = [ @@ -137,6 +138,12 @@ if host_machine.cpu_family() != 'x86' extra_args += ['-DHAVE_DIRECTX_MATH_SIMD'] endif +if have_wgc and dwmapi_lib.found() + d3d12_sources += ['gstd3d12graphicscapture.cpp'] + extra_args += ['-DHAVE_WGC'] + extra_deps += [dwmapi_lib] +endif + gstd3d12 = library('gstd3d12', d3d12_sources, c_args : gst_plugins_bad_args + extra_args, @@ -144,7 +151,7 @@ gstd3d12 = library('gstd3d12', include_directories : [configinc], dependencies : [gstbase_dep, gstvideo_dep, gstcodecs_dep, gmodule_dep, gstdxva_dep, d3d12_lib, d3d11_lib, d2d_dep, dxgi_lib, - gstd3dshader_dep, dx_headers_dep, dwmapi_lib], + gstd3dshader_dep, dx_headers_dep] + extra_deps, install : true, install_dir : plugins_install_dir, )