Skip to content

Commit

Permalink
feat(ddprobe): allow to manually specify gpu preference (#3521)
Browse files Browse the repository at this point in the history
  • Loading branch information
FrogTheFrog authored Jan 8, 2025
1 parent 9b9767b commit 6a233cb
Show file tree
Hide file tree
Showing 8 changed files with 68 additions and 15 deletions.
31 changes: 31 additions & 0 deletions docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -848,6 +848,37 @@ editing the `conf` file in a text editor. Use the examples as reference.
</tr>
</table>

### gpu_preference

<table>
<tr>
<td>Description</td>
<td colspan="2">
Specify the GPU preference for the Sunshine process.
<br>
<br>
If set to negative number (-1 by default), Sunshine will try to detect the best GPU for the streamed display, but if it fails you will get a black screen.
<br>
Setting it to 0 will allow Windows to try and select the best GPU.
<br>
Setting it to 1 and above will prioritize the GPU that matches this number (the number has to be guessed, but it starts at 1 and increases).
@note{Applies to Windows only.}
</td>
</tr>
<tr>
<td>Default</td>
<td colspan="2">@code{}
-1
@endcode</td>
</tr>
<tr>
<td>Example</td>
<td colspan="2">@code{}
2
@endcode</td>
</tr>
</table>

### output_name

<table>
Expand Down
2 changes: 2 additions & 0 deletions src/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,7 @@ namespace config {
{}, // capture
{}, // encoder
{}, // adapter_name
-1, // gpu_preference
{}, // output_name

{
Expand Down Expand Up @@ -1088,6 +1089,7 @@ namespace config {
string_f(vars, "capture", video.capture);
string_f(vars, "encoder", video.encoder);
string_f(vars, "adapter_name", video.adapter_name);
int_f(vars, "gpu_preference", video.gpu_preference);
string_f(vars, "output_name", video.output_name);

generic_f(vars, "dd_configuration_option", video.dd.configuration_option, dd::config_option_from_view);
Expand Down
1 change: 1 addition & 0 deletions src/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ namespace config {
std::string capture;
std::string encoder;
std::string adapter_name;
int gpu_preference;
std::string output_name;

struct dd_t {
Expand Down
32 changes: 18 additions & 14 deletions src/platform/windows/display_base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -386,12 +386,7 @@ namespace platf::dxgi {
// would have been raised first if it wasn't.
if (result == S_OK || result == E_ACCESSDENIED) {
// We found a working GPU preference, so set ourselves to use that.
if (set_gpu_preference_on_self(i)) {
return true;
}
else {
return false;
}
return set_gpu_preference_on_self(i);
}
}

Expand All @@ -418,16 +413,25 @@ namespace platf::dxgi {
return true;
}

// Try probing with different GPU preferences and verify_frame_capture flag
if (validate_and_test_gpu_preference(display_name, true)) {
set_gpu_preference = true;
return true;
// If the GPU preference was manually specified, we can skip the probe.
if (config::video.gpu_preference >= 0) {
if (set_gpu_preference_on_self(config::video.gpu_preference)) {
set_gpu_preference = true;
return true;
}
}
else {
// Try probing with different GPU preferences and verify_frame_capture flag
if (validate_and_test_gpu_preference(display_name, true)) {
set_gpu_preference = true;
return true;
}

// If no valid configuration was found, try again with verify_frame_capture == false
if (validate_and_test_gpu_preference(display_name, false)) {
set_gpu_preference = true;
return true;
// If no valid configuration was found, try again with verify_frame_capture == false
if (validate_and_test_gpu_preference(display_name, false)) {
set_gpu_preference = true;
return true;
}
}

// If neither worked, return false
Expand Down
1 change: 1 addition & 0 deletions src_assets/common/assets/web/config.html
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ <h1 class="my-4">{{ $t('config.configuration') }}</h1>
"virtual_sink": "",
"install_steam_audio_drivers": "enabled",
"adapter_name": "",
"gpu_preference": -1,
"output_name": "",
"dd_configuration_option": "verify_only",
"dd_resolution_option": "auto",
Expand Down
12 changes: 12 additions & 0 deletions src_assets/common/assets/web/configs/tabs/AudioVideo.vue
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,18 @@ const config = ref(props.config)
:config="config"
/>

<PlatformLayout :platform="platform">
<template #windows>
<!-- GPU Preference -->
<div class="mb-3">
<label for="gpu_preference" class="form-label">{{ $t('config.gpu_preference') }}</label>
<input type="number" class="form-control" id="gpu_preference" placeholder="-1" min="-1"
v-model="config.gpu_preference" />
<div class="form-text">{{ $t('config.gpu_preference_desc') }}</div>
</div>
</template>
</PlatformLayout>

<DisplayOutputSelector
:platform="platform"
:config="config"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ const config = ref(props.config)
<label for="dd_config_revert_delay" class="form-label">
{{ $t('config.dd_config_revert_delay') }}
</label>
<input type="text" class="form-control" id="dd_config_revert_delay" placeholder="3000"
<input type="number" class="form-control" id="dd_config_revert_delay" placeholder="3000" min="0"
v-model="config.dd_config_revert_delay" />
<div class="form-text">
{{ $t('config.dd_config_revert_delay_desc') }}
Expand Down
2 changes: 2 additions & 0 deletions src_assets/common/assets/web/public/assets/locale/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,8 @@
"fec_percentage": "FEC Percentage",
"fec_percentage_desc": "Percentage of error correcting packets per data packet in each video frame. Higher values can correct for more network packet loss, but at the cost of increasing bandwidth usage.",
"ffmpeg_auto": "auto -- let ffmpeg decide (default)",
"gpu_preference": "GPU Preference",
"gpu_preference_desc": "Specify the GPU preference for the Sunshine process. If set to negative number (-1 by default), Sunshine will try to detect the best GPU for the streamed display, but if it fails you will get a black screen. Setting it to 0 will allow Windows to try and select the best GPU. Setting it to 1 and above will prioritize the GPU that matches this number (the number has to be guessed, but it starts at 1 and increases).",
"file_apps": "Apps File",
"file_apps_desc": "The file where current apps of Sunshine are stored.",
"file_state": "State File",
Expand Down

0 comments on commit 6a233cb

Please sign in to comment.