__init__.py (2370B)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | LOAD_OPENGL_DLL = ''' version(Windows) { private import std.c.windows.windows; } else { private import core.sys.posix.dlfcn; } version(Windows) { private __gshared HMODULE libGL; } else { private __gshared void* libGL; } extern(System) private @nogc alias gladGetProcAddressPtrType = void* function(const(char)*); private __gshared gladGetProcAddressPtrType gladGetProcAddressPtr; %(pre)s bool %(init)s() @nogc { version(Windows) { libGL = LoadLibraryA("opengl32.dll"); if(libGL !is null) { gladGetProcAddressPtr = cast(typeof(gladGetProcAddressPtr))GetProcAddress( libGL, "wglGetProcAddress"); return gladGetProcAddressPtr !is null; } return false; } else { version(OSX) { enum const(char)*[] NAMES = [ "../Frameworks/OpenGL.framework/OpenGL", "/Library/Frameworks/OpenGL.framework/OpenGL", "/System/Library/Frameworks/OpenGL.framework/OpenGL", "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL" ]; } else { enum const(char)*[] NAMES = ["libGL.so.1", "libGL.so"]; } foreach(name; NAMES) { libGL = dlopen(name, RTLD_NOW | RTLD_GLOBAL); if(libGL !is null) { version(OSX) { return true; } else { gladGetProcAddressPtr = cast(typeof(gladGetProcAddressPtr))dlsym(libGL, "glXGetProcAddressARB"); return gladGetProcAddressPtr !is null; } } } return false; } } %(pre)s void* %(proc)s(const(char)* namez) @nogc { if(libGL is null) return null; void* result; if(gladGetProcAddressPtr !is null) { result = gladGetProcAddressPtr(namez); } if(result is null) { version(Windows) { result = GetProcAddress(libGL, namez); } else { result = dlsym(libGL, namez); } } return result; } %(pre)s void %(terminate)s() @nogc { version(Windows) { if(libGL !is null) { FreeLibrary(libGL); libGL = null; } } else { if(libGL !is null) { dlclose(libGL); libGL = null; } } } ''' |