System: Scaffolding for multi-system/multi-bios

This commit is contained in:
Connor McLaughlin
2019-11-16 15:27:57 +10:00
parent d6209937fb
commit 246c97ccb3
19 changed files with 576 additions and 268 deletions

View File

@ -133,21 +133,7 @@ void SDLHostInterface::SaveSettings()
m_settings.Save(m_settings_filename.c_str());
}
bool SDLHostInterface::InitializeSystem(const char* filename, const char* exp1_filename)
{
if (!HostInterface::InitializeSystem(filename, exp1_filename))
{
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", "System initialization failed.", m_window);
return false;
}
ConnectDevices();
UpdateAudioVisualSync();
m_paused = m_system->GetSettings().start_paused;
return true;
}
void SDLHostInterface::ConnectDevices()
void SDLHostInterface::ConnectControllers()
{
m_controller = DigitalController::Create();
m_system->SetController(0, m_controller);
@ -216,7 +202,7 @@ std::unique_ptr<SDLHostInterface> SDLHostInterface::Create(const char* filename
const bool boot = (filename != nullptr || exp1_filename != nullptr || save_state_filename != nullptr);
if (boot)
{
if (!intf->InitializeSystem(filename, exp1_filename))
if (!intf->CreateSystem() || !intf->BootSystem(filename, exp1_filename))
return nullptr;
if (save_state_filename)
@ -235,9 +221,14 @@ TinyString SDLHostInterface::GetSaveStateFilename(u32 index)
return TinyString::FromFormat("savestate_%u.bin", index);
}
void SDLHostInterface::ReportError(const char* message)
{
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "DuckStation Error", message, m_window);
}
void SDLHostInterface::ReportMessage(const char* message)
{
AddOSDMessage(message, 3.0f);
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "DuckStation Information", message, m_window);
}
static inline u32 SDLButtonToHostButton(u32 button)
@ -736,13 +727,13 @@ void SDLHostInterface::DrawQuickSettingsMenu()
if (ImGui::BeginMenu("Renderer"))
{
const Settings::GPURenderer current = m_settings.gpu_renderer;
for (u32 i = 0; i < static_cast<u32>(Settings::GPURenderer::Count); i++)
const GPURenderer current = m_settings.gpu_renderer;
for (u32 i = 0; i < static_cast<u32>(GPURenderer::Count); i++)
{
if (ImGui::MenuItem(Settings::GetRendererDisplayName(static_cast<Settings::GPURenderer>(i)), nullptr,
if (ImGui::MenuItem(Settings::GetRendererDisplayName(static_cast<GPURenderer>(i)), nullptr,
i == static_cast<u32>(current)))
{
m_settings.gpu_renderer = static_cast<Settings::GPURenderer>(i);
m_settings.gpu_renderer = static_cast<GPURenderer>(i);
settings_changed = true;
if (m_system)
SwitchGPURenderer();
@ -998,12 +989,12 @@ void SDLHostInterface::DrawSettingsWindow()
if (ImGui::Combo(
"##gpu_renderer", &gpu_renderer,
[](void*, int index, const char** out_text) {
*out_text = Settings::GetRendererDisplayName(static_cast<Settings::GPURenderer>(index));
*out_text = Settings::GetRendererDisplayName(static_cast<GPURenderer>(index));
return true;
},
nullptr, static_cast<int>(Settings::GPURenderer::Count)))
nullptr, static_cast<int>(GPURenderer::Count)))
{
m_settings.gpu_renderer = static_cast<Settings::GPURenderer>(gpu_renderer);
m_settings.gpu_renderer = static_cast<GPURenderer>(gpu_renderer);
SwitchGPURenderer();
}
}
@ -1213,21 +1204,16 @@ void SDLHostInterface::DoReset()
void SDLHostInterface::DoPowerOff()
{
Assert(m_system);
ShutdownSystem();
DestroySystem();
AddOSDMessage("System powered off.");
}
void SDLHostInterface::DoResume()
{
Assert(!m_system);
if (!InitializeSystem())
return;
if (!LoadState(RESUME_SAVESTATE_FILENAME))
if (!CreateSystem() || !BootSystem(nullptr, RESUME_SAVESTATE_FILENAME))
{
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Load state failed",
"Failed to load the resume save state. Stopping emulation.", m_window);
ShutdownSystem();
DestroySystem();
return;
}
@ -1244,8 +1230,11 @@ void SDLHostInterface::DoStartDisc()
return;
AddOSDMessage(SmallString::FromFormat("Starting disc from '%s'...", path));
if (!InitializeSystem(path, nullptr))
if (!CreateSystem() || !BootSystem(path, nullptr))
{
DestroySystem();
return;
}
ResetPerformanceCounters();
ClearImGuiFocus();
@ -1256,8 +1245,11 @@ void SDLHostInterface::DoStartBIOS()
Assert(!m_system);
AddOSDMessage("Starting BIOS...");
if (!InitializeSystem(nullptr, nullptr))
if (!CreateSystem() || !BootSystem(nullptr, nullptr))
{
DestroySystem();
return;
}
ResetPerformanceCounters();
ClearImGuiFocus();
@ -1282,10 +1274,19 @@ void SDLHostInterface::DoChangeDisc()
void SDLHostInterface::DoLoadState(u32 index)
{
if (!HasSystem() && !InitializeSystem(nullptr, nullptr))
return;
if (HasSystem())
{
LoadState(GetSaveStateFilename(index));
}
else
{
if (!CreateSystem() || !BootSystem(nullptr, GetSaveStateFilename(index)))
{
DestroySystem();
return;
}
}
LoadState(GetSaveStateFilename(index));
ResetPerformanceCounters();
ClearImGuiFocus();
}
@ -1321,16 +1322,15 @@ void SDLHostInterface::DoToggleSoftwareRendering()
if (!m_system)
return;
if (m_settings.gpu_renderer != Settings::GPURenderer::Software)
if (m_settings.gpu_renderer != GPURenderer::Software)
{
m_settings.gpu_renderer = Settings::GPURenderer::Software;
m_settings.gpu_renderer = GPURenderer::Software;
AddOSDMessage("Switched to software GPU renderer.");
}
else
{
m_settings.gpu_renderer = m_display->GetRenderAPI() == HostDisplay::RenderAPI::D3D11 ?
Settings::GPURenderer::HardwareD3D11 :
Settings::GPURenderer::HardwareOpenGL;
m_settings.gpu_renderer = m_display->GetRenderAPI() == HostDisplay::RenderAPI::D3D11 ? GPURenderer::HardwareD3D11 :
GPURenderer::HardwareOpenGL;
AddOSDMessage("Switched to hardware GPU renderer.");
}
@ -1431,6 +1431,6 @@ void SDLHostInterface::Run()
"Saving state failed, you will not be able to resume this session.", m_window);
}
ShutdownSystem();
DestroySystem();
}
}
}

