Skip to content

Commit be920ac

Browse files
committed
System: Get rid of double popup on renderer create error
1 parent 5808e14 commit be920ac

File tree

4 files changed

+34
-27
lines changed

4 files changed

+34
-27
lines changed

src/core/host.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ void Host::ReportFormattedDebuggerMessage(const char* format, ...)
268268
ReportDebuggerMessage(message);
269269
}
270270

271-
bool Host::CreateGPUDevice(RenderAPI api)
271+
bool Host::CreateGPUDevice(RenderAPI api, Error* error)
272272
{
273273
DebugAssert(!g_gpu_device);
274274

@@ -292,29 +292,32 @@ bool Host::CreateGPUDevice(RenderAPI api)
292292
if (g_settings.gpu_disable_texture_copy_to_self)
293293
disabled_features |= GPUDevice::FEATURE_MASK_TEXTURE_COPY_TO_SELF;
294294

295-
Error error;
295+
Error create_error;
296296
if (!g_gpu_device || !g_gpu_device->Create(
297297
g_settings.gpu_adapter,
298298
g_settings.gpu_disable_shader_cache ? std::string_view() : std::string_view(EmuFolders::Cache),
299299
SHADER_CACHE_VERSION, g_settings.gpu_use_debug_device, System::IsVSyncEffectivelyEnabled(),
300300
g_settings.gpu_threaded_presentation, exclusive_fullscreen_control,
301-
static_cast<GPUDevice::FeatureMask>(disabled_features), &error))
301+
static_cast<GPUDevice::FeatureMask>(disabled_features), &create_error))
302302
{
303-
Log_ErrorPrintf("Failed to create GPU device.");
303+
Log_ErrorFmt("Failed to create GPU device: {}", create_error.GetDescription());
304304
if (g_gpu_device)
305305
g_gpu_device->Destroy();
306306
g_gpu_device.reset();
307307

308-
Host::ReportErrorAsync(
309-
"Error", fmt::format("Failed to create render device:\n\n{}\n\nThis may be due to your GPU not supporting the "
310-
"chosen renderer ({}), or because your graphics drivers need to be updated.",
311-
error.GetDescription(), GPUDevice::RenderAPIToString(api)));
308+
Error::SetStringFmt(
309+
error,
310+
TRANSLATE_FS("System", "Failed to create render device:\n\n{0}\n\nThis may be due to your GPU not supporting the "
311+
"chosen renderer ({1}), or because your graphics drivers need to be updated."),
312+
create_error.GetDescription(), GPUDevice::RenderAPIToString(api));
312313
return false;
313314
}
314315

315-
if (!ImGuiManager::Initialize(g_settings.display_osd_scale / 100.0f, g_settings.display_show_osd_messages, &error))
316+
if (!ImGuiManager::Initialize(g_settings.display_osd_scale / 100.0f, g_settings.display_show_osd_messages,
317+
&create_error))
316318
{
317-
Host::ReportErrorAsync("Error", fmt::format("Failed to initialize ImGuiManager: {}", error.GetDescription()));
319+
Log_ErrorFmt("Failed to initialize ImGuiManager: {}", create_error.GetDescription());
320+
Error::SetStringFmt(error, "Failed to initialize ImGuiManager: {}", create_error.GetDescription());
318321
g_gpu_device->Destroy();
319322
g_gpu_device.reset();
320323
return false;
@@ -379,4 +382,3 @@ void Host::ReleaseGPUDevice()
379382
g_gpu_device->Destroy();
380383
g_gpu_device.reset();
381384
}
382-

src/core/host.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <string_view>
1919
#include <vector>
2020

