mirror of
https://github.com/glfw/glfw.git
synced 2024-11-29 23:54:37 +00:00
Make all WGL functions dynamically loaded
This commit is contained in:
parent
1343ef5915
commit
84b512c62c
@ -87,6 +87,7 @@ GLFW bundles a number of dependencies in the `deps/` directory.
|
|||||||
- [X11] Bugfix: The original video mode was not restored on iconification of
|
- [X11] Bugfix: The original video mode was not restored on iconification of
|
||||||
full screen windows
|
full screen windows
|
||||||
- [X11] Bugfix: `GLFW_ARROW_CURSOR` selected the wrong cursor image
|
- [X11] Bugfix: `GLFW_ARROW_CURSOR` selected the wrong cursor image
|
||||||
|
- [WGL] Made all WGL functions dynamically loaded
|
||||||
- [WGL] Removed `GLFW_USE_DWM_SWAP_INTERVAL` compile-time option
|
- [WGL] Removed `GLFW_USE_DWM_SWAP_INTERVAL` compile-time option
|
||||||
- [WGL] Bugfix: Swap interval was ignored when DWM was enabled
|
- [WGL] Bugfix: Swap interval was ignored when DWM was enabled
|
||||||
- [GLX] Added dependency on `libdl` on systems where it provides `dlopen`
|
- [GLX] Added dependency on `libdl` on systems where it provides `dlopen`
|
||||||
|
@ -39,21 +39,21 @@ static void initWGLExtensions(_GLFWwindow* window)
|
|||||||
// Functions for WGL_EXT_extension_string
|
// Functions for WGL_EXT_extension_string
|
||||||
// NOTE: These are needed by _glfwPlatformExtensionSupported
|
// NOTE: These are needed by _glfwPlatformExtensionSupported
|
||||||
window->wgl.GetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)
|
window->wgl.GetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)
|
||||||
wglGetProcAddress("wglGetExtensionsStringEXT");
|
_glfw_wglGetProcAddress("wglGetExtensionsStringEXT");
|
||||||
window->wgl.GetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)
|
window->wgl.GetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)
|
||||||
wglGetProcAddress("wglGetExtensionsStringARB");
|
_glfw_wglGetProcAddress("wglGetExtensionsStringARB");
|
||||||
|
|
||||||
// Functions for WGL_ARB_create_context
|
// Functions for WGL_ARB_create_context
|
||||||
window->wgl.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)
|
window->wgl.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)
|
||||||
wglGetProcAddress("wglCreateContextAttribsARB");
|
_glfw_wglGetProcAddress("wglCreateContextAttribsARB");
|
||||||
|
|
||||||
// Functions for WGL_EXT_swap_control
|
// Functions for WGL_EXT_swap_control
|
||||||
window->wgl.SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)
|
window->wgl.SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)
|
||||||
wglGetProcAddress("wglSwapIntervalEXT");
|
_glfw_wglGetProcAddress("wglSwapIntervalEXT");
|
||||||
|
|
||||||
// Functions for WGL_ARB_pixel_format
|
// Functions for WGL_ARB_pixel_format
|
||||||
window->wgl.GetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)
|
window->wgl.GetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)
|
||||||
wglGetProcAddress("wglGetPixelFormatAttribivARB");
|
_glfw_wglGetProcAddress("wglGetPixelFormatAttribivARB");
|
||||||
|
|
||||||
// This needs to include every extension used below except for
|
// This needs to include every extension used below except for
|
||||||
// WGL_ARB_extensions_string and WGL_EXT_extensions_string
|
// WGL_ARB_extensions_string and WGL_EXT_extensions_string
|
||||||
@ -282,6 +282,28 @@ int _glfwInitContextAPI(void)
|
|||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_glfw.wgl.opengl32.CreateContext = (WGLCREATECONTEXT_T)
|
||||||
|
GetProcAddress(_glfw.wgl.opengl32.instance, "wglCreateContext");
|
||||||
|
_glfw.wgl.opengl32.DeleteContext = (WGLDELETECONTEXT_T)
|
||||||
|
GetProcAddress(_glfw.wgl.opengl32.instance, "wglDeleteContext");
|
||||||
|
_glfw.wgl.opengl32.GetProcAddress = (WGLGETPROCADDRESS_T)
|
||||||
|
GetProcAddress(_glfw.wgl.opengl32.instance, "wglGetProcAddress");
|
||||||
|
_glfw.wgl.opengl32.MakeCurrent = (WGLMAKECURRENT_T)
|
||||||
|
GetProcAddress(_glfw.wgl.opengl32.instance, "wglMakeCurrent");
|
||||||
|
_glfw.wgl.opengl32.ShareLists = (WGLSHARELISTS_T)
|
||||||
|
GetProcAddress(_glfw.wgl.opengl32.instance, "wglShareLists");
|
||||||
|
|
||||||
|
if (!_glfw.wgl.opengl32.CreateContext ||
|
||||||
|
!_glfw.wgl.opengl32.DeleteContext ||
|
||||||
|
!_glfw.wgl.opengl32.GetProcAddress ||
|
||||||
|
!_glfw.wgl.opengl32.MakeCurrent ||
|
||||||
|
!_glfw.wgl.opengl32.ShareLists)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
|
"WGL: Failed to load opengl32 functions");
|
||||||
|
return GL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -426,7 +448,7 @@ int _glfwCreateContext(_GLFWwindow* window,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
window->wgl.context = wglCreateContext(window->wgl.dc);
|
window->wgl.context = _glfw_wglCreateContext(window->wgl.dc);
|
||||||
if (!window->wgl.context)
|
if (!window->wgl.context)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_VERSION_UNAVAILABLE,
|
_glfwInputError(GLFW_VERSION_UNAVAILABLE,
|
||||||
@ -436,7 +458,7 @@ int _glfwCreateContext(_GLFWwindow* window,
|
|||||||
|
|
||||||
if (share)
|
if (share)
|
||||||
{
|
{
|
||||||
if (!wglShareLists(share, window->wgl.context))
|
if (!_glfw_wglShareLists(share, window->wgl.context))
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"WGL: Failed to enable sharing with specified OpenGL context");
|
"WGL: Failed to enable sharing with specified OpenGL context");
|
||||||
@ -459,7 +481,7 @@ void _glfwDestroyContext(_GLFWwindow* window)
|
|||||||
{
|
{
|
||||||
if (window->wgl.context)
|
if (window->wgl.context)
|
||||||
{
|
{
|
||||||
wglDeleteContext(window->wgl.context);
|
_glfw_wglDeleteContext(window->wgl.context);
|
||||||
window->wgl.context = NULL;
|
window->wgl.context = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -568,9 +590,9 @@ int _glfwAnalyzeContext(const _GLFWwindow* window,
|
|||||||
void _glfwPlatformMakeContextCurrent(_GLFWwindow* window)
|
void _glfwPlatformMakeContextCurrent(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
if (window)
|
if (window)
|
||||||
wglMakeCurrent(window->wgl.dc, window->wgl.context);
|
_glfw_wglMakeCurrent(window->wgl.dc, window->wgl.context);
|
||||||
else
|
else
|
||||||
wglMakeCurrent(NULL, NULL);
|
_glfw_wglMakeCurrent(NULL, NULL);
|
||||||
|
|
||||||
_glfwSetContextTLS(window);
|
_glfwSetContextTLS(window);
|
||||||
}
|
}
|
||||||
@ -634,7 +656,7 @@ int _glfwPlatformExtensionSupported(const char* extension)
|
|||||||
|
|
||||||
GLFWglproc _glfwPlatformGetProcAddress(const char* procname)
|
GLFWglproc _glfwPlatformGetProcAddress(const char* procname)
|
||||||
{
|
{
|
||||||
const GLFWglproc proc = (GLFWglproc) wglGetProcAddress(procname);
|
const GLFWglproc proc = (GLFWglproc) _glfw_wglGetProcAddress(procname);
|
||||||
if (proc)
|
if (proc)
|
||||||
return proc;
|
return proc;
|
||||||
|
|
||||||
|
@ -33,6 +33,18 @@
|
|||||||
// extensions and not all operating systems come with an up-to-date version
|
// extensions and not all operating systems come with an up-to-date version
|
||||||
#include "../deps/GL/wglext.h"
|
#include "../deps/GL/wglext.h"
|
||||||
|
|
||||||
|
// opengl32.dll function pointer typedefs
|
||||||
|
typedef HGLRC (WINAPI * WGLCREATECONTEXT_T)(HDC);
|
||||||
|
typedef BOOL (WINAPI * WGLDELETECONTEXT_T)(HGLRC);
|
||||||
|
typedef PROC (WINAPI * WGLGETPROCADDRESS_T)(LPCSTR);
|
||||||
|
typedef BOOL (WINAPI * WGLMAKECURRENT_T)(HDC,HGLRC);
|
||||||
|
typedef BOOL (WINAPI * WGLSHARELISTS_T)(HGLRC,HGLRC);
|
||||||
|
#define _glfw_wglCreateContext _glfw.wgl.opengl32.CreateContext
|
||||||
|
#define _glfw_wglDeleteContext _glfw.wgl.opengl32.DeleteContext
|
||||||
|
#define _glfw_wglGetProcAddress _glfw.wgl.opengl32.GetProcAddress
|
||||||
|
#define _glfw_wglMakeCurrent _glfw.wgl.opengl32.MakeCurrent
|
||||||
|
#define _glfw_wglShareLists _glfw.wgl.opengl32.ShareLists
|
||||||
|
|
||||||
#define _GLFW_PLATFORM_FBCONFIG int wgl
|
#define _GLFW_PLATFORM_FBCONFIG int wgl
|
||||||
#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextWGL wgl
|
#define _GLFW_PLATFORM_CONTEXT_STATE _GLFWcontextWGL wgl
|
||||||
#define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE _GLFWlibraryWGL wgl
|
#define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE _GLFWlibraryWGL wgl
|
||||||
@ -70,9 +82,13 @@ typedef struct _GLFWcontextWGL
|
|||||||
//
|
//
|
||||||
typedef struct _GLFWlibraryWGL
|
typedef struct _GLFWlibraryWGL
|
||||||
{
|
{
|
||||||
// opengl32.dll (for glfwGetProcAddress)
|
|
||||||
struct {
|
struct {
|
||||||
HINSTANCE instance;
|
HINSTANCE instance;
|
||||||
|
WGLCREATECONTEXT_T CreateContext;
|
||||||
|
WGLDELETECONTEXT_T DeleteContext;
|
||||||
|
WGLGETPROCADDRESS_T GetProcAddress;
|
||||||
|
WGLMAKECURRENT_T MakeCurrent;
|
||||||
|
WGLSHARELISTS_T ShareLists;
|
||||||
} opengl32;
|
} opengl32;
|
||||||
|
|
||||||
} _GLFWlibraryWGL;
|
} _GLFWlibraryWGL;
|
||||||
|
Loading…
Reference in New Issue
Block a user