aboutsummaryrefslogtreecommitdiff
path: root/src/GPU3D_OpenGL43.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GPU3D_OpenGL43.cpp')
-rw-r--r--src/GPU3D_OpenGL43.cpp138
1 files changed, 138 insertions, 0 deletions
diff --git a/src/GPU3D_OpenGL43.cpp b/src/GPU3D_OpenGL43.cpp
new file mode 100644
index 0000000..acb1436
--- /dev/null
+++ b/src/GPU3D_OpenGL43.cpp
@@ -0,0 +1,138 @@
+/*
+ Copyright 2016-2019 Arisotura
+
+ This file is part of melonDS.
+
+ melonDS is free software: you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation, either version 3 of the License, or (at your option)
+ any later version.
+
+ melonDS is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with melonDS. If not, see http://www.gnu.org/licenses/.
+*/
+
+#include <GL/gl.h>
+#include <GL/glext.h>
+
+#include <stdio.h>
+#include <string.h>
+#include "NDS.h"
+#include "GPU.h"
+#include "Platform.h"
+
+namespace GPU3D
+{
+namespace GLRenderer43
+{
+
+PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
+PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
+PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture;
+
+
+GLuint FramebufferID;
+u8 Framebuffer[256*192*4];
+u8 CurLine[256*4];
+
+
+bool InitGLExtensions()
+{
+#define LOADPROC(type, name) \
+ name = (PFN##type##PROC)Platform::GL_GetProcAddress(#name); \
+ if (!name) return false;
+
+ LOADPROC(GLGENFRAMEBUFFERS, glGenFramebuffers);
+ LOADPROC(GLBINDFRAMEBUFFER, glBindFramebuffer);
+ LOADPROC(GLFRAMEBUFFERTEXTURE, glFramebufferTexture);
+
+#undef LOADPROC
+ return true;
+}
+
+bool Init()
+{
+ if (!InitGLExtensions()) return false;
+
+ u8* test_tex = new u8[256*192*4];
+ u8* ptr = test_tex;
+ for (int y = 0; y < 192; y++)
+ {
+ for (int x = 0; x < 256; x++)
+ {
+ if ((x & 0x10) ^ (y & 0x10))
+ {
+ *ptr++ = 0x00;
+ *ptr++ = 0x00;
+ *ptr++ = 0x3F;
+ *ptr++ = 0x1F;
+ }
+ else
+ {
+ *ptr++ = 0;
+ *ptr++ = y>>2;
+ *ptr++ = 0x3F;
+ *ptr++ = 0x1F;
+ }
+ }
+ }
+
+ glGenFramebuffers(1, &FramebufferID);
+ glBindFramebuffer(GL_FRAMEBUFFER, FramebufferID);
+
+ GLuint frametex;
+ glGenTextures(1, &frametex);
+ glBindTexture(GL_TEXTURE_2D, frametex);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 192, 0, GL_RGBA, GL_UNSIGNED_BYTE, test_tex);
+ glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, frametex, 0);
+
+ return true;
+}
+
+void DeInit()
+{
+ //
+}
+
+void Reset()
+{
+ //
+}
+
+
+void VCount144()
+{
+}
+
+void RenderFrame()
+{
+ //
+}
+
+void RequestLine(int line)
+{
+ //
+}
+
+u32* GetLine(int line)
+{
+ if (line == 0)
+ {
+ glBindFramebuffer(GL_FRAMEBUFFER, FramebufferID);
+ glReadBuffer(GL_COLOR_ATTACHMENT0);
+ glReadPixels(0, 0, 256, 192, GL_RGBA, GL_UNSIGNED_BYTE, Framebuffer);
+ }
+
+ return (u32*)&Framebuffer[256*4 * line];
+}
+
+}
+}