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