[Libreoffice-commits] core.git: include/vcl vcl/Executable_vcldemo.mk vcl/inc vcl/opengl vcl/source vcl/workben

Michael Meeks michael.meeks at collabora.com
Mon Aug 31 12:48:42 PDT 2015


 include/vcl/opengl/OpenGLContext.hxx |    2 
 vcl/Executable_vcldemo.mk            |    7 ++
 vcl/inc/opengl/framebuffer.hxx       |    2 
 vcl/inc/opengl/texture.hxx           |    2 
 vcl/inc/openglgdiimpl.hxx            |    4 +
 vcl/opengl/framebuffer.cxx           |    2 
 vcl/source/opengl/OpenGLContext.cxx  |    5 ++
 vcl/workben/vcldemo.cxx              |   86 ++++++++++++++++++++++++++++++++++-
 8 files changed, 103 insertions(+), 7 deletions(-)

New commits:
commit b27b9084c5b55f6cf6732fb9bdc253658ea612ea
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Sat Aug 29 23:15:54 2015 +0100

    tdf#93772 - handle framebuffer unbinding on GL context switch.
    
    Also start gl tests in vcldemo:
        $ SAL_FORCEGL=1 vcldemo --gltests
    
    Change-Id: I8f0022770d57cd60c830659e3f7fcc0721320a10
    Reviewed-on: https://gerrit.libreoffice.org/18132
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    Tested-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/include/vcl/opengl/OpenGLContext.hxx b/include/vcl/opengl/OpenGLContext.hxx
index 96abe49..cb45973 100644
--- a/include/vcl/opengl/OpenGLContext.hxx
+++ b/include/vcl/opengl/OpenGLContext.hxx
@@ -63,6 +63,7 @@ class OpenGLFramebuffer;
 class OpenGLProgram;
 class OpenGLTexture;
 class SalGraphicsImpl;
+class OpenGLTests;
 
 /// Holds the information of our new child window
 struct GLWindow
