medfall

A super great game engine
Log | Files | Refs

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)