Mercurial > hg > forks > gldragon
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 |