avmedia/source/opengl/oglplayer.cxx | 31 ++++++++++ include/vcl/opengl/OpenGLHelper.hxx | 3 slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx | 11 --- slideshow/source/engine/OGLTrans/mac/OGLTrans_TransitionerImpl.mm | 12 +-- slideshow/source/engine/OGLTrans/win/OGLTrans_TransitionerImpl.cxx | 12 +-- vcl/source/opengl/OpenGLHelper.cxx | 15 ++++ 6 files changed, 60 insertions(+), 24 deletions(-)
New commits: commit 378b1d24a958114eb4484cb10f609f6e482772ec Author: Zolnai Tamás <tamas.zol...@collabora.com> Date: Sun Jul 20 17:20:01 2014 +0200 fdo#81055: Crash due to inadequate checks for GL version / capabilities Base line is OpenGL 2.1 + extensions: GL_ARB_framebuffer_object (part of OpenGL 3.0) for glGenFramebuffers, glGenRenderbuffers... GL_ARB_vertex_array_object (part of OpenGL 3.0) for glGenVertexArrays, glBindVertexArray... GL_ARB_sampler_objects (part of OpenGL 3.3) for glGenSamplers, glBindSampler... Change-Id: Ib8acf41ab85cd1677d0341719b3a5b4f743ed756 diff --git a/avmedia/source/opengl/oglplayer.cxx b/avmedia/source/opengl/oglplayer.cxx index a602d3c..89ac3b1 100644 --- a/avmedia/source/opengl/oglplayer.cxx +++ b/avmedia/source/opengl/oglplayer.cxx @@ -239,6 +239,25 @@ awt::Size SAL_CALL OGLPlayer::getPreferredPlayerWindowSize() throw ( uno::Runtim return awt::Size( 480, 360 ); } +static bool lcl_CheckOpenGLRequirements() +{ + float fVersion = OpenGLHelper::getGLVersion(); + if( fVersion >= 3.3 ) + { + return true; + } + else if( fVersion >= 3.0 ) + { + return glewIsSupported("GL_ARB_sampler_objects"); + } + else if( fVersion >= 2.1 ) + { + return glewIsSupported("GL_ARB_sampler_objects GL_ARB_framebuffer_object GL_ARB_vertex_array_object"); + } + + return false; +} + uno::Reference< media::XPlayerWindow > SAL_CALL OGLPlayer::createPlayerWindow( const uno::Sequence< uno::Any >& rArguments ) throw ( uno::RuntimeException, std::exception ) { @@ -264,6 +283,12 @@ uno::Reference< media::XPlayerWindow > SAL_CALL OGLPlayer::createPlayerWindow( c return uno::Reference< media::XPlayerWindow >(); } + if( !lcl_CheckOpenGLRequirements() ) + { + SAL_WARN("avmedia.opengl", "Your platform does not have the minimal OpenGL requiremenets!"); + return uno::Reference< media::XPlayerWindow >(); + } + Size aSize = pChildWindow->GetSizePixel(); m_aContext.setWinSize(aSize); m_pHandle->viewport.x = 0; @@ -298,6 +323,12 @@ uno::Reference< media::XFrameGrabber > SAL_CALL OGLPlayer::createFrameGrabber() return uno::Reference< media::XFrameGrabber >(); } + if( !lcl_CheckOpenGLRequirements() ) + { + SAL_WARN("avmedia.opengl", "Your platform does not have the minimal OpenGL requiremenets!"); + return uno::Reference< media::XFrameGrabber >(); + } + m_pHandle->viewport.x = 0; m_pHandle->viewport.y = 0; m_pHandle->viewport.width = getPreferredPlayerWindowSize().Width; commit 23c876deeb357b6306712ff0586a819176151c15 Author: Zolnai Tamás <tamas.zol...@collabora.com> Date: Sun Jul 20 14:20:35 2014 +0200 Extract getGLVersion() method to OpenGLHelper Change-Id: If3b7a6c71164f2b55defe8c28cdce69de9283175 diff --git a/include/vcl/opengl/OpenGLHelper.hxx b/include/vcl/opengl/OpenGLHelper.hxx index 9cc485b..87a71fa 100644 --- a/include/vcl/opengl/OpenGLHelper.hxx +++ b/include/vcl/opengl/OpenGLHelper.hxx @@ -36,6 +36,9 @@ public: */ static void createFramebuffer(long nWidth, long nHeight, GLuint& nFramebufferId, GLuint& nRenderbufferTextId, GLuint& nRenderbufferColorId); + + // Get OpenGL version (needs a context) + static float getGLVersion(); }; VCLOPENGL_DLLPUBLIC std::ostream& operator<<(std::ostream& rStrm, const glm::mat4& rMatrix); diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx index 36c1dd0..378de36 100644 --- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx +++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx @@ -61,6 +61,7 @@ #include <vcl/canvastools.hxx> #include <vcl/opengl/OpenGLContext.hxx> +#include <vcl/opengl/OpenGLHelper.hxx> #include <vcl/window.hxx> #include <boost/noncopyable.hpp> @@ -337,14 +338,8 @@ void OGLTransitionerImpl::impl_initializeFlags( bool const bGLXPresent ) { mbGLXPresent = bGLXPresent; if ( bGLXPresent ) { - const GLubyte* version = glGetString( GL_VERSION ); - if( version && version[0] ) { - mnGLVersion = version[0] - '0'; - if( version[1] == '.' && version[2] ) - mnGLVersion += (version[2] - '0')/10.0; - } else - mnGLVersion = 1.0; - SAL_INFO("slideshow.opengl", "GL version: " << version << " parsed: " << mnGLVersion << "" ); + mnGLVersion = OpenGLHelper::getGLVersion(); + SAL_INFO("slideshow.opengl", "GL version: " << mnGLVersion << "" ); const GLubyte* vendor = glGetString( GL_VENDOR ); mbMesa = ( vendor && strstr( (const char *) vendor, "Mesa" ) ); diff --git a/slideshow/source/engine/OGLTrans/mac/OGLTrans_TransitionerImpl.mm b/slideshow/source/engine/OGLTrans/mac/OGLTrans_TransitionerImpl.mm index 47cdb2d..62b135a 100644 --- a/slideshow/source/engine/OGLTrans/mac/OGLTrans_TransitionerImpl.mm +++ b/slideshow/source/engine/OGLTrans/mac/OGLTrans_TransitionerImpl.mm @@ -56,6 +56,8 @@ #include <vcl/syschild.hxx> #include <vcl/sysdata.hxx> +#include <vcl/opengl/OpenGLHelper.hxx> + #include <boost/noncopyable.hpp> #include <premac.h> @@ -311,14 +313,8 @@ bool OGLTransitionerImpl::initialize( const Reference< presentation::XSlideShowV if( instance->initWindowFromSlideShowView( xView ) ) { - const GLubyte* version = glGetString( GL_VERSION ); - if( version && version[0] ) { - cnGLVersion = version[0] - '0'; - if( version[1] == '.' && version[2] ) - cnGLVersion += (version[2] - '0')/10.0; - } else - cnGLVersion = 1.0; - OSL_TRACE("GL version: %s parsed: %f", version, cnGLVersion ); + cnGLVersion = OpenGLHelper::getGLVersion(); + OSL_TRACE("GL version: %f", cnGLVersion ); const GLubyte* vendor = glGetString( GL_VENDOR ); cbMesa = ( vendor && strstr( (const char *) vendor, "Mesa" ) ); diff --git a/slideshow/source/engine/OGLTrans/win/OGLTrans_TransitionerImpl.cxx b/slideshow/source/engine/OGLTrans/win/OGLTrans_TransitionerImpl.cxx index 19f22fd..2fcd3b5 100644 --- a/slideshow/source/engine/OGLTrans/win/OGLTrans_TransitionerImpl.cxx +++ b/slideshow/source/engine/OGLTrans/win/OGLTrans_TransitionerImpl.cxx @@ -56,6 +56,8 @@ #include <vcl/syschild.hxx> #include <vcl/sysdata.hxx> +#include <vcl/opengl/OpenGLHelper.hxx> + #include <boost/noncopyable.hpp> #include <GL/gl.h> @@ -314,14 +316,8 @@ bool OGLTransitionerImpl::initialize( const Reference< presentation::XSlideShowV instance = new OGLTransitionerImpl( NULL ); if( instance->initWindowFromSlideShowView( xView ) ) { - const GLubyte* version = glGetString( GL_VERSION ); - if( version && version[0] ) { - cnGLVersion = version[0] - '0'; - if( version[1] == '.' && version[2] ) - cnGLVersion += (version[2] - '0')/10.0; - } else - cnGLVersion = 1.0; - OSL_TRACE("GL version: %s parsed: %f", version, cnGLVersion ); + cnGLVersion = OpenGLHelper::getGLVersion(); + OSL_TRACE("GL version: %f", cnGLVersion ); const GLubyte* vendor = glGetString( GL_VENDOR ); cbMesa = ( vendor && strstr( (const char *) vendor, "Mesa" ) ); diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx index a2d9b83..0629d90 100644 --- a/vcl/source/opengl/OpenGLHelper.cxx +++ b/vcl/source/opengl/OpenGLHelper.cxx @@ -305,5 +305,20 @@ void OpenGLHelper::createFramebuffer(long nWidth, long nHeight, glBindFramebuffer(GL_FRAMEBUFFER, 0); } +float OpenGLHelper::getGLVersion() +{ + float fVersion = 1.0; + const GLubyte* aVersion = glGetString( GL_VERSION ); + if( aVersion && aVersion[0] ) + { + fVersion = aVersion[0] - '0'; + if( aVersion[1] == '.' && aVersion[2] ) + { + fVersion += (aVersion[2] - '0')/10.0; + } + } + return fVersion; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits