aboutsummaryrefslogtreecommitdiff
path: root/src/GPU3D_OpenGL43.cpp
diff options
context:
space:
mode:
authorArisotura <thetotalworm@gmail.com>2019-04-09 23:23:24 +0200
committerArisotura <thetotalworm@gmail.com>2019-04-09 23:23:24 +0200
commit32c75e20a6f030bb4ac9e5bb68f2f6febbde7f24 (patch)
tree40a561a498e00d6f84a13dc699303f33a72a4004 /src/GPU3D_OpenGL43.cpp
parent00341bbae5a0344fece4fdffb586bfdfb716959b (diff)
here, have shader shit
Diffstat (limited to 'src/GPU3D_OpenGL43.cpp')
-rw-r--r--src/GPU3D_OpenGL43.cpp133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/GPU3D_OpenGL43.cpp b/src/GPU3D_OpenGL43.cpp
index 2e15cfa..32d652b 100644
--- a/src/GPU3D_OpenGL43.cpp
+++ b/src/GPU3D_OpenGL43.cpp
@@ -43,6 +43,44 @@ PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
PFNGLUNMAPBUFFERPROC glUnmapBuffer;
PFNGLBUFFERDATAPROC glBufferData;
+PFNGLCREATESHADERPROC glCreateShader;
+PFNGLSHADERSOURCEPROC glShaderSource;
+PFNGLCOMPILESHADERPROC glCompileShader;
+PFNGLCREATEPROGRAMPROC glCreateProgram;
+PFNGLATTACHSHADERPROC glAttachShader;
+PFNGLLINKPROGRAMPROC glLinkProgram;
+PFNGLUSEPROGRAMPROC glUseProgram;
+PFNGLGETSHADERIVPROC glGetShaderiv;
+PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog;
+PFNGLGETPROGRAMIVPROC glGetProgramiv;
+PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;
+PFNGLDELETESHADERPROC glDeleteShader;
+PFNGLDELETEPROGRAMPROC glDeleteProgram;
+
+
+const char* kRenderVS = R"(#version 400
+
+in vec4 vPosition;
+
+void main()
+{
+ // burp
+ gl_Position = vPosition;
+}
+)";
+
+const char* kRenderFS = R"(#version 400
+
+out vec4 oColor;
+
+void main()
+{
+ oColor = vec4(0,1,1,1);
+}
+)";
+
+
+GLuint RenderShader[3];
GLuint FramebufferID, PixelbufferID;
u8 Framebuffer[256*192*4];
@@ -68,14 +106,109 @@ bool InitGLExtensions()
LOADPROC(GLUNMAPBUFFER, glUnmapBuffer);
LOADPROC(GLBUFFERDATA, glBufferData);
+ LOADPROC(GLCREATESHADER, glCreateShader);
+ LOADPROC(GLSHADERSOURCE, glShaderSource);
+ LOADPROC(GLCOMPILESHADER, glCompileShader);
+ LOADPROC(GLCREATEPROGRAM, glCreateProgram);
+ LOADPROC(GLATTACHSHADER, glAttachShader);
+ LOADPROC(GLLINKPROGRAM, glLinkProgram);
+ LOADPROC(GLUSEPROGRAM, glUseProgram);
+ LOADPROC(GLGETSHADERIV, glGetShaderiv);
+ LOADPROC(GLGETSHADERINFOLOG, glGetShaderInfoLog);
+ LOADPROC(GLGETPROGRAMIV, glGetProgramiv);
+ LOADPROC(GLGETPROGRAMINFOLOG, glGetProgramInfoLog);
+ LOADPROC(GLDELETESHADER, glDeleteShader);
+ LOADPROC(GLDELETEPROGRAM, glDeleteProgram);
+
#undef LOADPROC
return true;
}
+bool BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, const char* name)
+{
+ int len;
+ int res;
+
+ ids[0] = glCreateShader(GL_VERTEX_SHADER);
+ len = strlen(vs);
+ glShaderSource(ids[0], 1, &vs, &len);
+ glCompileShader(ids[0]);
+
+ glGetShaderiv(ids[0], GL_COMPILE_STATUS, &res);
+ if (res != GL_TRUE)
+ {
+ glGetShaderiv(ids[0], GL_INFO_LOG_LENGTH, &res);
+ if (res < 1) res = 1024;
+ char* log = new char[res+1];
+ glGetShaderInfoLog(ids[0], res+1, NULL, log);
+ printf("OpenGL: failed to compile vertex shader %s: %s\n", name, log);
+ delete[] log;
+
+ glDeleteShader(ids[0]);
+
+ return false;
+ }
+
+ ids[1] = glCreateShader(GL_FRAGMENT_SHADER);
+ len = strlen(vs);
+ glShaderSource(ids[1], 1, &fs, &len);
+ glCompileShader(ids[1]);
+
+ glGetShaderiv(ids[1], GL_COMPILE_STATUS, &res);
+ if (res != GL_TRUE)
+ {
+ glGetShaderiv(ids[1], GL_INFO_LOG_LENGTH, &res);
+ if (res < 1) res = 1024;
+ char* log = new char[res+1];
+ glGetShaderInfoLog(ids[1], res+1, NULL, log);
+ printf("OpenGL: failed to compile fragment shader %s: %s\n", name, log);
+ delete[] log;
+
+ glDeleteShader(ids[0]);
+ glDeleteShader(ids[1]);
+
+ return false;
+ }
+
+ ids[2] = glCreateProgram();
+ glAttachShader(ids[2], ids[0]);
+ glAttachShader(ids[2], ids[1]);
+ glLinkProgram(ids[2]);
+
+ glGetProgramiv(ids[2], GL_LINK_STATUS, &res);
+ if (res != GL_TRUE)
+ {
+ glGetProgramiv(ids[2], GL_INFO_LOG_LENGTH, &res);
+ if (res < 1) res = 1024;
+ char* log = new char[res+1];
+ glGetProgramInfoLog(ids[2], res+1, NULL, log);
+ printf("OpenGL: failed to link program %s: %s\n", name, log);
+ delete[] log;
+
+ glDeleteShader(ids[0]);
+ glDeleteShader(ids[1]);
+ glDeleteProgram(ids[2]);
+
+ return false;
+ }
+
+ return true;
+}
+
bool Init()
{
if (!InitGLExtensions()) return false;
+ const GLubyte* renderer = glGetString(GL_RENDERER); // get renderer string
+ const GLubyte* version = glGetString(GL_VERSION); // version as a string
+ printf("OpenGL: renderer: %s\n", renderer);
+ printf("OpenGL: version: %s\n", version);
+
+
+ if (!BuildShaderProgram(kRenderVS, kRenderFS, RenderShader, "RenderShader"))
+ return false;
+
+
u8* test_tex = new u8[256*192*4];
u8* ptr = test_tex;
for (int y = 0; y < 192; y++)