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.
This commit is contained in:
parent
2f3c0911fa
commit
1da97fb0d0
@ -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(
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user