mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-22 22:01:06 -06:00
separate GPU2D registers and renderer
This commit is contained in:
66
src/GPU.cpp
66
src/GPU.cpp
@ -82,8 +82,10 @@ int FrontBuffer;
|
||||
u32* Framebuffer[2][2];
|
||||
int Renderer = 0;
|
||||
|
||||
std::unique_ptr<GPU2D> GPU2D_A = {};
|
||||
std::unique_ptr<GPU2D> GPU2D_B = {};
|
||||
GPU2D::Unit GPU2D_A(0);
|
||||
GPU2D::Unit GPU2D_B(1);
|
||||
|
||||
std::unique_ptr<GPU2D::Renderer2D> GPU2D_Renderer = {};
|
||||
|
||||
/*
|
||||
VRAM invalidation tracking
|
||||
@ -143,8 +145,7 @@ std::unique_ptr<GLCompositor> CurGLCompositor = {};
|
||||
|
||||
bool Init()
|
||||
{
|
||||
GPU2D_A = std::make_unique<GPU2D_Soft>(0);
|
||||
GPU2D_B = std::make_unique<GPU2D_Soft>(1);
|
||||
GPU2D_Renderer = std::make_unique<GPU2D::SoftRenderer>();
|
||||
if (!GPU3D::Init()) return false;
|
||||
|
||||
FrontBuffer = 0;
|
||||
@ -157,8 +158,7 @@ bool Init()
|
||||
|
||||
void DeInit()
|
||||
{
|
||||
GPU2D_A.reset();
|
||||
GPU2D_B.reset();
|
||||
GPU2D_Renderer.reset();
|
||||
GPU3D::DeInit();
|
||||
|
||||
if (Framebuffer[0][0]) delete[] Framebuffer[0][0];
|
||||
@ -262,13 +262,12 @@ void Reset()
|
||||
Framebuffer[1][1][i] = 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
GPU2D_A->Reset();
|
||||
GPU2D_B->Reset();
|
||||
GPU2D_A.Reset();
|
||||
GPU2D_B.Reset();
|
||||
GPU3D::Reset();
|
||||
|
||||
int backbuf = FrontBuffer ? 0 : 1;
|
||||
GPU2D_A->SetFramebuffer(Framebuffer[backbuf][1]);
|
||||
GPU2D_B->SetFramebuffer(Framebuffer[backbuf][0]);
|
||||
GPU2D_Renderer->SetFramebuffer(Framebuffer[backbuf][1], Framebuffer[backbuf][0]);
|
||||
|
||||
ResetRenderer();
|
||||
|
||||
@ -358,8 +357,8 @@ void DoSavestate(Savestate* file)
|
||||
VRAMPtr_BOBJ[i] = GetUniqueBankPtr(VRAMMap_BOBJ[i], i << 14);
|
||||
}
|
||||
|
||||
GPU2D_A->DoSavestate(file);
|
||||
GPU2D_B->DoSavestate(file);
|
||||
GPU2D_A.DoSavestate(file);
|
||||
GPU2D_B.DoSavestate(file);
|
||||
GPU3D::DoSavestate(file);
|
||||
|
||||
ResetVRAMCache();
|
||||
@ -370,13 +369,11 @@ void AssignFramebuffers()
|
||||
int backbuf = FrontBuffer ? 0 : 1;
|
||||
if (NDS::PowerControl9 & (1<<15))
|
||||
{
|
||||
GPU2D_A->SetFramebuffer(Framebuffer[backbuf][0]);
|
||||
GPU2D_B->SetFramebuffer(Framebuffer[backbuf][1]);
|
||||
GPU2D_Renderer->SetFramebuffer(Framebuffer[backbuf][0], Framebuffer[backbuf][1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
GPU2D_A->SetFramebuffer(Framebuffer[backbuf][1]);
|
||||
GPU2D_B->SetFramebuffer(Framebuffer[backbuf][0]);
|
||||
GPU2D_Renderer->SetFramebuffer(Framebuffer[backbuf][1], Framebuffer[backbuf][0]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -973,8 +970,8 @@ void SetPowerCnt(u32 val)
|
||||
|
||||
if (!(val & (1<<0))) printf("!!! CLEARING POWCNT BIT0. DANGER\n");
|
||||
|
||||
GPU2D_A->SetEnabled(val & (1<<1));
|
||||
GPU2D_B->SetEnabled(val & (1<<9));
|
||||
GPU2D_A.SetEnabled(val & (1<<1));
|
||||
GPU2D_B.SetEnabled(val & (1<<9));
|
||||
GPU3D::SetEnabled(val & (1<<3), val & (1<<2));
|
||||
|
||||
AssignFramebuffers();
|
||||
@ -989,9 +986,9 @@ void DisplayFIFO(u32 x)
|
||||
if (x > 0)
|
||||
{
|
||||
if (x == 8)
|
||||
GPU2D_A->SampleFIFO(0, 5);
|
||||
GPU2D_A.SampleFIFO(0, 5);
|
||||
else
|
||||
GPU2D_A->SampleFIFO(x-11, 8);
|
||||
GPU2D_A.SampleFIFO(x-11, 8);
|
||||
}
|
||||
|
||||
if (x < 256)
|
||||
@ -1001,7 +998,7 @@ void DisplayFIFO(u32 x)
|
||||
NDS::ScheduleEvent(NDS::Event_DisplayFIFO, true, 6*8, DisplayFIFO, x+8);
|
||||
}
|
||||
else
|
||||
GPU2D_A->SampleFIFO(253, 3); // sample the remaining pixels
|
||||
GPU2D_A.SampleFIFO(253, 3); // sample the remaining pixels
|
||||
}
|
||||
|
||||
void StartFrame()
|
||||
@ -1009,7 +1006,7 @@ void StartFrame()
|
||||
// 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);
|
||||
@ -1026,15 +1023,15 @@ void StartHBlank(u32 line)
|
||||
// note: this should start 48 cycles after the scanline start
|
||||
if (line < 192)
|
||||
{
|
||||
GPU2D_A->DrawScanline(line);
|
||||
GPU2D_B->DrawScanline(line);
|
||||
GPU2D_Renderer->DrawScanline(line, &GPU2D_A);
|
||||
GPU2D_Renderer->DrawScanline(line, &GPU2D_B);
|
||||
}
|
||||
|
||||
// sprites are pre-rendered one scanline in advance
|
||||
if (line < 191)
|
||||
{
|
||||
GPU2D_A->DrawSprites(line+1);
|
||||
GPU2D_B->DrawSprites(line+1);
|
||||
GPU2D_Renderer->DrawSprites(line+1, &GPU2D_A);
|
||||
GPU2D_Renderer->DrawSprites(line+1, &GPU2D_B);
|
||||
}
|
||||
|
||||
NDS::CheckDMAs(0, 0x02);
|
||||
@ -1045,8 +1042,8 @@ void StartHBlank(u32 line)
|
||||
}
|
||||
else if (VCount == 262)
|
||||
{
|
||||
GPU2D_A->DrawSprites(0);
|
||||
GPU2D_B->DrawSprites(0);
|
||||
GPU2D_Renderer->DrawSprites(0, &GPU2D_A);
|
||||
GPU2D_Renderer->DrawSprites(0, &GPU2D_B);
|
||||
}
|
||||
|
||||
if (DispStat[0] & (1<<4)) NDS::SetIRQ(0, NDS::IRQ_HBlank);
|
||||
@ -1098,8 +1095,8 @@ void StartScanline(u32 line)
|
||||
else
|
||||
DispStat[1] &= ~(1<<2);
|
||||
|
||||
GPU2D_A->CheckWindows(VCount);
|
||||
GPU2D_B->CheckWindows(VCount);
|
||||
GPU2D_A.CheckWindows(VCount);
|
||||
GPU2D_B.CheckWindows(VCount);
|
||||
|
||||
if (VCount >= 2 && VCount < 194)
|
||||
NDS::CheckDMAs(0, 0x03);
|
||||
@ -1110,8 +1107,8 @@ void StartScanline(u32 line)
|
||||
{
|
||||
if (line == 0)
|
||||
{
|
||||
GPU2D_A->VBlankEnd();
|
||||
GPU2D_B->VBlankEnd();
|
||||
GPU2D_A.VBlankEnd();
|
||||
GPU2D_B.VBlankEnd();
|
||||
}
|
||||
|
||||
if (RunFIFO)
|
||||
@ -1149,8 +1146,9 @@ void StartScanline(u32 line)
|
||||
if (DispStat[0] & (1<<3)) NDS::SetIRQ(0, NDS::IRQ_VBlank);
|
||||
if (DispStat[1] & (1<<3)) NDS::SetIRQ(1, NDS::IRQ_VBlank);
|
||||
|
||||
GPU2D_A->VBlank();
|
||||
GPU2D_B->VBlank();
|
||||
GPU2D_Renderer->VBlankEnd(&GPU2D_A, &GPU2D_B);
|
||||
GPU2D_A.VBlank();
|
||||
GPU2D_B.VBlank();
|
||||
GPU3D::VBlank();
|
||||
|
||||
#ifdef OGLRENDERER_ENABLED
|
||||
|
Reference in New Issue
Block a user