[Libreoffice-commits] core.git: Branch 'private/moggi/opengl-3D-bar-rendering' - 3 commits - include/svx include/vcl svx/Library_svxcore.mk svx/source vcl/source
Markus Mohrhard
markus.mohrhard at collabora.co.uk
Tue Apr 1 18:35:44 PDT 2014
include/svx/sdr/contact/viewobjectcontactofopenglobj.hxx | 4 +
include/vcl/OpenGLContext.hxx | 2
svx/Library_svxcore.mk | 3 +
svx/source/sdr/contact/viewobjectcontactofopenglobj.cxx | 3 +
vcl/source/opengl/OpenGLContext.cxx | 37 ++++++++-------
5 files changed, 34 insertions(+), 15 deletions(-)
New commits:
commit b48f11667dc28abf8fbbb0c4136909a437c0e00b
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date: Wed Apr 2 03:31:38 2014 +0200
fix crash when passing external Window to OpenGLContext::init
The external window is not controlled by OpenGLContext so it is not
allowed to delete the window
Change-Id: Id2c79a3612cc875fd94b8cd1206b30af2f185875
diff --git a/include/vcl/OpenGLContext.hxx b/include/vcl/OpenGLContext.hxx
index 91355bf..e84e8fc 100644
--- a/include/vcl/OpenGLContext.hxx
+++ b/include/vcl/OpenGLContext.hxx
@@ -108,6 +108,7 @@ private:
GLWindow m_aGLWin;
boost::scoped_ptr<Window> m_pWindow;
+ Window* mpWindow; //points to m_pWindow or the parent window, don't delete it
boost::scoped_ptr<SystemChildWindow> m_pChildWindow;
bool mbInitialized;
};
diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx
index 8540da3..b9b9125 100644
--- a/vcl/source/opengl/OpenGLContext.cxx
+++ b/vcl/source/opengl/OpenGLContext.cxx
@@ -14,6 +14,7 @@
using namespace com::sun::star;
OpenGLContext::OpenGLContext():
+ mpWindow(NULL),
mbInitialized(false)
{
}
@@ -319,13 +320,15 @@ int oglErrorHandler( Display* /*dpy*/, XErrorEvent* /*evnt*/ )
bool OpenGLContext::init( Window* pParent )
{
- m_pWindow.reset(pParent ? pParent : new Window(0, WB_NOBORDER|WB_NODIALOGCONTROL));
if(mbInitialized)
return true;
+ m_pWindow.reset(pParent ? NULL : new Window(0, WB_NOBORDER|WB_NODIALOGCONTROL));
+ mpWindow = pParent ? pParent : m_pWindow.get();
SAL_INFO("vcl.opengl", "OpenGLContext::OpenGLContext----start");
initWindow();
- m_pWindow->setPosSizePixel(0,0,0,0);
+ if(m_pWindow)
+ m_pWindow->setPosSizePixel(0,0,0,0);
m_aGLWin.Width = 0;
m_aGLWin.Height = 0;
@@ -396,10 +399,10 @@ bool OpenGLContext::init( Window* pParent )
double nGLXVersion = 0;
if( glXQueryVersion( m_aGLWin.dpy, &glxMajor, &glxMinor ) )
nGLXVersion = glxMajor + 0.1*glxMinor;
- SAL_INFO("vcl.opengl", "available GLX version: %f", nGLXVersion);
+ SAL_INFO("vcl.opengl", "available GLX version: " << nGLXVersion);
m_aGLWin.GLExtensions = glGetString( GL_EXTENSIONS );
- SAL_INFO("vcl.opengl", "available GL extensions: %s", m_aGLWin.GLExtensions);
+ SAL_INFO("vcl.opengl", "available GL extensions: " << m_aGLWin.GLExtensions);
if( m_aGLWin.HasGLXExtension("GLX_SGI_swap_control" ) )
{
@@ -451,7 +454,8 @@ bool OpenGLContext::init( Window* pParent )
void OpenGLContext::setWinSize(const Size& rSize)
{
- m_pWindow->SetSizePixel(rSize);
+ if(m_pWindow)
+ m_pWindow->SetSizePixel(rSize);
m_pChildWindow->SetSizePixel(rSize);
}
@@ -464,12 +468,11 @@ GLWindow& OpenGLContext::getOpenGLWindow()
bool OpenGLContext::initWindow()
{
- const SystemEnvData* sysData(m_pWindow->GetSystemData());
+ const SystemEnvData* sysData(mpWindow->GetSystemData());
m_aGLWin.hWnd = sysData->hWnd;
SystemWindowData winData;
winData.nSize = sizeof(winData);
- m_pChildWindow.reset(new SystemChildWindow(m_pWindow.get(), 0, &winData, sal_False));
-
+ m_pChildWindow.reset(new SystemChildWindow(mpWindow.get(), 0, &winData, sal_False));
if( m_pChildWindow )
{
@@ -503,14 +506,13 @@ void initOpenGLFunctionPointers()
glXChooseFBConfig = (GLXFBConfig*(*)(Display *dpy, int screen, const int *attrib_list, int *nelements))glXGetProcAddressARB((GLubyte*)"glXChooseFBConfig");
glXGetVisualFromFBConfig = (XVisualInfo*(*)(Display *dpy, GLXFBConfig config))glXGetProcAddressARB((GLubyte*)"glXGetVisualFromFBConfig"); // try to find a visual for the current set of attributes
glXGetFBConfigAttrib = (int(*)(Display *dpy, GLXFBConfig config, int attribute, int* value))glXGetProcAddressARB((GLubyte*)"glXGetFBConfigAttrib");
-
}
}
bool OpenGLContext::initWindow()
{
- const SystemEnvData* sysData(m_pWindow->GetSystemData());
+ const SystemEnvData* sysData(mpWindow->GetSystemData());
m_aGLWin.dpy = reinterpret_cast<Display*>(sysData->pDisplay);
@@ -519,7 +521,7 @@ bool OpenGLContext::initWindow()
m_aGLWin.win = sysData->aWindow;
- SAL_INFO("vcl.opengl", "parent window: %d", m_aGLWin.win);
+ SAL_INFO("vcl.opengl", "parent window: " << m_aGLWin.win);
XWindowAttributes xattr;
XGetWindowAttributes( m_aGLWin.dpy, m_aGLWin.win, &xattr );
@@ -582,9 +584,9 @@ bool OpenGLContext::initWindow()
{
SystemWindowData winData;
winData.nSize = sizeof(winData);
- SAL_INFO("vcl.opengl", "using VisualID %08X", vi->visualid);
+ SAL_INFO("vcl.opengl", "using VisualID " << vi->visualid);
winData.pVisual = (void*)(vi->visual);
- m_pChildWindow.reset(new SystemChildWindow(m_pWindow.get(), 0, &winData, false));
+ m_pChildWindow.reset(new SystemChildWindow(mpWindow, 0, &winData, false));
pChildSysData = m_pChildWindow->GetSystemData();
}
@@ -601,7 +603,7 @@ bool OpenGLContext::initWindow()
m_aGLWin.win = pChildSysData->aWindow;
m_aGLWin.vi = vi;
m_aGLWin.GLXExtensions = glXQueryExtensionsString( m_aGLWin.dpy, m_aGLWin.screen );
- SAL_INFO("vcl.opengl", "available GLX extensions: %s", m_aGLWin.GLXExtensions);
+ SAL_INFO("vcl.opengl", "available GLX extensions: " << m_aGLWin.GLXExtensions);
return true;
}
commit 7bfe7696e8f052076f91d0d14db3ba4029056281
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date: Wed Apr 2 03:31:01 2014 +0200
prevent initializing the OpenGL context multiple times
Change-Id: I2ebdbcd51938bc1dc61693ac392eed5d5e497a8d
diff --git a/include/vcl/OpenGLContext.hxx b/include/vcl/OpenGLContext.hxx
index 82145b4..91355bf 100644
--- a/include/vcl/OpenGLContext.hxx
+++ b/include/vcl/OpenGLContext.hxx
@@ -109,6 +109,7 @@ private:
GLWindow m_aGLWin;
boost::scoped_ptr<Window> m_pWindow;
boost::scoped_ptr<SystemChildWindow> m_pChildWindow;
+ bool mbInitialized;
};
#endif
diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx
index 06920fa..8540da3 100644
--- a/vcl/source/opengl/OpenGLContext.cxx
+++ b/vcl/source/opengl/OpenGLContext.cxx
@@ -13,7 +13,8 @@
using namespace com::sun::star;
-OpenGLContext::OpenGLContext()
+OpenGLContext::OpenGLContext():
+ mbInitialized(false)
{
}
@@ -319,6 +320,9 @@ int oglErrorHandler( Display* /*dpy*/, XErrorEvent* /*evnt*/ )
bool OpenGLContext::init( Window* pParent )
{
m_pWindow.reset(pParent ? pParent : new Window(0, WB_NOBORDER|WB_NODIALOGCONTROL));
+ if(mbInitialized)
+ return true;
+
SAL_INFO("vcl.opengl", "OpenGLContext::OpenGLContext----start");
initWindow();
m_pWindow->setPosSizePixel(0,0,0,0);
@@ -441,6 +445,7 @@ bool OpenGLContext::init( Window* pParent )
#endif
SAL_INFO("vcl.opengl", "OpenGLContext::init----end");
+ mbInitialized = true;
return true;
}
commit 7ba57762ea2d4e1a126343b0bd6f037bd26c071b
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date: Mon Mar 31 23:09:24 2014 +0200
Revert "Remove opengl usage from svx until we can't solve building problems"
This reverts commit 10be411f33c69db83cc5de410eaddf2d297608ae.
diff --git a/include/svx/sdr/contact/viewobjectcontactofopenglobj.hxx b/include/svx/sdr/contact/viewobjectcontactofopenglobj.hxx
index 8781aa4..00e1dff 100644
--- a/include/svx/sdr/contact/viewobjectcontactofopenglobj.hxx
+++ b/include/svx/sdr/contact/viewobjectcontactofopenglobj.hxx
@@ -11,6 +11,7 @@
#define INCLUDED_SVX_SDR_CONTACT_VIEWOBJECTCONTACTOFOPENGL_HXX
#include <svx/sdr/contact/viewobjectcontactofsdrobj.hxx>
+#include <vcl/OpenGLContext.hxx>
class Window;
@@ -25,6 +26,9 @@ public:
protected:
Window* getWindow() const;
+
+private:
+ OpenGLContext m_aOpenGLContext;
};
} // namespace sdr
diff --git a/svx/Library_svxcore.mk b/svx/Library_svxcore.mk
index f26479c..b3c3521 100644
--- a/svx/Library_svxcore.mk
+++ b/svx/Library_svxcore.mk
@@ -75,6 +75,7 @@ $(eval $(call gb_Library_use_libraries,svxcore,\
utl \
vcl \
xo \
+ $(if $(filter FREEBSD LINUX MACOSX WNT,$(OS)),vclopengl) \
$(gb_UWINAPI) \
))
@@ -82,6 +83,8 @@ $(eval $(call gb_Library_use_externals,svxcore,\
boost_headers \
icuuc \
icu_headers \
+ mesa_headers \
+ glew \
))
$(eval $(call gb_Library_add_exception_objects,svxcore,\
diff --git a/svx/source/sdr/contact/viewobjectcontactofopenglobj.cxx b/svx/source/sdr/contact/viewobjectcontactofopenglobj.cxx
index 2cf0086..1689468 100644
--- a/svx/source/sdr/contact/viewobjectcontactofopenglobj.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofopenglobj.cxx
@@ -18,6 +18,9 @@ ViewObjectContactOfOpenGLObj::ViewObjectContactOfOpenGLObj(
ObjectContact& rObjectContact, ViewContact& rViewContact )
: ViewObjectContactOfSdrObj( rObjectContact, rViewContact )
{
+ m_aOpenGLContext.init(getWindow());
+ // Set a dummy size to make the window visible
+ m_aOpenGLContext.setWinSize(Size(200,200));
}
ViewObjectContactOfOpenGLObj::~ViewObjectContactOfOpenGLObj()
More information about the Libreoffice-commits
mailing list