From 1da97fb0d0ab3e0807f1e3d0b2a49ebfa20a5768 Mon Sep 17 00:00:00 2001 From: Ryan Foster Date: Mon, 7 Jun 2021 08:38:33 -0400 Subject: [PATCH] win-capture: Check for WGC support on plugin load We shouldn't have to check WGC support for every display capture or window capture source. Either the system supports it or it doesn't. Check when the plugin loads and use that result. --- .../win-capture/duplicator-monitor-capture.c | 17 ++++++++--------- plugins/win-capture/plugin-main.c | 7 +++++++ plugins/win-capture/window-capture.c | 15 +++++++-------- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/plugins/win-capture/duplicator-monitor-capture.c b/plugins/win-capture/duplicator-monitor-capture.c index a7d4ec121..59cb63342 100644 --- a/plugins/win-capture/duplicator-monitor-capture.c +++ b/plugins/win-capture/duplicator-monitor-capture.c @@ -85,7 +85,6 @@ struct duplicator_capture { float reset_timeout; struct cursor_data cursor_data; - bool wgc_supported; void *winrt_module; struct winrt_exports exports; struct winrt_capture *capture_winrt; @@ -176,6 +175,8 @@ choose_method(enum display_capture_method method, bool wgc_supported, return method; } +extern bool wgc_supported; + static inline void update_settings(struct duplicator_capture *capture, obs_data_t *settings) { @@ -186,8 +187,8 @@ static inline void update_settings(struct duplicator_capture *capture, EnumDisplayMonitors(NULL, NULL, enum_monitor, (LPARAM)&monitor); capture->method = choose_method( - (int)obs_data_get_int(settings, "method"), - capture->wgc_supported, monitor.handle, &capture->dxgi_index); + (int)obs_data_get_int(settings, "method"), wgc_supported, + monitor.handle, &capture->dxgi_index); capture->monitor = monitor.id; capture->handle = monitor.handle; @@ -321,11 +322,9 @@ static void *duplicator_capture_create(obs_data_t *settings, if (graphics_uses_d3d11) { static const char *const module = "libobs-winrt"; capture->winrt_module = os_dlopen(module); - if (capture->winrt_module && - load_winrt_imports(&capture->exports, capture->winrt_module, - module) && - capture->exports.winrt_capture_supported()) { - capture->wgc_supported = true; + if (capture->winrt_module) { + load_winrt_imports(&capture->exports, + capture->winrt_module, module); } } @@ -650,7 +649,7 @@ static obs_properties_t *duplicator_capture_properties(void *data) obs_property_list_add_int(p, TEXT_METHOD_AUTO, METHOD_AUTO); obs_property_list_add_int(p, TEXT_METHOD_DXGI, METHOD_DXGI); obs_property_list_add_int(p, TEXT_METHOD_WGC, METHOD_WGC); - obs_property_list_item_disable(p, 2, !capture->wgc_supported); + obs_property_list_item_disable(p, 2, !wgc_supported); obs_property_set_modified_callback(p, display_capture_method_changed); obs_property_t *monitors = obs_properties_add_list( diff --git a/plugins/win-capture/plugin-main.c b/plugins/win-capture/plugin-main.c index 427ebb85b..aed06a159 100644 --- a/plugins/win-capture/plugin-main.c +++ b/plugins/win-capture/plugin-main.c @@ -69,6 +69,7 @@ void wait_for_hook_initialization(void) void init_hook_files(void); bool graphics_uses_d3d11 = false; +bool wgc_supported = false; bool obs_module_load(void) { @@ -76,6 +77,9 @@ bool obs_module_load(void) bool win8_or_above = false; char *config_dir; + struct win_version_info win1903 = { + .major = 10, .minor = 0, .build = 18362, .revis = 0}; + config_dir = obs_module_config_path(NULL); if (config_dir) { os_mkdirs(config_dir); @@ -90,6 +94,9 @@ bool obs_module_load(void) graphics_uses_d3d11 = gs_get_device_type() == GS_DEVICE_DIRECT3D_11; obs_leave_graphics(); + if (graphics_uses_d3d11) + wgc_supported = win_version_compare(&ver, &win1903) >= 0; + if (win8_or_above && graphics_uses_d3d11) obs_register_source(&duplicator_capture_info); else diff --git a/plugins/win-capture/window-capture.c b/plugins/win-capture/window-capture.c index bfd91351c..9ce4347f5 100644 --- a/plugins/win-capture/window-capture.c +++ b/plugins/win-capture/window-capture.c @@ -79,7 +79,6 @@ struct window_capture { struct dc_capture capture; - bool wgc_supported; bool previously_failed; void *winrt_module; struct winrt_exports exports; @@ -174,6 +173,8 @@ static void log_settings(struct window_capture *wc, obs_data_t *s) } } +extern bool wgc_supported; + static void update_settings(struct window_capture *wc, obs_data_t *s) { pthread_mutex_lock(&wc->update_mutex); @@ -188,7 +189,7 @@ static void update_settings(struct window_capture *wc, obs_data_t *s) build_window_strings(window, &wc->class, &wc->title, &wc->executable); - wc->method = choose_method(method, wc->wgc_supported, wc->class); + wc->method = choose_method(method, wgc_supported, wc->class); wc->priority = (enum window_priority)priority; wc->cursor = obs_data_get_bool(s, "cursor"); wc->use_wildcards = obs_data_get_bool(s, "use_wildcards"); @@ -248,11 +249,9 @@ static void *wc_create(obs_data_t *settings, obs_source_t *source) if (graphics_uses_d3d11) { static const char *const module = "libobs-winrt"; wc->winrt_module = os_dlopen(module); - if (wc->winrt_module && - load_winrt_imports(&wc->exports, wc->winrt_module, - module) && - wc->exports.winrt_capture_supported()) { - wc->wgc_supported = true; + if (wc->winrt_module) { + load_winrt_imports(&wc->exports, wc->winrt_module, + module); } } @@ -408,7 +407,7 @@ static obs_properties_t *wc_properties(void *data) obs_property_list_add_int(p, TEXT_METHOD_AUTO, METHOD_AUTO); obs_property_list_add_int(p, TEXT_METHOD_BITBLT, METHOD_BITBLT); obs_property_list_add_int(p, TEXT_METHOD_WGC, METHOD_WGC); - obs_property_list_item_disable(p, 2, !wc->wgc_supported); + obs_property_list_item_disable(p, 2, !wgc_supported); obs_property_set_modified_callback(p, wc_capture_method_changed); p = obs_properties_add_list(ppts, "priority", TEXT_MATCH_PRIORITY,