diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2016-07-28 17:31:20 +0900 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2016-07-28 13:06:30 +0000 |
commit | 7480838db5cd695fc46362dae291f9c1052321d8 (patch) | |
tree | 4dcff183784fd908a786f7970a31c58d504bd4f5 /vcl/opengl | |
parent | aeb0c407a620ea8c28903f61d9d53e6d9ae7c53a (diff) |
opengl: improve context creation, temp window creation on windows
If anything fails at context creation then don't forget to
deallocate resources.
Temp window creation is written C like, as it was copy/pasted from
an C example.
Change-Id: Ia9d704e42206b1d4c37db2954bba4f165e3c8389
Reviewed-on: https://gerrit.libreoffice.org/27613
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'vcl/opengl')
-rw-r--r-- | vcl/opengl/win/gdiimpl.cxx | 52 |
1 files changed, 37 insertions, 15 deletions
diff --git a/vcl/opengl/win/gdiimpl.cxx b/vcl/opengl/win/gdiimpl.cxx index 71251dfd91be..bd35667695dc 100644 --- a/vcl/opengl/win/gdiimpl.cxx +++ b/vcl/opengl/win/gdiimpl.cxx @@ -106,7 +106,7 @@ void WinOpenGLContext::makeCurrent() bool WinOpenGLContext::init(HDC hDC, HWND hWnd) { if (isInitialized()) - return false; + return true; m_aGLWin.hDC = hDC; m_aGLWin.hWnd = hWnd; @@ -164,12 +164,11 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM l } } -int InitTempWindow(HWND *hwnd, int width, int height, const PIXELFORMATDESCRIPTOR& inPfd, GLWinWindow& glWin) +bool InitTempWindow(HWND& hwnd, int width, int height, const PIXELFORMATDESCRIPTOR& inPfd, GLWinWindow& glWin) { OpenGLZone aZone; PIXELFORMATDESCRIPTOR pfd = inPfd; - int pfmt; int ret; WNDCLASS wc; wc.style = 0; @@ -182,30 +181,41 @@ int InitTempWindow(HWND *hwnd, int width, int height, const PIXELFORMATDESCRIPTO wc.lpszMenuName = NULL; wc.lpszClassName = (LPCSTR)"GLRenderer"; RegisterClass(&wc); - *hwnd = CreateWindow(wc.lpszClassName, NULL, WS_DISABLED, 0, 0, width, height, NULL, NULL, wc.hInstance, NULL); - glWin.hDC = GetDC(*hwnd); - pfmt = ChoosePixelFormat(glWin.hDC, &pfd); - if (!pfmt) + hwnd = CreateWindow(wc.lpszClassName, NULL, WS_DISABLED, 0, 0, width, height, NULL, NULL, wc.hInstance, NULL); + glWin.hDC = GetDC(hwnd); + + int nPixelFormat = ChoosePixelFormat(glWin.hDC, &pfd); + if (!nPixelFormat) { - return -1; + ReleaseDC(hwnd, glWin.hDC); + DestroyWindow(hwnd); + return false; } - ret = SetPixelFormat(glWin.hDC, pfmt, &pfd); + ret = SetPixelFormat(glWin.hDC, nPixelFormat, &pfd); if(!ret) { - return -1; + ReleaseDC(hwnd, glWin.hDC); + DestroyWindow(hwnd); + return false; } glWin.hRC = wglCreateContext(glWin.hDC); if(!(glWin.hRC)) { - return -1; + ReleaseDC(hwnd, glWin.hDC); + DestroyWindow(hwnd); + return false; } ret = wglMakeCurrent(glWin.hDC, glWin.hRC); if(!ret) { - return -1; + wglMakeCurrent(NULL, NULL); + wglDeleteContext(glWin.hRC); + ReleaseDC(hwnd, glWin.hDC); + DestroyWindow(hwnd); + return false; } - return 0; + return true; } bool WGLisExtensionSupported(const char *extension) @@ -255,7 +265,7 @@ bool InitMultisample(const PIXELFORMATDESCRIPTOR& pfd, int& rPixelFormat, HWND hWnd = NULL; GLWinWindow glWin; // Create a temp window to check whether support multi-sample, if support, get the format - if (InitTempWindow(&hWnd, 1, 1, pfd, glWin) < 0) + if (!InitTempWindow(hWnd, 32, 32, pfd, glWin)) { SAL_WARN("vcl.opengl", "Can't create temp window to test"); return false; @@ -265,12 +275,20 @@ bool InitMultisample(const PIXELFORMATDESCRIPTOR& pfd, int& rPixelFormat, if (!WGLisExtensionSupported("WGL_ARB_multisample")) { SAL_WARN("vcl.opengl", "Device doesn't support multisample"); + wglMakeCurrent(NULL, NULL); + wglDeleteContext(glWin.hRC); + ReleaseDC(hWnd, glWin.hDC); + DestroyWindow(hWnd); return false; } // Get our pixel format PFNWGLCHOOSEPIXELFORMATARBPROC fn_wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB"); if (!fn_wglChoosePixelFormatARB) { + wglMakeCurrent(NULL, NULL); + wglDeleteContext(glWin.hRC); + ReleaseDC(hWnd, glWin.hDC); + DestroyWindow(hWnd); return false; } // Get our current device context @@ -686,7 +704,11 @@ rtl::Reference<OpenGLContext> WinOpenGLSalGraphicsImpl::CreateWinContext() { rtl::Reference<WinOpenGLContext> xContext(new WinOpenGLContext); xContext->setVCLOnly(); - xContext->init(mrParent.mhLocalDC, mrParent.mhWnd); + if (!xContext->init(mrParent.mhLocalDC, mrParent.mhWnd)) + { + SAL_WARN("vcl.opengl", "Context could not be created."); + return rtl::Reference<OpenGLContext>(); + } return rtl::Reference<OpenGLContext>(xContext.get()); } |