Refactoring settings/support changing GPU renderer at runtime

This commit is contained in:
Connor McLaughlin
2019-10-26 12:55:56 +10:00
parent ca48b21ffc
commit 9b56499afa
20 changed files with 281 additions and 189 deletions

View File

@ -1,4 +1,5 @@
#include "system.h"
#include "YBaseLib/AutoReleasePtr.h"
#include "YBaseLib/Log.h"
#include "bus.h"
#include "cdrom.h"
@ -23,8 +24,6 @@ System::System(HostInterface* host_interface, const Settings& settings)
m_bus = std::make_unique<Bus>();
m_dma = std::make_unique<DMA>();
m_interrupt_controller = std::make_unique<InterruptController>();
// m_gpu = std::make_unique<GPU>();
m_gpu = GPU::CreateHardwareOpenGLRenderer();
m_cdrom = std::make_unique<CDROM>();
m_pad = std::make_unique<Pad>();
m_timers = std::make_unique<Timers>();
@ -34,9 +33,31 @@ System::System(HostInterface* host_interface, const Settings& settings)
System::~System() = default;
void System::UpdateSettings()
bool System::RecreateGPU()
{
m_gpu->UpdateSettings();
// save current state
AutoReleasePtr<ByteStream> state_stream = ByteStream_CreateGrowableMemoryStream();
StateWrapper sw(state_stream, StateWrapper::Mode::Write);
const bool state_valid = m_gpu->DoState(sw);
if (!state_valid)
Log_ErrorPrintf("Failed to save old GPU state when switching renderers");
// create new renderer
m_gpu.reset();
if (!CreateGPU())
{
Panic("Failed to recreate GPU");
return false;
}
if (state_valid)
{
state_stream->SeekAbsolute(0);
sw.SetMode(StateWrapper::Mode::Read);
m_gpu->DoState(sw);
}
return true;
}
bool System::Initialize()
@ -59,7 +80,7 @@ bool System::Initialize()
if (!m_interrupt_controller->Initialize(m_cpu.get()))
return false;
if (!m_gpu->Initialize(this, m_dma.get(), m_interrupt_controller.get(), m_timers.get()))
if (!CreateGPU())
return false;
if (!m_cdrom->Initialize(this, m_dma.get(), m_interrupt_controller.get(), m_spu.get()))
@ -80,6 +101,28 @@ bool System::Initialize()
return true;
}
bool System::CreateGPU()
{
switch (m_settings.gpu_renderer)
{
case GPURenderer::HardwareOpenGL:
default:
m_gpu = GPU::CreateHardwareOpenGLRenderer();
break;
}
if (!m_gpu || !m_gpu->Initialize(this, m_dma.get(), m_interrupt_controller.get(), m_timers.get()))
return false;
m_bus->SetGPU(m_gpu.get());
m_dma->SetGPU(m_gpu.get());
// the new GPU could have a lower maximum resolution
m_settings.gpu_resolution_scale = m_gpu->GetResolutionScale();
m_settings.max_gpu_resolution_scale = m_gpu->GetMaxResolutionScale();
return true;
}
bool System::DoState(StateWrapper& sw)
{
if (!sw.DoMarker("System"))
@ -326,21 +369,3 @@ void System::RemoveMedia()
{
m_cdrom->RemoveMedia();
}
void System::DrawDebugMenus()
{
m_gpu->DrawDebugMenu();
m_spu->DrawDebugMenu();
m_timers->DrawDebugMenu();
m_cdrom->DrawDebugMenu();
m_mdec->DrawDebugMenu();
}
void System::DrawDebugWindows()
{
m_gpu->DrawDebugWindows();
m_spu->DrawDebugWindow();
m_timers->DrawDebugWindow();
m_cdrom->DrawDebugWindow();
m_mdec->DrawDebugWindow();
}