Skip to content

Commit

Permalink
GPUThread: Fix setting change crash with thread off
Browse files Browse the repository at this point in the history
  • Loading branch information
stenzek committed Jan 30, 2025
1 parent 369879e commit 44a75d6
Showing 1 changed file with 15 additions and 8 deletions.
23 changes: 15 additions & 8 deletions src/core/gpu_thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ static bool CreateGPUBackendOnThread(GPURenderer renderer, bool upload_vram, Err
static void DestroyGPUBackendOnThread();
static void DestroyGPUPresenterOnThread();

static void UpdateSettingsOnThread(GPUThreadUpdateSettingsCommand* cmd);
static void UpdateSettingsOnThread(GPUSettings&& new_settings);

static void UpdateRunIdle();

Expand Down Expand Up @@ -511,7 +511,7 @@ void GPUThread::Internal::GPUThreadEntryPoint()
case GPUBackendCommandType::UpdateSettings:
{
GPUThreadUpdateSettingsCommand* ccmd = static_cast<GPUThreadUpdateSettingsCommand*>(cmd);
UpdateSettingsOnThread(ccmd);
UpdateSettingsOnThread(std::move(ccmd->settings));
ccmd->~GPUThreadUpdateSettingsCommand();
}
break;
Expand Down Expand Up @@ -984,12 +984,12 @@ bool GPUThread::Internal::PresentFrameAndRestoreContext()
return true;
}

void GPUThread::UpdateSettingsOnThread(GPUThreadUpdateSettingsCommand* cmd)
void GPUThread::UpdateSettingsOnThread(GPUSettings&& new_settings)
{
VERBOSE_LOG("Updating GPU settings on thread...");

GPUSettings old_settings = std::move(g_gpu_settings);
g_gpu_settings = std::move(cmd->settings);
g_gpu_settings = std::move(new_settings);

if (g_gpu_device)
{
Expand Down Expand Up @@ -1090,9 +1090,16 @@ void GPUThread::UpdateSettings(bool gpu_settings_changed, bool device_settings_c
}
else if (gpu_settings_changed)
{
GPUThreadUpdateSettingsCommand* cmd =
AllocateCommand<GPUThreadUpdateSettingsCommand>(GPUBackendCommandType::UpdateSettings, g_settings);
PushCommandAndWakeThread(cmd);
if (s_state.use_gpu_thread) [[likely]]
{
GPUThreadUpdateSettingsCommand* cmd =
AllocateCommand<GPUThreadUpdateSettingsCommand>(GPUBackendCommandType::UpdateSettings, g_settings);
PushCommandAndWakeThread(cmd);
}
else
{
UpdateSettingsOnThread(GPUSettings(g_settings));
}
}
else
{
Expand Down Expand Up @@ -1377,7 +1384,7 @@ const std::string& GPUThread::GetGameSerial()

void GPUThread::SetGameSerial(std::string serial)
{
DebugAssert(!IsOnThread());
DebugAssert(!IsOnThread() || !s_state.use_gpu_thread);
RunOnThread([serial = std::move(serial)]() mutable {
const bool changed = (s_state.game_serial != serial);
s_state.game_serial = std::move(serial);
Expand Down

0 comments on commit 44a75d6

Please sign in to comment.