diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c5eb802b80..afa72c058b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -97,7 +97,6 @@ if( WIN32 ) endif() set( ZDOOM_LIBS - opengl32 wsock32 winmm "${DX_dinput8_LIBRARY}" diff --git a/src/common/platform/win32/gl_sysfb.cpp b/src/common/platform/win32/gl_sysfb.cpp index 9a23028b6c..e373c3d3b0 100644 --- a/src/common/platform/win32/gl_sysfb.cpp +++ b/src/common/platform/win32/gl_sysfb.cpp @@ -52,6 +52,8 @@ extern HWND Window; +extern "C" PROC zd_wglGetProcAddress(LPCSTR name); + PFNWGLSWAPINTERVALEXTPROC myWglSwapIntervalExtProc; //========================================================================== @@ -78,15 +80,15 @@ SystemGLFrameBuffer::SystemGLFrameBuffer(void *hMonitor, bool fullscreen) : Syst HDC hDC = GetDC(Window); const char *wglext = nullptr; - myWglSwapIntervalExtProc = (PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT"); - auto myWglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB"); + myWglSwapIntervalExtProc = (PFNWGLSWAPINTERVALEXTPROC)zd_wglGetProcAddress("wglSwapIntervalEXT"); + auto myWglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)zd_wglGetProcAddress("wglGetExtensionsStringARB"); if (myWglGetExtensionsStringARB) { wglext = myWglGetExtensionsStringARB(hDC); } else { - auto myWglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)wglGetProcAddress("wglGetExtensionsStringEXT"); + auto myWglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)zd_wglGetProcAddress("wglGetExtensionsStringEXT"); if (myWglGetExtensionsStringEXT) { wglext = myWglGetExtensionsStringEXT(); diff --git a/src/common/platform/win32/win32glvideo.cpp b/src/common/platform/win32/win32glvideo.cpp index 034ec86918..e6d38d9d66 100644 --- a/src/common/platform/win32/win32glvideo.cpp +++ b/src/common/platform/win32/win32glvideo.cpp @@ -55,6 +55,13 @@ #include "gl_framebuffer.h" +extern "C" { +HGLRC zd_wglCreateContext(HDC Arg1); +BOOL zd_wglDeleteContext(HGLRC Arg1); +BOOL zd_wglMakeCurrent(HDC Arg1, HGLRC Arg2); +PROC zd_wglGetProcAddress(LPCSTR name); +} + EXTERN_CVAR(Int, vid_adapter) EXTERN_CVAR(Bool, vid_hdr) @@ -74,7 +81,7 @@ CUSTOM_CVAR(Bool, vr_enable_quadbuffered, false, CVAR_ARCHIVE | CVAR_GLOBALCONFI extern bool vid_hdr_active; // these get used before GLEW is initialized so we have to use separate pointers with different names -PFNWGLCHOOSEPIXELFORMATARBPROC myWglChoosePixelFormatARB; // = (PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB"); +PFNWGLCHOOSEPIXELFORMATARBPROC myWglChoosePixelFormatARB; // = (PFNWGLCHOOSEPIXELFORMATARBPROC)zd_wglGetProcAddress("wglChoosePixelFormatARB"); PFNWGLCREATECONTEXTATTRIBSARBPROC myWglCreateContextAttribsARB; @@ -224,15 +231,15 @@ bool Win32GLVideo::SetPixelFormat() ::SetPixelFormat(hDC, pixelFormat, &pfd); - hRC = wglCreateContext(hDC); - wglMakeCurrent(hDC, hRC); + hRC = zd_wglCreateContext(hDC); + zd_wglMakeCurrent(hDC, hRC); - myWglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB"); - myWglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB"); + myWglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)zd_wglGetProcAddress("wglChoosePixelFormatARB"); + myWglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)zd_wglGetProcAddress("wglCreateContextAttribsARB"); // any extra stuff here? - wglMakeCurrent(NULL, NULL); - wglDeleteContext(hRC); + zd_wglMakeCurrent(NULL, NULL); + zd_wglDeleteContext(hRC); ReleaseDC(dummy, hDC); ShutdownDummy(dummy); @@ -436,7 +443,7 @@ bool Win32GLVideo::InitHardware(HWND Window, int multisample) if (m_hRC == NULL && prof == WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB) { - m_hRC = wglCreateContext(m_hDC); + m_hRC = zd_wglCreateContext(m_hDC); if (m_hRC == NULL) { I_Error("R_OPENGL: Unable to create an OpenGL render context.\n"); @@ -446,7 +453,7 @@ bool Win32GLVideo::InitHardware(HWND Window, int multisample) if (m_hRC != NULL) { - wglMakeCurrent(m_hDC, m_hRC); + zd_wglMakeCurrent(m_hDC, m_hRC); return true; } } @@ -465,8 +472,8 @@ void Win32GLVideo::Shutdown() { if (m_hRC) { - wglMakeCurrent(0, 0); - wglDeleteContext(m_hRC); + zd_wglMakeCurrent(0, 0); + zd_wglDeleteContext(m_hRC); } if (m_hDC) ReleaseDC(m_Window, m_hDC); } diff --git a/src/common/rendering/gl_load/gl_load.c b/src/common/rendering/gl_load/gl_load.c index 4bfbb78786..bf563afe00 100644 --- a/src/common/rendering/gl_load/gl_load.c +++ b/src/common/rendering/gl_load/gl_load.c @@ -67,10 +67,51 @@ static int TestPointer(const PROC pTest) return 1; } +static HMODULE opengl32dll; +static HGLRC(WINAPI* createcontext)(HDC); +static BOOL(WINAPI* deletecontext)(HGLRC); +static BOOL(WINAPI* makecurrent)(HDC, HGLRC); +static PROC(WINAPI* getprocaddress)(LPCSTR name); +static void CheckOpenGL(void) +{ + if (opengl32dll == 0) + { + opengl32dll = LoadLibrary(L"OpenGL32.DLL"); + createcontext = (HGLRC(WINAPI*)(HDC)) GetProcAddress(opengl32dll, "wglCreateContext"); + deletecontext = (BOOL(WINAPI*)(HGLRC)) GetProcAddress(opengl32dll, "wglDeleteContext"); + makecurrent = (BOOL(WINAPI*)(HDC, HGLRC)) GetProcAddress(opengl32dll, "wglMakeCurrent"); + getprocaddress = (PROC(WINAPI*)(LPCSTR)) GetProcAddress(opengl32dll, "wglGetProcAddress"); + } +} + +HGLRC zd_wglCreateContext(HDC dc) +{ + CheckOpenGL(); + return createcontext(dc); +} + +BOOL zd_wglDeleteContext(HGLRC context) +{ + CheckOpenGL(); + return deletecontext(context); +} + +BOOL zd_wglMakeCurrent(HDC dc, HGLRC context) +{ + CheckOpenGL(); + return makecurrent(dc, context); +} + +PROC zd_wglGetProcAddress(LPCSTR name) +{ + CheckOpenGL(); + return getprocaddress(name); +} + static PROC WinGetProcAddress(const char *name) { HMODULE glMod = NULL; - PROC pFunc = wglGetProcAddress((LPCSTR)name); + PROC pFunc = zd_wglGetProcAddress((LPCSTR)name); if(TestPointer(pFunc)) { return pFunc;