diff --git a/src/core/fullscreenui_settings.cpp b/src/core/fullscreenui_settings.cpp index b0769229b..48875326f 100644 --- a/src/core/fullscreenui_settings.cpp +++ b/src/core/fullscreenui_settings.cpp @@ -217,6 +217,7 @@ struct SettingsLocals bool game_settings_changed = false; bool cover_downloader_urls_loaded = false; bool cover_downloader_use_serial_names = false; + GPURenderer graphics_adapter_list_cache_renderer = GPURenderer::Count; InputBindingDialog input_binding_dialog; }; @@ -1747,7 +1748,6 @@ void FullscreenUI::SwitchToSettings() s_settings_locals.game_cheat_groups = {}; s_settings_locals.selected_controller_port = -1; - PopulateGraphicsAdapterList(); PopulateHotkeyList(); const auto lock = Core::GetSettingsLock(); @@ -1813,17 +1813,9 @@ void FullscreenUI::SwitchToGameSettings(const GameList::Entry* entry, SettingsPa void FullscreenUI::PopulateGraphicsAdapterList() { - GPURenderer renderer; - const auto lock = Core::GetSettingsLock(); - { - renderer = Settings::ParseRendererName( - GetEffectiveTinyStringSetting(GetEditingSettingsInterface(false), "GPU", "Renderer").c_str()) - .value_or(Settings::DEFAULT_GPU_RENDERER); - } - Error error; std::optional adapter_list = GPUDevice::GetAdapterListForAPI( - Settings::GetRenderAPIForRenderer(renderer), + Settings::GetRenderAPIForRenderer(s_settings_locals.graphics_adapter_list_cache_renderer), g_gpu_device->HasMainSwapChain() ? g_gpu_device->GetMainSwapChain()->GetWindowInfo().type : WindowInfoType::Surfaceless, &error); @@ -3975,15 +3967,26 @@ void FullscreenUI::DrawGraphicsSettingsPage() .c_str()) .value_or(Settings::DEFAULT_GPU_RENDERER); const bool is_hardware = (renderer != GPURenderer::Software); + if (s_settings_locals.graphics_adapter_list_cache_renderer != renderer) + { + s_settings_locals.graphics_adapter_list_cache_renderer = renderer; + PopulateGraphicsAdapterList(); + } std::optional current_adapter = bsi->GetOptionalSmallStringValue("GPU", "Adapter", game_settings ? std::nullopt : std::optional("")); if (MenuActionButton( FSUI_ICONVSTR(ICON_PF_GPU_GRAPHICS_CARD, "GPU Adapter"), FSUI_VSTR("Selects the GPU to use for rendering."), - current_adapter.has_value() ? (current_adapter->empty() ? FSUI_VSTR("Default") : current_adapter->view()) : - FSUI_VSTR("Use Global Setting"), - true)) + current_adapter.has_value() ? + ((current_adapter->empty() || std::ranges::none_of(s_settings_locals.graphics_adapter_list_cache, + [¤t_adapter](const GPUDevice::AdapterInfo& ai) { + return (current_adapter.value() == ai.name); + })) ? + FSUI_VSTR("Default") : + current_adapter->view()) : + FSUI_VSTR("Use Global Setting"), + true, !s_settings_locals.graphics_adapter_list_cache.empty())) { DropdownDialogOptions options; options.reserve(s_settings_locals.graphics_adapter_list_cache.size() + 2);