@@ -166,6 +167,7 @@ struct GLWindow
 
 class VCL_DLLPUBLIC OpenGLContext
 {
+    friend class OpenGLTests;
 public:
     OpenGLContext();
     ~OpenGLContext();
diff --git a/vcl/Executable_vcldemo.mk b/vcl/Executable_vcldemo.mk
index 5fa49e6..c86c7fa 100644
--- a/vcl/Executable_vcldemo.mk
+++ b/vcl/Executable_vcldemo.mk
@@ -15,7 +15,12 @@ $(eval $(call gb_Executable_use_api,vcldemo,\
     udkapi \
 ))
 
-$(eval $(call gb_Executable_use_external,vcldemo,boost_headers))
+$(eval $(call gb_Executable_use_externals,vcldemo,\
+	boost_headers \
+	glew \
+	glm_headers \
+    mesa_headers \
+))
 
 $(eval $(call gb_Executable_set_include,vcldemo,\
     $$(INCLUDE) \
diff --git a/vcl/inc/opengl/framebuffer.hxx b/vcl/inc/opengl/framebuffer.hxx
index 5d5e870..7acd710 100644
--- a/vcl/inc/opengl/framebuffer.hxx
+++ b/vcl/inc/opengl/framebuffer.hxx
@@ -15,7 +15,7 @@
 
 #include <opengl/texture.hxx>
 
-class VCL_PLUGIN_PUBLIC OpenGLFramebuffer
+class VCL_DLLPUBLIC OpenGLFramebuffer
 {
 private:
     GLuint      mnId;
diff --git a/vcl/inc/opengl/texture.hxx b/vcl/inc/opengl/texture.hxx
index a6117a7..89fc500 100644
--- a/vcl/inc/opengl/texture.hxx
+++ b/vcl/inc/opengl/texture.hxx
@@ -79,7 +79,7 @@ public:
     int FindFreeSlot();
 };
 
-class VCL_PLUGIN_PUBLIC OpenGLTexture
+class VCL_DLLPUBLIC OpenGLTexture
 {
 private:
     // if the rect size doesn't match the mpImpl one, this instance
diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index 912b917..c95453e 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -34,6 +34,7 @@
 
 class SalFrame;
 class SalVirtualDevice;
+class OpenGLTests;
 
 namespace basegfx
 {
@@ -46,8 +47,9 @@ struct TextureCombo
     std::unique_ptr<OpenGLTexture> mpMask;
 };
 
-class VCL_PLUGIN_PUBLIC OpenGLSalGraphicsImpl : public SalGraphicsImpl
+class VCL_DLLPUBLIC OpenGLSalGraphicsImpl : public SalGraphicsImpl
 {
+    friend class OpenGLTests;
 protected:
 
     OpenGLContext* mpContext;
diff --git a/vcl/opengl/framebuffer.cxx b/vcl/opengl/framebuffer.cxx
index 7e19981..b1135fc 100644
--- a/vcl/opengl/framebuffer.cxx
+++ b/vcl/opengl/framebuffer.cxx
@@ -32,8 +32,8 @@ OpenGLFramebuffer::~OpenGLFramebuffer()
 
 void OpenGLFramebuffer::Bind()
 {
-    glBindFramebuffer( GL_FRAMEBUFFER, mnId );
     VCL_GL_INFO( "vcl.opengl", "Binding framebuffer " << (int)mnId );
+    glBindFramebuffer( GL_FRAMEBUFFER, mnId );
     CHECK_GL_ERROR();
 }
 
diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx
index cb05356..0d7e9cc 100644
--- a/vcl/source/opengl/OpenGLContext.cxx
+++ b/vcl/source/opengl/OpenGLContext.cxx
@@ -1566,6 +1566,7 @@ void OpenGLContext::ReleaseFramebuffer( OpenGLFramebuffer* pFramebuffer )
 void OpenGLContext::ReleaseFramebuffer( const OpenGLTexture& rTexture )
 {
     OpenGLZone aZone;
+
     OpenGLFramebuffer* pFramebuffer = mpLastFramebuffer;
 
     while( pFramebuffer )
@@ -1574,6 +1575,8 @@ void OpenGLContext::ReleaseFramebuffer( const OpenGLTexture& rTexture )
         {
             BindFramebuffer( pFramebuffer );
             pFramebuffer->DetachTexture();
+            if (mpCurrentFramebuffer == pFramebuffer)
+                BindFramebuffer( NULL );
         }
         pFramebuffer = pFramebuffer->mpPrevFramebuffer;
     }
@@ -1582,6 +1585,7 @@ void OpenGLContext::ReleaseFramebuffer( const OpenGLTexture& rTexture )
 void OpenGLContext::ReleaseFramebuffers()
 {
     OpenGLZone aZone;
+
     OpenGLFramebuffer* pFramebuffer = mpLastFramebuffer;
     while( pFramebuffer )
     {
@@ -1592,6 +1596,7 @@ void OpenGLContext::ReleaseFramebuffers()
         }
         pFramebuffer = pFramebuffer->mpPrevFramebuffer;
     }
+    BindFramebuffer( NULL );
 }
 
 OpenGLProgram* OpenGLContext::GetProgram( const OUString& rVertexShader, const OUString& rFragmentShader, const OString& preamble )
diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 9218afd..417d69f 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -44,6 +44,14 @@
 #include <vcldemo-debug.hxx>
 #include <opengl/zone.hxx>
 
+// internal headers for OpenGLTests class.
+#include "salgdi.hxx"
+#include "salframe.hxx"
+#include "openglgdiimpl.hxx"
+#include "opengl/texture.hxx"
+#include "opengl/framebuffer.hxx"
+#include <vcl/opengl/OpenGLHelper.hxx>
+
 #include <rtl/math.hxx>
 
 #define FIXME_SELF_INTERSECTING_WORKING 0
@@ -1643,6 +1651,71 @@ class DemoPopup : public FloatingWindow
     }
 };
 
+class OpenGLTests
+{
+    VclPtr<WorkWindow> mxWinA;
+    VclPtr<WorkWindow> mxWinB;
+    OpenGLSalGraphicsImpl *mpImplA;
+    OpenGLSalGraphicsImpl *mpImplB;
+    OpenGLContext *mpA;
+    OpenGLContext *mpB;
+
+    OpenGLSalGraphicsImpl *getImpl(const VclPtr<WorkWindow> &xWin)
+    {
+        SalGraphics *pGraphics = xWin->GetGraphics();
+        return dynamic_cast<OpenGLSalGraphicsImpl *>(pGraphics->GetImpl());
+    }
+public:
+    OpenGLTests() :
+        mxWinA(VclPtr<WorkWindow>::Create(nullptr, WB_APP | WB_STDWORK)),
+        mxWinB(VclPtr<WorkWindow>::Create(nullptr, WB_APP | WB_STDWORK))
+    {
+        if (!OpenGLHelper::isVCLOpenGLEnabled())
+        {
+            fprintf (stderr, "OpenGL is not enabled: try SAL_FORCEGL=1\n");
+            return;
+        }
+
+        mpImplA = getImpl(mxWinA);
+        mpImplB = getImpl(mxWinB);
+        assert (mpImplA && mpImplB);
+        mpA = mpImplA->GetOpenGLContext();
+        mpB = mpImplB->GetOpenGLContext();
+
+        assert (mpA && mpB);
+    }
+    ~OpenGLTests()
+    {
+        mxWinB.disposeAndClear();
+        mxWinA.disposeAndClear();
+    }
+
+    void testCurrentFramebuffer()
+    {
+        fprintf(stderr,"test OpenGLContext's framebuffer association.\n");
+        mpA->makeCurrent();
+        OpenGLFramebuffer *pBuffer;
+        {
+            OpenGLTexture aTexture(256,128);
+            pBuffer = mpA->AcquireFramebuffer(aTexture);
+            pBuffer->DetachTexture(); // TESTME - remove this line too ...
+        }
+        assert (pBuffer->IsFree());
+        mpB->makeCurrent();
+        assert (mpA->mpCurrentFramebuffer == NULL);
+    }
+
+    int execute()
+    {
+        if (!OpenGLHelper::isVCLOpenGLEnabled())
+            return 1;
+
+        testCurrentFramebuffer();
+
+        return 0;
+    }
+};
+
 class DemoApp : public Application
 {
     static int showHelp(DemoRenderer &rRenderer)
@@ -1656,6 +1729,7 @@ class DemoApp : public Application
         fprintf(stderr,"  --test <iterCount> - create benchmark data\n");
         fprintf(stderr,"  --widgets          - launch the widget test.\n");
         fprintf(stderr,"  --threads          - render from multiple threads.\n");
+        fprintf(stderr,"  --gltest           - run openGL regression tests.\n");
         fprintf(stderr, "\n");
         return 0;
     }
@@ -1667,7 +1741,8 @@ public:
     {
         try
         {
-            bool bWidgets = false, bThreads = false, bPopup = false;
+            bool bWidgets = false, bThreads = false;
+            bool bPopup = false, bGLTest = false;
             DemoRenderer aRenderer;
 
             for (sal_Int32 i = 0; i < GetCommandLineParamCount(); i++)
@@ -1694,6 +1769,8 @@ public:
                     bWidgets = true;
                 else if (aArg == "--popup")
                     bPopup = true;
+                else if (aArg == "--gltest")
+                    bGLTest = true;
                 else if (aArg == "--threads")
                     bThreads = true;
                 else if (aArg.startsWith("--"))
@@ -1710,7 +1787,12 @@ public:
 
             aMainWin->SetText("Interactive VCL demo #1");
 
-            if (bWidgets)
+            if (bGLTest)
+            {
+                OpenGLTests aTests;
+                return aTests.execute();
+            }
+            else if (bWidgets)
                 xWidgets = VclPtr< DemoWidgets >::Create ();
             else if (bPopup)
                 xPopup = VclPtrInstance< DemoPopup> ();


More information about the Libreoffice-commits mailing list