Refactoring settings/support changing GPU renderer at runtime
This commit is contained in:
@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user