Commit: b75c03e5e88166eab68b32648d5abfddf65447d7 Author: Germano Date: Sat Feb 10 00:06:48 2018 -0200 Branches: temp-drawcontext https://developer.blender.org/rBb75c03e5e88166eab68b32648d5abfddf65447d7
Support for the new GHOST API in Windows =================================================================== M intern/ghost/intern/GHOST_ContextWGL.cpp M intern/ghost/intern/GHOST_ContextWGL.h M intern/ghost/intern/GHOST_SystemWin32.cpp M intern/ghost/intern/GHOST_SystemWin32.h M intern/ghost/intern/GHOST_WindowWin32.cpp =================================================================== diff --git a/intern/ghost/intern/GHOST_ContextWGL.cpp b/intern/ghost/intern/GHOST_ContextWGL.cpp index d2dd38878f7..e6498f1ffa8 100644 --- a/intern/ghost/intern/GHOST_ContextWGL.cpp +++ b/intern/ghost/intern/GHOST_ContextWGL.cpp @@ -745,60 +745,57 @@ static void reportContextString(const char *name, const char *dummy, const char GHOST_TSuccess GHOST_ContextWGL::initializeDrawingContext() { - const bool needAlpha = m_alphaBackground; + SetLastError(NO_ERROR); + + HGLRC prevHGLRC = ::wglGetCurrentContext(); + WIN32_CHK(GetLastError() == NO_ERROR); + + HDC prevHDC = ::wglGetCurrentDC(); + WIN32_CHK(GetLastError() == NO_ERROR); + + if (!WGLEW_ARB_create_context || ::GetPixelFormat(m_hDC) == 0) { + const bool needAlpha = m_alphaBackground; #ifdef GHOST_OPENGL_STENCIL - const bool needStencil = true; + const bool needStencil = true; #else - const bool needStencil = false; + const bool needStencil = false; #endif #ifdef GHOST_OPENGL_SRGB - const bool sRGB = true; + const bool sRGB = true; #else - const bool sRGB = false; + const bool sRGB = false; #endif + int iPixelFormat; + int lastPFD; - HGLRC prevHGLRC; - HDC prevHDC; - - int iPixelFormat; - int lastPFD; - - PIXELFORMATDESCRIPTOR chosenPFD; + PIXELFORMATDESCRIPTOR chosenPFD; + iPixelFormat = choose_pixel_format(m_stereoVisual, m_numOfAASamples, needAlpha, needStencil, sRGB); - SetLastError(NO_ERROR); - - prevHGLRC = ::wglGetCurrentContext(); - WIN32_CHK(GetLastError() == NO_ERROR); - - prevHDC = ::wglGetCurrentDC(); - WIN32_CHK(GetLastError() == NO_ERROR); - - iPixelFormat = choose_pixel_format(m_stereoVisual, m_numOfAASamples, needAlpha, needStencil, sRGB); - - if (iPixelFormat == 0) { - ::wglMakeCurrent(prevHDC, prevHGLRC); - return GHOST_kFailure; - } + if (iPixelFormat == 0) { + ::wglMakeCurrent(prevHDC, prevHGLRC); + return GHOST_kFailure; + } - lastPFD = ::DescribePixelFormat(m_hDC, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &chosenPFD); + lastPFD = ::DescribePixelFormat(m_hDC, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &chosenPFD); - if (!WIN32_CHK(lastPFD != 0)) { - ::wglMakeCurrent(prevHDC, prevHGLRC); - return GHOST_kFailure; - } + if (!WIN32_CHK(lastPFD != 0)) { + ::wglMakeCurrent(prevHDC, prevHGLRC); + return GHOST_kFailure; + } - if (needAlpha && chosenPFD.cAlphaBits == 0) - fprintf(stderr, "Warning! Unable to find a pixel format with an alpha channel.\n"); + if (needAlpha && chosenPFD.cAlphaBits == 0) + fprintf(stderr, "Warning! Unable to find a pixel format with an alpha channel.\n"); - if (needStencil && chosenPFD.cStencilBits == 0) - fprintf(stderr, "Warning! Unable to find a pixel format with a stencil buffer.\n"); + if (needStencil && chosenPFD.cStencilBits == 0) + fprintf(stderr, "Warning! Unable to find a pixel format with a stencil buffer.\n"); - if (!WIN32_CHK(::SetPixelFormat(m_hDC, iPixelFormat, &chosenPFD))) { - ::wglMakeCurrent(prevHDC, prevHGLRC); - return GHOST_kFailure; + if (!WIN32_CHK(::SetPixelFormat(m_hDC, iPixelFormat, &chosenPFD))) { + ::wglMakeCurrent(prevHDC, prevHGLRC); + return GHOST_kFailure; + } } if (WGLEW_ARB_create_context) { @@ -909,9 +906,11 @@ GHOST_TSuccess GHOST_ContextWGL::initializeDrawingContext() const char *version = reinterpret_cast<const char*>(glGetString(GL_VERSION)); #ifndef NDEBUG - reportContextString("Vendor", m_dummyVendor, vendor); - reportContextString("Renderer", m_dummyRenderer, renderer); - reportContextString("Version", m_dummyVersion, version); + if (m_dummyVendor != NULL) { + reportContextString("Vendor", m_dummyVendor, vendor); + reportContextString("Renderer", m_dummyRenderer, renderer); + reportContextString("Version", m_dummyVersion, version); + } #endif return GHOST_kSuccess; @@ -927,97 +926,3 @@ GHOST_TSuccess GHOST_ContextWGL::releaseNativeHandles() return success; } - -/** - * For any given HDC you may call SetPixelFormat once - * - * So we better try to get the correct OpenGL version in a new window altogether, in case it fails. - * (see https://msdn.microsoft.com/en-us/library/windows/desktop/dd369049(v=vs.85).aspx) - */ -static bool TryOpenGLVersion( - HWND hwnd, - bool wantStereoVisual, - bool wantAlphaBackground, - GHOST_TUns16 wantNumOfAASamples, - int contextProfileMask, - bool debugContext, - int major, int minor) -{ - HWND dummyHWND = clone_window(hwnd, NULL); - if (dummyHWND == NULL) { - return false; - } - - HDC dummyHDC = GetDC(dummyHWND); - if (dummyHDC == NULL) { - return false; - } - - GHOST_ContextWGL * context = new GHOST_ContextWGL( - wantStereoVisual, - wantAlphaBackground, - wantNumOfAASamples, - dummyHWND, - dummyHDC, - contextProfileMask, - major, minor, - (debugContext ? WGL_CONTEXT_DEBUG_BIT_ARB : 0), - GHOST_OPENGL_WGL_RESET_NOTIFICATION_STRATEGY); - - bool result = context->initializeDrawingContext(); - delete context; - - ReleaseDC(dummyHWND, dummyHDC); - DestroyWindow(dummyHWND); - - return result; -} - -GHOST_TSuccess GHOST_ContextWGL::getMaximumSupportedOpenGLVersion( - HWND hwnd, - bool wantStereoVisual, - bool wantAlphaBackground, - GHOST_TUns16 wantNumOfAASamples, - int contextProfileMask, - bool debugContext, - GHOST_TUns8 *r_major_version, - GHOST_TUns8 *r_minor_version) -{ - /* - AMD and Intel give us exactly this version - * - NVIDIA gives at least this version <-- desired behavior - * So we ask for 4.5, 4.4 ... 3.3 in descending order to get the best version on the user's system. */ - for (int minor = 5; minor >= 0; --minor) { - if (TryOpenGLVersion( - hwnd, - wantStereoVisual, - wantAlphaBackground, - wantNumOfAASamples, - contextProfileMask, - debugContext, - 4, minor)) - { - *r_major_version = 4; - *r_minor_version = minor; - return GHOST_kSuccess; - } - } - - /* Fallback to OpenGL 3.3 */ - if (TryOpenGLVersion( - hwnd, - wantStereoVisual, - wantAlphaBackground, - wantNumOfAASamples, - contextProfileMask, - debugContext, - 3, 3)) - { - *r_major_version = 3; - *r_minor_version = 3; - return GHOST_kSuccess; - } - - *r_major_version = 0; - *r_minor_version = 0; - return GHOST_kFailure; -} diff --git a/intern/ghost/intern/GHOST_ContextWGL.h b/intern/ghost/intern/GHOST_ContextWGL.h index 0d9986a0802..a07cc1b6301 100644 --- a/intern/ghost/intern/GHOST_ContextWGL.h +++ b/intern/ghost/intern/GHOST_ContextWGL.h @@ -105,20 +105,6 @@ public: */ GHOST_TSuccess getSwapInterval(int &intervalOut); - /** - * Gets the maximum supported OpenGL context for the user hardware - * \return Whether major_version and minor_version resulted in a valid context. - */ - static GHOST_TSuccess getMaximumSupportedOpenGLVersion( - HWND hwnd, - bool wantStereoVisual, - bool wantAlphaBackground, - GHOST_TUns16 wantNumOfAASamples, - int contextProfileMask, - bool debugContext, - GHOST_TUns8 *r_major_version, - GHOST_TUns8 *r_minor_version); - private: int choose_pixel_format( bool stereoVisual, diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index b0dae432643..1f1d1461949 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -56,6 +56,12 @@ #include "GHOST_WindowManager.h" #include "GHOST_WindowWin32.h" +#if defined(WITH_GL_EGL) +# include "GHOST_ContextEGL.h" +#else +# include "GHOST_ContextWGL.h" +#endif + #ifdef WITH_INPUT_NDOF #include "GHOST_NDOFManagerWin32.h" #endif @@ -299,6 +305,105 @@ GHOST_IWindow *GHOST_SystemWin32::createWindow( } +/** + * Create a new offscreen context. + * Never explicitly delete the window, use disposeContext() instead. + * \return The new context (or 0 if creation failed). + */ +GHOST_IContext *GHOST_SystemWin32::createOffscreenContext() +{ + GHOST_WindowWin32 *ghost_window = (GHOST_WindowWin32 *)(m_windowManager->getWindows()[0]); + HWND hWnd = ghost_window->getHWND(); + HDC hDC = GetDC(hWnd); + + GHOST_Context *context; + +#if defined(WITH_GL_PROFILE_CORE) + for (int minor = 5; minor >= 0; --minor) { + context = new GHOST_ContextWGL( + false, + true, + 0, + hWnd, + hDC, + WGL_CONTEXT_CORE_PROFILE_BIT_ARB, + 4, minor, + (false ? WGL_CONTEXT_DEBUG_BIT_ARB : 0), + GHOST_OPENGL_WGL_RESET_NOTIFICATION_STRATEGY); + + if (context->initializeDrawingContext()) { + return context; + } + else { + delete context; + } + } + + context = new GHOST_ContextWGL( + false, + true, + 0, + hWnd, + hDC, + WGL_CONTEXT_CORE_PROFILE_BIT_ARB, + 3, 3, + (false ? WGL_CONTEXT_DEBUG_BIT_ARB : 0), + GHOST_OPENGL_WGL_RESET_NOTIFICATION_STRATEGY); + + if (context->initializeDrawingContext()) { + return context; + } + else { + MessageBox( + hWnd, + "Blender requires a graphics driver with at least OpenGL 3.3 support.\n\n" + "The program will now close.", + "Blender - Unsupported Graphics Driver!", + MB_OK | MB_ICONERROR); + exit(); + delete context; + } + +#elif defined(WITH_GL_PROFILE_COMPAT) + // ask for 2.1 context, driver gives any GL version >= 2.1 (hopefully the latest compatibility profile) + // 2.1 ignores the profile bit & is incompatible with core profile + context = new GHOST_ContextWGL( + false, + true, + 0, + hWnd, + NULL, + 0, // no profile bit + 2, 1, + (false ? WGL_CONTEXT_DEBUG_BIT_ARB : 0), + GHOST_OPENGL_WGL_RESET_NOTIFICATION_STRATEGY); + + if (context->initializeDrawingContext()) { + return context; + } + else { + delete context; + } +#else +# error // must specify either core or compat at build time +#endif + + return NULL; +} + +/** + * Dispose of a context. + * \param context Pointer to the context to be disposed. + * \return Indication of success. + */ +GHOST_TSuccess GHOST_Sys @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs