diff --git a/src/platform/windows/virtual_display.cpp b/src/platform/windows/virtual_display.cpp index 45700090..65f43ca6 100644 --- a/src/platform/windows/virtual_display.cpp +++ b/src/platform/windows/virtual_display.cpp @@ -5,6 +5,10 @@ #include #include #include + +#include +#include + #include "virtual_display.h" using namespace SUDOVDA; @@ -163,6 +167,38 @@ bool startPingThread(std::function failCb) { return true; } +bool setRenderAdapterByName(const std::wstring& adapterName) { + if (SUDOVDA_DRIVER_HANDLE == INVALID_HANDLE_VALUE) { + return false; + } + + Microsoft::WRL::ComPtr factory; + if (!SUCCEEDED(CreateDXGIFactory1(IID_PPV_ARGS(&factory)))) { + return false; + } + + Microsoft::WRL::ComPtr adapter; + DXGI_ADAPTER_DESC desc; + int i = 0; + while (SUCCEEDED(factory->EnumAdapters(i, &adapter))) { + i += 1; + + if (!SUCCEEDED(adapter->GetDesc(&desc))) { + continue; + } + + if (std::wstring_view(desc.Description) != adapterName) { + continue; + } + + if (SetRenderAdapter(SUDOVDA_DRIVER_HANDLE, desc.AdapterLuid)) { + return true; + } + } + + return false; +} + std::wstring createVirtualDisplay( const char* s_client_uid, const char* s_client_name, diff --git a/src/platform/windows/virtual_display.h b/src/platform/windows/virtual_display.h index 7e9f76bb..fcdcd99d 100644 --- a/src/platform/windows/virtual_display.h +++ b/src/platform/windows/virtual_display.h @@ -29,6 +29,7 @@ namespace VDISPLAY { void closeVDisplayDevice(); DRIVER_STATUS openVDisplayDevice(); bool startPingThread(std::function failCb); + bool setRenderAdapterByName(const std::wstring& adapterName); std::wstring createVirtualDisplay( const char* s_client_uid, const char* s_client_name, diff --git a/src/platform/windows/windows.rs.in b/src/platform/windows/windows.rs.in index 8a4f31dc..d042504e 100644 --- a/src/platform/windows/windows.rs.in +++ b/src/platform/windows/windows.rs.in @@ -16,7 +16,7 @@ BEGIN BEGIN BLOCK "040904E4" BEGIN - VALUE "CompanyName", "YukiWorkshop\0" + VALUE "CompanyName", "SudoMaker\0" VALUE "FileDescription", "Apollo\0" VALUE "FileVersion", "@PROJECT_VERSION@\0" VALUE "InternalName", "Apollo\0" diff --git a/src/process.cpp b/src/process.cpp index 54bcb050..674cd0d1 100644 --- a/src/process.cpp +++ b/src/process.cpp @@ -58,6 +58,7 @@ namespace proc { if (vDisplayDriverStatus == VDISPLAY::DRIVER_STATUS::OK) { if (!VDISPLAY::startPingThread(onVDisplayWatchdogFailed)) { onVDisplayWatchdogFailed(); + return; } } } @@ -249,6 +250,11 @@ namespace proc { if (vDisplayDriverStatus == VDISPLAY::DRIVER_STATUS::OK) { std::wstring prevPrimaryDisplayName = VDISPLAY::getPrimaryDisplay(); + // Try set the render adapter matching the capture adapter if user has specified one + if (!config::video.adapter_name.empty()) { + VDISPLAY::setRenderAdapterByName(platf::from_utf8(config::video.adapter_name)); + } + memcpy(&launch_session->display_guid, &http::uuid, sizeof(GUID)); std::wstring vdisplayName = VDISPLAY::createVirtualDisplay( diff --git a/src_assets/common/assets/web/config.html b/src_assets/common/assets/web/config.html index 9d570c81..5eceafee 100644 --- a/src_assets/common/assets/web/config.html +++ b/src_assets/common/assets/web/config.html @@ -132,7 +132,7 @@ restarted: false, config: null, currentTab: "general", - vdisplayStatus: false, + vdisplayStatus: "1", global_prep_cmd: [], tabs: [ // TODO: Move the options to each Component instead, encapsulate. { @@ -311,7 +311,7 @@ delete this.config.status; delete this.config.version; - this.vdisplayStatus = this.config.vdisplayStatus === 'true'; + this.vdisplayStatus = this.config.vdisplayStatus; delete this.config.vdisplayStatus; // TODO: let each tab's Component handle it's own data instead of doing it here diff --git a/src_assets/common/assets/web/configs/tabs/audiovideo/AdapterNameSelector.vue b/src_assets/common/assets/web/configs/tabs/audiovideo/AdapterNameSelector.vue index 8fa94ce8..59b2a12a 100644 --- a/src_assets/common/assets/web/configs/tabs/audiovideo/AdapterNameSelector.vue +++ b/src_assets/common/assets/web/configs/tabs/audiovideo/AdapterNameSelector.vue @@ -20,7 +20,7 @@ const config = ref(props.config)