aboutsummaryrefslogtreecommitdiff
path: root/src/GPU3D_OpenGL.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GPU3D_OpenGL.cpp')
-rw-r--r--src/GPU3D_OpenGL.cpp143
1 files changed, 24 insertions, 119 deletions
diff --git a/src/GPU3D_OpenGL.cpp b/src/GPU3D_OpenGL.cpp
index 164f29a..93c1523 100644
--- a/src/GPU3D_OpenGL.cpp
+++ b/src/GPU3D_OpenGL.cpp
@@ -16,118 +16,19 @@
with melonDS. If not, see http://www.gnu.org/licenses/.
*/
+#include "GPU3D_OpenGL.h"
+
#include <stdio.h>
#include <string.h>
#include "NDS.h"
#include "GPU.h"
#include "Config.h"
-#include "OpenGLSupport.h"
#include "GPU3D_OpenGL_shaders.h"
namespace GPU3D
{
-namespace GLRenderer
-{
-
-using namespace OpenGL;
-
-// GL version requirements
-// * texelFetch: 3.0 (GLSL 1.30) (3.2/1.50 for MS)
-// * UBO: 3.1
-
-
-enum
-{
- RenderFlag_WBuffer = 0x01,
- RenderFlag_Trans = 0x02,
- RenderFlag_ShadowMask = 0x04,
- RenderFlag_Edge = 0x08,
-};
-
-
-GLuint ClearShaderPlain[3];
-
-GLuint RenderShader[16][3];
-GLuint CurShaderID = -1;
-
-GLuint FinalPassEdgeShader[3];
-GLuint FinalPassFogShader[3];
-
-// std140 compliant structure
-struct
-{
- float uScreenSize[2]; // vec2 0 / 2
- u32 uDispCnt; // int 2 / 1
- u32 __pad0;
- float uToonColors[32][4]; // vec4[32] 4 / 128
- float uEdgeColors[8][4]; // vec4[8] 132 / 32
- float uFogColor[4]; // vec4 164 / 4
- float uFogDensity[34][4]; // float[34] 168 / 136
- u32 uFogOffset; // int 304 / 1
- u32 uFogShift; // int 305 / 1
- u32 _pad1[2]; // int 306 / 2
-} ShaderConfig;
-
-GLuint ShaderConfigUBO;
-
-struct RendererPolygon
-{
- Polygon* PolyData;
-
- u32 NumIndices;
- u32 IndicesOffset;
- GLuint PrimType;
-
- u32 NumEdgeIndices;
- u32 EdgeIndicesOffset;
- u32 RenderKey;
-};
-
-RendererPolygon PolygonList[2048];
-int NumFinalPolys, NumOpaqueFinalPolys;
-
-GLuint ClearVertexBufferID, ClearVertexArrayID;
-GLint ClearUniformLoc[4];
-
-// vertex buffer
-// * XYZW: 4x16bit
-// * RGBA: 4x8bit
-// * ST: 2x16bit
-// * polygon data: 3x32bit (polygon/texture attributes)
-//
-// polygon attributes:
-// * bit4-7, 11, 14-15, 24-29: POLYGON_ATTR
-// * bit16-20: Z shift
-// * bit8: front-facing (?)
-// * bit9: W-buffering (?)
-
-GLuint VertexBufferID;
-u32 VertexBuffer[10240 * 7];
-u32 NumVertices;
-
-GLuint VertexArrayID;
-GLuint IndexBufferID;
-u16 IndexBuffer[2048 * 40];
-u32 NumIndices, NumEdgeIndices;
-
-const u32 EdgeIndicesOffset = 2048 * 30;
-
-GLuint TexMemID;
-GLuint TexPalMemID;
-
-int ScaleFactor;
-bool BetterPolygons;
-int ScreenW, ScreenH;
-
-GLuint FramebufferTex[8];
-int FrontBuffer;
-GLuint FramebufferID[4], PixelbufferID;
-u32 Framebuffer[256*192];
-
-
-
-bool BuildRenderShader(u32 flags, const char* vs, const char* fs)
+bool GLRenderer::BuildRenderShader(u32 flags, const char* vs, const char* fs)
{
char shadername[32];
sprintf(shadername, "RenderShader%02X", flags);
@@ -180,7 +81,7 @@ bool BuildRenderShader(u32 flags, const char* vs, const char* fs)
return true;
}
-void UseRenderShader(u32 flags)
+void GLRenderer::UseRenderShader(u32 flags)
{
if (CurShaderID == flags) return;
glUseProgram(RenderShader[flags][2]);
@@ -196,7 +97,12 @@ void SetupDefaultTexParams(GLuint tex)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
-bool Init()
+GLRenderer::GLRenderer()
+ : Renderer3D(true)
+{
+}
+
+bool GLRenderer::Init()
{
GLint uni_id;
@@ -382,7 +288,7 @@ bool Init()
return true;
}
-void DeInit()
+void GLRenderer::DeInit()
{
glDeleteTextures(1, &TexMemID);
glDeleteTextures(1, &TexPalMemID);
@@ -404,11 +310,11 @@ void DeInit()
}
}
-void Reset()
+void GLRenderer::Reset()
{
}
-void SetRenderSettings(GPU::RenderSettings& settings)
+void GLRenderer::SetRenderSettings(GPU::RenderSettings& settings)
{
int scale = settings.GL_ScaleFactor;
@@ -462,7 +368,7 @@ void SetRenderSettings(GPU::RenderSettings& settings)
}
-void SetupPolygon(RendererPolygon* rp, Polygon* polygon)
+void GLRenderer::SetupPolygon(GLRenderer::RendererPolygon* rp, Polygon* polygon)
{
rp->PolyData = polygon;
@@ -508,7 +414,7 @@ void SetupPolygon(RendererPolygon* rp, Polygon* polygon)
}
}
-u32* SetupVertex(Polygon* poly, int vid, Vertex* vtx, u32 vtxattr, u32* vptr)
+u32* GLRenderer::SetupVertex(Polygon* poly, int vid, Vertex* vtx, u32 vtxattr, u32* vptr)
{
u32 z = poly->FinalZ[vid];
u32 w = poly->FinalW[vid];
@@ -569,7 +475,7 @@ u32* SetupVertex(Polygon* poly, int vid, Vertex* vtx, u32 vtxattr, u32* vptr)
return vptr;
}
-void BuildPolygons(RendererPolygon* polygons, int npolys)
+void GLRenderer::BuildPolygons(GLRenderer::RendererPolygon* polygons, int npolys)
{
u32* vptr = &VertexBuffer[0];
u32 vidx = 0;
@@ -791,7 +697,7 @@ void BuildPolygons(RendererPolygon* polygons, int npolys)
NumEdgeIndices = eidx - EdgeIndicesOffset;
}
-int RenderSinglePolygon(int i)
+int GLRenderer::RenderSinglePolygon(int i)
{
RendererPolygon* rp = &PolygonList[i];
@@ -800,7 +706,7 @@ int RenderSinglePolygon(int i)
return 1;
}
-int RenderPolygonBatch(int i)
+int GLRenderer::RenderPolygonBatch(int i)
{
RendererPolygon* rp = &PolygonList[i];
GLuint primtype = rp->PrimType;
@@ -822,7 +728,7 @@ int RenderPolygonBatch(int i)
return numpolys;
}
-int RenderPolygonEdgeBatch(int i)
+int GLRenderer::RenderPolygonEdgeBatch(int i)
{
RendererPolygon* rp = &PolygonList[i];
u32 key = rp->RenderKey;
@@ -842,7 +748,7 @@ int RenderPolygonEdgeBatch(int i)
return numpolys;
}
-void RenderSceneChunk(int y, int h)
+void GLRenderer::RenderSceneChunk(int y, int h)
{
u32 flags = 0;
if (RenderPolygonRAM[0]->WBuffer) flags |= RenderFlag_WBuffer;
@@ -1206,7 +1112,7 @@ void RenderSceneChunk(int y, int h)
}
-void RenderFrame()
+void GLRenderer::RenderFrame()
{
CurShaderID = -1;
@@ -1381,7 +1287,7 @@ void RenderFrame()
FrontBuffer = FrontBuffer ? 0 : 1;
}
-void PrepareCaptureFrame()
+void GLRenderer::PrepareCaptureFrame()
{
// TODO: make sure this picks the right buffer when doing antialiasing
int original_fb = FrontBuffer^1;
@@ -1396,7 +1302,7 @@ void PrepareCaptureFrame()
glReadPixels(0, 0, 256, 192, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
}
-u32* GetLine(int line)
+u32* GLRenderer::GetLine(int line)
{
int stride = 256;
@@ -1419,10 +1325,9 @@ u32* GetLine(int line)
return &Framebuffer[stride * line];
}
-void SetupAccelFrame()
+void GLRenderer::SetupAccelFrame()
{
glBindTexture(GL_TEXTURE_2D, FramebufferTex[FrontBuffer]);
}
}
-}