aboutsummaryrefslogtreecommitdiff
path: root/src/GPU.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GPU.cpp')
-rw-r--r--src/GPU.cpp66
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