This commit is contained in:
Camilla Berglund 2016-06-23 14:13:13 +02:00
parent d67a0259cf
commit e250c226ca

View File

@ -335,13 +335,17 @@ static void destroyContextWGL(_GLFWwindow* window)
// //
static void loadWGLExtensions(void) static void loadWGLExtensions(void)
{ {
int pf;
PIXELFORMATDESCRIPTOR pfd; PIXELFORMATDESCRIPTOR pfd;
HDC dc;
HGLRC rc; HGLRC rc;
HDC dc = GetDC(_glfw.win32.helperWindowHandle);;
_glfw.wgl.extensionsLoaded = GLFW_TRUE; _glfw.wgl.extensionsLoaded = GLFW_TRUE;
// NOTE: A dummy context has to be created for opengl32.dll to load the
// OpenGL ICD, from which we can then query WGL extensions
// NOTE: This code will accept the Microsoft GDI ICD; accelerated context
// creation failure occurs during manual pixel format enumeration
ZeroMemory(&pfd, sizeof(pfd)); ZeroMemory(&pfd, sizeof(pfd));
pfd.nSize = sizeof(pfd); pfd.nSize = sizeof(pfd);
pfd.nVersion = 1; pfd.nVersion = 1;
@ -349,27 +353,10 @@ static void loadWGLExtensions(void)
pfd.iPixelType = PFD_TYPE_RGBA; pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24; pfd.cColorBits = 24;
dc = GetDC(_glfw.win32.helperWindowHandle); if (!SetPixelFormat(dc, ChoosePixelFormat(dc, &pfd), &pfd))
pf = ChoosePixelFormat(dc, &pfd);
if (!pf)
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, _glfwInputError(GLFW_PLATFORM_ERROR,
"WGL: Failed to choose pixel format for WGL extension loading"); "WGL: Failed to set pixel format for dummy context");
return;
}
if (!DescribePixelFormat(dc, pf, sizeof(pfd), &pfd))
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"WGL: Failed to describe pixel format for WGL extension loading");
return;
}
if (!SetPixelFormat(dc, pf, &pfd))
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"WGL: Failed to set pixel format for WGL extension loading");
return; return;
} }
@ -377,7 +364,7 @@ static void loadWGLExtensions(void)
if (!rc) if (!rc)
{ {
_glfwInputError(GLFW_PLATFORM_ERROR, _glfwInputError(GLFW_PLATFORM_ERROR,
"WGL: Failed to create context for WGL extension loading"); "WGL: Failed to create dummy context");
return; return;
} }
@ -386,31 +373,25 @@ static void loadWGLExtensions(void)
wglDeleteContext(rc); wglDeleteContext(rc);
_glfwInputError(GLFW_PLATFORM_ERROR, _glfwInputError(GLFW_PLATFORM_ERROR,
"WGL: Failed to make context current for WGL extension loading"); "WGL: Failed to make dummy context current");
return; return;
} }
// Functions for WGL_EXT_extension_string // NOTE: Functions must be loaded first as they're needed to retrieve the
// NOTE: These are needed by extensionSupported // extension string that tells us whether the functions are supported
_glfw.wgl.GetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) _glfw.wgl.GetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)
wglGetProcAddress("wglGetExtensionsStringEXT"); wglGetProcAddress("wglGetExtensionsStringEXT");
_glfw.wgl.GetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) _glfw.wgl.GetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)
wglGetProcAddress("wglGetExtensionsStringARB"); wglGetProcAddress("wglGetExtensionsStringARB");
// Functions for WGL_ARB_create_context
_glfw.wgl.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) _glfw.wgl.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)
wglGetProcAddress("wglCreateContextAttribsARB"); wglGetProcAddress("wglCreateContextAttribsARB");
// Functions for WGL_EXT_swap_control
_glfw.wgl.SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) _glfw.wgl.SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)
wglGetProcAddress("wglSwapIntervalEXT"); wglGetProcAddress("wglSwapIntervalEXT");
// Functions for WGL_ARB_pixel_format
_glfw.wgl.GetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC) _glfw.wgl.GetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)
wglGetProcAddress("wglGetPixelFormatAttribivARB"); wglGetProcAddress("wglGetPixelFormatAttribivARB");
// This needs to include every extension used below except for // NOTE: WGL_ARB_extensions_string and WGL_EXT_extensions_string are not
// WGL_ARB_extensions_string and WGL_EXT_extensions_string // checked below as we are already using them
_glfw.wgl.ARB_multisample = _glfw.wgl.ARB_multisample =
extensionSupportedWGL("WGL_ARB_multisample"); extensionSupportedWGL("WGL_ARB_multisample");
_glfw.wgl.ARB_framebuffer_sRGB = _glfw.wgl.ARB_framebuffer_sRGB =