mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-23 06:10:03 -06:00
Refactor NDS
and DSi
to be objects (#1893)
* First crack at refactoring NDS and DSi into objects - Remove all global/`static` variables in `NDS` and related classes - Rely more on virtual dispatch when we need to pick methods at runtime - Pass `NDS&` or `DSi&` to its constituent components where necessary - Introduce some headers or move some definitions to break `#include` cycles * Refactor the frontend to accommodate the core's changes * Move up `SchedList`'s declaration - Move it to before the components are initialized so the `map`s inside are initialized - Fields in C++ are initialized in the order they're declared * Fix a crash when allocating memory * Fix JIT-free builds * Fix GDB-free builds * Fix Linux builds - Explicitly qualify some member types in NDS, since they share the same name as their classes * Remove an unnecessary template argument - This was causing the build to fail on macOS * Fix ARM and Android builds * Rename `Constants.h` to `MemConstants.h` * Add `NDS::IsRunning()` * Use an `#include` guard instead of `#pragma once`
This commit is contained in:

committed by
GitHub

parent
c84cb17462
commit
e973236203
60
src/GPU.cpp
60
src/GPU.cpp
@ -64,12 +64,12 @@ enum
|
||||
VRAMDirty need to be reset for the respective VRAM bank.
|
||||
*/
|
||||
|
||||
GPU::GPU(ARMJIT& jit) noexcept : GPU2D_A(0, *this), GPU2D_B(1, *this), JIT(jit)
|
||||
GPU::GPU(melonDS::NDS& nds) noexcept : NDS(nds), GPU2D_A(0, *this), GPU2D_B(1, *this), GPU3D(nds)
|
||||
{
|
||||
NDS::RegisterEventFunc(NDS::Event_LCD, LCD_StartHBlank, MemberEventFunc(GPU, StartHBlank));
|
||||
NDS::RegisterEventFunc(NDS::Event_LCD, LCD_StartScanline, MemberEventFunc(GPU, StartScanline));
|
||||
NDS::RegisterEventFunc(NDS::Event_LCD, LCD_FinishFrame, MemberEventFunc(GPU, FinishFrame));
|
||||
NDS::RegisterEventFunc(NDS::Event_DisplayFIFO, 0, MemberEventFunc(GPU, DisplayFIFO));
|
||||
NDS.RegisterEventFunc(Event_LCD, LCD_StartHBlank, MemberEventFunc(GPU, StartHBlank));
|
||||
NDS.RegisterEventFunc(Event_LCD, LCD_StartScanline, MemberEventFunc(GPU, StartScanline));
|
||||
NDS.RegisterEventFunc(Event_LCD, LCD_FinishFrame, MemberEventFunc(GPU, FinishFrame));
|
||||
NDS.RegisterEventFunc(Event_DisplayFIFO, 0, MemberEventFunc(GPU, DisplayFIFO));
|
||||
|
||||
GPU2D_Renderer = std::make_unique<GPU2D::SoftRenderer>(*this);
|
||||
|
||||
@ -92,10 +92,10 @@ GPU::~GPU() noexcept
|
||||
Framebuffer[1][0] = nullptr;
|
||||
Framebuffer[1][1] = nullptr;
|
||||
|
||||
NDS::UnregisterEventFunc(NDS::Event_LCD, LCD_StartHBlank);
|
||||
NDS::UnregisterEventFunc(NDS::Event_LCD, LCD_StartScanline);
|
||||
NDS::UnregisterEventFunc(NDS::Event_LCD, LCD_FinishFrame);
|
||||
NDS::UnregisterEventFunc(NDS::Event_DisplayFIFO, 0);
|
||||
NDS.UnregisterEventFunc(Event_LCD, LCD_StartHBlank);
|
||||
NDS.UnregisterEventFunc(Event_LCD, LCD_StartScanline);
|
||||
NDS.UnregisterEventFunc(Event_LCD, LCD_FinishFrame);
|
||||
NDS.UnregisterEventFunc(Event_DisplayFIFO, 0);
|
||||
}
|
||||
|
||||
void GPU::ResetVRAMCache() noexcept
|
||||
@ -298,7 +298,7 @@ void GPU::DoSavestate(Savestate* file) noexcept
|
||||
void GPU::AssignFramebuffers() noexcept
|
||||
{
|
||||
int backbuf = FrontBuffer ? 0 : 1;
|
||||
if (NDS::PowerControl9 & (1<<15))
|
||||
if (NDS.PowerControl9 & (1<<15))
|
||||
{
|
||||
GPU2D_Renderer->SetFramebuffer(Framebuffer[backbuf][0], Framebuffer[backbuf][1]);
|
||||
}
|
||||
@ -588,7 +588,7 @@ void GPU::MapVRAM_CD(u32 bank, u8 cnt) noexcept
|
||||
VRAMMap_ARM7[ofs] |= bankmask;
|
||||
memset(VRAMDirty[bank].Data, 0xFF, sizeof(VRAMDirty[bank].Data));
|
||||
VRAMSTAT |= (1 << (bank-2));
|
||||
JIT.CheckAndInvalidateWVRAM(ofs);
|
||||
NDS.JIT.CheckAndInvalidateWVRAM(ofs);
|
||||
break;
|
||||
|
||||
case 3: // texture
|
||||
@ -942,8 +942,8 @@ void GPU::DisplayFIFO(u32 x) noexcept
|
||||
if (x < 256)
|
||||
{
|
||||
// transfer the next 8 pixels
|
||||
NDS::CheckDMAs(0, 0x04);
|
||||
NDS::ScheduleEvent(NDS::Event_DisplayFIFO, true, 6*8, 0, x+8);
|
||||
NDS.CheckDMAs(0, 0x04);
|
||||
NDS.ScheduleEvent(Event_DisplayFIFO, true, 6*8, 0, x+8);
|
||||
}
|
||||
else
|
||||
GPU2D_A.SampleFIFO(253, 3); // sample the remaining pixels
|
||||
@ -954,7 +954,7 @@ void GPU::StartFrame() noexcept
|
||||
// only run the display FIFO if needed:
|
||||
// * if it is used for display or capture
|
||||
// * if we have display FIFO DMA
|
||||
RunFIFO = GPU2D_A.UsesFIFO() || NDS::DMAsInMode(0, 0x04);
|
||||
RunFIFO = GPU2D_A.UsesFIFO() || NDS.DMAsInMode(0, 0x04);
|
||||
|
||||
TotalScanlines = 0;
|
||||
StartScanline(0);
|
||||
@ -982,7 +982,7 @@ void GPU::StartHBlank(u32 line) noexcept
|
||||
GPU2D_Renderer->DrawSprites(line+1, &GPU2D_B);
|
||||
}
|
||||
|
||||
NDS::CheckDMAs(0, 0x02);
|
||||
NDS.CheckDMAs(0, 0x02);
|
||||
}
|
||||
else if (VCount == 215)
|
||||
{
|
||||
@ -994,13 +994,13 @@ void GPU::StartHBlank(u32 line) noexcept
|
||||
GPU2D_Renderer->DrawSprites(0, &GPU2D_B);
|
||||
}
|
||||
|
||||
if (DispStat[0] & (1<<4)) NDS::SetIRQ(0, NDS::IRQ_HBlank);
|
||||
if (DispStat[1] & (1<<4)) NDS::SetIRQ(1, NDS::IRQ_HBlank);
|
||||
if (DispStat[0] & (1<<4)) NDS.SetIRQ(0, IRQ_HBlank);
|
||||
if (DispStat[1] & (1<<4)) NDS.SetIRQ(1, IRQ_HBlank);
|
||||
|
||||
if (VCount < 262)
|
||||
NDS::ScheduleEvent(NDS::Event_LCD, true, (LINE_CYCLES - HBLANK_CYCLES), LCD_StartScanline, line+1);
|
||||
NDS.ScheduleEvent(Event_LCD, true, (LINE_CYCLES - HBLANK_CYCLES), LCD_StartScanline, line+1);
|
||||
else
|
||||
NDS::ScheduleEvent(NDS::Event_LCD, true, (LINE_CYCLES - HBLANK_CYCLES), LCD_FinishFrame, line+1);
|
||||
NDS.ScheduleEvent(Event_LCD, true, (LINE_CYCLES - HBLANK_CYCLES), LCD_FinishFrame, line+1);
|
||||
}
|
||||
|
||||
void GPU::FinishFrame(u32 lines) noexcept
|
||||
@ -1053,7 +1053,7 @@ void GPU::StartScanline(u32 line) noexcept
|
||||
{
|
||||
DispStat[0] |= (1<<2);
|
||||
|
||||
if (DispStat[0] & (1<<5)) NDS::SetIRQ(0, NDS::IRQ_VCount);
|
||||
if (DispStat[0] & (1<<5)) NDS.SetIRQ(0, IRQ_VCount);
|
||||
}
|
||||
else
|
||||
DispStat[0] &= ~(1<<2);
|
||||
@ -1062,7 +1062,7 @@ void GPU::StartScanline(u32 line) noexcept
|
||||
{
|
||||
DispStat[1] |= (1<<2);
|
||||
|
||||
if (DispStat[1] & (1<<5)) NDS::SetIRQ(1, NDS::IRQ_VCount);
|
||||
if (DispStat[1] & (1<<5)) NDS.SetIRQ(1, IRQ_VCount);
|
||||
}
|
||||
else
|
||||
DispStat[1] &= ~(1<<2);
|
||||
@ -1071,9 +1071,9 @@ void GPU::StartScanline(u32 line) noexcept
|
||||
GPU2D_B.CheckWindows(VCount);
|
||||
|
||||
if (VCount >= 2 && VCount < 194)
|
||||
NDS::CheckDMAs(0, 0x03);
|
||||
NDS.CheckDMAs(0, 0x03);
|
||||
else if (VCount == 194)
|
||||
NDS::StopDMAs(0, 0x03);
|
||||
NDS.StopDMAs(0, 0x03);
|
||||
|
||||
if (line < 192)
|
||||
{
|
||||
@ -1085,7 +1085,7 @@ void GPU::StartScanline(u32 line) noexcept
|
||||
}
|
||||
|
||||
if (RunFIFO)
|
||||
NDS::ScheduleEvent(NDS::Event_DisplayFIFO, false, 32, 0, 0);
|
||||
NDS.ScheduleEvent(Event_DisplayFIFO, false, 32, 0, 0);
|
||||
}
|
||||
|
||||
if (VCount == 262)
|
||||
@ -1111,13 +1111,13 @@ void GPU::StartScanline(u32 line) noexcept
|
||||
DispStat[0] |= (1<<0);
|
||||
DispStat[1] |= (1<<0);
|
||||
|
||||
NDS::StopDMAs(0, 0x04);
|
||||
NDS.StopDMAs(0, 0x04);
|
||||
|
||||
NDS::CheckDMAs(0, 0x01);
|
||||
NDS::CheckDMAs(1, 0x11);
|
||||
NDS.CheckDMAs(0, 0x01);
|
||||
NDS.CheckDMAs(1, 0x11);
|
||||
|
||||
if (DispStat[0] & (1<<3)) NDS::SetIRQ(0, NDS::IRQ_VBlank);
|
||||
if (DispStat[1] & (1<<3)) NDS::SetIRQ(1, NDS::IRQ_VBlank);
|
||||
if (DispStat[0] & (1<<3)) NDS.SetIRQ(0, IRQ_VBlank);
|
||||
if (DispStat[1] & (1<<3)) NDS.SetIRQ(1, IRQ_VBlank);
|
||||
|
||||
GPU2D_A.VBlank();
|
||||
GPU2D_B.VBlank();
|
||||
@ -1131,7 +1131,7 @@ void GPU::StartScanline(u32 line) noexcept
|
||||
}
|
||||
}
|
||||
|
||||
NDS::ScheduleEvent(NDS::Event_LCD, true, HBLANK_CYCLES, LCD_StartHBlank, line);
|
||||
NDS.ScheduleEvent(Event_LCD, true, HBLANK_CYCLES, LCD_StartHBlank, line);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user