From 074bf5a23232f7e525d61498cfa85b872c2f966a Mon Sep 17 00:00:00 2001 From: bkaradzic Date: Sat, 23 Feb 2013 00:15:54 -0800 Subject: [PATCH] Added dummy window to peek into WGL features. --- src/glcontext_wgl.cpp | 141 +++++++++++++++++++++++++---------------- src/renderer_d3d11.cpp | 2 +- src/renderer_d3d9.cpp | 2 +- src/renderer_gl.cpp | 19 +++--- 4 files changed, 100 insertions(+), 64 deletions(-) diff --git a/src/glcontext_wgl.cpp b/src/glcontext_wgl.cpp index 3d3cfaed..7454a5cd 100644 --- a/src/glcontext_wgl.cpp +++ b/src/glcontext_wgl.cpp @@ -24,6 +24,51 @@ namespace bgfx # include "glimports.h" # undef GL_IMPORT + static HGLRC createContext(HDC _hdc) + { + PIXELFORMATDESCRIPTOR pfd; + memset(&pfd, 0, sizeof(pfd) ); + pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 32; + pfd.cAlphaBits = 8; + pfd.cDepthBits = 24; + pfd.cStencilBits = 8; + pfd.iLayerType = PFD_MAIN_PLANE; + + int pixelFormat = ChoosePixelFormat(_hdc, &pfd); + BGFX_FATAL(0 != pixelFormat, Fatal::UnableToInitialize, "ChoosePixelFormat failed!"); + + DescribePixelFormat(_hdc, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd); + + BX_TRACE("Pixel format:\n" + "\tiPixelType %d\n" + "\tcColorBits %d\n" + "\tcAlphaBits %d\n" + "\tcDepthBits %d\n" + "\tcStencilBits %d\n" + , pfd.iPixelType + , pfd.cColorBits + , pfd.cAlphaBits + , pfd.cDepthBits + , pfd.cStencilBits + ); + + int result; + result = SetPixelFormat(_hdc, pixelFormat, &pfd); + BGFX_FATAL(0 != result, Fatal::UnableToInitialize, "SetPixelFormat failed!"); + + HGLRC context = wglCreateContext(_hdc); + BGFX_FATAL(NULL != context, Fatal::UnableToInitialize, "wglCreateContext failed!"); + + result = wglMakeCurrent(_hdc, context); + BGFX_FATAL(0 != result, Fatal::UnableToInitialize, "wglMakeCurrent failed!"); + + return context; + } + void GlContext::create(uint32_t _width, uint32_t _height) { m_opengl32dll = LoadLibrary("opengl32.dll"); @@ -44,44 +89,28 @@ namespace bgfx m_hdc = GetDC(g_bgfxHwnd); BGFX_FATAL(NULL != m_hdc, Fatal::UnableToInitialize, "GetDC failed!"); - PIXELFORMATDESCRIPTOR pfd; - memset(&pfd, 0, sizeof(pfd) ); - pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); - pfd.nVersion = 1; - pfd.iPixelType = PFD_TYPE_RGBA; - pfd.cColorBits = 32; - pfd.cAlphaBits = 8; - pfd.cDepthBits = 24; - pfd.cStencilBits = 8; - pfd.iLayerType = PFD_MAIN_PLANE; - - int pixelFormat = ChoosePixelFormat(m_hdc, &pfd); - BGFX_FATAL(0 != pixelFormat, Fatal::UnableToInitialize, "ChoosePixelFormat failed!"); - - DescribePixelFormat(m_hdc, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd); - - BX_TRACE("Pixel format:\n" - "\tiPixelType %d\n" - "\tcColorBits %d\n" - "\tcAlphaBits %d\n" - "\tcDepthBits %d\n" - "\tcStencilBits %d\n" - , pfd.iPixelType - , pfd.cColorBits - , pfd.cAlphaBits - , pfd.cDepthBits - , pfd.cStencilBits + // Dummy window to peek into WGL functionality. + // + // An application can only set the pixel format of a window one time. + // Once a window's pixel format is set, it cannot be changed. + // MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/dd369049%28v=vs.85%29.aspx + HWND hwnd = CreateWindowA("STATIC" + , "" + , WS_POPUP|WS_DISABLED + , -32000 + , -32000 + , 0 + , 0 + , NULL + , NULL + , GetModuleHandle(NULL) + , 0 ); - int result; - result = SetPixelFormat(m_hdc, pixelFormat, &pfd); - BGFX_FATAL(0 != result, Fatal::UnableToInitialize, "SetPixelFormat failed!"); + HDC hdc = GetDC(hwnd); + BGFX_FATAL(NULL != hdc, Fatal::UnableToInitialize, "GetDC failed!"); - m_context = wglCreateContext(m_hdc); - BGFX_FATAL(NULL != m_context, Fatal::UnableToInitialize, "wglCreateContext failed!"); - - result = wglMakeCurrent(m_hdc, m_context); - BGFX_FATAL(0 != result, Fatal::UnableToInitialize, "wglMakeCurrent failed!"); + HGLRC context = createContext(hdc); wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB"); wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB"); @@ -90,7 +119,7 @@ namespace bgfx if (NULL != wglGetExtensionsStringARB) { BX_TRACE("WGL extensions:"); - const char* extensions = (const char*)wglGetExtensionsStringARB(m_hdc); + const char* extensions = (const char*)wglGetExtensionsStringARB(hdc); if (NULL != extensions) { char name[1024]; @@ -119,10 +148,6 @@ namespace bgfx } } -#if 0 - // An application can only set the pixel format of a window one time. - // Once a window's pixel format is set, it cannot be changed. - // MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/dd369049%28v=vs.85%29.aspx if (NULL != wglChoosePixelFormatARB && NULL != wglCreateContextAttribsARB) { @@ -134,15 +159,14 @@ namespace bgfx WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB, WGL_DRAW_TO_WINDOW_ARB, true, WGL_DOUBLE_BUFFER_ARB, true, - WGL_RED_BITS_ARB, 8, - WGL_BLUE_BITS_ARB, 8, - WGL_GREEN_BITS_ARB, 8, - WGL_ALPHA_BITS_ARB, 8, + WGL_COLOR_BITS_ARB, 32, WGL_DEPTH_BITS_ARB, 24, WGL_STENCIL_BITS_ARB, 8, 0 }; + int result; + int pixelFormat; uint32_t numFormats = 0; do { @@ -156,6 +180,7 @@ namespace bgfx } while (0 == numFormats); + PIXELFORMATDESCRIPTOR pfd; DescribePixelFormat(m_hdc, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd); BX_TRACE("Pixel format:\n" @@ -174,13 +199,16 @@ namespace bgfx result = SetPixelFormat(m_hdc, pixelFormat, &pfd); BGFX_FATAL(0 != result, Fatal::UnableToInitialize, "SetPixelFormat failed (last err: 0x%08x)!", GetLastError() ); - wglMakeCurrent(m_hdc, NULL); - wglDeleteContext(m_context); - const int32_t contextAttrs[] = { - WGL_CONTEXT_MAJOR_VERSION_ARB, 2, - WGL_CONTEXT_MINOR_VERSION_ARB, 1, +#if 1 + WGL_CONTEXT_MAJOR_VERSION_ARB, 2, + WGL_CONTEXT_MINOR_VERSION_ARB, 1, +#else + WGL_CONTEXT_MAJOR_VERSION_ARB, 3, + WGL_CONTEXT_MINOR_VERSION_ARB, 2, + WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, +#endif // 1 #if BGFX_CONFIG_DEBUG WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_DEBUG_BIT_ARB, #endif // BGFX_CONFIG_DEBUG @@ -188,12 +216,19 @@ namespace bgfx }; m_context = wglCreateContextAttribsARB(m_hdc, 0, contextAttrs); - - result = wglMakeCurrent(m_hdc, m_context); - BGFX_FATAL(0 != result, Fatal::UnableToInitialize, "wglMakeCurrent failed!"); } -#endif // 0 + wglMakeCurrent(NULL, NULL); + wglDeleteContext(context); + DestroyWindow(hwnd); + + if (NULL == m_context) + { + m_context = createContext(m_hdc); + } + + int result = wglMakeCurrent(m_hdc, m_context); + BGFX_FATAL(0 != result, Fatal::UnableToInitialize, "wglMakeCurrent failed!"); import(); } diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index a34ce49a..01bd1e36 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -2568,7 +2568,7 @@ namespace bgfx tvm.clear(); uint16_t pos = 10; - tvm.printf(0, 0, 0x8f, " " BGFX_RENDERER_NAME " "); + tvm.printf(0, 0, BGFX_CONFIG_DEBUG ? 0x89 : 0x8f, " " BGFX_RENDERER_NAME " "); tvm.printf(10, pos++, 0x8e, " Frame: %7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS" , double(frameTime)*toMs , double(min)*toMs diff --git a/src/renderer_d3d9.cpp b/src/renderer_d3d9.cpp index da2b0e5f..12f92932 100644 --- a/src/renderer_d3d9.cpp +++ b/src/renderer_d3d9.cpp @@ -2671,7 +2671,7 @@ namespace bgfx tvm.clear(); uint16_t pos = 10; - tvm.printf(0, 0, 0x8f, " " BGFX_RENDERER_NAME " "); + tvm.printf(0, 0, BGFX_CONFIG_DEBUG ? 0x89 : 0x8f, " " BGFX_RENDERER_NAME " "); tvm.printf(10, pos++, 0x8e, " Frame: %7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS" , double(frameTime)*toMs , double(min)*toMs diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 16f55dd4..b613cef1 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -117,12 +117,12 @@ namespace bgfx static void GL_APIENTRY stubDrawArraysInstanced(GLenum _mode, GLint _first, GLsizei _count, GLsizei /*_primcount*/) { - glDrawArrays(_mode, _first, _count); + GL_CHECK(glDrawArrays(_mode, _first, _count) ); } static void GL_APIENTRY stubDrawElementsInstanced(GLenum _mode, GLsizei _count, GLenum _type, const GLvoid* _indices, GLsizei /*_primcount*/) { - glDrawElements(_mode, _count, _type, _indices); + GL_CHECK(glDrawElements(_mode, _count, _type, _indices) ); } #if BGFX_CONFIG_RENDERER_OPENGLES3 @@ -1404,7 +1404,7 @@ namespace bgfx if (0 != (_flags & (BGFX_TEXTURE_MIN_ANISOTROPIC|BGFX_TEXTURE_MAG_ANISOTROPIC) ) && 0.0f < s_renderCtx.m_maxAnisotropy) { - glTexParameterf(m_target, GL_TEXTURE_MAX_ANISOTROPY_EXT, s_renderCtx.m_maxAnisotropy); + GL_CHECK(glTexParameterf(m_target, GL_TEXTURE_MAX_ANISOTROPY_EXT, s_renderCtx.m_maxAnisotropy) ); } GL_CHECK(glBindTexture(m_target, 0) ); @@ -1446,8 +1446,8 @@ namespace bgfx GL_CHECK(glGenTextures(1, &m_id) ); BX_CHECK(0 != m_id, "Failed to generate texture id."); GL_CHECK(glBindTexture(m_target, m_id) ); -// glTexParameteri(m_target, GL_TEXTURE_COMPARE_MODE, GL_NONE); -// glTexParameteri(m_target, GL_DEPTH_TEXTURE_MODE, GL_NONE); +// GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_COMPARE_MODE, GL_NONE) ); +// GL_CHECK(glTexParameteri(m_target, GL_DEPTH_TEXTURE_MODE, GL_NONE) ); GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR) ); GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR) ); GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) ); @@ -1941,11 +1941,12 @@ namespace bgfx GL_GET(GL_MAX_RENDERBUFFER_SIZE, 1); const char* version = (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION); - GL_CHECK(version = version); // check if error is generated by glGetString. + GL_CHECK(;); // check if error is generated by glGetString. BX_TRACE("GLSL version: %s", version); #endif // BGFX_CONFIG_DEBUG const char* extensions = (const char*)glGetString(GL_EXTENSIONS); + GL_CHECK(;); // check if error is generated by glGetString. if (NULL != extensions) { char name[1024]; @@ -2026,13 +2027,13 @@ namespace bgfx if (s_extension[Extension::EXT_texture_filter_anisotropic].m_supported) { - glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &s_renderCtx.m_maxAnisotropy); + GL_CHECK(glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &s_renderCtx.m_maxAnisotropy) ); } #if BGFX_CONFIG_RENDERER_OPENGL|BGFX_CONFIG_RENDERER_OPENGLES3 if (s_extension[Extension::ARB_texture_multisample].m_supported) { - glGetIntegerv(GL_MAX_SAMPLES, &s_renderCtx.m_maxMsaa); + GL_CHECK(glGetIntegerv(GL_MAX_SAMPLES, &s_renderCtx.m_maxMsaa) ); } #endif // BGFX_CONFIG_RENDERER_OPENGL|BGFX_CONFIG_RENDERER_OPENGLES3 @@ -2991,7 +2992,7 @@ namespace bgfx tvm.clear(); uint16_t pos = 10; - tvm.printf(0, 0, 0x8f, " " BGFX_RENDERER_NAME " "); + tvm.printf(0, 0, BGFX_CONFIG_DEBUG ? 0x89 : 0x8f, " " BGFX_RENDERER_NAME " "); tvm.printf(10, pos++, 0x8e, " Frame CPU: %7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS" , double(frameTime)*toMs , double(min)*toMs