d3d12: Allow building without WGC support

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6435>
This commit is contained in:
Seungha Yang 2024-03-24 22:39:20 +09:00 committed by GStreamer Marge Bot
parent ce0b60b5c9
commit 6c80d2f5f8
3 changed files with 45 additions and 16 deletions

View file

@ -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'],

View file

@ -36,7 +36,9 @@
#include "gstd3d12screencapturesrc.h"
#include "gstd3d12dxgicapture.h"
#ifdef HAVE_WGC
#include "gstd3d12graphicscapture.h"
#endif
#include "gstd3d12pluginutils.h"
#include <mutex>
#include <wrl.h>
@ -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);
}

View file

@ -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<windows.h>
#include<winstring.h>
#include<roapi.h>
@ -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,
)