changeset 52:6343c3392a95

After looking at many incorrect examples, the correct method for GL extension probing is now implemented.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 06 Dec 2019 19:09:47 +0200
parents 9c6654647608
children d871e4b24328
files gldragon.cpp
diffstat 1 files changed, 35 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/gldragon.cpp	Fri Dec 06 01:30:51 2019 +0200
+++ b/gldragon.cpp	Fri Dec 06 19:09:47 2019 +0200
@@ -47,39 +47,41 @@
 #undef DM_GLEXT_INIT
 
 
-void * dmGLExtTry(const std::string &name)
+bool dmGLCheckExtension(const std::string &name)
 {
-    bool res = SDL_GL_ExtensionSupported(name.c_str());
+    bool res = SDL_GL_ExtensionSupported("GL_ARB_shader_objects");
+    dmMsg(" - Have '%s'? %s\n",
+        name.c_str(),
+        res ? "YES" : "no");
+    return res;
+}
+
+
+void * dmGLGetProcAddr(const std::string &name)
+{
     void *ptr = SDL_GL_GetProcAddress(name.c_str());
 
-    dmMsg(" - Checking '%s' : %s : %p\n",
+    dmMsg(" - Have '%s'? %s\n",
         name.c_str(),
-        res ? "YES" : "no",
-        ptr);
+        ptr != NULL ? "YES" : "no");
 
-    res = true;
+    return ptr;
+}
 
-    if (res && ptr != NULL)
-        return ptr;
-    else
-        return NULL;
-}
 
 void * dmGLExtInit(const std::string &name, bool &status)
 {
     void *ptr;
+    bool ok =
+        (ptr = dmGLGetProcAddr(name)) != NULL ||
+        (ptr = dmGLGetProcAddr(name + "EXT")) != NULL ||
+        (ptr = dmGLGetProcAddr(name + "ARB")) != NULL;
 
-    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;
+    if (!ok)
+        status = false;
+
+    return ptr;
 }
 #endif
 
@@ -90,6 +92,18 @@
     return true;
 #else
     bool status = true;
+
+    dmMsg("Checking for required OpenGL extensions ..\n");
+
+    if (!dmGLCheckExtension("GL_ARB_shader_objects") ||
+        !dmGLCheckExtension("GL_ARB_shading_language_100") ||
+        !dmGLCheckExtension("GL_ARB_vertex_shader") ||
+        !dmGLCheckExtension("GL_ARB_fragment_shader"))
+    {
+        dmError("Required OpenGL extensions not supported.\n");
+        return false;
+    }
+
 #define DM_GLEXT_INIT(extproctype, extprocname) \
     extprocname = (extproctype) dmGLExtInit(#extprocname, status);
 #include "dmglexts.h"