changeset 42:3c7e1d3fa5a2

Implement OpengL extension handling through new header file dmglexts.h to "define" the entrypoints we require and some wonderful preprocessor macro magic to add checks for them via SDL_GL_ExtensionSupported() and initialize function pointers with SDL_GL_GetProcAddress().
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 05 Dec 2019 21:05:43 +0200
parents eaa3e8575c12
children a7d56f006063
files Makefile Makefile.gen dmglexts.h gldragon.cpp
diffstat 4 files changed, 94 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Thu Dec 05 18:32:13 2019 +0200
+++ b/Makefile	Thu Dec 05 21:05:43 2019 +0200
@@ -1,3 +1,4 @@
+CXXFLAGS ?= -DGL_GLEXT_PROTOTYPES
 BINEXT ?= 
 OBJPATH ?= ./obj/unix/
 
--- a/Makefile.gen	Thu Dec 05 18:32:13 2019 +0200
+++ b/Makefile.gen	Thu Dec 05 21:05:43 2019 +0200
@@ -1,5 +1,5 @@
-CXXFLAGS ?= -O3 -W -Wall -DGL_GLEXT_PROTOTYPES -std=c++11
-LDFLAGS ?= 
+CXXFLAGS += -O3 -W -Wall -std=c++11
+LDFLAGS += 
 CXXFLAGS += $(SDL_CFLAGS) $(GL_CFLAGS)
 
 MKDIR ?= mkdir
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmglexts.h	Thu Dec 05 21:05:43 2019 +0200
@@ -0,0 +1,23 @@
+//
+// GLDragon - OpenGL PLY model viewer / simple benchmark
+// -- OpenGL extension definitions
+// Programmed and designed by Matti 'ccr' Hämäläinen <ccr@tnsp.org>
+// (C) Copyright 2019 Tecnic Software productions (TNSP)
+//
+// See file "COPYING" for license information.
+//
+DM_GLEXT_INIT(PFNGLCREATEPROGRAMPROC, glCreateProgram)
+DM_GLEXT_INIT(PFNGLUSEPROGRAMPROC, glUseProgram)
+DM_GLEXT_INIT(PFNGLLINKPROGRAMPROC, glLinkProgram)
+
+DM_GLEXT_INIT(PFNGLCOMPILESHADERPROC, glCompileShader)
+DM_GLEXT_INIT(PFNGLCREATESHADERPROC, glCreateShader)
+DM_GLEXT_INIT(PFNGLATTACHSHADERPROC, glAttachShader)
+DM_GLEXT_INIT(PFNGLSHADERSOURCEPROC, glShaderSource)
+
+DM_GLEXT_INIT(PFNGLUNIFORM1IPROC, glUniform1i)
+
+DM_GLEXT_INIT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog)
+DM_GLEXT_INIT(PFNGLGETSHADERIVPROC, glGetShaderiv)
+DM_GLEXT_INIT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation)
+
--- a/gldragon.cpp	Thu Dec 05 18:32:13 2019 +0200
+++ b/gldragon.cpp	Thu Dec 05 21:05:43 2019 +0200
@@ -39,6 +39,70 @@
 
 /* Helpers
  */
+#ifdef GL_GLEXT_PROTOTYPES
+#define DM_GLEXT_INIT(extproctype, extprocname) /* stub */
+#else
+// GL_GLEXT_PROTOTYPES not defined
+
+#define DM_GLEXT_INIT(extproctype, extprocname) extproctype extprocname = NULL;
+#include "dmglexts.h"
+#undef DM_GLEXT_INIT
+
+
+void * dmGLExtTry(const std::string &name)
+{
+    bool res = SDL_GL_ExtensionSupported(name.c_str());
+    void *ptr = SDL_GL_GetProcAddress(name.c_str());
+    res = true;
+
+    printf(" - Checking '%s' : %s : %p\n",
+        name.c_str(),
+        res ? "YES" : "no",
+        ptr);
+
+    if (res && ptr != NULL)
+        return ptr;
+    else
+        return NULL;
+}
+
+void * dmGLExtInit(const std::string &name, bool &status)
+{
+    void *ptr;
+
+    if ((ptr = dmGLExtTry(name)) != NULL)
+        return ptr;
+    else
+    if ((ptr = dmGLExtTry(name + "EXT")) != NULL)
+        return ptr;
+    else
+    if ((ptr = dmGLExtTry(name + "ARB")) != NULL)
+        return ptr;
+
+    status = false;
+    return NULL;
+}
+
+
+#define DM_GLEXT_INIT(extproctype, extprocname) \
+    extprocname = (extproctype) dmGLExtInit(#extprocname, status);
+
+#endif
+
+
+
+bool dmInitGLExtensions(void)
+{
+#ifdef GL_GLEXT_PROTOTYPES
+    return true;
+#else
+    bool status = true;
+#include "dmglexts.h"
+    return status;
+#endif
+}
+
+
 bool dmInitSDLGL(const int width, const int height, const char *title)
 {
     int ret;
@@ -114,6 +178,10 @@
         return false;
     }
 
+    // Get/initialize OpenGL extension function pointers
+    if (optUseShaders && !dmInitGLExtensions())
+        return false;
+
     // Dump some information
     printf(
         "GL_VENDOR   : %s\n"