Changeset View
Changeset View
Standalone View
Standalone View
source/third_party/glad/glad_wgl.cpp
- This file was added.
/* | |||||
WGL loader generated by glad 0.1.14a0 on Fri Jul 7 13:42:45 2017. | |||||
Language/Generator: C/C++ | |||||
Specification: wgl | |||||
APIs: wgl=1.0 | |||||
Profile: - | |||||
Extensions: | |||||
WGL_ARB_pbuffer, | |||||
WGL_ARB_pixel_format, | |||||
WGL_EXT_swap_control | |||||
Loader: True | |||||
Local files: True | |||||
Omit khrplatform: True | |||||
Commandline: | |||||
--api="wgl=1.0" --generator="c" --spec="wgl" --local-files --omit-khrplatform --extensions="WGL_ARB_pbuffer,WGL_ARB_pixel_format,WGL_EXT_swap_control" | |||||
Online: | |||||
http://glad.dav1d.de/#language=c&specification=wgl&loader=on&api=wgl%3D1.0&extensions=WGL_ARB_pbuffer&extensions=WGL_ARB_pixel_format&extensions=WGL_EXT_swap_control | |||||
*/ | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#include "glad_wgl.h" | |||||
static void* get_proc(const char *namez); | |||||
#ifdef _WIN32 | |||||
#include <windows.h> | |||||
static HMODULE libGL; | |||||
typedef void* (APIENTRYP PFNWGLGETPROCADDRESSPROC_PRIVATE)(const char*); | |||||
static PFNWGLGETPROCADDRESSPROC_PRIVATE gladGetProcAddressPtr; | |||||
static | |||||
int open_gl(void) { | |||||
libGL = LoadLibraryW(L"opengl32.dll"); | |||||
if(libGL != NULL) { | |||||
gladGetProcAddressPtr = (PFNWGLGETPROCADDRESSPROC_PRIVATE)GetProcAddress( | |||||
libGL, "wglGetProcAddress"); | |||||
return gladGetProcAddressPtr != NULL; | |||||
} | |||||
return 0; | |||||
} | |||||
static | |||||
void close_gl(void) { | |||||
if(libGL != NULL) { | |||||
FreeLibrary(libGL); | |||||
libGL = NULL; | |||||
} | |||||
} | |||||
#else | |||||
#include <dlfcn.h> | |||||
static void* libGL; | |||||
#ifndef __APPLE__ | |||||
typedef void* (APIENTRYP PFNGLXGETPROCADDRESSPROC_PRIVATE)(const char*); | |||||
static PFNGLXGETPROCADDRESSPROC_PRIVATE gladGetProcAddressPtr; | |||||
#endif | |||||
static | |||||
int open_gl(void) { | |||||
#ifdef __APPLE__ | |||||
static 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 | |||||
static const char *NAMES[] = {"libGL.so.1", "libGL.so"}; | |||||
#endif | |||||
unsigned int index = 0; | |||||
for(index = 0; index < (sizeof(NAMES) / sizeof(NAMES[0])); index++) { | |||||
libGL = dlopen(NAMES[index], RTLD_NOW | RTLD_GLOBAL); | |||||
if(libGL != NULL) { | |||||
#ifdef __APPLE__ | |||||
return 1; | |||||
#else | |||||
gladGetProcAddressPtr = (PFNGLXGETPROCADDRESSPROC_PRIVATE)dlsym(libGL, | |||||
"glXGetProcAddressARB"); | |||||
return gladGetProcAddressPtr != NULL; | |||||
#endif | |||||
} | |||||
} | |||||
return 0; | |||||
} | |||||
static | |||||
void close_gl() { | |||||
if(libGL != NULL) { | |||||
dlclose(libGL); | |||||
libGL = NULL; | |||||
} | |||||
} | |||||
#endif | |||||
static | |||||
void* get_proc(const char *namez) { | |||||
void* result = NULL; | |||||
if(libGL == NULL) return NULL; | |||||
#ifndef __APPLE__ | |||||
if(gladGetProcAddressPtr != NULL) { | |||||
result = gladGetProcAddressPtr(namez); | |||||
} | |||||
#endif | |||||
if(result == NULL) { | |||||
#ifdef _WIN32 | |||||
result = (void*)GetProcAddress(libGL, namez); | |||||
#else | |||||
result = dlsym(libGL, namez); | |||||
#endif | |||||
} | |||||
return result; | |||||
} | |||||
int gladLoadWGL(HDC hdc) { | |||||
int status = 0; | |||||
if(open_gl()) { | |||||
status = gladLoadWGLLoader((GLADloadproc)get_proc, hdc); | |||||
close_gl(); | |||||
} | |||||
return status; | |||||
} | |||||
static HDC GLADWGLhdc = (HDC)INVALID_HANDLE_VALUE; | |||||
static int get_exts(void) { | |||||
return 1; | |||||
} | |||||
static void free_exts(void) { | |||||
return; | |||||
} | |||||
static int has_ext(const char *ext) { | |||||
const char *terminator; | |||||
const char *loc; | |||||
const char *extensions; | |||||
if(wglGetExtensionsStringEXT == NULL && wglGetExtensionsStringARB == NULL) | |||||
return 0; | |||||
if(wglGetExtensionsStringARB == NULL || GLADWGLhdc == INVALID_HANDLE_VALUE) | |||||
extensions = wglGetExtensionsStringEXT(); | |||||
else | |||||
extensions = wglGetExtensionsStringARB(GLADWGLhdc); | |||||
if(extensions == NULL || ext == NULL) | |||||
return 0; | |||||
while(1) { | |||||
loc = strstr(extensions, ext); | |||||
if(loc == NULL) | |||||
break; | |||||
terminator = loc + strlen(ext); | |||||
if((loc == extensions || *(loc - 1) == ' ') && | |||||
(*terminator == ' ' || *terminator == '\0')) | |||||
{ | |||||
return 1; | |||||
} | |||||
extensions = terminator; | |||||
} | |||||
return 0; | |||||
} | |||||
int GLAD_WGL_VERSION_1_0; | |||||
int GLAD_WGL_ARB_pbuffer; | |||||
int GLAD_WGL_ARB_pixel_format; | |||||
int GLAD_WGL_EXT_swap_control; | |||||
PFNWGLCREATEPBUFFERARBPROC glad_wglCreatePbufferARB; | |||||
PFNWGLGETPBUFFERDCARBPROC glad_wglGetPbufferDCARB; | |||||
PFNWGLRELEASEPBUFFERDCARBPROC glad_wglReleasePbufferDCARB; | |||||
PFNWGLDESTROYPBUFFERARBPROC glad_wglDestroyPbufferARB; | |||||
PFNWGLQUERYPBUFFERARBPROC glad_wglQueryPbufferARB; | |||||
PFNWGLGETPIXELFORMATATTRIBIVARBPROC glad_wglGetPixelFormatAttribivARB; | |||||
PFNWGLGETPIXELFORMATATTRIBFVARBPROC glad_wglGetPixelFormatAttribfvARB; | |||||
PFNWGLCHOOSEPIXELFORMATARBPROC glad_wglChoosePixelFormatARB; | |||||
PFNWGLSWAPINTERVALEXTPROC glad_wglSwapIntervalEXT; | |||||
PFNWGLGETSWAPINTERVALEXTPROC glad_wglGetSwapIntervalEXT; | |||||
static void load_WGL_ARB_pbuffer(GLADloadproc load) { | |||||
if(!GLAD_WGL_ARB_pbuffer) return; | |||||
glad_wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC)load("wglCreatePbufferARB"); | |||||
glad_wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC)load("wglGetPbufferDCARB"); | |||||
glad_wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC)load("wglReleasePbufferDCARB"); | |||||
glad_wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC)load("wglDestroyPbufferARB"); | |||||
glad_wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC)load("wglQueryPbufferARB"); | |||||
} | |||||
static void load_WGL_ARB_pixel_format(GLADloadproc load) { | |||||
if(!GLAD_WGL_ARB_pixel_format) return; | |||||
glad_wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)load("wglGetPixelFormatAttribivARB"); | |||||
glad_wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)load("wglGetPixelFormatAttribfvARB"); | |||||
glad_wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)load("wglChoosePixelFormatARB"); | |||||
} | |||||
static void load_WGL_EXT_swap_control(GLADloadproc load) { | |||||
if(!GLAD_WGL_EXT_swap_control) return; | |||||
glad_wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)load("wglSwapIntervalEXT"); | |||||
glad_wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)load("wglGetSwapIntervalEXT"); | |||||
} | |||||
static int find_extensionsWGL(void) { | |||||
if (!get_exts()) return 0; | |||||
GLAD_WGL_ARB_pbuffer = has_ext("WGL_ARB_pbuffer"); | |||||
GLAD_WGL_ARB_pixel_format = has_ext("WGL_ARB_pixel_format"); | |||||
GLAD_WGL_EXT_swap_control = has_ext("WGL_EXT_swap_control"); | |||||
free_exts(); | |||||
return 1; | |||||
} | |||||
static void find_coreWGL(HDC hdc) { | |||||
GLADWGLhdc = hdc; | |||||
} | |||||
int gladLoadWGLLoader(GLADloadproc load, HDC hdc) { | |||||
wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)load("wglGetExtensionsStringARB"); | |||||
wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)load("wglGetExtensionsStringEXT"); | |||||
if(wglGetExtensionsStringARB == NULL && wglGetExtensionsStringEXT == NULL) return 0; | |||||
find_coreWGL(hdc); | |||||
if (!find_extensionsWGL()) return 0; | |||||
load_WGL_ARB_pbuffer(load); | |||||
load_WGL_ARB_pixel_format(load); | |||||
load_WGL_EXT_swap_control(load); | |||||
return 1; | |||||
} | |||||
Wildfire Games · Phabricator