diff options
author | Louis-Francis Ratté-Boulianne <lfrb@collabora.com> | 2014-11-22 07:58:38 -0500 |
---|---|---|
committer | Jan Holesovsky <kendy@collabora.com> | 2014-12-02 15:47:21 +0100 |
commit | 8b0954e2619ccd82a8ccb1426734bcab2068f89c (patch) | |
tree | a2386f01c82a249eb61342eee10fc19ca7a9ef96 /vcl/opengl/x11/gdiimpl.cxx | |
parent | 260a0b53b758daa79aa6a87d07537841821d25ff (diff) |
vcl: Always use the same OpenGL context when drawing in a window
Change-Id: Ief0e947149c133aaa8e81973e088c4df6432bfdc
Diffstat (limited to 'vcl/opengl/x11/gdiimpl.cxx')
-rw-r--r-- | vcl/opengl/x11/gdiimpl.cxx | 56 |
1 files changed, 39 insertions, 17 deletions
diff --git a/vcl/opengl/x11/gdiimpl.cxx b/vcl/opengl/x11/gdiimpl.cxx index afaea924601c..0a8bf681484e 100644 --- a/vcl/opengl/x11/gdiimpl.cxx +++ b/vcl/opengl/x11/gdiimpl.cxx @@ -59,31 +59,53 @@ GLfloat X11OpenGLSalGraphicsImpl::GetHeight() const return 1; } -void X11OpenGLSalGraphicsImpl::Init() +bool X11OpenGLSalGraphicsImpl::IsOffscreen() const { X11WindowProvider *pProvider = dynamic_cast<X11WindowProvider*>(mrParent.m_pFrame); - - // Called after eg. a vdev re-size where we need to update the underlying pixmap - maContext.resetToReInitialize(); - if (pProvider) - { - Window aWin = pProvider->GetX11Window(); - maContext.init( mrParent.GetXDisplay(), aWin, mrParent.m_nXScreen.getXScreen()); - SetOffscreen( false ); - } + if( pProvider ) + return false; else if( mrParent.m_pVDev ) - { - maContext.init( mrParent.GetXDisplay(), mrParent.m_pVDev->GetDrawable(), - mrParent.m_pVDev->GetWidth(), mrParent.m_pVDev->GetHeight(), - mrParent.m_nXScreen.getXScreen() ); - SetOffscreen( true ); - } + return true; else { SAL_WARN( "vcl.opengl", "what happened here?" ); + return true; } } +OpenGLContext* X11OpenGLSalGraphicsImpl::CreateWinContext() +{ + X11WindowProvider *pProvider = dynamic_cast<X11WindowProvider*>(mrParent.m_pFrame); + + if( !pProvider ) + return NULL; + Window aWin = pProvider->GetX11Window(); + OpenGLContext* pContext = new OpenGLContext(); + pContext->init( mrParent.GetXDisplay(), aWin, + mrParent.m_nXScreen.getXScreen() ); + return pContext; +} + +bool X11OpenGLSalGraphicsImpl::CompareWinContext( OpenGLContext* pContext ) +{ + X11WindowProvider *pProvider = dynamic_cast<X11WindowProvider*>(mrParent.m_pFrame); + + if( !pProvider || !pContext->isInitialized() ) + return false; + return ( pContext->getOpenGLWindow().win == pProvider->GetX11Window() ); +} + +OpenGLContext* X11OpenGLSalGraphicsImpl::CreatePixmapContext() +{ + if( mrParent.m_pVDev == NULL ) + return NULL; + OpenGLContext* pContext = new OpenGLContext(); + pContext->init( mrParent.GetXDisplay(), mrParent.m_pVDev->GetDrawable(), + mrParent.m_pVDev->GetWidth(), mrParent.m_pVDev->GetHeight(), + mrParent.m_nXScreen.getXScreen() ); + return pContext; +} + void X11OpenGLSalGraphicsImpl::copyBits( const SalTwoRect& rPosAry, SalGraphics* pSrcGraphics ) { OpenGLSalGraphicsImpl *pImpl = pSrcGraphics ? static_cast< OpenGLSalGraphicsImpl* >(pSrcGraphics->GetImpl()) : static_cast< OpenGLSalGraphicsImpl *>(mrParent.GetImpl()); @@ -104,7 +126,7 @@ bool X11OpenGLSalGraphicsImpl::FillPixmapFromScreen( X11Pixmap* pPixmap, int nX, return false; // make sure everything is synced up before reading back - maContext.makeCurrent(); + mpContext->makeCurrent(); glXWaitX(); // TODO: lfrb: What if offscreen? |