diff options
Diffstat (limited to 'src/GPU.cpp')
-rw-r--r-- | src/GPU.cpp | 66 |
1 files changed, 32 insertions, 34 deletions
diff --git a/src/GPU.cpp b/src/GPU.cpp index d8e3d72..57df8ae 100644 --- a/src/GPU.cpp +++ b/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 |