# HG changeset patch # User Matti Hamalainen # Date 1575652187 -7200 # Node ID 6343c3392a958d8385d2b196b27ce530e8b9471c # Parent 9c6654647608b7fb4c06ab55f60d615f53514ce3 After looking at many incorrect examples, the correct method for GL extension probing is now implemented. diff -r 9c6654647608 -r 6343c3392a95 gldragon.cpp --- 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"