151 lines
4.9 KiB
C
151 lines
4.9 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "glad_wgl.h"
|
|
|
|
#ifndef GLAD_IMPL_UTIL_C_
|
|
#define GLAD_IMPL_UTIL_C_
|
|
|
|
#ifdef _MSC_VER
|
|
#define GLAD_IMPL_UTIL_SSCANF sscanf_s
|
|
#else
|
|
#define GLAD_IMPL_UTIL_SSCANF sscanf
|
|
#endif
|
|
|
|
#endif /* GLAD_IMPL_UTIL_C_ */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
|
|
int GLAD_WGL_VERSION_1_0 = 0;
|
|
int GLAD_WGL_ARB_create_context = 0;
|
|
int GLAD_WGL_ARB_create_context_profile = 0;
|
|
int GLAD_WGL_ARB_extensions_string = 0;
|
|
int GLAD_WGL_EXT_extensions_string = 0;
|
|
int GLAD_WGL_EXT_swap_control = 0;
|
|
|
|
|
|
|
|
PFNWGLCREATECONTEXTATTRIBSARBPROC glad_wglCreateContextAttribsARB = NULL;
|
|
PFNWGLGETEXTENSIONSSTRINGARBPROC glad_wglGetExtensionsStringARB = NULL;
|
|
PFNWGLGETEXTENSIONSSTRINGEXTPROC glad_wglGetExtensionsStringEXT = NULL;
|
|
PFNWGLGETSWAPINTERVALEXTPROC glad_wglGetSwapIntervalEXT = NULL;
|
|
PFNWGLSWAPINTERVALEXTPROC glad_wglSwapIntervalEXT = NULL;
|
|
|
|
|
|
static void glad_wgl_load_WGL_ARB_create_context(GLADuserptrloadfunc load, void *userptr) {
|
|
if(!GLAD_WGL_ARB_create_context) return;
|
|
glad_wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) load(userptr, "wglCreateContextAttribsARB");
|
|
}
|
|
static void glad_wgl_load_WGL_ARB_extensions_string(GLADuserptrloadfunc load, void *userptr) {
|
|
if(!GLAD_WGL_ARB_extensions_string) return;
|
|
glad_wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) load(userptr, "wglGetExtensionsStringARB");
|
|
}
|
|
static void glad_wgl_load_WGL_EXT_extensions_string(GLADuserptrloadfunc load, void *userptr) {
|
|
if(!GLAD_WGL_EXT_extensions_string) return;
|
|
glad_wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) load(userptr, "wglGetExtensionsStringEXT");
|
|
}
|
|
static void glad_wgl_load_WGL_EXT_swap_control(GLADuserptrloadfunc load, void *userptr) {
|
|
if(!GLAD_WGL_EXT_swap_control) return;
|
|
glad_wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC) load(userptr, "wglGetSwapIntervalEXT");
|
|
glad_wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) load(userptr, "wglSwapIntervalEXT");
|
|
}
|
|
|
|
|
|
static void glad_wgl_resolve_aliases(void) {
|
|
}
|
|
|
|
static int glad_wgl_has_extension(HDC hdc, const char *ext) {
|
|
const char *terminator;
|
|
const char *loc;
|
|
const char *extensions;
|
|
|
|
if(wglGetExtensionsStringEXT == NULL && wglGetExtensionsStringARB == NULL)
|
|
return 0;
|
|
|
|
if(wglGetExtensionsStringARB == NULL || hdc == INVALID_HANDLE_VALUE)
|
|
extensions = wglGetExtensionsStringEXT();
|
|
else
|
|
extensions = wglGetExtensionsStringARB(hdc);
|
|
|
|
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;
|
|
}
|
|
|
|
static GLADapiproc glad_wgl_get_proc_from_userptr(void *userptr, const char* name) {
|
|
return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name);
|
|
}
|
|
|
|
static int glad_wgl_find_extensions_wgl(HDC hdc) {
|
|
GLAD_WGL_ARB_create_context = glad_wgl_has_extension(hdc, "WGL_ARB_create_context");
|
|
GLAD_WGL_ARB_create_context_profile = glad_wgl_has_extension(hdc, "WGL_ARB_create_context_profile");
|
|
GLAD_WGL_ARB_extensions_string = glad_wgl_has_extension(hdc, "WGL_ARB_extensions_string");
|
|
GLAD_WGL_EXT_extensions_string = glad_wgl_has_extension(hdc, "WGL_EXT_extensions_string");
|
|
GLAD_WGL_EXT_swap_control = glad_wgl_has_extension(hdc, "WGL_EXT_swap_control");
|
|
return 1;
|
|
}
|
|
|
|
static int glad_wgl_find_core_wgl(void) {
|
|
int major = 1, minor = 0;
|
|
GLAD_WGL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;
|
|
return GLAD_MAKE_VERSION(major, minor);
|
|
}
|
|
|
|
int gladLoadWGLUserPtr(HDC hdc, GLADuserptrloadfunc load, void *userptr) {
|
|
int version;
|
|
wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) load(userptr, "wglGetExtensionsStringARB");
|
|
wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) load(userptr, "wglGetExtensionsStringEXT");
|
|
if(wglGetExtensionsStringARB == NULL && wglGetExtensionsStringEXT == NULL) return 0;
|
|
version = glad_wgl_find_core_wgl();
|
|
|
|
|
|
if (!glad_wgl_find_extensions_wgl(hdc)) return 0;
|
|
glad_wgl_load_WGL_ARB_create_context(load, userptr);
|
|
glad_wgl_load_WGL_ARB_extensions_string(load, userptr);
|
|
glad_wgl_load_WGL_EXT_extensions_string(load, userptr);
|
|
glad_wgl_load_WGL_EXT_swap_control(load, userptr);
|
|
|
|
return version;
|
|
}
|
|
|
|
int gladLoadWGL(HDC hdc, GLADloadfunc load) {
|
|
return gladLoadWGLUserPtr(hdc, glad_wgl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);
|
|
}
|
|
|
|
|
|
#ifdef GLAD_WGL
|
|
|
|
static GLADapiproc glad_wgl_get_proc(void *vuserptr, const char* name) {
|
|
(void) vuserptr;
|
|
return GLAD_GNUC_EXTENSION (GLADapiproc) wglGetProcAddress(name);
|
|
}
|
|
|
|
int gladLoaderLoadWGL(HDC hdc) {
|
|
return gladLoadWGLUserPtr(hdc, glad_wgl_get_proc, NULL);
|
|
}
|
|
|
|
|
|
#endif /* GLAD_WGL */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|