[Libreoffice-commits] core.git: vcl/workben

Michael Meeks michael.meeks at collabora.com
Wed Sep 2 14:49:09 PDT 2015


 vcl/workben/vcldemo.cxx |   47 +++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 43 insertions(+), 4 deletions(-)

New commits:
commit 4d841e5f616a117956eaeecf74835efaa5973a7f
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Mon Aug 31 21:42:54 2015 +0100

    Add another vcldemo OpenGL test to try to catch another Windows nasty.
    
    Change-Id: I43e48617617e89f5aa089ef1487215c5b81c50bc

diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 7ff45e0..043c062 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -1660,9 +1660,9 @@ class OpenGLTests
     OpenGLContext *mpA;
     OpenGLContext *mpB;
 
-    static OpenGLSalGraphicsImpl *getImpl(const VclPtr<WorkWindow> &xWin)
+    static OpenGLSalGraphicsImpl *getImpl(const VclPtr<WorkWindow> &xOut)
     {
-        SalGraphics *pGraphics = xWin->GetGraphics();
+        SalGraphics *pGraphics = xOut->GetGraphics();
         return dynamic_cast<OpenGLSalGraphicsImpl *>(pGraphics->GetImpl());
     }
 public:
@@ -1683,6 +1683,7 @@ public:
         mpB = mpImplB->GetOpenGLContext();
 
         assert (mpA && mpB);
+        assert (mpA != mpB);
     }
     ~OpenGLTests()
     {
@@ -1698,19 +1699,57 @@ public:
         {
             OpenGLTexture aTexture(256,128);
             pBuffer = mpA->AcquireFramebuffer(aTexture);
-            pBuffer->DetachTexture(); // TESTME - remove this line too ...
         }
-        assert (pBuffer->IsFree());
+        assert (pBuffer->IsFree()); (void)pBuffer;
         mpB->makeCurrent();
         assert (mpA->mpCurrentFramebuffer == NULL);
     }
 
+    void testVirtualDevice()
+    {
+        fprintf(stderr, "test sharing OpenGLContexts with virtual-devices reference counting\n");
+        VclPtrInstance<WorkWindow> xTempWin(nullptr, WB_STDWORK);
+        xTempWin->Show();
+        // forcibly make this context current by rendering
+        xTempWin->DrawPixel(Point(0, 0), COL_RED);
+
+        // get some other guys to leach off this context
+        VclPtrInstance<VirtualDevice> xVDev;
+        OpenGLContext *pContext = getImpl(xVDev)->GetOpenGLContext();
+        VclPtrInstance<VirtualDevice> xVDev2;
+        OpenGLContext *pContext2 = getImpl(xVDev)->GetOpenGLContext();
+
+        // sharing the same off-screen context.
+        assert(pContext == pContext2);
+        assert(pContext == getImpl(xTempWin)->GetOpenGLContext());
+        assert(pContext != mpA && pContext != mpB);
+        (void)pContext; (void)pContext2;
+
+        // Kill the parent we free-ride on ...
+        xTempWin.disposeAndClear();
+
+        // This appears to continue working; fun.
+        Point aPt(0, 0);
+        xVDev->DrawPixel(aPt, COL_GREEN);
+        assert(xVDev->GetPixel(aPt) == COL_GREEN);
+        xVDev.disposeAndClear();
+
+        // Switch context to see if we can switch back.
+        mxWinA->DrawPixel(aPt, COL_WHITE);
+
+        // Now try switching back to this guy ...
+        xVDev2->DrawPixel(aPt, COL_BLUE);
+        assert(xVDev2->GetPixel(aPt) == COL_BLUE);
+        xVDev2.disposeAndClear();
+    }
+
     int execute()
     {
         if (!OpenGLHelper::isVCLOpenGLEnabled())
             return 1;
 
         testCurrentFramebuffer();
+        testVirtualDevice();
 
         return 0;
     }


More information about the Libreoffice-commits mailing list