From 2b02cb149d89f0fd17179b27f0429eba0f502feb Mon Sep 17 00:00:00 2001 From: KuleRucket Date: Fri, 24 Mar 2023 01:58:50 +0100 Subject: [PATCH 01/11] Provide ability to force a capture method via configuration. --- src/config.cpp | 2 ++ src/config.h | 1 + src/platform/linux/misc.cpp | 38 ++++++++++++++++-------- src_assets/common/assets/web/config.html | 17 ++++++++++- 4 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/config.cpp b/src/config.cpp index 71b90df841f..ffe17904dc2 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -351,6 +351,7 @@ video_t video { -1, }, // vt + {}, // capture method {}, // encoder {}, // adapter_name {}, // output_name @@ -882,6 +883,7 @@ void apply_config(std::unordered_map &&vars) { int_f(vars, "vt_software", video.vt.vt_require_sw, vt::force_software_from_view); int_f(vars, "vt_realtime", video.vt.vt_realtime, vt::rt_from_view); + string_f(vars, "capture", video.capture); string_f(vars, "encoder", video.encoder); string_f(vars, "adapter_name", video.adapter_name); string_f(vars, "output_name", video.output_name); diff --git a/src/config.h b/src/config.h index 2a4a638ad93..2e82ec01b5c 100644 --- a/src/config.h +++ b/src/config.h @@ -52,6 +52,7 @@ struct video_t { int vt_coder; } vt; + std::string capture;; std::string encoder; std::string adapter_name; std::string output_name; diff --git a/src/platform/linux/misc.cpp b/src/platform/linux/misc.cpp index 081fb534156..a41bf2f3b65 100644 --- a/src/platform/linux/misc.cpp +++ b/src/platform/linux/misc.cpp @@ -8,13 +8,15 @@ #include +// local includes #include "graphics.h" #include "misc.h" #include "vaapi.h" - +#include "src/config.h" #include "src/main.h" #include "src/platform/common.h" +// lib includes #include #include @@ -518,34 +520,44 @@ std::unique_ptr init() { window_system = window_system_e::X11; } #endif + #ifdef SUNSHINE_BUILD_CUDA - if(verify_nvfbc()) { - sources[source::NVFBC] = true; + if(config::video.capture.empty() || config::video.capture == "nvfbc") { + if(verify_nvfbc()) { + sources[source::NVFBC] = true; + } } #endif #ifdef SUNSHINE_BUILD_WAYLAND - if(verify_wl()) { - sources[source::WAYLAND] = true; + if(config::video.capture.empty() || config::video.capture == "wlr") { + if(verify_wl()) { + sources[source::WAYLAND] = true; + } } #endif #ifdef SUNSHINE_BUILD_DRM - if(verify_kms()) { - if(window_system == window_system_e::WAYLAND) { - // On Wayland, using KMS, the cursor is unreliable. - // Hide it by default - display_cursor = false; + if(config::video.capture.empty() || config::video.capture == "kms") { + if(verify_kms()) { + if(window_system == window_system_e::WAYLAND) { + // On Wayland, using KMS, the cursor is unreliable. + // Hide it by default + display_cursor = false; + } } sources[source::KMS] = true; } #endif #ifdef SUNSHINE_BUILD_X11 - if(verify_x11()) { - sources[source::X11] = true; + if(config::video.capture.empty() || config::video.capture == "x11") { + if(verify_x11()) { + sources[source::X11] = true; + } } #endif if(sources.none()) { + BOOST_LOG(error) << "Unable to initialize capture method"; return nullptr; } @@ -555,4 +567,4 @@ std::unique_ptr init() { return std::make_unique(); } -} // namespace platf \ No newline at end of file +} // namespace platf diff --git a/src_assets/common/assets/web/config.html b/src_assets/common/assets/web/config.html index a0b4f64f75f..0f9ead623b1 100644 --- a/src_assets/common/assets/web/config.html +++ b/src_assets/common/assets/web/config.html @@ -591,7 +591,21 @@

Configuration

HEVC is more CPU-intensive to encode, so enabling this may reduce performance when using software encoding. - + +
+ + +
+ Force a specific capture method, otherwise Sunshine will use the first one that works. NvFBC requires patched nvidia drivers. +
+
+
- + @@ -609,7 +609,7 @@

Configuration