tdf#94006 - need an explicit dispose for GLContext's SystemChildWindow.
Previously we would get an explicit ~OpenGLContext - and potentially leave FMR's around for other OGC users, now we treat the other users properly - we need an explicit dispose() to get Window::dispose ordering right. Change-Id: I5edcbd73399b6db3dbcfb391570f364f9ab0c70d Reviewed-on: https://gerrit.libreoffice.org/18412 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
This commit is contained in:
parent
f19049065a
commit
82d25c02f8
@ -41,6 +41,7 @@ OGLPlayer::~OGLPlayer()
|
||||
{
|
||||
m_xContext->makeCurrent();
|
||||
gltf_renderer_release(m_pHandle);
|
||||
m_xContext->dispose();
|
||||
}
|
||||
releaseInputFiles();
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ namespace oglcanvas
|
||||
{}
|
||||
|
||||
SpriteDeviceHelper::~SpriteDeviceHelper()
|
||||
{}
|
||||
{ mxContext->dispose(); }
|
||||
|
||||
void SpriteDeviceHelper::init( vcl::Window& rWindow,
|
||||
SpriteCanvas& rSpriteCanvas,
|
||||
|
@ -175,6 +175,7 @@ public:
|
||||
~OpenGLContext();
|
||||
void acquire() { mnRefCount++; }
|
||||
void release() { if ( --mnRefCount == 0 ) delete this; }
|
||||
void dispose();
|
||||
|
||||
void requestLegacyContext();
|
||||
void requestSingleBufferedRendering();
|
||||
|
@ -112,6 +112,13 @@ OpenGLContext::~OpenGLContext()
|
||||
assert (mnRefCount == 1);
|
||||
}
|
||||
|
||||
// release associated child-window if we have one
|
||||
void OpenGLContext::dispose()
|
||||
{
|
||||
reset();
|
||||
m_pChildWindow.disposeAndClear();
|
||||
}
|
||||
|
||||
rtl::Reference<OpenGLContext> OpenGLContext::Create()
|
||||
{
|
||||
return rtl::Reference<OpenGLContext>(new OpenGLContext);
|
||||
@ -1191,6 +1198,7 @@ void OpenGLContext::reset()
|
||||
wglMakeCurrent(NULL, NULL);
|
||||
wglDeleteContext( m_aGLWin.hRC );
|
||||
ReleaseDC( m_aGLWin.hWnd, m_aGLWin.hDC );
|
||||
m_aGLWin.hRC = 0;
|
||||
}
|
||||
#elif defined( MACOSX )
|
||||
OpenGLWrapper::resetCurrent();
|
||||
@ -1212,6 +1220,7 @@ void OpenGLContext::reset()
|
||||
|
||||
if (mbPixmap && m_aGLWin.glPix != None)
|
||||
glXDestroyPixmap(m_aGLWin.dpy, m_aGLWin.glPix);
|
||||
m_aGLWin.ctx = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ class OpenGLWindowImpl
|
||||
{
|
||||
public:
|
||||
explicit OpenGLWindowImpl(vcl::Window* pWindow);
|
||||
~OpenGLWindowImpl() { mxChildWindow.disposeAndClear(); }
|
||||
~OpenGLWindowImpl();
|
||||
OpenGLContext& getContext() { return *mxContext.get(); }
|
||||
private:
|
||||
rtl::Reference<OpenGLContext> mxContext;
|
||||
@ -33,6 +33,12 @@ OpenGLWindowImpl::OpenGLWindowImpl(vcl::Window* pWindow)
|
||||
pWindow->SetMouseTransparent(false);
|
||||
}
|
||||
|
||||
OpenGLWindowImpl::~OpenGLWindowImpl()
|
||||
{
|
||||
mxContext->dispose();
|
||||
mxChildWindow.disposeAndClear();
|
||||
}
|
||||
|
||||
OpenGLWindow::OpenGLWindow(vcl::Window* pParent):
|
||||
Window(pParent, 0),
|
||||
mxImpl(new OpenGLWindowImpl(this)),
|
||||
|
Loading…
x
Reference in New Issue
Block a user