View File

@ -17,7 +17,7 @@ class DigitalController;
class MemoryCard;
class AudioStream;
class SDLHostInterface : public HostInterface
class SDLHostInterface final : public HostInterface
{
public:
SDLHostInterface();
@ -28,6 +28,7 @@ public:
static TinyString GetSaveStateFilename(u32 index);
void ReportError(const char* message) override;
void ReportMessage(const char* message) override;
// Adds OSD messages, duration is in seconds.
@ -35,6 +36,9 @@ public:
void Run();
protected:
void ConnectControllers() override;
private:
static constexpr u32 NUM_QUICK_SAVE_STATES = 10;
static constexpr char RESUME_SAVESTATE_FILENAME[] = "savestate_resume.bin";
@ -49,7 +53,7 @@ private:
bool HasSystem() const { return static_cast<bool>(m_system); }
#ifdef WIN32
bool UseOpenGLRenderer() const { return m_settings.gpu_renderer == Settings::GPURenderer::HardwareOpenGL; }
bool UseOpenGLRenderer() const { return m_settings.gpu_renderer == GPURenderer::HardwareOpenGL; }
#else
bool UseOpenGLRenderer() const { return true; }
#endif
@ -64,8 +68,6 @@ private:
void SaveSettings();
bool InitializeSystem(const char* filename = nullptr, const char* exp1_filename = nullptr);
void ConnectDevices();
void ResetPerformanceCounters();
void SwitchGPURenderer();
void UpdateFullscreen();