From cb1af4e13b48828e41e4d13363193991ef3cdf63 Mon Sep 17 00:00:00 2001 From: Markus Mohrhard Date: Mon, 19 Jan 2015 22:57:32 +0100 Subject: use a special X error handler for more GLX calls Change-Id: I8cafc7e106bbf9ddc790d72b9399efcf76df633e --- vcl/source/opengl/OpenGLContext.cxx | 54 +++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 14 deletions(-) (limited to 'vcl') diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx index 4317d56dd6cb..d9bf3c2a401e 100644 --- a/vcl/source/opengl/OpenGLContext.cxx +++ b/vcl/source/opengl/OpenGLContext.cxx @@ -432,6 +432,41 @@ debug_callback(GLenum source, GLenum type, GLuint id, namespace { +int unxErrorHandler(Display* dpy, XErrorEvent* event) +{ + char errorString[256]; + XGetErrorText(dpy, event->type, errorString, 256); + SAL_WARN("vcl.opengl", errorString); + return 0; +} + +typedef int (*errorHandler)(Display* /*dpy*/, XErrorEvent* /*evnt*/); + +class TempErrorHandler +{ +private: + errorHandler oldErrorHandler; + Display* mdpy; + +public: + TempErrorHandler(Display* dpy, errorHandler newErrorHandler): + mdpy(dpy) + { + XLockDisplay(dpy); + XSync(dpy, false); + oldErrorHandler = XSetErrorHandler(newErrorHandler); + } + + ~TempErrorHandler() + { + // sync so that we possibly get an XError + glXWaitGL(); + XSync(mdpy, false); + XSetErrorHandler(oldErrorHandler); + XUnlockDisplay(mdpy); + } +}; + static bool errorTriggered; int oglErrorHandler( Display* /*dpy*/, XErrorEvent* /*evnt*/ ) { @@ -670,6 +705,7 @@ bool OpenGLContext::init(Display* dpy, Pixmap pix, unsigned int width, unsigned bool OpenGLContext::ImplInit() { GLXContext pSharedCtx( NULL ); + TempErrorHandler(m_aGLWin.dpy, unxErrorHandler); SAL_INFO("vcl.opengl", "OpenGLContext::ImplInit----start"); @@ -762,31 +798,19 @@ bool OpenGLContext::ImplInit() glXSwapIntervalProc glXSwapInterval = (glXSwapIntervalProc) glXGetProcAddress( (const GLubyte*) "glXSwapIntervalSGI" ); if( glXSwapInterval ) { - int (*oldHandler)(Display* /*dpy*/, XErrorEvent* /*evnt*/); - - XLockDisplay(m_aGLWin.dpy); - XSync(m_aGLWin.dpy, false); - // replace error handler temporarily - oldHandler = XSetErrorHandler( oglErrorHandler ); + TempErrorHandler(m_aGLWin.dpy, oglErrorHandler); errorTriggered = false; glXSwapInterval( 1 ); - // sync so that we possibly get an XError - glXWaitGL(); - XSync(m_aGLWin.dpy, false); - if( errorTriggered ) SAL_WARN("vcl.opengl", "error when trying to set swap interval, NVIDIA or Mesa bug?"); else SAL_INFO("vcl.opengl", "set swap interval to 1 (enable vsync)"); - - // restore the error handler - XSetErrorHandler( oldHandler ); - XUnlockDisplay(m_aGLWin.dpy); } } + return InitGLEW(); } @@ -1313,6 +1337,8 @@ void OpenGLContext::makeCurrent() #elif defined( IOS ) || defined( ANDROID ) // nothing #elif defined( UNX ) + TempErrorHandler(m_aGLWin.dpy, unxErrorHandler); + GLXDrawable nDrawable = mbPixmap ? m_aGLWin.glPix : m_aGLWin.win; if (!glXMakeCurrent( m_aGLWin.dpy, nDrawable, m_aGLWin.ctx )) { -- cgit