21+
class Error;
2122
class SettingsInterface;
2223
struct WindowInfo;
2324
enum class AudioBackend : u8;
@@ -91,7 +92,7 @@ void DisplayLoadingScreen(const char* message, int progress_min = -1, int progre
9192
void RunOnCPUThread(std::function<void()> function, bool block = false);
9293

9394
/// Attempts to create the rendering device backend.
94-
bool CreateGPUDevice(RenderAPI api);
95+
bool CreateGPUDevice(RenderAPI api, Error* error);
9596

9697
/// Handles fullscreen transitions and such.
9798
void UpdateDisplayWindow();

src/core/system.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ static void ClearRunningGame();
108108
static void DestroySystem();
109109
static std::string GetMediaPathFromSaveState(const char* path);
110110
static bool DoState(StateWrapper& sw, GPUTexture** host_texture, bool update_display, bool is_memory_state);
111-
static bool CreateGPU(GPURenderer renderer, bool is_switching);
111+
static bool CreateGPU(GPURenderer renderer, bool is_switching, Error* error);
112112
static bool SaveUndoLoadState();
113113
static void WarnAboutUnsafeSettings();
114114
static void LogUnsafeSettingsToConsole(const SmallStringBase& messages);
@@ -126,7 +126,7 @@ static void DoRewind();
126126
static void SaveRunaheadState();
127127
static bool DoRunahead();
128128

129-
static bool Initialize(bool force_software_renderer);
129+
static bool Initialize(bool force_software_renderer, Error* error);
130130
static bool FastForwardToFirstFrame();
131131

132132
static bool UpdateGameSettingsLayer();
@@ -938,10 +938,11 @@ bool System::RecreateGPU(GPURenderer renderer, bool force_recreate_device, bool
938938
Host::ReleaseGPUDevice();
939939
}
940940

941-
if (!CreateGPU(renderer, true))
941+
Error error;
942+
if (!CreateGPU(renderer, true, &error))
942943
{
943944
if (!IsStartupCancelled())
944-
Host::ReportErrorAsync("Error", "Failed to recreate GPU.");
945+
Host::ReportErrorAsync("Error", error.GetDescription());
945946

946947
DestroySystem();
947948
return false;
@@ -1474,7 +1475,7 @@ bool System::BootSystem(SystemBootParameters parameters, Error* error)
14741475
}
14751476

14761477
// Component setup.
1477-
if (!Initialize(parameters.force_software_renderer))
1478+
if (!Initialize(parameters.force_software_renderer, error))
14781479
{
14791480
s_state = State::Shutdown;
14801481
ClearRunningGame();
@@ -1579,7 +1580,7 @@ bool System::BootSystem(SystemBootParameters parameters, Error* error)
15791580
return true;
15801581
}
15811582

1582-
bool System::Initialize(bool force_software_renderer)
1583+
bool System::Initialize(bool force_software_renderer, Error* error)
15831584
{
15841585
g_ticks_per_second = ScaleTicksToOverclock(MASTER_CLOCK);
15851586
s_max_slice_ticks = ScaleTicksToOverclock(MASTER_CLOCK / 10);
@@ -1636,7 +1637,7 @@ bool System::Initialize(bool force_software_renderer)
16361637

16371638
CPU::CodeCache::Initialize();
16381639

1639-
if (!CreateGPU(force_software_renderer ? GPURenderer::Software : g_settings.gpu_renderer, false))
1640+
if (!CreateGPU(force_software_renderer ? GPURenderer::Software : g_settings.gpu_renderer, false, error))
16401641
{
16411642
Bus::Shutdown();
16421643
CPU::Shutdown();
@@ -2076,7 +2077,7 @@ void System::RecreateSystem()
20762077
PauseSystem(true);
20772078
}
20782079

2079-
bool System::CreateGPU(GPURenderer renderer, bool is_switching)
2080+
bool System::CreateGPU(GPURenderer renderer, bool is_switching, Error* error)
20802081
{
20812082
const RenderAPI api = Settings::GetRenderAPIForRenderer(renderer);
20822083

@@ -2085,13 +2086,13 @@ bool System::CreateGPU(GPURenderer renderer, bool is_switching)
20852086
{
20862087
if (g_gpu_device)
20872088
{
2088-
Log_WarningPrintf("Recreating GPU device, expecting %s got %s", GPUDevice::RenderAPIToString(api),
2089-
GPUDevice::RenderAPIToString(g_gpu_device->GetRenderAPI()));
2089+
Log_WarningFmt("Recreating GPU device, expecting {} got {}", GPUDevice::RenderAPIToString(api),
2090+
GPUDevice::RenderAPIToString(g_gpu_device->GetRenderAPI()));
20902091
PostProcessing::Shutdown();
20912092
}
20922093

20932094
Host::ReleaseGPUDevice();
2094-
if (!Host::CreateGPUDevice(api))
2095+
if (!Host::CreateGPUDevice(api, error))
20952096
{
20962097
Host::ReleaseRenderWindow();
20972098
return false;
@@ -2108,16 +2109,16 @@ bool System::CreateGPU(GPURenderer renderer, bool is_switching)
21082109

21092110
if (!g_gpu)
21102111
{
2111-
Log_ErrorPrintf("Failed to initialize %s renderer, falling back to software renderer",
2112-
Settings::GetRendererName(renderer));
2112+
Log_ErrorFmt("Failed to initialize {} renderer, falling back to software renderer",
2113+
Settings::GetRendererName(renderer));
21132114
Host::AddFormattedOSDMessage(
21142115
30.0f, TRANSLATE("OSDMessage", "Failed to initialize %s renderer, falling back to software renderer."),
21152116
Settings::GetRendererName(renderer));
21162117
g_gpu.reset();
21172118
g_gpu = GPU::CreateSoftwareRenderer();
21182119
if (!g_gpu)
21192120
{
2120-
Log_ErrorPrintf("Failed to create fallback software renderer.");
2121+
Log_ErrorPrint("Failed to create fallback software renderer.");
21212122
if (!s_keep_gpu_device_on_shutdown)
21222123
{
21232124
PostProcessing::Shutdown();

src/duckstation-qt/qthost.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -718,8 +718,11 @@ void EmuThread::startFullscreenUI()
718718
setInitialState(s_start_fullscreen_ui_fullscreen ? std::optional<bool>(true) : std::optional<bool>());
719719
m_run_fullscreen_ui = true;
720720

721-
if (!Host::CreateGPUDevice(Settings::GetRenderAPIForRenderer(g_settings.gpu_renderer)) || !FullscreenUI::Initialize())
721+
Error error;
722+
if (!Host::CreateGPUDevice(Settings::GetRenderAPIForRenderer(g_settings.gpu_renderer), &error) ||
723+
!FullscreenUI::Initialize())
722724
{
725+
Host::ReportErrorAsync("Error", error.GetDescription());
723726
Host::ReleaseGPUDevice();
724727
Host::ReleaseRenderWindow();
725728
m_run_fullscreen_ui = false;

0 commit comments

Comments
 (0)