comparison gldragon.cpp @ 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
comparison
equal deleted inserted replaced
51:9c6654647608 52:6343c3392a95
45 #define DM_GLEXT_INIT(extproctype, extprocname) extproctype extprocname = NULL; 45 #define DM_GLEXT_INIT(extproctype, extprocname) extproctype extprocname = NULL;
46 #include "dmglexts.h" 46 #include "dmglexts.h"
47 #undef DM_GLEXT_INIT 47 #undef DM_GLEXT_INIT
48 48
49 49
50 void * dmGLExtTry(const std::string &name) 50 bool dmGLCheckExtension(const std::string &name)
51 { 51 {
52 bool res = SDL_GL_ExtensionSupported(name.c_str()); 52 bool res = SDL_GL_ExtensionSupported("GL_ARB_shader_objects");
53 dmMsg(" - Have '%s'? %s\n",
54 name.c_str(),
55 res ? "YES" : "no");
56 return res;
57 }
58
59
60 void * dmGLGetProcAddr(const std::string &name)
61 {
53 void *ptr = SDL_GL_GetProcAddress(name.c_str()); 62 void *ptr = SDL_GL_GetProcAddress(name.c_str());
54 63
55 dmMsg(" - Checking '%s' : %s : %p\n", 64 dmMsg(" - Have '%s'? %s\n",
56 name.c_str(), 65 name.c_str(),
57 res ? "YES" : "no", 66 ptr != NULL ? "YES" : "no");
58 ptr); 67
59 68 return ptr;
60 res = true; 69 }
61 70
62 if (res && ptr != NULL)
63 return ptr;
64 else
65 return NULL;
66 }
67 71
68 void * dmGLExtInit(const std::string &name, bool &status) 72 void * dmGLExtInit(const std::string &name, bool &status)
69 { 73 {
70 void *ptr; 74 void *ptr;
71 75 bool ok =
72 if ((ptr = dmGLExtTry(name)) != NULL) 76 (ptr = dmGLGetProcAddr(name)) != NULL ||
73 return ptr; 77 (ptr = dmGLGetProcAddr(name + "EXT")) != NULL ||
74 else 78 (ptr = dmGLGetProcAddr(name + "ARB")) != NULL;
75 if ((ptr = dmGLExtTry(name + "EXT")) != NULL) 79
76 return ptr; 80
77 else 81 if (!ok)
78 if ((ptr = dmGLExtTry(name + "ARB")) != NULL) 82 status = false;
79 return ptr; 83
80 84 return ptr;
81 status = false;
82 return NULL;
83 } 85 }
84 #endif 86 #endif
85 87
86 88
87 bool dmInitGLExtensions(void) 89 bool dmInitGLExtensions(void)
88 { 90 {
89 #ifdef GL_GLEXT_PROTOTYPES 91 #ifdef GL_GLEXT_PROTOTYPES
90 return true; 92 return true;
91 #else 93 #else
92 bool status = true; 94 bool status = true;
95
96 dmMsg("Checking for required OpenGL extensions ..\n");
97
98 if (!dmGLCheckExtension("GL_ARB_shader_objects") ||
99 !dmGLCheckExtension("GL_ARB_shading_language_100") ||
100 !dmGLCheckExtension("GL_ARB_vertex_shader") ||
101 !dmGLCheckExtension("GL_ARB_fragment_shader"))
102 {
103 dmError("Required OpenGL extensions not supported.\n");
104 return false;
105 }
106
93 #define DM_GLEXT_INIT(extproctype, extprocname) \ 107 #define DM_GLEXT_INIT(extproctype, extprocname) \
94 extprocname = (extproctype) dmGLExtInit(#extprocname, status); 108 extprocname = (extproctype) dmGLExtInit(#extprocname, status);
95 #include "dmglexts.h" 109 #include "dmglexts.h"
96 return status; 110 return status;
97 #endif 111 #endif