summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Core.cpp12
-rw-r--r--Source/Core/Core/Core.h1
2 files changed, 12 insertions, 1 deletions
diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp
index 5908cc1347..4030ec9acc 100644
--- a/Source/Core/Core/Core.cpp
+++ b/Source/Core/Core/Core.cpp
@@ -94,6 +94,7 @@ static bool s_is_stopping = false;
static bool s_hardware_initialized = false;
static bool s_is_started = false;
static Common::Flag s_is_booting;
+static Common::Event s_done_booting;
static std::thread s_emu_thread;
static StateChangedCallbackFunc s_on_state_changed_callback;
@@ -236,6 +237,8 @@ bool Init(std::unique_ptr<BootParameters> boot, const WindowSystemInfo& wsi)
g_video_backend->PrepareWindow(wsi);
// Start the emu thread
+ s_done_booting.Reset();
+ s_is_booting.Set();
s_emu_thread = std::thread(EmuThread, std::move(boot), wsi);
return true;
}
@@ -412,11 +415,11 @@ static void FifoPlayerThread(const std::optional<std::string>& savestate_path,
static void EmuThread(std::unique_ptr<BootParameters> boot, WindowSystemInfo wsi)
{
const SConfig& core_parameter = SConfig::GetInstance();
- s_is_booting.Set();
if (s_on_state_changed_callback)
s_on_state_changed_callback(State::Starting);
Common::ScopeGuard flag_guard{[] {
s_is_booting.Clear();
+ s_done_booting.Set();
s_is_started = false;
s_is_stopping = false;
s_wants_determinism = false;
@@ -539,6 +542,7 @@ static void EmuThread(std::unique_ptr<BootParameters> boot, WindowSystemInfo wsi
// The hardware is initialized.
s_hardware_initialized = true;
s_is_booting.Clear();
+ s_done_booting.Set();
// Set execution state to known values (CPU/FIFO/Audio Paused)
CPU::Break();
@@ -662,6 +666,12 @@ State GetState()
return State::Uninitialized;
}
+void WaitUntilDoneBooting()
+{
+ if (s_is_booting.IsSet() || !s_hardware_initialized)
+ s_done_booting.Wait();
+}
+
static std::string GenerateScreenshotFolderPath()
{
const std::string& gameId = SConfig::GetInstance().GetGameID();
diff --git a/Source/Core/Core/Core.h b/Source/Core/Core/Core.h
index 530079b8ab..4015b98e15 100644
--- a/Source/Core/Core/Core.h
+++ b/Source/Core/Core/Core.h
@@ -56,6 +56,7 @@ bool WantsDeterminism();
// [NOT THREADSAFE] For use by Host only
void SetState(State state);
State GetState();
+void WaitUntilDoneBooting();
void SaveScreenShot(bool wait_for_completion = false);
void SaveScreenShot(std::string_view name, bool wait_for_completion = false);