gl.py (5851B)
1 from glad.lang.common.loader import BaseLoader 2 from glad.lang.c.loader import LOAD_OPENGL_DLL, LOAD_OPENGL_DLL_H, LOAD_OPENGL_GLAPI_H 3 4 5 _OPENGL_LOADER = \ 6 LOAD_OPENGL_DLL % {'pre':'static', 'init':'open_gl', 7 'proc':'get_proc', 'terminate':'close_gl'} + ''' 8 int gladLoadGL(void) { 9 int status = 0; 10 11 if(open_gl()) { 12 status = gladLoadGLLoader(&get_proc); 13 close_gl(); 14 } 15 16 return status; 17 } 18 ''' 19 20 _OPENGL_HAS_EXT = ''' 21 struct gladGLversionStruct GLVersion; 22 23 #if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) 24 #define _GLAD_IS_SOME_NEW_VERSION 1 25 #endif 26 27 static int max_loaded_major; 28 static int max_loaded_minor; 29 30 static const char *exts = NULL; 31 static int num_exts_i = 0; 32 static const char **exts_i = NULL; 33 34 static int get_exts(void) { 35 #ifdef _GLAD_IS_SOME_NEW_VERSION 36 if(max_loaded_major < 3) { 37 #endif 38 exts = (const char *)glGetString(GL_EXTENSIONS); 39 #ifdef _GLAD_IS_SOME_NEW_VERSION 40 } else { 41 int index; 42 43 num_exts_i = 0; 44 glGetIntegerv(GL_NUM_EXTENSIONS, &num_exts_i); 45 if (num_exts_i > 0) { 46 exts_i = (const char **)realloc((void *)exts_i, num_exts_i * sizeof *exts_i); 47 } 48 49 if (exts_i == NULL) { 50 return 0; 51 } 52 53 for(index = 0; index < num_exts_i; index++) { 54 exts_i[index] = (const char*)glGetStringi(GL_EXTENSIONS, index); 55 } 56 } 57 #endif 58 return 1; 59 } 60 61 static void free_exts(void) { 62 if (exts_i != NULL) { 63 free((char **)exts_i); 64 exts_i = NULL; 65 } 66 } 67 68 static int has_ext(const char *ext) { 69 #ifdef _GLAD_IS_SOME_NEW_VERSION 70 if(max_loaded_major < 3) { 71 #endif 72 const char *extensions; 73 const char *loc; 74 const char *terminator; 75 extensions = exts; 76 if(extensions == NULL || ext == NULL) { 77 return 0; 78 } 79 80 while(1) { 81 loc = strstr(extensions, ext); 82 if(loc == NULL) { 83 return 0; 84 } 85 86 terminator = loc + strlen(ext); 87 if((loc == extensions || *(loc - 1) == ' ') && 88 (*terminator == ' ' || *terminator == '\\0')) { 89 return 1; 90 } 91 extensions = terminator; 92 } 93 #ifdef _GLAD_IS_SOME_NEW_VERSION 94 } else { 95 int index; 96 97 for(index = 0; index < num_exts_i; index++) { 98 const char *e = exts_i[index]; 99 100 if(strcmp(e, ext) == 0) { 101 return 1; 102 } 103 } 104 } 105 #endif 106 107 return 0; 108 } 109 ''' 110 111 112 _OPENGL_HEADER_START = ''' 113 #ifndef __glad_h_ 114 #define __glad_h_ 115 ''' 116 117 _OPENGL_HEADER_INCLUDE_ERROR = ''' 118 #ifdef __{0}_h_ 119 #error {1} header already included, remove this include, glad already provides it 120 #endif 121 #define __{0}_h_ 122 ''' 123 124 _OPENGL_HEADER = ''' 125 #if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) 126 #ifndef WIN32_LEAN_AND_MEAN 127 #define WIN32_LEAN_AND_MEAN 1 128 #endif 129 #include <windows.h> 130 #endif 131 132 #ifndef APIENTRY 133 #define APIENTRY 134 #endif 135 #ifndef APIENTRYP 136 #define APIENTRYP APIENTRY * 137 #endif 138 139 #ifdef __cplusplus 140 extern "C" { 141 #endif 142 143 struct gladGLversionStruct { 144 int major; 145 int minor; 146 }; 147 148 typedef void* (* GLADloadproc)(const char *name); 149 ''' + LOAD_OPENGL_GLAPI_H + ''' 150 GLAPI struct gladGLversionStruct GLVersion; 151 ''' 152 153 _OPENGL_HEADER_LOADER = ''' 154 GLAPI int gladLoadGL(void); 155 ''' + LOAD_OPENGL_DLL_H 156 157 _OPENGL_HEADER_END = ''' 158 #ifdef __cplusplus 159 } 160 #endif 161 162 #endif 163 ''' 164 165 _FIND_VERSION = ''' 166 /* Thank you @elmindreda 167 * https://github.com/elmindreda/greg/blob/master/templates/greg.c.in#L176 168 * https://github.com/glfw/glfw/blob/master/src/context.c#L36 169 */ 170 int i, major, minor; 171 172 const char* version; 173 const char* prefixes[] = { 174 "OpenGL ES-CM ", 175 "OpenGL ES-CL ", 176 "OpenGL ES ", 177 NULL 178 }; 179 180 version = (const char*) glGetString(GL_VERSION); 181 if (!version) return; 182 183 for (i = 0; prefixes[i]; i++) { 184 const size_t length = strlen(prefixes[i]); 185 if (strncmp(version, prefixes[i], length) == 0) { 186 version += length; 187 break; 188 } 189 } 190 191 /* PR #18 */ 192 #ifdef _MSC_VER 193 sscanf_s(version, "%d.%d", &major, &minor); 194 #else 195 sscanf(version, "%d.%d", &major, &minor); 196 #endif 197 198 GLVersion.major = major; GLVersion.minor = minor; 199 max_loaded_major = major; max_loaded_minor = minor; 200 ''' 201 202 203 class OpenGLCLoader(BaseLoader): 204 def write(self, fobj): 205 if not self.disabled and 'gl' in self.apis: 206 fobj.write(_OPENGL_LOADER) 207 208 def write_begin_load(self, fobj): 209 fobj.write('\tGLVersion.major = 0; GLVersion.minor = 0;\n') 210 fobj.write('\tglGetString = (PFNGLGETSTRINGPROC)load("glGetString");\n') 211 fobj.write('\tif(glGetString == NULL) return 0;\n') 212 fobj.write('\tif(glGetString(GL_VERSION) == NULL) return 0;\n') 213 214 def write_end_load(self, fobj): 215 fobj.write('\treturn GLVersion.major != 0 || GLVersion.minor != 0;\n') 216 217 def write_find_core(self, fobj): 218 fobj.write(_FIND_VERSION) 219 220 def write_find_core_end(self, fobj): 221 fobj.write(_FIND_VERSION) 222 223 def write_has_ext(self, fobj): 224 fobj.write(_OPENGL_HAS_EXT) 225 226 def write_header(self, fobj): 227 fobj.write(_OPENGL_HEADER_START) 228 written = set() 229 for api, hname, name in [ 230 ('gl', 'gl', 'OpenGL'), ('gles1', 'gl', 'OpenGL ES 1'), 231 ('gles2', 'gl2', 'OpenGL ES 2'), ('gles2', 'gl3', 'OpenGL ES 3') 232 ]: 233 if api in self.apis and hname not in written: 234 fobj.write(_OPENGL_HEADER_INCLUDE_ERROR.format(hname, name)) 235 written.add(hname) 236 237 fobj.write(_OPENGL_HEADER) 238 if not self.disabled and 'gl' in self.apis: 239 fobj.write(_OPENGL_HEADER_LOADER) 240 241 def write_header_end(self, fobj): 242 fobj.write(_OPENGL_HEADER_END)