summaryrefslogtreecommitdiff
path: root/src/oglfunc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/oglfunc.c')
-rw-r--r--src/oglfunc.c289
1 files changed, 210 insertions, 79 deletions
diff --git a/src/oglfunc.c b/src/oglfunc.c
index d1ada9a..fba8fe6 100644
--- a/src/oglfunc.c
+++ b/src/oglfunc.c
@@ -1,3 +1,4 @@
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -5,51 +6,86 @@
#include "oglfunc.h"
-PFNGLALPHAFUNCPROC pglAlphaFunc;
-PFNGLBINDTEXTUREPROC pglBindTexture;
-PFNGLBLENDFUNCPROC pglBlendFunc;
-PFNGLCLEARPROC pglClear;
-PFNGLCLEARCOLORPROC pglClearColor;
-PFNGLCOLOR4FPROC pglColor4f;
-PFNGLCOLORPOINTERPROC pglColorPointer;
-PFNGLCULLFACEPROC pglCullFace;
-PFNGLDELETETEXTURESPROC pglDeleteTextures;
-PFNGLDEPTHFUNCPROC pglDepthFunc;
-PFNGLDEPTHMASKPROC pglDepthMask;
-PFNGLDEPTHRANGEPROC pglDepthRange;
-PFNGLDISABLEPROC pglDisable;
-PFNGLDISABLECLIENTSTATEPROC pglDisableClientState;
-PFNGLDRAWELEMENTSPROC pglDrawElements;
-PFNGLENABLEPROC pglEnable;
-PFNGLENABLECLIENTSTATEPROC pglEnableClientState;
-PFNGLFRONTFACEPROC pglFrontFace;
-PFNGLGENTEXTURESPROC pglGenTextures;
-PFNGLGETERRORPROC pglGetError;
-PFNGLGETFLOATVPROC pglGetFloatv;
-PFNGLGETINTEGERVPROC pglGetIntegerv;
-PFNGLGETSTRINGPROC pglGetString;
-PFNGLGETTEXPARAMETERFVPROC pglGetTexParameterfv;
-PFNGLHINTPROC pglHint;
-PFNGLPIXELSTOREIPROC pglPixelStorei;
-PFNGLPOLYGONOFFSETPROC pglPolygonOffset;
-PFNGLREADPIXELSPROC pglReadPixels;
-PFNGLSHADEMODELPROC pglShadeModel;
-PFNGLTEXCOORDPOINTERPROC pglTexCoordPointer;
-PFNGLTEXENVFPROC pglTexEnvf;
-PFNGLTEXENVFVPROC pglTexEnvfv;
-PFNGLTEXENVIPROC pglTexEnvi;
-PFNGLTEXIMAGE2DPROC pglTexImage2D;
-PFNGLTEXPARAMETERFPROC pglTexParameterf;
-PFNGLTEXPARAMETERIPROC pglTexParameteri;
-PFNGLTEXSUBIMAGE2DPROC pglTexSubImage2D;
-PFNGLVERTEXPOINTERPROC pglVertexPointer;
-PFNGLVIEWPORTPROC pglViewport;
+// Base OpenGL / OpenGL ES
+avpPFNGLACTIVETEXTUREPROC pglActiveTexture;
+avpPFNGLBINDTEXTUREPROC pglBindTexture;
+avpPFNGLBLENDFUNCPROC pglBlendFunc;
+avpPFNGLCLEARPROC pglClear;
+avpPFNGLCLEARCOLORPROC pglClearColor;
+avpPFNGLCULLFACEPROC pglCullFace;
+avpPFNGLDELETETEXTURESPROC pglDeleteTextures;
+avpPFNGLDEPTHFUNCPROC pglDepthFunc;
+avpPFNGLDEPTHMASKPROC pglDepthMask;
+avpPFNGLDEPTHRANGEPROC pglDepthRange;
+avpPFNGLDISABLEPROC pglDisable;
+avpPFNGLDRAWELEMENTSPROC pglDrawElements;
+avpPFNGLENABLEPROC pglEnable;
+avpPFNGLFRONTFACEPROC pglFrontFace;
+avpPFNGLGENTEXTURESPROC pglGenTextures;
+avpPFNGLGETERRORPROC pglGetError;
+avpPFNGLGETFLOATVPROC pglGetFloatv;
+avpPFNGLGETINTEGERVPROC pglGetIntegerv;
+avpPFNGLGETSTRINGPROC pglGetString;
+avpPFNGLGETTEXPARAMETERFVPROC pglGetTexParameterfv;
+avpPFNGLHINTPROC pglHint;
+avpPFNGLPIXELSTOREIPROC pglPixelStorei;
+avpPFNGLPOLYGONOFFSETPROC pglPolygonOffset;
+avpPFNGLREADPIXELSPROC pglReadPixels;
+avpPFNGLTEXIMAGE2DPROC pglTexImage2D;
+avpPFNGLTEXPARAMETERFPROC pglTexParameterf;
+avpPFNGLTEXPARAMETERIPROC pglTexParameteri;
+avpPFNGLTEXSUBIMAGE2DPROC pglTexSubImage2D;
+avpPFNGLVIEWPORTPROC pglViewport;
+
+// OpenGL 2.1 / OpenGL ES 2.0
+avpPFNGLATTACHSHADERPROC pglAttachShader;
+avpPFNGLBINDATTRIBLOCATIONPROC pglBindAttribLocation;
+avpPFNGLBINDBUFFERPROC pglBindBuffer;
+avpPFNGLBUFFERDATAPROC pglBufferData;
+avpPFNGLBUFFERSUBDATAPROC pglBufferSubData;
+avpPFNGLCREATEPROGRAMPROC pglCreateProgram;
+avpPFNGLCREATESHADERPROC pglCreateShader;
+avpPFNGLCOMPILESHADERPROC pglCompileShader;
+avpPFNGLDELETEBUFFERSPROC pglDeleteBuffers;
+avpPFNGLDELETEPROGRAMPROC pglDeleteProgram;
+avpPFNGLDELETESHADERPROC pglDeleteShader;
+avpPFNGLDISABLEVERTEXATTRIBARRAYPROC pglDisableVertexAttribArray;
+avpPFNGLENABLEVERTEXATTRIBARRAYPROC pglEnableVertexAttribArray;
+avpPFNGLGENBUFFERSPROC pglGenBuffers;
+avpPFNGLGETATTRIBLOCATIONPROC pglGetAttribLocation;
+avpPFNGLGETPROGRAMINFOLOGPROC pglGetProgramInfoLog;
+avpPFNGLGETPROGRAMIVPROC pglGetProgramiv;
+avpPFNGLGETSHADERINFOLOGPROC pglGetShaderInfoLog;
+avpPFNGLGETSHADERIVPROC pglGetShaderiv;
+avpPFNGLGETUNIFORMLOCATIONPROC pglGetUniformLocation;
+avpPFNGLLINKPROGRAMPROC pglLinkProgram;
+avpPFNGLSHADERSOURCEPROC pglShaderSource;
+avpPFNGLVALIDATEPROGRAMPROC pglValidateProgram;
+avpPFNGLVERTEXATTRIBPOINTERPROC pglVertexAttribPointer;
+avpPFNGLUNIFORM1IPROC pglUniform1i;
+avpPFNGLUNIFORMMATRIX4FVPROC pglUniformMatrix4fv;
+avpPFNGLUSEPROGRAMPROC pglUseProgram;
+
+// GL_EXT_framebuffer_object / GL_ARB_framebuffer_object / OpenGL ES 2.0
+avpPFNGLBINDFRAMEBUFFERPROC pglBindFramebuffer;
+avpPFNGLBINDRENDERBUFFERPROC pglBindRenderbuffer;
+avpPFNGLCHECKFRAMEBUFFERSTATUSPROC pglCheckFramebufferStatus;
+avpPFNGLDELETEFRAMEBUFFERSPROC pglDeleteFramebuffers;
+avpPFNGLDELETERENDERBUFFERSPROC pglDeleteRenderbuffers;
+avpPFNGLFRAMEBUFFERRENDERBUFFERPROC pglFramebufferRenderbuffer;
+avpPFNGLFRAMEBUFFERTEXTURE2DPROC pglFramebufferTexture2D;
+avpPFNGLGENERATEMIPMAPPROC pglGenerateMipmap;
+avpPFNGLGENFRAMEBUFFERSPROC pglGenFramebuffers;
+avpPFNGLGENRENDERBUFFERSPROC pglGenRenderbuffers;
+avpPFNGLRENDERBUFFERSTORAGEPROC pglRenderbufferStorage;
int ogl_have_multisample_filter_hint;
int ogl_have_texture_filter_anisotropic;
+int ogl_have_framebuffer_object;
int ogl_use_multisample_filter_hint;
int ogl_use_texture_filter_anisotropic;
+int ogl_use_framebuffer_object;
static void dummyfunc()
{
@@ -73,6 +109,20 @@ static void dummyfunc()
LoadOGLProc_(type, func1, func2); \
}
+#define LoadOGLExtProc(e, type, func) \
+ if ((e)) { \
+ LoadOGLProc(type, func); \
+ } else { \
+ p##func = NULL; \
+ }
+
+#define LoadOGLExtProc2(e, type, func1, func2) \
+ if ((e)) { \
+ LoadOGLProc2(type, func1, func2); \
+ } else { \
+ p##func = NULL; \
+ }
+
static int check_token(const char *string, const char *token)
{
const char *s = string;
@@ -98,47 +148,71 @@ void load_ogl_functions(int mode)
const char* ogl_missing_func;
const char* ext;
+ int base_framebuffer_object;
+ int ext_framebuffer_object;
+ int arb_framebuffer_object;
+
ogl_missing_func = NULL;
- LoadOGLProc(PFNGLALPHAFUNCPROC, glAlphaFunc);
- LoadOGLProc(PFNGLBINDTEXTUREPROC, glBindTexture);
- LoadOGLProc(PFNGLBLENDFUNCPROC, glBlendFunc);
- LoadOGLProc(PFNGLCLEARPROC, glClear);
- LoadOGLProc(PFNGLCLEARCOLORPROC, glClearColor);
- LoadOGLProc(PFNGLCOLOR4FPROC, glColor4f);
- LoadOGLProc(PFNGLCOLORPOINTERPROC, glColorPointer);
- LoadOGLProc(PFNGLCULLFACEPROC, glCullFace);
- LoadOGLProc(PFNGLDELETETEXTURESPROC, glDeleteTextures);
- LoadOGLProc(PFNGLDEPTHFUNCPROC, glDepthFunc);
- LoadOGLProc(PFNGLDEPTHMASKPROC, glDepthMask);
- LoadOGLProc2(PFNGLDEPTHRANGEPROC, glDepthRange, glDepthRangef);
- LoadOGLProc(PFNGLDISABLEPROC, glDisable);
- LoadOGLProc(PFNGLDISABLECLIENTSTATEPROC, glDisableClientState);
- LoadOGLProc(PFNGLDRAWELEMENTSPROC, glDrawElements);
- LoadOGLProc(PFNGLENABLEPROC, glEnable);
- LoadOGLProc(PFNGLENABLECLIENTSTATEPROC, glEnableClientState);
- LoadOGLProc(PFNGLFRONTFACEPROC, glFrontFace);
- LoadOGLProc(PFNGLGENTEXTURESPROC, glGenTextures);
- LoadOGLProc(PFNGLGETERRORPROC, glGetError);
- LoadOGLProc(PFNGLGETFLOATVPROC, glGetFloatv);
- LoadOGLProc(PFNGLGETINTEGERVPROC, glGetIntegerv);
- LoadOGLProc(PFNGLGETSTRINGPROC, glGetString);
- LoadOGLProc(PFNGLGETTEXPARAMETERFVPROC, glGetTexParameterfv);
- LoadOGLProc(PFNGLHINTPROC, glHint);
- LoadOGLProc(PFNGLPIXELSTOREIPROC, glPixelStorei);
- LoadOGLProc(PFNGLPOLYGONOFFSETPROC, glPolygonOffset);
- LoadOGLProc(PFNGLREADPIXELSPROC, glReadPixels);
- LoadOGLProc(PFNGLSHADEMODELPROC, glShadeModel);
- LoadOGLProc(PFNGLTEXCOORDPOINTERPROC, glTexCoordPointer);
- LoadOGLProc(PFNGLTEXENVFPROC, glTexEnvf);
- LoadOGLProc(PFNGLTEXENVFVPROC, glTexEnvfv);
- LoadOGLProc(PFNGLTEXENVIPROC, glTexEnvi);
- LoadOGLProc(PFNGLTEXIMAGE2DPROC, glTexImage2D);
- LoadOGLProc(PFNGLTEXPARAMETERFPROC, glTexParameterf);
- LoadOGLProc(PFNGLTEXPARAMETERIPROC, glTexParameteri);
- LoadOGLProc(PFNGLTEXSUBIMAGE2DPROC, glTexSubImage2D);
- LoadOGLProc(PFNGLVERTEXPOINTERPROC, glVertexPointer);
- LoadOGLProc(PFNGLVIEWPORTPROC, glViewport);
+ // Base OpenGL / OpenGL ES
+ LoadOGLProc(avpPFNGLACTIVETEXTUREPROC, glActiveTexture);
+ LoadOGLProc(avpPFNGLBINDTEXTUREPROC, glBindTexture);
+ LoadOGLProc(avpPFNGLBLENDFUNCPROC, glBlendFunc);
+ LoadOGLProc(avpPFNGLCLEARPROC, glClear);
+ LoadOGLProc(avpPFNGLCLEARCOLORPROC, glClearColor);
+ LoadOGLProc(avpPFNGLCULLFACEPROC, glCullFace);
+ LoadOGLProc(avpPFNGLDELETETEXTURESPROC, glDeleteTextures);
+ LoadOGLProc(avpPFNGLDEPTHFUNCPROC, glDepthFunc);
+ LoadOGLProc(avpPFNGLDEPTHMASKPROC, glDepthMask);
+ LoadOGLProc2(avpPFNGLDEPTHRANGEPROC, glDepthRange, glDepthRangef);
+ LoadOGLProc(avpPFNGLDISABLEPROC, glDisable);
+ LoadOGLProc(avpPFNGLDRAWELEMENTSPROC, glDrawElements);
+ LoadOGLProc(avpPFNGLENABLEPROC, glEnable);
+ LoadOGLProc(avpPFNGLFRONTFACEPROC, glFrontFace);
+ LoadOGLProc(avpPFNGLGENTEXTURESPROC, glGenTextures);
+ LoadOGLProc(avpPFNGLGETERRORPROC, glGetError);
+ LoadOGLProc(avpPFNGLGETFLOATVPROC, glGetFloatv);
+ LoadOGLProc(avpPFNGLGETINTEGERVPROC, glGetIntegerv);
+ LoadOGLProc(avpPFNGLGETSTRINGPROC, glGetString);
+ LoadOGLProc(avpPFNGLGETTEXPARAMETERFVPROC, glGetTexParameterfv);
+ LoadOGLProc(avpPFNGLHINTPROC, glHint);
+ LoadOGLProc(avpPFNGLPIXELSTOREIPROC, glPixelStorei);
+ LoadOGLProc(avpPFNGLPOLYGONOFFSETPROC, glPolygonOffset);
+ LoadOGLProc(avpPFNGLREADPIXELSPROC, glReadPixels);
+ LoadOGLProc(avpPFNGLTEXIMAGE2DPROC, glTexImage2D);
+ LoadOGLProc(avpPFNGLTEXPARAMETERFPROC, glTexParameterf);
+ LoadOGLProc(avpPFNGLTEXPARAMETERIPROC, glTexParameteri);
+ LoadOGLProc(avpPFNGLTEXSUBIMAGE2DPROC, glTexSubImage2D);
+ LoadOGLProc(avpPFNGLVIEWPORTPROC, glViewport);
+
+ // OpenGL 2.1 / OpenGL ES 2.0
+ LoadOGLProc(avpPFNGLATTACHSHADERPROC, glAttachShader);
+ LoadOGLProc(avpPFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation);
+ LoadOGLProc(avpPFNGLBINDBUFFERPROC, glBindBuffer);
+ LoadOGLProc(avpPFNGLBUFFERDATAPROC, glBufferData);
+ LoadOGLProc(avpPFNGLBUFFERSUBDATAPROC, glBufferSubData);
+ LoadOGLProc(avpPFNGLCREATEPROGRAMPROC, glCreateProgram);
+ LoadOGLProc(avpPFNGLCREATESHADERPROC, glCreateShader);
+ LoadOGLProc(avpPFNGLCOMPILESHADERPROC, glCompileShader);
+ LoadOGLProc(avpPFNGLDELETEBUFFERSPROC, glDeleteBuffers);
+ LoadOGLProc(avpPFNGLDELETEPROGRAMPROC, glDeleteProgram);
+ LoadOGLProc(avpPFNGLDELETESHADERPROC, glDeleteShader);
+ LoadOGLProc(avpPFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray);
+ LoadOGLProc(avpPFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray);
+ LoadOGLProc(avpPFNGLGENBUFFERSPROC, glGenBuffers);
+ LoadOGLProc(avpPFNGLGETATTRIBLOCATIONPROC, glGetAttribLocation);
+ LoadOGLProc(avpPFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog);
+ LoadOGLProc(avpPFNGLGETPROGRAMIVPROC, glGetProgramiv);
+ LoadOGLProc(avpPFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog);
+ LoadOGLProc(avpPFNGLGETSHADERIVPROC, glGetShaderiv);
+ LoadOGLProc(avpPFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation);
+ LoadOGLProc(avpPFNGLLINKPROGRAMPROC, glLinkProgram);
+ LoadOGLProc(avpPFNGLSHADERSOURCEPROC, glShaderSource);
+ LoadOGLProc(avpPFNGLVALIDATEPROGRAMPROC, glValidateProgram);
+ LoadOGLProc(avpPFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer);
+ LoadOGLProc(avpPFNGLUNIFORM1IPROC, glUniform1i);
+ LoadOGLProc(avpPFNGLUNIFORMMATRIX4FVPROC, glUniformMatrix4fv);
+ LoadOGLProc(avpPFNGLUSEPROGRAMPROC, glUseProgram);
if (!mode) {
return;
@@ -153,17 +227,74 @@ void load_ogl_functions(int mode)
printf("GL_VENDOR: %s\n", pglGetString(GL_VENDOR));
printf("GL_RENDERER: %s\n", pglGetString(GL_RENDERER));
printf("GL_VERSION: %s\n", pglGetString(GL_VERSION));
- //printf("GL_SHADING_LANGUAGE_VERSION: %s\n", pglGetString(GL_SHADING_LANGUAGE_VERSION));
+ printf("GL_SHADING_LANGUAGE_VERSION: %s\n", pglGetString(GL_SHADING_LANGUAGE_VERSION));
printf("GL_EXTENSIONS: %s\n", pglGetString(GL_EXTENSIONS));
#endif
ext = (const char *) pglGetString(GL_EXTENSIONS);
+ // GL_EXT_framebuffer_object / GL_ARB_framebuffer_object / OpenGL ES 2.0
+ // figure out which version of framebuffer objects to use, if any
+ ext_framebuffer_object = check_token(ext, "GL_EXT_framebuffer_object");
+ arb_framebuffer_object = check_token(ext, "GL_ARB_framebuffer_object");
+
+#if defined(USE_OPENGL_ES)
+ // not quite right as ARB fbo includes functionality not present in ES2.
+ base_framebuffer_object = 1;
+#else
+ base_framebuffer_object = arb_framebuffer_object;
+#endif
+
+ ogl_missing_func = NULL;
+ LoadOGLExtProc(base_framebuffer_object, avpPFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer);
+ LoadOGLExtProc(base_framebuffer_object, avpPFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer);
+ LoadOGLExtProc(base_framebuffer_object, avpPFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus);
+ LoadOGLExtProc(base_framebuffer_object, avpPFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers);
+ LoadOGLExtProc(base_framebuffer_object, avpPFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers);
+ LoadOGLExtProc(base_framebuffer_object, avpPFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer);
+ LoadOGLExtProc(base_framebuffer_object, avpPFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D);
+ LoadOGLExtProc(base_framebuffer_object, avpPFNGLGENERATEMIPMAPPROC, glGenerateMipmap);
+ LoadOGLExtProc(base_framebuffer_object, avpPFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers);
+ LoadOGLExtProc(base_framebuffer_object, avpPFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers);
+ LoadOGLExtProc(base_framebuffer_object, avpPFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage);
+ if (base_framebuffer_object != 0 && ogl_missing_func == NULL) {
+ ogl_have_framebuffer_object = 1;
+
+#if !defined(NDEBUG)
+ printf("ARB/ES2 framebuffer objects enabled.\n");
+#endif
+ }
+
+ if (ext_framebuffer_object != 0 && ogl_have_framebuffer_object == 0) {
+ // try the EXT suffixed functions
+ ogl_missing_func = NULL;
+ LoadOGLProc_(avpPFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer, glBindFramebufferEXT);
+ LoadOGLProc_(avpPFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer, glBindRenderbufferEXT);
+ LoadOGLProc_(avpPFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus, glCheckFramebufferStatusEXT);
+ LoadOGLProc_(avpPFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers, glDeleteFramebuffersEXT);
+ LoadOGLProc_(avpPFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers, glDeleteRenderbuffersEXT);
+ LoadOGLProc_(avpPFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer, glFramebufferRenderbufferEXT);
+ LoadOGLProc_(avpPFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D, glFramebufferTexture2DEXT);
+ LoadOGLProc_(avpPFNGLGENERATEMIPMAPPROC, glGenerateMipmap, glGenerateMipmapEXT);
+ LoadOGLProc_(avpPFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers, glGenFramebuffersEXT);
+ LoadOGLProc_(avpPFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers, glGenRenderbuffersEXT);
+ LoadOGLProc_(avpPFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage, glRenderbufferStorageEXT);
+ if (ogl_missing_func == NULL) {
+ ogl_have_framebuffer_object = 1;
+
+#if !defined(NDEBUG)
+ printf("EXT framebuffer objects enabled.\n");
+#endif
+ }
+ }
+
+ // other extensions
ogl_have_multisample_filter_hint = check_token(ext, "GL_NV_multisample_filter_hint");
ogl_have_texture_filter_anisotropic = check_token(ext, "GL_EXT_texture_filter_anisotropic");
ogl_use_multisample_filter_hint = ogl_have_multisample_filter_hint;
ogl_use_texture_filter_anisotropic = ogl_have_texture_filter_anisotropic;
+ ogl_use_framebuffer_object = ogl_have_framebuffer_object;
}
int check_for_errors_(const char *file, int line)