rework diamond transition to use only opengl core
authorCaolán McNamara <caolanm@redhat.com>
Thu, 1 Dec 2016 12:32:09 +0000 (12:32 +0000)
committerPeter Michael Green <plugwash@raspbian.org>
Sun, 26 Mar 2017 15:06:24 +0000 (15:06 +0000)
cause that's all we've got in gtk3

Change-Id: I6a47e344ccd39ba63e7a51ae18f89bb05bb642c4

Gbp-Pq: Name gtk3-opengl-slideshow.diff

include/vcl/opengl/OpenGLContext.hxx
slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx
vcl/inc/unx/gtk/gtkinst.hxx
vcl/source/opengl/OpenGLContext.cxx
vcl/unx/gtk3/gtk3gtkinst.cxx

index a7cc2d6de28bce95899927bb28519ad05e28eb73..2b46eb648fdb25f8a2c1a626dc2dced14ef67259 100644 (file)
@@ -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();
index 8b508c637baaaf6f28e4b972a9ce412b70ef38ba..a89546243997fd1ee3a87ec45c3a0e6f07e8f001 100644 (file)
@@ -30,6 +30,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>
@@ -133,7 +134,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)
@@ -201,7 +202,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;
 }
 
@@ -234,7 +235,7 @@ void OGLTransitionImpl::finish( double, double, double, double, double )
 {
 }
 
-void OGLTransitionImpl::prepareTransition( sal_Int32, sal_Int32 )
+void OGLTransitionImpl::prepareTransition( sal_Int32, sal_Int32, OpenGLContext* )
 {
 }
 
@@ -242,7 +243,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 );
@@ -258,7 +259,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;
@@ -268,7 +269,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();
@@ -316,8 +317,6 @@ OGLTransitionImpl::displayUnbufferedSlide(
         const sal_Int32 glSlideTex, const Primitives_t& primitives,
         double SlideWidthScale, double SlideHeightScale )
 {
-    CHECK_GL_ERROR();
-    glPushMatrix();
     CHECK_GL_ERROR();
     glBindTexture(GL_TEXTURE_2D, glSlideTex);
     CHECK_GL_ERROR();
@@ -336,8 +335,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 +357,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, Vertices.size() );
     CHECK_GL_ERROR();
-    glPopClientAttrib();
+
+    glDeleteBuffers(1, &nBuffer);
+    CHECK_GL_ERROR();
+
+    glDeleteVertexArrays(1, &nVertexArrayObject);
 
     CHECK_GL_ERROR();
 }
@@ -525,9 +538,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);
     }
 
@@ -542,7 +555,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 );
@@ -590,7 +603,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
@@ -599,7 +612,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 );
@@ -849,10 +862,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 );
 
@@ -1187,13 +1200,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 );
@@ -1405,7 +1418,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 */
@@ -1482,7 +1495,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" );
@@ -1623,8 +1636,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;
@@ -1673,10 +1686,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");
@@ -1777,7 +1790,7 @@ void VortexTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32
         }
     }
 
-    glBindFramebuffer(GL_FRAMEBUFFER, 0);
+    pContext->restoreDefaultFramebuffer();
     glBindTexture(GL_TEXTURE_2D, 0);
 
     glActiveTexture( GL_TEXTURE2 );
@@ -1787,7 +1800,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 );
@@ -1809,7 +1822,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 );
@@ -1871,7 +1884,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;
@@ -1883,7 +1896,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();
@@ -1968,7 +1981,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;
@@ -1984,10 +1997,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");
@@ -2072,8 +2085,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;
@@ -2106,10 +2119,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");
@@ -2183,11 +2196,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);
@@ -2211,7 +2224,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);
index 2a7c472ada69aabb941819a36a4aaf372976d8ee..0634de897c06214336be49fe267e50f7eaac2e2b 100644 (file)
@@ -37,6 +37,7 @@
 #include <vector>
 
 class Primitive;
+class OpenGLContext;
 class Operation;
 class SceneObject;
 class TransitionData;
@@ -141,10 +142,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();
@@ -187,7 +188,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.
       *
@@ -200,7 +201,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.
       *
index a428e99dc4c8dad79651b58d08bb064b1a577471..7539c99840016bbd0152f6a8e9dbf35bc9d0a6c4 100644 (file)
@@ -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();
 
index 941fa4acb2c58f3f13f10f371b0cecb61b5e7286..6e114d1731e45688930bfd6c956049863ff350c9 100644 (file)
@@ -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;
index ffe5f3619136d11434e5b28e649f9b62ecb07a4f..1955b18d990aa0a8f6b2daa6f37683842b40fde0 100644 (file)
@@ -335,6 +335,11 @@ void OpenGLContext::InitGLEWDebugging()
 #endif
 }
 
+void OpenGLContext::restoreDefaultFramebuffer()
+{
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);
+}
+
 void OpenGLContext::setWinPosAndSize(const Point &rPos, const Size& rSize)
 {
     if(m_xWindow)
index 7202b4681c8d49ec356cc01040768ed8bb22e585..2a47a2b7653c491d21b71857086b1a98a2b32217 100644 (file)
@@ -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 = InitGLEW();
+        InitGLEWDebugging();
+        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: */