aboutsummaryrefslogtreecommitdiff
path: root/src/GPU.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GPU.cpp')
-rw-r--r--src/GPU.cpp89
1 files changed, 80 insertions, 9 deletions
diff --git a/src/GPU.cpp b/src/GPU.cpp
index 42bfc56..29867db 100644
--- a/src/GPU.cpp
+++ b/src/GPU.cpp
@@ -21,6 +21,7 @@
#include "NDS.h"
#include "GPU.h"
+
namespace GPU
{
@@ -78,6 +79,7 @@ u8* VRAMPtr_BOBJ[0x8];
int FrontBuffer;
u32* Framebuffer[2][2];
+int Renderer;
bool Accelerated;
GPU2D* GPU2D_A;
@@ -93,8 +95,8 @@ bool Init()
FrontBuffer = 0;
Framebuffer[0][0] = NULL; Framebuffer[0][1] = NULL;
Framebuffer[1][0] = NULL; Framebuffer[1][1] = NULL;
+ Renderer = 0;
Accelerated = false;
- SetDisplaySettings(false);
return true;
}
@@ -182,6 +184,8 @@ void Reset()
int backbuf = FrontBuffer ? 0 : 1;
GPU2D_A->SetFramebuffer(Framebuffer[backbuf][1]);
GPU2D_B->SetFramebuffer(Framebuffer[backbuf][0]);
+
+ ResetRenderer();
}
void Stop()
@@ -274,15 +278,72 @@ void AssignFramebuffers()
}
}
-void SetDisplaySettings(bool accel)
+void InitRenderer(int renderer)
+{
+ if (renderer == 1)
+ {
+ if (!GLCompositor::Init())
+ {
+ renderer = 0;
+ }
+ else if (!GPU3D::GLRenderer::Init())
+ {
+ GLCompositor::DeInit();
+ renderer = 0;
+ }
+ }
+
+ if (renderer == 0)
+ {
+ GPU3D::SoftRenderer::Init();
+ }
+
+ Renderer = renderer;
+ Accelerated = renderer != 0;
+}
+
+void DeInitRenderer()
+{
+ if (Renderer == 0)
+ {
+ GPU3D::SoftRenderer::DeInit();
+ }
+ else
+ {
+ GPU3D::GLRenderer::DeInit();
+ GLCompositor::DeInit();
+ }
+}
+
+void ResetRenderer()
{
+ if (Renderer == 0)
+ {
+ GPU3D::SoftRenderer::Reset();
+ }
+ else
+ {
+ GLCompositor::Reset();
+ GPU3D::GLRenderer::Reset();
+ }
+}
+
+void SetRenderSettings(int renderer, RenderSettings& settings)
+{
+ if (renderer != Renderer)
+ {
+ DeInitRenderer();
+ InitRenderer(renderer);
+ }
+
+ bool accel = Accelerated;
int fbsize;
if (accel) fbsize = (256*3 + 1) * 192;
else fbsize = 256 * 192;
- if (Framebuffer[0][0]) delete[] Framebuffer[0][0];
- if (Framebuffer[1][0]) delete[] Framebuffer[1][0];
- if (Framebuffer[0][1]) delete[] Framebuffer[0][1];
- if (Framebuffer[1][1]) delete[] Framebuffer[1][1];
+ if (Framebuffer[0][0]) { delete[] Framebuffer[0][0]; Framebuffer[0][0] = nullptr; }
+ if (Framebuffer[1][0]) { delete[] Framebuffer[1][0]; Framebuffer[1][0] = nullptr; }
+ if (Framebuffer[0][1]) { delete[] Framebuffer[0][1]; Framebuffer[0][1] = nullptr; }
+ if (Framebuffer[1][1]) { delete[] Framebuffer[1][1]; Framebuffer[1][1] = nullptr; }
Framebuffer[0][0] = new u32[fbsize];
Framebuffer[1][0] = new u32[fbsize];
@@ -296,10 +357,18 @@ void SetDisplaySettings(bool accel)
AssignFramebuffers();
- GPU2D_A->SetDisplaySettings(accel);
- GPU2D_B->SetDisplaySettings(accel);
+ GPU2D_A->SetRenderSettings(accel);
+ GPU2D_B->SetRenderSettings(accel);
- Accelerated = accel;
+ if (Renderer == 0)
+ {
+ GPU3D::SoftRenderer::SetRenderSettings(settings);
+ }
+ else
+ {
+ GLCompositor::SetRenderSettings(settings);
+ GPU3D::GLRenderer::SetRenderSettings(settings);
+ }
}
@@ -985,6 +1054,8 @@ void StartScanline(u32 line)
GPU2D_A->VBlank();
GPU2D_B->VBlank();
GPU3D::VBlank();
+
+ if (Accelerated) GLCompositor::RenderFrame();
}
else if (VCount == 144)
{