medfall

A super great game engine
Log | Files | Refs

glx.py (3513B)


      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 _GLX_LOADER = \
      5     LOAD_OPENGL_DLL % {'pre':'static', 'init':'open_gl',
      6                        'proc':'get_proc', 'terminate':'close_gl'} + '''
      7 int gladLoadGLX(Display *dpy, int screen) {
      8     int status = 0;
      9 
     10     if(open_gl()) {
     11         status = gladLoadGLXLoader((GLADloadproc)get_proc, dpy, screen);
     12         close_gl();
     13     }
     14 
     15     return status;
     16 }
     17 '''
     18 
     19 _GLX_HEADER_START = '''
     20 #include <X11/X.h>
     21 #include <X11/Xlib.h>
     22 #include <X11/Xutil.h>
     23 '''
     24 
     25 #include <glad/glad.h>
     26 
     27 _WGL_HEADER_MID = '''
     28 #ifndef __glad_glxext_h_
     29 
     30 #ifdef __glxext_h_
     31 #error GLX header already included, remove this include, glad already provides it
     32 #endif
     33 
     34 #define __glad_glxext_h_
     35 #define __glxext_h_
     36 
     37 #ifndef APIENTRY
     38 #define APIENTRY
     39 #endif
     40 #ifndef APIENTRYP
     41 #define APIENTRYP APIENTRY *
     42 #endif
     43 
     44 #ifdef __cplusplus
     45 extern "C" {
     46 #endif
     47 
     48 typedef void* (* GLADloadproc)(const char *name);
     49 ''' + LOAD_OPENGL_GLAPI_H
     50 
     51 _GLX_HEADER_LOADER = '''
     52 GLAPI int gladLoadGLX(Display *dpy, int screen);
     53 ''' + LOAD_OPENGL_DLL_H
     54 
     55 _GLX_HEADER_END = '''
     56 #ifdef __cplusplus
     57 }
     58 #endif
     59 
     60 #endif
     61 '''
     62 
     63 _GLX_HAS_EXT = '''
     64 static Display *GLADGLXDisplay = 0;
     65 static int GLADGLXscreen = 0;
     66 
     67 static int get_exts(void) {
     68     return 1;
     69 }
     70 
     71 static void free_exts(void) {
     72     return;
     73 }
     74 
     75 static int has_ext(const char *ext) {
     76     const char *terminator;
     77     const char *loc;
     78     const char *extensions;
     79 
     80     if(!GLAD_GLX_VERSION_1_1)
     81         return 0;
     82 
     83     extensions = glXQueryExtensionsString(GLADGLXDisplay, GLADGLXscreen);
     84 
     85     if(extensions == NULL || ext == NULL)
     86         return 0;
     87 
     88     while(1) {
     89         loc = strstr(extensions, ext);
     90         if(loc == NULL)
     91             break;
     92 
     93         terminator = loc + strlen(ext);
     94         if((loc == extensions || *(loc - 1) == ' ') &&
     95             (*terminator == ' ' || *terminator == '\\0'))
     96         {
     97             return 1;
     98         }
     99         extensions = terminator;
    100     }
    101 
    102     return 0;
    103 }
    104 
    105 '''
    106 
    107 
    108 class GLXCLoader(BaseLoader):
    109     def write(self, fobj):
    110         if not self.disabled:
    111             fobj.write(_GLX_LOADER)
    112 
    113     def write_begin_load(self, fobj):
    114         fobj.write('\tglXQueryVersion = (PFNGLXQUERYVERSIONPROC)load("glXQueryVersion");\n')
    115         fobj.write('\tif(glXQueryVersion == NULL) return 0;\n')
    116 
    117     def write_end_load(self, fobj):
    118         fobj.write('\treturn 1;\n')
    119 
    120     def write_find_core(self, fobj):
    121         fobj.write('\tint major = 0, minor = 0;\n')
    122         fobj.write('\tif(dpy == 0 && GLADGLXDisplay == 0) {\n')
    123         fobj.write('\t\tdpy = XOpenDisplay(0);\n')
    124         fobj.write('\t\tscreen = XScreenNumberOfScreen(XDefaultScreenOfDisplay(dpy));\n')
    125         fobj.write('\t} else if(dpy == 0) {\n')
    126         fobj.write('\t\tdpy = GLADGLXDisplay;\n')
    127         fobj.write('\t\tscreen = GLADGLXscreen;\n')
    128         fobj.write('\t}\n')
    129         fobj.write('\tglXQueryVersion(dpy, &major, &minor);\n')
    130         fobj.write('\tGLADGLXDisplay = dpy;\n')
    131         fobj.write('\tGLADGLXscreen = screen;\n')
    132 
    133     def write_has_ext(self, fobj):
    134         fobj.write(_GLX_HAS_EXT)
    135 
    136     def write_header(self, fobj):
    137         fobj.write(_GLX_HEADER_START)
    138         if self.local_files:
    139             fobj.write('#include "glad.h"\n')
    140         else:
    141             fobj.write('#include <glad/glad.h>\n')
    142         fobj.write(_WGL_HEADER_MID)
    143         if not self.disabled:
    144             fobj.write(_GLX_HEADER_LOADER)
    145 
    146     def write_header_end(self, fobj):
    147         fobj.write(_GLX_HEADER_END)
    148