From 2f3c0911fa6c73321675eacd24f982d77e34d9bd Mon Sep 17 00:00:00 2001 From: Ryan Foster Date: Mon, 7 Jun 2021 08:00:29 -0400 Subject: [PATCH] win-capture: Determine D3D11 usage once per run The device type (OBS renderer) cannot change without restarting OBS, so we should only have to check if we're using D3D11 once instead of checking every time a new display capture or window capture source is created. --- plugins/win-capture/duplicator-monitor-capture.c | 8 +++----- plugins/win-capture/plugin-main.c | 8 +++++--- plugins/win-capture/window-capture.c | 8 +++----- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/plugins/win-capture/duplicator-monitor-capture.c b/plugins/win-capture/duplicator-monitor-capture.c index 6abffa2c6..a7d4ec121 100644 --- a/plugins/win-capture/duplicator-monitor-capture.c +++ b/plugins/win-capture/duplicator-monitor-capture.c @@ -306,6 +306,8 @@ static bool load_winrt_imports(struct winrt_exports *exports, void *module, return success; } +extern bool graphics_uses_d3d11; + static void *duplicator_capture_create(obs_data_t *settings, obs_source_t *source) { @@ -316,11 +318,7 @@ static void *duplicator_capture_create(obs_data_t *settings, pthread_mutex_init(&capture->update_mutex, NULL); - obs_enter_graphics(); - const bool uses_d3d11 = gs_get_device_type() == GS_DEVICE_DIRECT3D_11; - obs_leave_graphics(); - - if (uses_d3d11) { + if (graphics_uses_d3d11) { static const char *const module = "libobs-winrt"; capture->winrt_module = os_dlopen(module); if (capture->winrt_module && diff --git a/plugins/win-capture/plugin-main.c b/plugins/win-capture/plugin-main.c index fb83cc749..427ebb85b 100644 --- a/plugins/win-capture/plugin-main.c +++ b/plugins/win-capture/plugin-main.c @@ -68,6 +68,8 @@ void wait_for_hook_initialization(void) void init_hook_files(void); +bool graphics_uses_d3d11 = false; + bool obs_module_load(void) { struct win_version_info ver; @@ -85,14 +87,14 @@ bool obs_module_load(void) win8_or_above = ver.major > 6 || (ver.major == 6 && ver.minor >= 2); obs_enter_graphics(); + graphics_uses_d3d11 = gs_get_device_type() == GS_DEVICE_DIRECT3D_11; + obs_leave_graphics(); - if (win8_or_above && gs_get_device_type() == GS_DEVICE_DIRECT3D_11) + if (win8_or_above && graphics_uses_d3d11) obs_register_source(&duplicator_capture_info); else obs_register_source(&monitor_capture_info); - obs_leave_graphics(); - obs_register_source(&window_capture_info); char *config_path = obs_module_config_path(NULL); diff --git a/plugins/win-capture/window-capture.c b/plugins/win-capture/window-capture.c index b2a5252f4..bfd91351c 100644 --- a/plugins/win-capture/window-capture.c +++ b/plugins/win-capture/window-capture.c @@ -236,6 +236,8 @@ static bool load_winrt_imports(struct winrt_exports *exports, void *module, return success; } +extern bool graphics_uses_d3d11; + static void *wc_create(obs_data_t *settings, obs_source_t *source) { struct window_capture *wc = bzalloc(sizeof(struct window_capture)); @@ -243,11 +245,7 @@ static void *wc_create(obs_data_t *settings, obs_source_t *source) pthread_mutex_init(&wc->update_mutex, NULL); - obs_enter_graphics(); - const bool uses_d3d11 = gs_get_device_type() == GS_DEVICE_DIRECT3D_11; - obs_leave_graphics(); - - if (uses_d3d11) { + if (graphics_uses_d3d11) { static const char *const module = "libobs-winrt"; wc->winrt_module = os_dlopen(module); if (wc->winrt_module &&