only init the OpenGL context if we need it

Change-Id: Ia88a1720d204b9933f1476bd703b99180e45abde
Reviewed-on: https://gerrit.libreoffice.org/26023
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
This commit is contained in:
Markus Mohrhard
2016-06-07 16:11:02 +02:00
parent 665844d8dd
commit 78b100ec9c
4 changed files with 49 additions and 8 deletions

View File

@@ -50,7 +50,7 @@ ChartWindow::ChartWindow( ChartController* pController, vcl::Window* pParent, Wi
, m_pWindowController( pController ) , m_pWindowController( pController )
, m_bInPaint(false) , m_bInPaint(false)
#if HAVE_FEATURE_OPENGL #if HAVE_FEATURE_OPENGL
, m_pOpenGLWindow(VclPtr<OpenGLWindow>::Create(this)) , m_pOpenGLWindow(VclPtr<OpenGLWindow>::Create(this, false))
#else #else
, m_pOpenGLWindow(nullptr) , m_pOpenGLWindow(nullptr)
#endif #endif

View File

@@ -2731,6 +2731,10 @@ void ChartView::impl_updateView( bool bCheckLockedCtrler )
//create chart view //create chart view
{ {
OpenGLWindow* pWindow = mrChartModel.getOpenGLWindow();
if (pWindow && ChartHelper::isGL3DDiagram(mrChartModel.getFirstDiagram()))
pWindow->Initialize();
m_bViewDirty = false; m_bViewDirty = false;
m_bViewUpdatePending = false; m_bViewUpdatePending = false;
createShapes(); createShapes();

View File

@@ -33,7 +33,7 @@ public:
class VCL_DLLPUBLIC OpenGLWindow : public vcl::Window class VCL_DLLPUBLIC OpenGLWindow : public vcl::Window
{ {
public: public:
OpenGLWindow(vcl::Window* pParent); OpenGLWindow(vcl::Window* pParent, bool bInit = true);
virtual ~OpenGLWindow(); virtual ~OpenGLWindow();
virtual void dispose() override; virtual void dispose() override;
@@ -48,6 +48,10 @@ public:
virtual void MouseMove( const MouseEvent& rMEvt ) override; virtual void MouseMove( const MouseEvent& rMEvt ) override;
virtual void Command( const CommandEvent& rCEvt ) override; virtual void Command( const CommandEvent& rCEvt ) override;
bool IsInitialized() const;
void Initialize();
private: private:
std::unique_ptr<OpenGLWindowImpl> mxImpl; std::unique_ptr<OpenGLWindowImpl> mxImpl;
IRenderer* mpRenderer; IRenderer* mpRenderer;

View File

@@ -15,21 +15,33 @@
class OpenGLWindowImpl class OpenGLWindowImpl
{ {
public: public:
explicit OpenGLWindowImpl(vcl::Window* pWindow); explicit OpenGLWindowImpl(vcl::Window* pWindow, bool bInit);
~OpenGLWindowImpl(); ~OpenGLWindowImpl();
OpenGLContext& getContext() { return *mxContext.get(); } OpenGLContext& getContext() { return *mxContext.get(); }
bool IsInitialized() const;
void Initialize();
private: private:
rtl::Reference<OpenGLContext> mxContext; rtl::Reference<OpenGLContext> mxContext;
VclPtr<SystemChildWindow> mxChildWindow; VclPtr<SystemChildWindow> mxChildWindow;
bool mbInitialized;
}; };
OpenGLWindowImpl::OpenGLWindowImpl(vcl::Window* pWindow) OpenGLWindowImpl::OpenGLWindowImpl(vcl::Window* pWindow, bool bInit)
: mxContext(OpenGLContext::Create()) : mxContext(OpenGLContext::Create()),
mbInitialized(bInit)
{ {
SystemWindowData aData = mxContext->generateWinData(pWindow, false); SystemWindowData aData = mxContext->generateWinData(pWindow, false);
mxChildWindow.reset(VclPtr<SystemChildWindow>::Create(pWindow, 0, &aData)); mxChildWindow.reset(VclPtr<SystemChildWindow>::Create(pWindow, 0, &aData));
mxChildWindow->Show(); mxChildWindow->Show();
mxContext->init(mxChildWindow.get());
if (bInit)
mxContext->init(mxChildWindow.get());
pWindow->SetMouseTransparent(false); pWindow->SetMouseTransparent(false);
} }
@@ -39,9 +51,19 @@ OpenGLWindowImpl::~OpenGLWindowImpl()
mxChildWindow.disposeAndClear(); mxChildWindow.disposeAndClear();
} }
OpenGLWindow::OpenGLWindow(vcl::Window* pParent): bool OpenGLWindowImpl::IsInitialized() const
{
return mbInitialized;
}
void OpenGLWindowImpl::Initialize()
{
mxContext->init(mxChildWindow.get());
}
OpenGLWindow::OpenGLWindow(vcl::Window* pParent, bool bInit):
Window(pParent, 0), Window(pParent, 0),
mxImpl(new OpenGLWindowImpl(this)), mxImpl(new OpenGLWindowImpl(this, bInit)),
mpRenderer(nullptr) mpRenderer(nullptr)
{ {
} }
@@ -118,4 +140,15 @@ void OpenGLWindow::setRenderer(IRenderer* pRenderer)
mpRenderer = pRenderer; mpRenderer = pRenderer;
} }
bool OpenGLWindow::IsInitialized() const
{
return mxImpl->IsInitialized();
}
void OpenGLWindow::Initialize()
{
if (!IsInitialized())
mxImpl->Initialize();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */