[libreoffice] 01/02: backport OpenGL GTK3 fixes from master
Rene Engelhard
rene at moszumanska.debian.org
Sat Dec 17 12:21:13 UTC 2016
This is an automated email from the git hooks/post-receive script.
rene pushed a commit to branch master
in repository libreoffice.
commit 007e4ab680e0014ab37ec69c94811d57fff948d0
Author: Rene Engelhard <rene at debian.org>
Date: Tue Dec 13 21:31:00 2016 +0100
backport OpenGL GTK3 fixes from master
---
changelog | 5 +
patches/gtk3-opengl-slideshow.diff | 632 +++++++++++++++++++++++++++++++++++++
patches/series | 1 +
3 files changed, 638 insertions(+)
diff --git a/changelog b/changelog
index d38f1ba..7a58fdc 100644
--- a/changelog
+++ b/changelog
@@ -2,6 +2,11 @@ libreoffice (1:5.2.4~rc2-1) UNRELEASED; urgency=medium
* New upstream release candidate
+ * debian/patches/gtk3-opengl-slideshow.diff: add Fedora 25 patches
+ backported from master to rework Diamond slide transition to use only
+ OpenGL core (all we have in gtk3) and fix ogltrans generically with gtk3
+ (without the glew->epoxy move)
+
* debian/rules:
- MYSQL_FLAVOUR=mysql on jessie-backports
diff --git a/patches/gtk3-opengl-slideshow.diff b/patches/gtk3-opengl-slideshow.diff
new file mode 100644
index 0000000..253087c
--- /dev/null
+++ b/patches/gtk3-opengl-slideshow.diff
@@ -0,0 +1,632 @@
+From 712af05b25bd4fd5343a5622b7a42eff177eeb83 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm at redhat.com>
+Date: Thu, 1 Dec 2016 12:32:09 +0000
+Subject: [PATCH] rework diamond transition to use only opengl core
+
+cause that's all we've got in gtk3
+
+Change-Id: I6a47e344ccd39ba63e7a51ae18f89bb05bb642c4
+---
+ .../OGLTrans/generic/OGLTrans_TransitionImpl.cxx | 28 +++++++++++++++-------
+ 1 file changed, 20 insertions(+), 8 deletions(-)
+
+diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
+index 8b508c6..9eb1e51 100644
+--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
++++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
+@@ -317,8 +317,6 @@ OGLTransitionImpl::displayUnbufferedSlide(
+ double SlideWidthScale, double SlideHeightScale )
+ {
+ CHECK_GL_ERROR();
+- glPushMatrix();
+- CHECK_GL_ERROR();
+ glBindTexture(GL_TEXTURE_2D, glSlideTex);
+ CHECK_GL_ERROR();
+ glBindVertexArray(0);
+@@ -336,8 +334,6 @@ OGLTransitionImpl::displayUnbufferedSlide(
+ CHECK_GL_ERROR();
+ glBindBuffer(GL_ARRAY_BUFFER, m_nVertexBufferObject);
+ CHECK_GL_ERROR();
+- glPopMatrix();
+- CHECK_GL_ERROR();
+ }
+
+ void OGLTransitionImpl::displayScene( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight )
+@@ -360,15 +356,31 @@ void Primitive::display(GLint primitiveTransformLocation, double nTime, double W
+ CHECK_GL_ERROR();
+ }
+
+- glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
++ GLuint nVertexArrayObject;
++ glGenVertexArrays(1, &nVertexArrayObject);
++ CHECK_GL_ERROR();
++ glBindVertexArray(nVertexArrayObject);
++ CHECK_GL_ERROR();
++
++ GLuint nBuffer;
++ glGenBuffers(1, &nBuffer);
+ CHECK_GL_ERROR();
+- glEnableClientState( GL_VERTEX_ARRAY );
++ glBindBuffer(GL_ARRAY_BUFFER, nBuffer);
+ CHECK_GL_ERROR();
+- glVertexPointer( 3, GL_FLOAT, sizeof(Vertex), &Vertices[0] );
++ glBufferData(GL_ARRAY_BUFFER, getVerticesSize(), Vertices.data(), GL_STATIC_DRAW);
++
++ glEnableVertexAttribArray(0);
++ CHECK_GL_ERROR();
++ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), nullptr);
++
+ CHECK_GL_ERROR();
+ glDrawArrays( GL_TRIANGLES, 0, getVerticesSize() );
+ CHECK_GL_ERROR();
+- glPopClientAttrib();
++
++ glDeleteBuffers(1, &nBuffer);
++ CHECK_GL_ERROR();
++
++ glDeleteVertexArrays(1, &nVertexArrayObject);
+
+ CHECK_GL_ERROR();
+ }
+--
+2.9.3
+
+From fdc33220c54238850958001b536c8a54bf40f9c1 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm at redhat.com>
+Date: Fri, 25 Nov 2016 14:11:13 +0000
+Subject: [PATCH] gtk3: implement opengl support for slideshow
+
+all of them work, except "Fall" doesn't look right, but it has
+the exact same problem under gtk2/gen to.
+
+Change-Id: I73cb9c0fb8211f727198be78d90d4f80a4f8c7c8
+---
+ include/vcl/opengl/OpenGLContext.hxx | 2 +
+ .../OGLTrans/generic/OGLTrans_TransitionImpl.cxx | 73 ++++++------
+ .../OGLTrans/generic/OGLTrans_TransitionImpl.hxx | 9 +-
+ .../OGLTrans/generic/OGLTrans_TransitionerImpl.cxx | 7 +-
+ vcl/inc/unx/gtk/gtkinst.hxx | 1 +
+ vcl/source/opengl/OpenGLContext.cxx | 5 +
+ vcl/unx/gtk3/gtk3gtkinst.cxx | 127 +++++++++++++++++++++
+ 7 files changed, 181 insertions(+), 43 deletions(-)
+
+diff --git a/include/vcl/opengl/OpenGLContext.hxx b/include/vcl/opengl/OpenGLContext.hxx
+index 7cd6954..2929006 100644
+--- a/include/vcl/opengl/OpenGLContext.hxx
++++ b/include/vcl/opengl/OpenGLContext.hxx
+@@ -129,6 +129,8 @@ public:
+ void registerAsCurrent();
+ /// reset the GL context so this context is not implicit in subsequent GL calls.
+ virtual void resetCurrent();
++ /// unbind the GL_FRAMEBUFFER to its default state, needed for gtk3
++ virtual void restoreDefaultFramebuffer();
+ virtual void swapBuffers();
+ virtual void sync();
+ void show();
+diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
+index 94b2217..f253a07 100644
+--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
++++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
+@@ -29,6 +29,7 @@
+ #include <glm/gtc/matrix_transform.hpp>
+ #include <glm/gtc/type_ptr.hpp>
+ #include <vcl/opengl/OpenGLHelper.hxx>
++#include <vcl/opengl/OpenGLContext.hxx>
+
+ #include <algorithm>
+ #include <array>
+@@ -132,7 +133,7 @@ static std::vector<int> uploadPrimitives(const Primitives_t& primitives)
+ return indices;
+ }
+
+-bool OGLTransitionImpl::prepare( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex )
++bool OGLTransitionImpl::prepare( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext )
+ {
+ m_nProgramObject = makeShader();
+ if (!m_nProgramObject)
+@@ -200,7 +201,7 @@ bool OGLTransitionImpl::prepare( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteri
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ CHECK_GL_ERROR();
+
+- prepareTransition( glLeavingSlideTex, glEnteringSlideTex );
++ prepareTransition( glLeavingSlideTex, glEnteringSlideTex, pContext );
+ return true;
+ }
+
+@@ -233,7 +234,7 @@ void OGLTransitionImpl::finish( double, double, double, double, double )
+ {
+ }
+
+-void OGLTransitionImpl::prepareTransition( sal_Int32, sal_Int32 )
++void OGLTransitionImpl::prepareTransition( sal_Int32, sal_Int32, OpenGLContext* )
+ {
+ }
+
+@@ -241,7 +242,7 @@ void OGLTransitionImpl::finishTransition()
+ {
+ }
+
+-void OGLTransitionImpl::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale )
++void OGLTransitionImpl::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext * )
+ {
+ CHECK_GL_ERROR();
+ applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
+@@ -257,7 +258,7 @@ void OGLTransitionImpl::displaySlides_( double nTime, sal_Int32 glLeavingSlideTe
+ }
+
+ void OGLTransitionImpl::display( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
+- double SlideWidth, double SlideHeight, double DispWidth, double DispHeight )
++ double SlideWidth, double SlideHeight, double DispWidth, double DispHeight, OpenGLContext *pContext )
+ {
+ const double SlideWidthScale = SlideWidth/DispWidth;
+ const double SlideHeightScale = SlideHeight/DispHeight;
+@@ -267,7 +268,7 @@ void OGLTransitionImpl::display( double nTime, sal_Int32 glLeavingSlideTex, sal_
+ prepare( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight );
+
+ CHECK_GL_ERROR();
+- displaySlides_( nTime, glLeavingSlideTex, glEnteringSlideTex, SlideWidthScale, SlideHeightScale );
++ displaySlides_( nTime, glLeavingSlideTex, glEnteringSlideTex, SlideWidthScale, SlideHeightScale, pContext );
+ CHECK_GL_ERROR();
+ displayScene( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight );
+ CHECK_GL_ERROR();
+@@ -536,9 +537,9 @@ public:
+
+ private:
+ virtual GLuint makeShader() const override;
+- virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) override;
++ virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext ) override;
+
+- virtual void prepareTransition( sal_Int32, sal_Int32 ) override {
++ virtual void prepareTransition( sal_Int32, sal_Int32, OpenGLContext* ) override {
+ glDisable(GL_CULL_FACE);
+ }
+
+@@ -553,7 +554,7 @@ GLuint ReflectionTransition::makeShader() const
+ }
+
+ void ReflectionTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
+- double SlideWidthScale, double SlideHeightScale )
++ double SlideWidthScale, double SlideHeightScale, OpenGLContext * )
+ {
+ CHECK_GL_ERROR();
+ applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
+@@ -601,7 +602,7 @@ public:
+ private:
+ virtual GLuint makeShader() const override;
+
+- virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) override;
++ virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext ) override;
+ };
+
+ GLuint SimpleTransition::makeShader() const
+@@ -610,7 +611,7 @@ GLuint SimpleTransition::makeShader() const
+ }
+
+ void SimpleTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
+- double SlideWidthScale, double SlideHeightScale )
++ double SlideWidthScale, double SlideHeightScale, OpenGLContext * )
+ {
+ CHECK_GL_ERROR();
+ applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
+@@ -860,10 +861,10 @@ public:
+ {}
+
+ private:
+- virtual void displaySlides_(double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale) override;
++ virtual void displaySlides_(double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext) override;
+ };
+
+-void RochadeTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale )
++void RochadeTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext * )
+ {
+ applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
+
+@@ -1198,13 +1199,13 @@ public:
+ {}
+
+ private:
+- virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) override;
++ virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext ) override;
+
+ Primitives_t makeLeavingSlide(double nTime) const;
+ };
+
+ void DiamondTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
+- double SlideWidthScale, double SlideHeightScale )
++ double SlideWidthScale, double SlideHeightScale, OpenGLContext * )
+ {
+ CHECK_GL_ERROR();
+ applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
+@@ -1416,7 +1417,7 @@ protected:
+ {}
+
+ virtual void finishTransition() override;
+- virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex ) override;
++ virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext ) override;
+
+ private:
+ /** various data */
+@@ -1493,7 +1494,7 @@ void initPermTexture(GLuint *texID)
+ CHECK_GL_ERROR();
+ }
+
+-void PermTextureTransition::prepareTransition( sal_Int32, sal_Int32 )
++void PermTextureTransition::prepareTransition( sal_Int32, sal_Int32, OpenGLContext* )
+ {
+ CHECK_GL_ERROR();
+ GLint location = glGetUniformLocation( m_nProgramObject, "permTexture" );
+@@ -1634,8 +1635,8 @@ public:
+ private:
+ virtual void finishTransition() override;
+ virtual GLuint makeShader() const override;
+- virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex ) override;
+- virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) override;
++ virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext ) override;
++ virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext ) override;
+
+ GLint mnSlideLocation = -1;
+ GLint mnTileInfoLocation = -1;
+@@ -1684,10 +1685,10 @@ glm::mat4 lookAt(const glm::vec3& eye, const glm::vec3& center, const glm::vec3&
+ -glm::dot(s, eye), -glm::dot(u, eye), glm::dot(f, eye), 1);
+ }
+
+-void VortexTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex )
++void VortexTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext )
+ {
+ CHECK_GL_ERROR();
+- PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex );
++ PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex, pContext );
+ CHECK_GL_ERROR();
+
+ mnSlideLocation = glGetUniformLocation(m_nProgramObject, "slide");
+@@ -1788,7 +1789,7 @@ void VortexTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32
+ }
+ }
+
+- glBindFramebuffer(GL_FRAMEBUFFER, 0);
++ pContext->restoreDefaultFramebuffer();
+ glBindTexture(GL_TEXTURE_2D, 0);
+
+ glActiveTexture( GL_TEXTURE2 );
+@@ -1798,7 +1799,7 @@ void VortexTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32
+ glActiveTexture( GL_TEXTURE0 );
+ }
+
+-void VortexTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale )
++void VortexTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext * pContext )
+ {
+ CHECK_GL_ERROR();
+ applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
+@@ -1820,7 +1821,7 @@ void VortexTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex
+ displaySlide( nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale );
+
+ glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
+- glBindFramebuffer(GL_FRAMEBUFFER, 0);
++ pContext->restoreDefaultFramebuffer();
+ glUniform1f( mnShadowLocation, 0.0 );
+ glUniform1f( mnSlideLocation, 0.0 );
+ displaySlide( nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale );
+@@ -1882,7 +1883,7 @@ public:
+
+ private:
+ virtual GLuint makeShader() const override;
+- virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex ) override;
++ virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext ) override;
+ virtual void prepare( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight ) override;
+
+ glm::vec2 maCenter;
+@@ -1894,7 +1895,7 @@ GLuint RippleTransition::makeShader() const
+ return OpenGLHelper::LoadShaders( "basicVertexShader", "rippleFragmentShader" );
+ }
+
+-void RippleTransition::prepareTransition( sal_Int32, sal_Int32 )
++void RippleTransition::prepareTransition( sal_Int32, sal_Int32, OpenGLContext* )
+ {
+ GLint nCenterLocation = glGetUniformLocation(m_nProgramObject, "center");
+ CHECK_GL_ERROR();
+@@ -1979,7 +1980,7 @@ public:
+
+ private:
+ virtual GLuint makeShader() const override;
+- virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex ) override;
++ virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext ) override;
+ virtual void finish( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight ) override;
+
+ GLuint maBuffer = 0;
+@@ -1995,10 +1996,10 @@ struct ThreeFloats
+ GLfloat x, y, z;
+ };
+
+-void GlitterTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex )
++void GlitterTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext )
+ {
+ CHECK_GL_ERROR();
+- PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex );
++ PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex, pContext );
+ CHECK_GL_ERROR();
+
+ GLint nNumTilesLocation = glGetUniformLocation(m_nProgramObject, "numTiles");
+@@ -2083,8 +2084,8 @@ public:
+ private:
+ virtual void finishTransition() override;
+ virtual GLuint makeShader() const override;
+- virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex ) override;
+- virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) override;
++ virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext ) override;
++ virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext ) override;
+
+ GLint maHexagonSizeLocation = -1;
+ GLint maSelectedTextureLocation = -1;
+@@ -2117,10 +2118,10 @@ GLuint HoneycombTransition::makeShader() const
+ return OpenGLHelper::LoadShaders( "honeycombVertexShader", "honeycombFragmentShader", "honeycombGeometryShader" );
+ }
+
+-void HoneycombTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex )
++void HoneycombTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext )
+ {
+ CHECK_GL_ERROR();
+- PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex );
++ PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex, pContext );
+
+ CHECK_GL_ERROR();
+ maHexagonSizeLocation = glGetUniformLocation(m_nProgramObject, "hexagonSize");
+@@ -2194,11 +2195,11 @@ void HoneycombTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_In
+ return;
+ }
+
+- glBindFramebuffer(GL_FRAMEBUFFER, 0);
++ pContext->restoreDefaultFramebuffer();
+ }
+
+ void HoneycombTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
+- double SlideWidthScale, double SlideHeightScale )
++ double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext )
+ {
+ CHECK_GL_ERROR();
+ applyOverallOperations(nTime, SlideWidthScale, SlideHeightScale);
+@@ -2222,7 +2223,7 @@ void HoneycombTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlide
+
+ // The back (entering) slide needs to be drawn before the front (leaving) one in order for blending to work.
+ glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
+- glBindFramebuffer(GL_FRAMEBUFFER, 0);
++ pContext->restoreDefaultFramebuffer();
+ glUniform1f(mnShadowLocation, 0.0);
+ glUniform1f(maSelectedTextureLocation, 0.0);
+ glUniform1f(maHexagonSizeLocation, 1.0f - borderSize);
+diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
+index fe6a1c5..81288db 100644
+--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
++++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
+@@ -35,6 +35,7 @@
+ #include <vector>
+
+ class Primitive;
++class OpenGLContext;
+ class Operation;
+ class SceneObject;
+ class TransitionData;
+@@ -139,10 +140,10 @@ public:
+
+ /** Prepare transition.
+ */
+- bool prepare( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex );
++ bool prepare( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext );
+ /** Display a step of the transition.
+ */
+- void display( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight );
++ void display( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight, OpenGLContext *pContext );
+ /** Clean up after transition.
+ */
+ void finish();
+@@ -185,7 +186,7 @@ private:
+ *
+ * Default implementation does nothing.
+ */
+- virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex );
++ virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext );
+
+ /** This function is called when the transition needs to clear after itself, like delete own textures etc.
+ *
+@@ -198,7 +199,7 @@ private:
+ * Default implementation applies overall operations and then
+ * displays both slides.
+ */
+- virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale );
++ virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext );
+
+ /** This function is called in prepare method to create the GL program.
+ *
+diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx
+index 266228c..67de19b 100644
+--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx
++++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx
+@@ -408,7 +408,7 @@ void OGLTransitionerImpl::impl_prepareSlides()
+ bool OGLTransitionerImpl::impl_prepareTransition()
+ {
+ if( mpTransition && mpTransition->getSettings().mnRequiredGLVersion <= mnGLVersion )
+- return mpTransition->prepare( maLeavingSlideGL, maEnteringSlideGL );
++ return mpTransition->prepare( maLeavingSlideGL, maEnteringSlideGL, mpContext.get() );
+ return false;
+ }
+
+@@ -1053,10 +1053,11 @@ void SAL_CALL OGLTransitionerImpl::update( double nTime ) throw (uno::RuntimeExc
+ CHECK_GL_ERROR();
+
+ const GLWindow& rGLWindow(mpContext->getOpenGLWindow());
+- mpTransition->display( nTime, maLeavingSlideGL, maEnteringSlideGL,
++ mpTransition->display(nTime, maLeavingSlideGL, maEnteringSlideGL,
+ maSlideSize.Width, maSlideSize.Height,
+ static_cast<double>(rGLWindow.Width),
+- static_cast<double>(rGLWindow.Height) );
++ static_cast<double>(rGLWindow.Height),
++ mpContext.get());
+
+ mpContext->swapBuffers();
+
+diff --git a/vcl/inc/unx/gtk/gtkinst.hxx b/vcl/inc/unx/gtk/gtkinst.hxx
+index 941fa4a..6e114d1 100644
+--- a/vcl/inc/unx/gtk/gtkinst.hxx
++++ b/vcl/inc/unx/gtk/gtkinst.hxx
+@@ -236,6 +236,7 @@ public:
+ virtual css::uno::Reference< css::uno::XInterface > CreateClipboard( const css::uno::Sequence< css::uno::Any >& i_rArguments ) override;
+ virtual css::uno::Reference< css::uno::XInterface > CreateDragSource() override;
+ virtual css::uno::Reference< css::uno::XInterface > CreateDropTarget() override;
++ virtual OpenGLContext* CreateOpenGLContext() override;
+ #endif
+
+ virtual const cairo_font_options_t* GetCairoFontOptions() override;
+diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx
+index 2412191..0e2a48d 100644
+--- a/vcl/source/opengl/OpenGLContext.cxx
++++ b/vcl/source/opengl/OpenGLContext.cxx
+@@ -313,6 +313,11 @@ void OpenGLContext::InitGLDebugging()
+ #endif
+ }
+
++void OpenGLContext::restoreDefaultFramebuffer()
++{
++ glBindFramebuffer(GL_FRAMEBUFFER, 0);
++}
++
+ void OpenGLContext::setWinPosAndSize(const Point &rPos, const Size& rSize)
+ {
+ if(m_xWindow)
+diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
+index 7202b468..7bb8adb 100644
+--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
++++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
+@@ -916,4 +916,131 @@ Reference< XInterface > GtkInstance::CreateDragSource()
+ return Reference< XInterface >( static_cast<cppu::OWeakObject *>(new GtkDragSource()) );
+ }
+
++class GtkOpenGLContext : public OpenGLContext
++{
++ GLWindow m_aGLWin;
++ GtkWidget *m_pGLArea;
++
++public:
++ GtkOpenGLContext()
++ : OpenGLContext()
++ , m_pGLArea(nullptr)
++ {
++ }
++
++ virtual bool initWindow() override
++ {
++ if( !m_pChildWindow )
++ {
++ SystemWindowData winData = generateWinData(mpWindow, mbRequestLegacyContext);
++ m_pChildWindow = VclPtr<SystemChildWindow>::Create(mpWindow, 0, &winData, false);
++ }
++
++ if (m_pChildWindow)
++ {
++ InitChildWindow(m_pChildWindow.get());
++ }
++
++ return true;
++ }
++
++private:
++ virtual const GLWindow& getOpenGLWindow() const override { return m_aGLWin; }
++ virtual GLWindow& getModifiableOpenGLWindow() override { return m_aGLWin; }
++
++ static void signalDestroy(GtkWidget*, gpointer context)
++ {
++ GtkOpenGLContext* pThis = static_cast<GtkOpenGLContext*>(context);
++ pThis->m_pGLArea = nullptr;
++ }
++
++ virtual bool ImplInit() override
++ {
++#if GTK_CHECK_VERSION(3,16,0)
++ const SystemEnvData* pEnvData = m_pChildWindow->GetSystemData();
++ GtkWidget *pParent = static_cast<GtkWidget*>(pEnvData->pWidget);
++ m_pGLArea = gtk_gl_area_new();
++ g_signal_connect(G_OBJECT(m_pGLArea), "destroy", G_CALLBACK(signalDestroy), this);
++ gtk_gl_area_set_has_depth_buffer(GTK_GL_AREA(m_pGLArea), true);
++ gtk_gl_area_set_auto_render(GTK_GL_AREA(m_pGLArea), false);
++ gtk_widget_set_hexpand(m_pGLArea, true);
++ gtk_widget_set_vexpand(m_pGLArea, true);
++ gtk_container_add(GTK_CONTAINER(pParent), m_pGLArea);
++ gtk_widget_show_all(pParent);
++ gtk_gl_area_make_current(GTK_GL_AREA(m_pGLArea));
++ gtk_gl_area_attach_buffers(GTK_GL_AREA(m_pGLArea));
++#endif
++ bool bRet = InitGL();
++ InitGLDebugging();
++ return bRet;
++ }
++
++ virtual void restoreDefaultFramebuffer() override
++ {
++ OpenGLContext::restoreDefaultFramebuffer();
++#if GTK_CHECK_VERSION(3,16,0)
++ gtk_gl_area_attach_buffers(GTK_GL_AREA(m_pGLArea));
++#endif
++ }
++
++ virtual void makeCurrent() override
++ {
++ if (isCurrent())
++ return;
++
++ clearCurrent();
++
++#if GTK_CHECK_VERSION(3,16,0)
++ if (m_pGLArea)
++ gtk_gl_area_make_current(GTK_GL_AREA(m_pGLArea));
++#endif
++
++ registerAsCurrent();
++ }
++
++ virtual void destroyCurrentContext() override
++ {
++#if GTK_CHECK_VERSION(3,16,0)
++ gdk_gl_context_clear_current();
++#endif
++ }
++
++ virtual bool isCurrent() override
++ {
++#if GTK_CHECK_VERSION(3,16,0)
++ return m_pGLArea && gdk_gl_context_get_current() == gtk_gl_area_get_context(GTK_GL_AREA(m_pGLArea));
++#else
++ return false;
++#endif
++ }
++
++ virtual void sync() override
++ {
++#if GTK_CHECK_VERSION(3,16,0)
++ gtk_gl_area_queue_render(GTK_GL_AREA(m_pGLArea));
++#endif
++ }
++
++ virtual void resetCurrent() override
++ {
++ clearCurrent();
++#if GTK_CHECK_VERSION(3,16,0)
++ gdk_gl_context_clear_current();
++#endif
++ }
++
++ virtual void swapBuffers() override
++ {
++#if GTK_CHECK_VERSION(3,16,0)
++ gtk_gl_area_queue_render(GTK_GL_AREA(m_pGLArea));
++#endif
++ BuffersSwapped();
++ }
++};
++
++OpenGLContext* GtkInstance::CreateOpenGLContext()
++{
++ return new GtkOpenGLContext;
++}
++
+ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+--
+2.9.3
+
diff --git a/patches/series b/patches/series
index a1a715e..9f15842 100644
--- a/patches/series
+++ b/patches/series
@@ -34,3 +34,4 @@ sparc64.diff
startcenter-grey-out-not-installed.diff
no-openssl.diff
m68k-java-arch.diff
+gtk3-opengl-slideshow.diff
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-openoffice/libreoffice.git
More information about the Pkg-openoffice-commits
mailing list