mirror of
				https://github.com/gwm17/glfw.git
				synced 2025-10-31 01:16:49 -04: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 | ||||
|                  full screen windows | ||||
|  - [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] Bugfix: Swap interval was ignored when DWM was enabled | ||||
|  - [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
 | ||||
|     // NOTE: These are needed by _glfwPlatformExtensionSupported
 | ||||
|     window->wgl.GetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) | ||||
|         wglGetProcAddress("wglGetExtensionsStringEXT"); | ||||
|         _glfw_wglGetProcAddress("wglGetExtensionsStringEXT"); | ||||
|     window->wgl.GetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) | ||||
|         wglGetProcAddress("wglGetExtensionsStringARB"); | ||||
|         _glfw_wglGetProcAddress("wglGetExtensionsStringARB"); | ||||
| 
 | ||||
|     // Functions for WGL_ARB_create_context
 | ||||
|     window->wgl.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) | ||||
|         wglGetProcAddress("wglCreateContextAttribsARB"); | ||||
|         _glfw_wglGetProcAddress("wglCreateContextAttribsARB"); | ||||
| 
 | ||||
|     // Functions for WGL_EXT_swap_control
 | ||||
|     window->wgl.SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) | ||||
|         wglGetProcAddress("wglSwapIntervalEXT"); | ||||
|         _glfw_wglGetProcAddress("wglSwapIntervalEXT"); | ||||
| 
 | ||||
|     // Functions for WGL_ARB_pixel_format
 | ||||
|     window->wgl.GetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC) | ||||
|         wglGetProcAddress("wglGetPixelFormatAttribivARB"); | ||||
|         _glfw_wglGetProcAddress("wglGetPixelFormatAttribivARB"); | ||||
| 
 | ||||
|     // This needs to include every extension used below except for
 | ||||
|     // WGL_ARB_extensions_string and WGL_EXT_extensions_string
 | ||||
|  | @ -282,6 +282,28 @@ int _glfwInitContextAPI(void) | |||
|         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; | ||||
| } | ||||
| 
 | ||||
|  | @ -426,7 +448,7 @@ int _glfwCreateContext(_GLFWwindow* window, | |||
|     } | ||||
|     else | ||||
|     { | ||||
|         window->wgl.context = wglCreateContext(window->wgl.dc); | ||||
|         window->wgl.context = _glfw_wglCreateContext(window->wgl.dc); | ||||
|         if (!window->wgl.context) | ||||
|         { | ||||
|             _glfwInputError(GLFW_VERSION_UNAVAILABLE, | ||||
|  | @ -436,7 +458,7 @@ int _glfwCreateContext(_GLFWwindow* window, | |||
| 
 | ||||
|         if (share) | ||||
|         { | ||||
|             if (!wglShareLists(share, window->wgl.context)) | ||||
|             if (!_glfw_wglShareLists(share, window->wgl.context)) | ||||
|             { | ||||
|                 _glfwInputError(GLFW_PLATFORM_ERROR, | ||||
|                                 "WGL: Failed to enable sharing with specified OpenGL context"); | ||||
|  | @ -459,7 +481,7 @@ void _glfwDestroyContext(_GLFWwindow* window) | |||
| { | ||||
|     if (window->wgl.context) | ||||
|     { | ||||
|         wglDeleteContext(window->wgl.context); | ||||
|         _glfw_wglDeleteContext(window->wgl.context); | ||||
|         window->wgl.context = NULL; | ||||
|     } | ||||
| 
 | ||||
|  | @ -568,9 +590,9 @@ int _glfwAnalyzeContext(const _GLFWwindow* window, | |||
| void _glfwPlatformMakeContextCurrent(_GLFWwindow* window) | ||||
| { | ||||
|     if (window) | ||||
|         wglMakeCurrent(window->wgl.dc, window->wgl.context); | ||||
|         _glfw_wglMakeCurrent(window->wgl.dc, window->wgl.context); | ||||
|     else | ||||
|         wglMakeCurrent(NULL, NULL); | ||||
|         _glfw_wglMakeCurrent(NULL, NULL); | ||||
| 
 | ||||
|     _glfwSetContextTLS(window); | ||||
| } | ||||
|  | @ -634,7 +656,7 @@ int _glfwPlatformExtensionSupported(const char* extension) | |||
| 
 | ||||
| GLFWglproc _glfwPlatformGetProcAddress(const char* procname) | ||||
| { | ||||
|     const GLFWglproc proc = (GLFWglproc) wglGetProcAddress(procname); | ||||
|     const GLFWglproc proc = (GLFWglproc) _glfw_wglGetProcAddress(procname); | ||||
|     if (proc) | ||||
|         return proc; | ||||
| 
 | ||||
|  |  | |||
|  | @ -33,6 +33,18 @@ | |||
| // extensions and not all operating systems come with an up-to-date version
 | ||||
| #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_CONTEXT_STATE            _GLFWcontextWGL wgl | ||||
| #define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE    _GLFWlibraryWGL wgl | ||||
|  | @ -70,9 +82,13 @@ typedef struct _GLFWcontextWGL | |||
| //
 | ||||
| typedef struct _GLFWlibraryWGL | ||||
| { | ||||
|     // opengl32.dll (for glfwGetProcAddress)
 | ||||
|     struct { | ||||
|         HINSTANCE   instance; | ||||
|         HINSTANCE           instance; | ||||
|         WGLCREATECONTEXT_T  CreateContext; | ||||
|         WGLDELETECONTEXT_T  DeleteContext; | ||||
|         WGLGETPROCADDRESS_T GetProcAddress; | ||||
|         WGLMAKECURRENT_T    MakeCurrent; | ||||
|         WGLSHARELISTS_T     ShareLists; | ||||
|     } opengl32; | ||||
| 
 | ||||
| } _GLFWlibraryWGL; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user