[Libreoffice-commits] core.git: Branch 'feature/fixes22' - 4 commits - vcl/opengl

Tomaž Vajngerl tomaz.vajngerl at collabora.co.uk
Wed Jun 1 05:04:07 UTC 2016


 vcl/opengl/combinedTextureFragmentShader.glsl |    7 +++++++
 vcl/opengl/combinedTextureVertexShader.glsl   |    9 +++++++++
 2 files changed, 16 insertions(+)

New commits:
commit df6b2fdc1587f4529290978f3b5ffba547de2b27
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Tue May 31 16:15:21 2016 +0900

    opengl: improve overlap tracking
    
    Instead of tracking the overlap with only one rectangle use more
    rectangles and add elements to the rectangle that increases the
    combined area the least. If a new entry overlaps with at least
    on rectangle then create a new list. Current limit the number of
    rectangles to 30.
    
    Change-Id: I3db619afc1fdd98fe7314c930e909bf2c93d7b2c

diff --git a/vcl/inc/opengl/RenderList.hxx b/vcl/inc/opengl/RenderList.hxx
index 32ece73..e63f5dc 100644
--- a/vcl/inc/opengl/RenderList.hxx
+++ b/vcl/inc/opengl/RenderList.hxx
@@ -38,6 +38,8 @@ struct RenderTextureParameters
 
 struct RenderEntry
 {
+    basegfx::B2DRange maOverlapTrackingRectangle;
+
     RenderParameters maTriangleParameters;
     RenderParameters maLineParameters;
     RenderParameters maLineAAParameters;
@@ -68,19 +70,59 @@ struct RenderEntry
 class RenderList
 {
 private:
-    basegfx::B2DRange maOverlapTrackingRectangle;
     std::vector<RenderEntry> maRenderEntries;
+    std::vector<basegfx::B2DRange> maRectangles;
+
+    bool doesOverlap(const basegfx::B2DRange& rDrawRectangle)
+    {
+        if (!maRenderEntries.back().maOverlapTrackingRectangle.overlaps(rDrawRectangle))
+            return false;
+
+        for (const basegfx::B2DRange& rRectangle : maRectangles)
+        {
+            if (rRectangle.overlaps(rDrawRectangle))
+                return true;
+        }
+        return false;
+    }
 
     void checkOverlapping(const basegfx::B2DRange& rDrawRectangle)
     {
-        if (maRenderEntries.empty() || maOverlapTrackingRectangle.overlaps(rDrawRectangle))
+        if (maRenderEntries.empty() || doesOverlap(rDrawRectangle))
         {
             maRenderEntries.resize(maRenderEntries.size() + 1);
-            maOverlapTrackingRectangle = rDrawRectangle;
+            maRenderEntries.back().maOverlapTrackingRectangle = rDrawRectangle;
+
+            maRectangles.clear();
+            maRectangles.reserve(30);
+            maRectangles.push_back(rDrawRectangle);
         }
         else
         {
-            maOverlapTrackingRectangle.expand(rDrawRectangle);
+            maRenderEntries.back().maOverlapTrackingRectangle.expand(rDrawRectangle);
+
+            if (maRectangles.size() < 30)
+            {
+                maRectangles.push_back(rDrawRectangle);
+            }
+            else
+            {
+                basegfx::B2DRange aTempRectangle(maRectangles[0]);
+                aTempRectangle.expand(rDrawRectangle);
+                double minArea = aTempRectangle.getWidth() * aTempRectangle.getHeight();
+                size_t index = 0;
+
+                double area;
+                for (size_t i = 1; i < maRectangles.size(); ++i)
+                {
+                    aTempRectangle = basegfx::B2DRange(maRectangles[i]);
+                    aTempRectangle.expand(rDrawRectangle);
+                    area = aTempRectangle.getWidth() * aTempRectangle.getHeight();
+                    if (area < minArea)
+                        index = i;
+                }
+                maRectangles[index].expand(rDrawRectangle);
+            }
         }
     }
 
@@ -96,7 +138,6 @@ public:
     void clear()
     {
         maRenderEntries.clear();
-        maOverlapTrackingRectangle.reset();
     }
 
     std::vector<RenderEntry>& getEntries()
commit a5814ee7bb01e39ab6554ee3c844489b34fc2ace
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Tue May 31 12:26:04 2016 +0900

    opengl: deferred texture drawing in RenderList, add drawAlphaRect
    
    Drawing accumulated textures (in Accumulatedtextures) is independent
    of drawing with render list which causes problems with rendering
    order when render list and accumulated textures are flushed. To
    solve this we need to combine both so we can check for overlapped
    drawing.
    
    Previously drawRect was using RenderList batch drawing but not
    drawAlphaRect which is essentially the same as drawRect but
    additionally supports alpha value. This adds support to draw
    alpha rectangles to RenderList and converts drawAlphaRect.
    
    + update combined texture shaders
    
    Change-Id: I82bf0b410e5ebabb13bab7b29a2e53a6fdaa404f

diff --git a/vcl/inc/opengl/AccumulatedTextures.hxx b/vcl/inc/opengl/AccumulatedTextures.hxx
deleted file mode 100644
index 504cf6a..0000000
--- a/vcl/inc/opengl/AccumulatedTextures.hxx
+++ /dev/null
@@ -1,99 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- */
-
-#ifndef INCLUDED_VCL_INC_OPENGL_ACCUMULATEDTEXTURES_H
-#define INCLUDED_VCL_INC_OPENGL_ACCUMULATEDTEXTURES_H
-
-#include <vcl/opengl/OpenGLHelper.hxx>
-
-#include <o3tl/make_unique.hxx>
-#include "opengl/texture.hxx"
-#include "opengl/VertexUtils.hxx"
-#include <memory>
-
-struct TextureDrawParameters
-{
-    std::vector<GLfloat> maVertices;
-    std::vector<GLfloat> maTextureCoords;
-};
-
-struct AccumulatedTexturesEntry
-{
-    OpenGLTexture maTexture;
-    std::unordered_map<SalColor, TextureDrawParameters> maColorTextureDrawParametersMap;
-
-    AccumulatedTexturesEntry(const OpenGLTexture& rTexture)
-        : maTexture(rTexture)
-    {}
-
-    void insert(const OpenGLTexture& rTexture, const SalColor& aColor, const SalTwoRect& r2Rect)
-    {
-        TextureDrawParameters& aDrawParameters = maColorTextureDrawParametersMap[aColor];
-        rTexture.FillCoords<GL_TRIANGLES>(aDrawParameters.maTextureCoords, r2Rect, false);
-
-        GLfloat fX1 = r2Rect.mnDestX;
-        GLfloat fY1 = r2Rect.mnDestY;
-        GLfloat fX2 = fX1 + r2Rect.mnDestWidth;
-        GLfloat fY2 = fY1 + r2Rect.mnDestHeight;
-
-        std::vector<GLfloat>& rVertices = aDrawParameters.maVertices;
-        vcl::vertex::addRectangle<GL_TRIANGLES>(rVertices, fX1, fY1, fX2, fY2);
-    }
-};
-
-class AccumulatedTextures
-{
-private:
-    typedef std::unordered_map<GLuint, std::unique_ptr<AccumulatedTexturesEntry>> AccumulatedTexturesMap;
-
-    AccumulatedTexturesMap maEntries;
-
-public:
-    AccumulatedTextures()
-    {}
-
-    bool empty()
-    {
-        return maEntries.empty();
-    }
-
-    void clear()
-    {
-        maEntries.clear();
-    }
-
-    bool insert(OpenGLTexture& rTexture, const SalColor& aColor, const SalTwoRect& r2Rect)
-    {
-        if (!rTexture)
-            return false;
-
-        GLuint nTextureId = rTexture.Id();
-
-        if (maEntries.find(nTextureId) == maEntries.end())
-        {
-            OpenGLTexture aWholeTexture(rTexture.GetWholeTexture());
-            maEntries[nTextureId] = o3tl::make_unique<AccumulatedTexturesEntry>(aWholeTexture);
-        }
-
-        std::unique_ptr<AccumulatedTexturesEntry>& rEntry = maEntries[nTextureId];
-        rEntry->insert(rTexture, aColor, r2Rect);
-
-        return true;
-    }
-
-    AccumulatedTexturesMap& getAccumulatedTexturesMap()
-    {
-        return maEntries;
-    }
-};
-
-#endif // INCLUDED_VCL_INC_OPENGL_ACCUMULATEDTEXTURES_H
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/opengl/RenderList.hxx b/vcl/inc/opengl/RenderList.hxx
index d533ad4..32ece73 100644
--- a/vcl/inc/opengl/RenderList.hxx
+++ b/vcl/inc/opengl/RenderList.hxx
@@ -11,12 +11,16 @@
 #ifndef INCLUDED_VCL_INC_OPENGL_RENDERLIST_H
 #define INCLUDED_VCL_INC_OPENGL_RENDERLIST_H
 
+#include <unordered_map>
+
 #include <glm/glm.hpp>
 
 #include <vcl/opengl/OpenGLHelper.hxx>
 #include <vcl/salgtype.hxx>
 #include <basegfx/range/b2drange.hxx>
 
+#include "opengl/texture.hxx"
+
 struct RenderParameters
 {
     std::vector<GLfloat>   maVertices;
@@ -24,12 +28,22 @@ struct RenderParameters
     std::vector<glm::vec4> maColors;
 };
 
+struct RenderTextureParameters
+{
+    std::vector<GLfloat>   maVertices;
+    std::vector<glm::vec4> maColors;
+    std::vector<GLfloat>   maTextureCoords;
+    OpenGLTexture          maTexture;
+};
+
 struct RenderEntry
 {
     RenderParameters maTriangleParameters;
     RenderParameters maLineParameters;
     RenderParameters maLineAAParameters;
 
+    std::unordered_map<GLuint, RenderTextureParameters> maTextureParametersMap;
+
     bool hasTriangles()
     {
         return !maTriangleParameters.maVertices.empty();
@@ -44,6 +58,11 @@ struct RenderEntry
     {
         return !maLineAAParameters.maVertices.empty();
     }
+
+    bool hasTextures()
+    {
+        return !maTextureParametersMap.empty();
+    }
 };
 
 class RenderList
@@ -85,9 +104,11 @@ public:
         return maRenderEntries;
     }
 
+    bool addDrawTextureWithMaskColor(OpenGLTexture& rTexture, const SalColor& rColor, const SalTwoRect& r2Rect);
+
     void addDrawPixel(long nX, long nY, const SalColor& rColor);
 
-    void addDrawRectangle(long nX, long nY, long nWidth, long nHeight,
+    void addDrawRectangle(long nX, long nY, long nWidth, long nHeight, double fTransparency,
                           const SalColor& rLineColor, const SalColor& rFillColor);
 
     void addDrawLine(long nX1, long nY1, long nX2, long nY2, const SalColor& rLineColor, bool bUseAA);
diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index fdc4601..4323787 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -28,7 +28,6 @@
 #include "opengl/program.hxx"
 #include "opengl/texture.hxx"
 #include "regionband.hxx"
-#include "opengl/AccumulatedTextures.hxx"
 #include "opengl/RenderList.hxx"
 
 #include <vcl/opengl/OpenGLContext.hxx>
@@ -101,7 +100,6 @@ protected:
     SalColor mProgramSolidColor;
     double mProgramSolidTransparency;
 
-    std::unique_ptr<AccumulatedTextures>  mpAccumulatedTextures;
     std::unique_ptr<RenderList> mpRenderList;
 
     void ImplInitClipRegion();
diff --git a/vcl/opengl/RenderList.cxx b/vcl/opengl/RenderList.cxx
index de5a9d6..8188319 100644
--- a/vcl/opengl/RenderList.cxx
+++ b/vcl/opengl/RenderList.cxx
@@ -52,10 +52,13 @@ void RenderList::addDrawPixel(long nX, long nY, const SalColor& rColor)
     vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
 }
 
-void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, const SalColor& rLineColor, const SalColor& rFillColor)
+void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, double fTransparency,
+                                  const SalColor& rLineColor, const SalColor& rFillColor)
 {
     if (rLineColor == SALCOLOR_NONE && rFillColor == SALCOLOR_NONE)
         return;
+    if (fTransparency == 1.0f)
+        return;
 
     GLfloat fX1(nX);
     GLfloat fY1(nY);
@@ -74,10 +77,10 @@ void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, c
         vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX2 - 0.5f, fY1 - 0.5f, fX2 + 0.5f, fY2 + 0.5f);
         vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX1 - 0.5f, fY2 - 0.5f, fX2 + 0.5f, fY2 + 0.5f);
 
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, 0.0f);
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, 0.0f);
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, 0.0f);
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, 0.0f);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, fTransparency);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, fTransparency);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, fTransparency);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, fTransparency);
 
         vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
         vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
@@ -95,10 +98,10 @@ void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, c
             vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX2 - 0.5f, fY1 - 0.5f, fX2 + 0.5f, fY2 + 0.5f);
             vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX1 - 0.5f, fY2 - 0.5f, fX2 + 0.5f, fY2 + 0.5f);
 
-            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
-            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
-            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
-            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
+            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
+            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
+            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
+            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
 
             vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
             vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
@@ -107,7 +110,7 @@ void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, c
         }
         // Draw rectangle fill with fill color
         vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX1 + 0.5f, fY1 + 0.5f, fX2 - 0.5f, fY2 - 0.5f);
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
         vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
     }
 }
@@ -213,4 +216,29 @@ void RenderList::addDrawPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPolygon,
     }
 }
 
+bool RenderList::addDrawTextureWithMaskColor(OpenGLTexture& rTexture, const SalColor& rColor, const SalTwoRect& r2Rect)
+{
+    if (!rTexture)
+        return false;
+
+    GLfloat fX1 = r2Rect.mnDestX;
+    GLfloat fY1 = r2Rect.mnDestY;
+    GLfloat fX2 = fX1 + r2Rect.mnDestWidth;
+    GLfloat fY2 = fY1 + r2Rect.mnDestHeight;
+
+    checkOverlapping(basegfx::B2DRange(fX1, fY1, fX2, fY2));
+
+    GLuint nTextureId = rTexture.Id();
+
+    RenderTextureParameters& rTextureParameter = maRenderEntries.back().maTextureParametersMap[nTextureId];
+    rTextureParameter.maTexture = rTexture;
+
+    rTexture.FillCoords<GL_TRIANGLES>(rTextureParameter.maTextureCoords, r2Rect, false);
+
+    vcl::vertex::addRectangle<GL_TRIANGLES>(rTextureParameter.maVertices, fX1, fY1, fX2, fY2);
+    vcl::vertex::addQuadColors<GL_TRIANGLES>(rTextureParameter.maColors, rColor, 0.0f);
+
+    return true;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/opengl/combinedTextureFragmentShader.glsl b/vcl/opengl/combinedTextureFragmentShader.glsl
index d8864cf..67797be 100644
--- a/vcl/opengl/combinedTextureFragmentShader.glsl
+++ b/vcl/opengl/combinedTextureFragmentShader.glsl
@@ -10,6 +10,9 @@
 varying vec2 tex_coord;
 varying vec2 alpha_coord;
 varying vec2 mask_coord;
+#ifdef USE_VERTEX_COLORS
+varying vec4 vertex_color;
+#endif
 
 uniform sampler2D texture;
 uniform sampler2D mask;
@@ -56,7 +59,11 @@ void main()
     }
     else if (type == TYPE_MASKED_COLOR)
     {
+#ifdef USE_VERTEX_COLORS
+        gl_FragColor = vertex_color;
+#else
         gl_FragColor = color;
+#endif
         gl_FragColor.a = 1.0 - texelTexture.r;
     }
 }
diff --git a/vcl/opengl/combinedTextureVertexShader.glsl b/vcl/opengl/combinedTextureVertexShader.glsl
index 883ec63..3086806 100644
--- a/vcl/opengl/combinedTextureVertexShader.glsl
+++ b/vcl/opengl/combinedTextureVertexShader.glsl
@@ -11,10 +11,16 @@ attribute vec4 position;
 attribute vec2 tex_coord_in;
 attribute vec2 mask_coord_in;
 attribute vec2 alpha_coord_in;
+#ifdef USE_VERTEX_COLORS
+attribute vec4 vertex_color_in;
+#endif
 
 varying vec2 tex_coord;
 varying vec2 mask_coord;
 varying vec2 alpha_coord;
+#ifdef USE_VERTEX_COLORS
+varying vec4 vertex_color;
+#endif
 
 uniform mat4 mvp;
 uniform mat4 transform;
@@ -27,6 +33,9 @@ void main()
    tex_coord = tex_coord_in;
    mask_coord = mask_coord_in;
    alpha_coord = alpha_coord_in;
+#ifdef USE_VERTEX_COLORS
+   vertex_color = vertex_color_in;
+#endif
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 8e00d0e..394130c 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -85,7 +85,6 @@ OpenGLSalGraphicsImpl::OpenGLSalGraphicsImpl(SalGraphics& rParent, SalGeometryPr
     , mnDrawCountAtFlush(0)
     , mProgramSolidColor(SALCOLOR_NONE)
     , mProgramSolidTransparency(0.0)
-    , mpAccumulatedTextures(new AccumulatedTextures)
     , mpRenderList(new RenderList)
 {
 }
@@ -1503,107 +1502,90 @@ void OpenGLSalGraphicsImpl::DrawMask( OpenGLTexture& rMask, SalColor nMaskColor,
 
 void OpenGLSalGraphicsImpl::DeferredTextDraw(OpenGLTexture& rTexture, SalColor aMaskColor, const SalTwoRect& rPosAry)
 {
-    mpAccumulatedTextures->insert(rTexture, aMaskColor, rPosAry);
+    mpRenderList->addDrawTextureWithMaskColor(rTexture, aMaskColor, rPosAry);
 }
 
 void OpenGLSalGraphicsImpl::FlushDeferredDrawing()
 {
-    if (mpAccumulatedTextures->empty() && mpRenderList->empty())
+    if (mpRenderList->empty())
         return;
 
     VCL_GL_INFO("FlushDeferredDrawing: " << mpRenderList->getEntries().size());
 
-    if (!mpAccumulatedTextures->empty())
-    {
-        InitializePreDrawState();
-
-        OpenGLZone aZone;
+    InitializePreDrawState(XOROption::IMPLEMENT_XOR);
 
-        if (!UseProgram("combinedTextureVertexShader", "combinedTextureFragmentShader"))
-            return;
-        mpProgram->SetShaderType(TextureShaderType::MaskedColor);
-        mpProgram->SetIdentityTransform("transform");
-        mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-        for (auto& rPair : mpAccumulatedTextures->getAccumulatedTexturesMap())
+    OpenGLZone aZone;
+    for (RenderEntry& rRenderEntry : mpRenderList->getEntries())
+    {
+        if (rRenderEntry.hasTriangles() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
+        {
+            RenderParameters& rParameters = rRenderEntry.maTriangleParameters;
+            VCL_GL_INFO("Flush Triangles: " << rParameters.maVertices.size());
+            mpProgram->SetShaderType(DrawShaderType::Normal);
+            mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            ApplyProgramMatrices(0.5f);
+            mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
+            mpProgram->SetVertexColors(rParameters.maColors);
+            mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
+            CHECK_GL_ERROR();
+            mpProgram->Clean();
+        }
+        if (rRenderEntry.hasLines() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
+        {
+            RenderParameters& rParameters = rRenderEntry.maLineParameters;
+            VCL_GL_INFO("Flush Lines: " << rParameters.maVertices.size());
+            mpProgram->SetShaderType(DrawShaderType::Line);
+            mpProgram->SetUniform1f("line_width", 1.0f);
+            mpProgram->SetUniform1f("feather", 0.0f); // Anti-Aliasing disabled
+            mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            ApplyProgramMatrices(0.5f);
+            mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
+            mpProgram->SetVertexColors(rParameters.maColors);
+            mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
+            CHECK_GL_ERROR();
+            mpProgram->Clean();
+        }
+        if (rRenderEntry.hasLinesAA() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
         {
-            OpenGLTexture& rTexture = rPair.second->maTexture;
-            mpProgram->SetTexture("texture", rTexture);
-            for (auto& rColorTwoRectPair: rPair.second->maColorTextureDrawParametersMap)
+            RenderParameters& rParameters = rRenderEntry.maLineAAParameters;
+            VCL_GL_INFO("Flush Lines AA: " << rParameters.maVertices.size());
+            mpProgram->SetShaderType(DrawShaderType::Line);
+            mpProgram->SetUniform1f("line_width", 1.0f);
+            mpProgram->SetUniform1f("feather", 0.5f); // Anti-Aliasing enabled
+            mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            ApplyProgramMatrices(0.5f);
+            mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
+            mpProgram->SetVertexColors(rParameters.maColors);
+            mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
+            CHECK_GL_ERROR();
+            mpProgram->Clean();
+        }
+        if (rRenderEntry.hasTextures() && UseProgram("combinedTextureVertexShader", "combinedTextureFragmentShader", "#define USE_VERTEX_COLORS"))
+        {
+            mpProgram->SetShaderType(TextureShaderType::MaskedColor);
+            mpProgram->SetIdentityTransform("transform");
+            mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+            for (auto& rPair : rRenderEntry.maTextureParametersMap)
             {
-                mpProgram->SetColor("color", rColorTwoRectPair.first, 0);
-                TextureDrawParameters& rParameters = rColorTwoRectPair.second;
+                RenderTextureParameters& rParameters = rPair.second;
+                mpProgram->SetTexture("texture", rParameters.maTexture);
                 ApplyProgramMatrices();
                 mpProgram->SetTextureCoord(rParameters.maTextureCoords.data());
                 mpProgram->SetMaskCoord(rParameters.maTextureCoords.data());
                 mpProgram->SetAlphaCoord(rParameters.maTextureCoords.data());
-                mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
-            }
-        }
-        mpProgram->Clean();
-        mpAccumulatedTextures->clear();
-
-        PostDraw();
-    }
-
-    if (!mpRenderList->empty())
-    {
-        InitializePreDrawState(XOROption::IMPLEMENT_XOR);
-
-        OpenGLZone aZone;
-        for (RenderEntry& rRenderEntry : mpRenderList->getEntries())
-        {
-            if (rRenderEntry.hasTriangles() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
-            {
-                RenderParameters& rParameters = rRenderEntry.maTriangleParameters;
-                VCL_GL_INFO("Flush Triangles: " << rParameters.maVertices.size());
-                mpProgram->SetShaderType(DrawShaderType::Normal);
-                mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-                ApplyProgramMatrices(0.5f);
-                mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
-                mpProgram->SetVertexColors(rParameters.maColors);
-                mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
-                CHECK_GL_ERROR();
-                mpProgram->Clean();
-            }
-            if (rRenderEntry.hasLines() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
-            {
-                RenderParameters& rParameters = rRenderEntry.maLineParameters;
-                VCL_GL_INFO("Flush Lines: " << rParameters.maVertices.size());
-                mpProgram->SetShaderType(DrawShaderType::Line);
-                mpProgram->SetUniform1f("line_width", 1.0f);
-                mpProgram->SetUniform1f("feather", 0.0f); // Anti-Aliasing disabled
-                mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-                ApplyProgramMatrices(0.5f);
-                mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
-                mpProgram->SetVertexColors(rParameters.maColors);
-                mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
-                CHECK_GL_ERROR();
-                mpProgram->Clean();
-            }
-            if (rRenderEntry.hasLinesAA() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
-            {
-                RenderParameters& rParameters = rRenderEntry.maLineAAParameters;
-                VCL_GL_INFO("Flush Lines AA: " << rParameters.maVertices.size());
-                mpProgram->SetShaderType(DrawShaderType::Line);
-                mpProgram->SetUniform1f("line_width", 1.0f);
-                mpProgram->SetUniform1f("feather", 0.5f); // Anti-Aliasing enabled
-                mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-                ApplyProgramMatrices(0.5f);
-                mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
                 mpProgram->SetVertexColors(rParameters.maColors);
                 mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
                 CHECK_GL_ERROR();
-                mpProgram->Clean();
             }
+            mpProgram->Clean();
         }
-
-        mpRenderList->clear();
-        PostDraw();
     }
 
-    VCL_GL_INFO("End FlushDeferredDrawing");
+    mpRenderList->clear();
+    PostDraw();
 
+    VCL_GL_INFO("End FlushDeferredDrawing");
 }
 
 void OpenGLSalGraphicsImpl::DrawLinearGradient( const Gradient& rGradient, const Rectangle& rRect )
@@ -1733,7 +1715,7 @@ void OpenGLSalGraphicsImpl::drawLine(long nX1, long nY1, long nX2, long nY2)
 void OpenGLSalGraphicsImpl::drawRect( long nX, long nY, long nWidth, long nHeight )
 {
     VCL_GL_INFO("::drawRect (" << nX << ", " << nY << ") [" << nWidth << ", " << nHeight << "]");
-    mpRenderList->addDrawRectangle(nX, nY, nWidth, nHeight, mnLineColor, mnFillColor);
+    mpRenderList->addDrawRectangle(nX, nY, nWidth, nHeight, 0.0, mnLineColor, mnFillColor);
 }
 
 void OpenGLSalGraphicsImpl::drawPolyLine( sal_uInt32 nPoints, const SalPoint* pPtAry )
@@ -1926,15 +1908,10 @@ void OpenGLSalGraphicsImpl::drawMask(
             const SalBitmap& rSalBitmap,
             SalColor nMaskColor )
 {
-    OpenGLZone aZone;
-
     const OpenGLSalBitmap& rBitmap = static_cast<const OpenGLSalBitmap&>(rSalBitmap);
-    OpenGLTexture& rTexture( rBitmap.GetTexture() );
 
     VCL_GL_INFO( "::drawMask" );
-    PreDraw();
-    DrawMask( rTexture, nMaskColor, rPosAry );
-    PostDraw();
+    mpRenderList->addDrawTextureWithMaskColor(rBitmap.GetTexture(), nMaskColor, rPosAry);
 }
 
 SalBitmap* OpenGLSalGraphicsImpl::getBitmap( long nX, long nY, long nWidth, long nHeight )
@@ -2138,15 +2115,8 @@ bool OpenGLSalGraphicsImpl::drawAlphaRect(
                 long nWidth, long nHeight,
                 sal_uInt8 nTransparency )
 {
-    VCL_GL_INFO( "::drawAlphaRect" );
-    if( mnFillColor != SALCOLOR_NONE && nTransparency < 100 )
-    {
-        PreDraw();
-        UseSolid( mnFillColor, nTransparency );
-        DrawRect( nX, nY, nWidth, nHeight );
-        PostDraw();
-    }
-
+    VCL_GL_INFO("::drawAlphaRect (" << nX << ", " << nY << ") [" << nWidth << ", " << nHeight << "]");
+    mpRenderList->addDrawRectangle(nX, nY, nWidth, nHeight, double(nTransparency / 100.0), mnLineColor, mnFillColor);
     return true;
 }
 
commit a26c8932a5fd1b2efdc8104809b3edc3b26db706
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Wed Jun 1 13:40:26 2016 +0900

    Revert "opengl: deferred texture drawing in RenderList, add drawAlphaRect"
    
    This reverts commit 01c06c78289c189d18825e3adf418f70cb7ec562.

diff --git a/vcl/inc/opengl/AccumulatedTextures.hxx b/vcl/inc/opengl/AccumulatedTextures.hxx
new file mode 100644
index 0000000..504cf6a
--- /dev/null
+++ b/vcl/inc/opengl/AccumulatedTextures.hxx
@@ -0,0 +1,99 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#ifndef INCLUDED_VCL_INC_OPENGL_ACCUMULATEDTEXTURES_H
+#define INCLUDED_VCL_INC_OPENGL_ACCUMULATEDTEXTURES_H
+
+#include <vcl/opengl/OpenGLHelper.hxx>
+
+#include <o3tl/make_unique.hxx>
+#include "opengl/texture.hxx"
+#include "opengl/VertexUtils.hxx"
+#include <memory>
+
+struct TextureDrawParameters
+{
+    std::vector<GLfloat> maVertices;
+    std::vector<GLfloat> maTextureCoords;
+};
+
+struct AccumulatedTexturesEntry
+{
+    OpenGLTexture maTexture;
+    std::unordered_map<SalColor, TextureDrawParameters> maColorTextureDrawParametersMap;
+
+    AccumulatedTexturesEntry(const OpenGLTexture& rTexture)
+        : maTexture(rTexture)
+    {}
+
+    void insert(const OpenGLTexture& rTexture, const SalColor& aColor, const SalTwoRect& r2Rect)
+    {
+        TextureDrawParameters& aDrawParameters = maColorTextureDrawParametersMap[aColor];
+        rTexture.FillCoords<GL_TRIANGLES>(aDrawParameters.maTextureCoords, r2Rect, false);
+
+        GLfloat fX1 = r2Rect.mnDestX;
+        GLfloat fY1 = r2Rect.mnDestY;
+        GLfloat fX2 = fX1 + r2Rect.mnDestWidth;
+        GLfloat fY2 = fY1 + r2Rect.mnDestHeight;
+
+        std::vector<GLfloat>& rVertices = aDrawParameters.maVertices;
+        vcl::vertex::addRectangle<GL_TRIANGLES>(rVertices, fX1, fY1, fX2, fY2);
+    }
+};
+
+class AccumulatedTextures
+{
+private:
+    typedef std::unordered_map<GLuint, std::unique_ptr<AccumulatedTexturesEntry>> AccumulatedTexturesMap;
+
+    AccumulatedTexturesMap maEntries;
+
+public:
+    AccumulatedTextures()
+    {}
+
+    bool empty()
+    {
+        return maEntries.empty();
+    }
+
+    void clear()
+    {
+        maEntries.clear();
+    }
+
+    bool insert(OpenGLTexture& rTexture, const SalColor& aColor, const SalTwoRect& r2Rect)
+    {
+        if (!rTexture)
+            return false;
+
+        GLuint nTextureId = rTexture.Id();
+
+        if (maEntries.find(nTextureId) == maEntries.end())
+        {
+            OpenGLTexture aWholeTexture(rTexture.GetWholeTexture());
+            maEntries[nTextureId] = o3tl::make_unique<AccumulatedTexturesEntry>(aWholeTexture);
+        }
+
+        std::unique_ptr<AccumulatedTexturesEntry>& rEntry = maEntries[nTextureId];
+        rEntry->insert(rTexture, aColor, r2Rect);
+
+        return true;
+    }
+
+    AccumulatedTexturesMap& getAccumulatedTexturesMap()
+    {
+        return maEntries;
+    }
+};
+
+#endif // INCLUDED_VCL_INC_OPENGL_ACCUMULATEDTEXTURES_H
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/opengl/RenderList.hxx b/vcl/inc/opengl/RenderList.hxx
index 32ece73..d533ad4 100644
--- a/vcl/inc/opengl/RenderList.hxx
+++ b/vcl/inc/opengl/RenderList.hxx
@@ -11,16 +11,12 @@
 #ifndef INCLUDED_VCL_INC_OPENGL_RENDERLIST_H
 #define INCLUDED_VCL_INC_OPENGL_RENDERLIST_H
 
-#include <unordered_map>
-
 #include <glm/glm.hpp>
 
 #include <vcl/opengl/OpenGLHelper.hxx>
 #include <vcl/salgtype.hxx>
 #include <basegfx/range/b2drange.hxx>
 
-#include "opengl/texture.hxx"
-
 struct RenderParameters
 {
     std::vector<GLfloat>   maVertices;
@@ -28,22 +24,12 @@ struct RenderParameters
     std::vector<glm::vec4> maColors;
 };
 
-struct RenderTextureParameters
-{
-    std::vector<GLfloat>   maVertices;
-    std::vector<glm::vec4> maColors;
-    std::vector<GLfloat>   maTextureCoords;
-    OpenGLTexture          maTexture;
-};
-
 struct RenderEntry
 {
     RenderParameters maTriangleParameters;
     RenderParameters maLineParameters;
     RenderParameters maLineAAParameters;
 
-    std::unordered_map<GLuint, RenderTextureParameters> maTextureParametersMap;
-
     bool hasTriangles()
     {
         return !maTriangleParameters.maVertices.empty();
@@ -58,11 +44,6 @@ struct RenderEntry
     {
         return !maLineAAParameters.maVertices.empty();
     }
-
-    bool hasTextures()
-    {
-        return !maTextureParametersMap.empty();
-    }
 };
 
 class RenderList
@@ -104,11 +85,9 @@ public:
         return maRenderEntries;
     }
 
-    bool addDrawTextureWithMaskColor(OpenGLTexture& rTexture, const SalColor& rColor, const SalTwoRect& r2Rect);
-
     void addDrawPixel(long nX, long nY, const SalColor& rColor);
 
-    void addDrawRectangle(long nX, long nY, long nWidth, long nHeight, double fTransparency,
+    void addDrawRectangle(long nX, long nY, long nWidth, long nHeight,
                           const SalColor& rLineColor, const SalColor& rFillColor);
 
     void addDrawLine(long nX1, long nY1, long nX2, long nY2, const SalColor& rLineColor, bool bUseAA);
diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index 4323787..fdc4601 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -28,6 +28,7 @@
 #include "opengl/program.hxx"
 #include "opengl/texture.hxx"
 #include "regionband.hxx"
+#include "opengl/AccumulatedTextures.hxx"
 #include "opengl/RenderList.hxx"
 
 #include <vcl/opengl/OpenGLContext.hxx>
@@ -100,6 +101,7 @@ protected:
     SalColor mProgramSolidColor;
     double mProgramSolidTransparency;
 
+    std::unique_ptr<AccumulatedTextures>  mpAccumulatedTextures;
     std::unique_ptr<RenderList> mpRenderList;
 
     void ImplInitClipRegion();
diff --git a/vcl/opengl/RenderList.cxx b/vcl/opengl/RenderList.cxx
index 8188319..de5a9d6 100644
--- a/vcl/opengl/RenderList.cxx
+++ b/vcl/opengl/RenderList.cxx
@@ -52,13 +52,10 @@ void RenderList::addDrawPixel(long nX, long nY, const SalColor& rColor)
     vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
 }
 
-void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, double fTransparency,
-                                  const SalColor& rLineColor, const SalColor& rFillColor)
+void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, const SalColor& rLineColor, const SalColor& rFillColor)
 {
     if (rLineColor == SALCOLOR_NONE && rFillColor == SALCOLOR_NONE)
         return;
-    if (fTransparency == 1.0f)
-        return;
 
     GLfloat fX1(nX);
     GLfloat fY1(nY);
@@ -77,10 +74,10 @@ void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, d
         vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX2 - 0.5f, fY1 - 0.5f, fX2 + 0.5f, fY2 + 0.5f);
         vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX1 - 0.5f, fY2 - 0.5f, fX2 + 0.5f, fY2 + 0.5f);
 
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, fTransparency);
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, fTransparency);
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, fTransparency);
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, fTransparency);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, 0.0f);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, 0.0f);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, 0.0f);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, 0.0f);
 
         vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
         vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
@@ -98,10 +95,10 @@ void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, d
             vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX2 - 0.5f, fY1 - 0.5f, fX2 + 0.5f, fY2 + 0.5f);
             vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX1 - 0.5f, fY2 - 0.5f, fX2 + 0.5f, fY2 + 0.5f);
 
-            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
-            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
-            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
-            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
+            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
+            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
+            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
+            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
 
             vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
             vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
@@ -110,7 +107,7 @@ void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, d
         }
         // Draw rectangle fill with fill color
         vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX1 + 0.5f, fY1 + 0.5f, fX2 - 0.5f, fY2 - 0.5f);
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
         vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
     }
 }
@@ -216,29 +213,4 @@ void RenderList::addDrawPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPolygon,
     }
 }
 
-bool RenderList::addDrawTextureWithMaskColor(OpenGLTexture& rTexture, const SalColor& rColor, const SalTwoRect& r2Rect)
-{
-    if (!rTexture)
-        return false;
-
-    GLfloat fX1 = r2Rect.mnDestX;
-    GLfloat fY1 = r2Rect.mnDestY;
-    GLfloat fX2 = fX1 + r2Rect.mnDestWidth;
-    GLfloat fY2 = fY1 + r2Rect.mnDestHeight;
-
-    checkOverlapping(basegfx::B2DRange(fX1, fY1, fX2, fY2));
-
-    GLuint nTextureId = rTexture.Id();
-
-    RenderTextureParameters& rTextureParameter = maRenderEntries.back().maTextureParametersMap[nTextureId];
-    rTextureParameter.maTexture = rTexture;
-
-    rTexture.FillCoords<GL_TRIANGLES>(rTextureParameter.maTextureCoords, r2Rect, false);
-
-    vcl::vertex::addRectangle<GL_TRIANGLES>(rTextureParameter.maVertices, fX1, fY1, fX2, fY2);
-    vcl::vertex::addQuadColors<GL_TRIANGLES>(rTextureParameter.maColors, rColor, 0.0f);
-
-    return true;
-}
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 394130c..8e00d0e 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -85,6 +85,7 @@ OpenGLSalGraphicsImpl::OpenGLSalGraphicsImpl(SalGraphics& rParent, SalGeometryPr
     , mnDrawCountAtFlush(0)
     , mProgramSolidColor(SALCOLOR_NONE)
     , mProgramSolidTransparency(0.0)
+    , mpAccumulatedTextures(new AccumulatedTextures)
     , mpRenderList(new RenderList)
 {
 }
@@ -1502,90 +1503,107 @@ void OpenGLSalGraphicsImpl::DrawMask( OpenGLTexture& rMask, SalColor nMaskColor,
 
 void OpenGLSalGraphicsImpl::DeferredTextDraw(OpenGLTexture& rTexture, SalColor aMaskColor, const SalTwoRect& rPosAry)
 {
-    mpRenderList->addDrawTextureWithMaskColor(rTexture, aMaskColor, rPosAry);
+    mpAccumulatedTextures->insert(rTexture, aMaskColor, rPosAry);
 }
 
 void OpenGLSalGraphicsImpl::FlushDeferredDrawing()
 {
-    if (mpRenderList->empty())
+    if (mpAccumulatedTextures->empty() && mpRenderList->empty())
         return;
 
     VCL_GL_INFO("FlushDeferredDrawing: " << mpRenderList->getEntries().size());
 
-    InitializePreDrawState(XOROption::IMPLEMENT_XOR);
-
-    OpenGLZone aZone;
-    for (RenderEntry& rRenderEntry : mpRenderList->getEntries())
+    if (!mpAccumulatedTextures->empty())
     {
-        if (rRenderEntry.hasTriangles() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
-        {
-            RenderParameters& rParameters = rRenderEntry.maTriangleParameters;
-            VCL_GL_INFO("Flush Triangles: " << rParameters.maVertices.size());
-            mpProgram->SetShaderType(DrawShaderType::Normal);
-            mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-            ApplyProgramMatrices(0.5f);
-            mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
-            mpProgram->SetVertexColors(rParameters.maColors);
-            mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
-            CHECK_GL_ERROR();
-            mpProgram->Clean();
-        }
-        if (rRenderEntry.hasLines() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
-        {
-            RenderParameters& rParameters = rRenderEntry.maLineParameters;
-            VCL_GL_INFO("Flush Lines: " << rParameters.maVertices.size());
-            mpProgram->SetShaderType(DrawShaderType::Line);
-            mpProgram->SetUniform1f("line_width", 1.0f);
-            mpProgram->SetUniform1f("feather", 0.0f); // Anti-Aliasing disabled
-            mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-            ApplyProgramMatrices(0.5f);
-            mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
-            mpProgram->SetVertexColors(rParameters.maColors);
-            mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
-            CHECK_GL_ERROR();
-            mpProgram->Clean();
-        }
-        if (rRenderEntry.hasLinesAA() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
-        {
-            RenderParameters& rParameters = rRenderEntry.maLineAAParameters;
-            VCL_GL_INFO("Flush Lines AA: " << rParameters.maVertices.size());
-            mpProgram->SetShaderType(DrawShaderType::Line);
-            mpProgram->SetUniform1f("line_width", 1.0f);
-            mpProgram->SetUniform1f("feather", 0.5f); // Anti-Aliasing enabled
-            mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-            ApplyProgramMatrices(0.5f);
-            mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
-            mpProgram->SetVertexColors(rParameters.maColors);
-            mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
-            CHECK_GL_ERROR();
-            mpProgram->Clean();
-        }
-        if (rRenderEntry.hasTextures() && UseProgram("combinedTextureVertexShader", "combinedTextureFragmentShader", "#define USE_VERTEX_COLORS"))
-        {
-            mpProgram->SetShaderType(TextureShaderType::MaskedColor);
-            mpProgram->SetIdentityTransform("transform");
-            mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+        InitializePreDrawState();
+
+        OpenGLZone aZone;
+
+        if (!UseProgram("combinedTextureVertexShader", "combinedTextureFragmentShader"))
+            return;
+        mpProgram->SetShaderType(TextureShaderType::MaskedColor);
+        mpProgram->SetIdentityTransform("transform");
+        mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-            for (auto& rPair : rRenderEntry.maTextureParametersMap)
+        for (auto& rPair : mpAccumulatedTextures->getAccumulatedTexturesMap())
+        {
+            OpenGLTexture& rTexture = rPair.second->maTexture;
+            mpProgram->SetTexture("texture", rTexture);
+            for (auto& rColorTwoRectPair: rPair.second->maColorTextureDrawParametersMap)
             {
-                RenderTextureParameters& rParameters = rPair.second;
-                mpProgram->SetTexture("texture", rParameters.maTexture);
+                mpProgram->SetColor("color", rColorTwoRectPair.first, 0);
+                TextureDrawParameters& rParameters = rColorTwoRectPair.second;
                 ApplyProgramMatrices();
                 mpProgram->SetTextureCoord(rParameters.maTextureCoords.data());
                 mpProgram->SetMaskCoord(rParameters.maTextureCoords.data());
                 mpProgram->SetAlphaCoord(rParameters.maTextureCoords.data());
+                mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
+            }
+        }
+        mpProgram->Clean();
+        mpAccumulatedTextures->clear();
+
+        PostDraw();
+    }
+
+    if (!mpRenderList->empty())
+    {
+        InitializePreDrawState(XOROption::IMPLEMENT_XOR);
+
+        OpenGLZone aZone;
+        for (RenderEntry& rRenderEntry : mpRenderList->getEntries())
+        {
+            if (rRenderEntry.hasTriangles() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
+            {
+                RenderParameters& rParameters = rRenderEntry.maTriangleParameters;
+                VCL_GL_INFO("Flush Triangles: " << rParameters.maVertices.size());
+                mpProgram->SetShaderType(DrawShaderType::Normal);
+                mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                ApplyProgramMatrices(0.5f);
+                mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
+                mpProgram->SetVertexColors(rParameters.maColors);
+                mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
+                CHECK_GL_ERROR();
+                mpProgram->Clean();
+            }
+            if (rRenderEntry.hasLines() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
+            {
+                RenderParameters& rParameters = rRenderEntry.maLineParameters;
+                VCL_GL_INFO("Flush Lines: " << rParameters.maVertices.size());
+                mpProgram->SetShaderType(DrawShaderType::Line);
+                mpProgram->SetUniform1f("line_width", 1.0f);
+                mpProgram->SetUniform1f("feather", 0.0f); // Anti-Aliasing disabled
+                mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                ApplyProgramMatrices(0.5f);
+                mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
+                mpProgram->SetVertexColors(rParameters.maColors);
+                mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
+                CHECK_GL_ERROR();
+                mpProgram->Clean();
+            }
+            if (rRenderEntry.hasLinesAA() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
+            {
+                RenderParameters& rParameters = rRenderEntry.maLineAAParameters;
+                VCL_GL_INFO("Flush Lines AA: " << rParameters.maVertices.size());
+                mpProgram->SetShaderType(DrawShaderType::Line);
+                mpProgram->SetUniform1f("line_width", 1.0f);
+                mpProgram->SetUniform1f("feather", 0.5f); // Anti-Aliasing enabled
+                mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+                ApplyProgramMatrices(0.5f);
+                mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
                 mpProgram->SetVertexColors(rParameters.maColors);
                 mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
                 CHECK_GL_ERROR();
+                mpProgram->Clean();
             }
-            mpProgram->Clean();
         }
-    }
 
-    mpRenderList->clear();
-    PostDraw();
+        mpRenderList->clear();
+        PostDraw();
+    }
 
     VCL_GL_INFO("End FlushDeferredDrawing");
+
 }
 
 void OpenGLSalGraphicsImpl::DrawLinearGradient( const Gradient& rGradient, const Rectangle& rRect )
@@ -1715,7 +1733,7 @@ void OpenGLSalGraphicsImpl::drawLine(long nX1, long nY1, long nX2, long nY2)
 void OpenGLSalGraphicsImpl::drawRect( long nX, long nY, long nWidth, long nHeight )
 {
     VCL_GL_INFO("::drawRect (" << nX << ", " << nY << ") [" << nWidth << ", " << nHeight << "]");
-    mpRenderList->addDrawRectangle(nX, nY, nWidth, nHeight, 0.0, mnLineColor, mnFillColor);
+    mpRenderList->addDrawRectangle(nX, nY, nWidth, nHeight, mnLineColor, mnFillColor);
 }
 
 void OpenGLSalGraphicsImpl::drawPolyLine( sal_uInt32 nPoints, const SalPoint* pPtAry )
@@ -1908,10 +1926,15 @@ void OpenGLSalGraphicsImpl::drawMask(
             const SalBitmap& rSalBitmap,
             SalColor nMaskColor )
 {
+    OpenGLZone aZone;
+
     const OpenGLSalBitmap& rBitmap = static_cast<const OpenGLSalBitmap&>(rSalBitmap);
+    OpenGLTexture& rTexture( rBitmap.GetTexture() );
 
     VCL_GL_INFO( "::drawMask" );
-    mpRenderList->addDrawTextureWithMaskColor(rBitmap.GetTexture(), nMaskColor, rPosAry);
+    PreDraw();
+    DrawMask( rTexture, nMaskColor, rPosAry );
+    PostDraw();
 }
 
 SalBitmap* OpenGLSalGraphicsImpl::getBitmap( long nX, long nY, long nWidth, long nHeight )
@@ -2115,8 +2138,15 @@ bool OpenGLSalGraphicsImpl::drawAlphaRect(
                 long nWidth, long nHeight,
                 sal_uInt8 nTransparency )
 {
-    VCL_GL_INFO("::drawAlphaRect (" << nX << ", " << nY << ") [" << nWidth << ", " << nHeight << "]");
-    mpRenderList->addDrawRectangle(nX, nY, nWidth, nHeight, double(nTransparency / 100.0), mnLineColor, mnFillColor);
+    VCL_GL_INFO( "::drawAlphaRect" );
+    if( mnFillColor != SALCOLOR_NONE && nTransparency < 100 )
+    {
+        PreDraw();
+        UseSolid( mnFillColor, nTransparency );
+        DrawRect( nX, nY, nWidth, nHeight );
+        PostDraw();
+    }
+
     return true;
 }
 
commit 802e1690761e4971098bb725ae8e5e1412e0f95f
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Wed Jun 1 13:40:19 2016 +0900

    Revert "opengl: improve overlap tracking"
    
    This reverts commit 3a4a4fb6c63a4a510254159c92cbeb81ff935fab.

diff --git a/vcl/inc/opengl/RenderList.hxx b/vcl/inc/opengl/RenderList.hxx
index e63f5dc..32ece73 100644
--- a/vcl/inc/opengl/RenderList.hxx
+++ b/vcl/inc/opengl/RenderList.hxx
@@ -38,8 +38,6 @@ struct RenderTextureParameters
 
 struct RenderEntry
 {
-    basegfx::B2DRange maOverlapTrackingRectangle;
-
     RenderParameters maTriangleParameters;
     RenderParameters maLineParameters;
     RenderParameters maLineAAParameters;
@@ -70,59 +68,19 @@ struct RenderEntry
 class RenderList
 {
 private:
+    basegfx::B2DRange maOverlapTrackingRectangle;
     std::vector<RenderEntry> maRenderEntries;
-    std::vector<basegfx::B2DRange> maRectangles;
-
-    bool doesOverlap(const basegfx::B2DRange& rDrawRectangle)
-    {
-        if (!maRenderEntries.back().maOverlapTrackingRectangle.overlaps(rDrawRectangle))
-            return false;
-
-        for (const basegfx::B2DRange& rRectangle : maRectangles)
-        {
-            if (rRectangle.overlaps(rDrawRectangle))
-                return true;
-        }
-        return false;
-    }
 
     void checkOverlapping(const basegfx::B2DRange& rDrawRectangle)
     {
-        if (maRenderEntries.empty() || doesOverlap(rDrawRectangle))
+        if (maRenderEntries.empty() || maOverlapTrackingRectangle.overlaps(rDrawRectangle))
         {
             maRenderEntries.resize(maRenderEntries.size() + 1);
-            maRenderEntries.back().maOverlapTrackingRectangle = rDrawRectangle;
-
-            maRectangles.clear();
-            maRectangles.reserve(30);
-            maRectangles.push_back(rDrawRectangle);
+            maOverlapTrackingRectangle = rDrawRectangle;
         }
         else
         {
-            maRenderEntries.back().maOverlapTrackingRectangle.expand(rDrawRectangle);
-
-            if (maRectangles.size() < 30)
-            {
-                maRectangles.push_back(rDrawRectangle);
-            }
-            else
-            {
-                basegfx::B2DRange aTempRectangle(maRectangles[0]);
-                aTempRectangle.expand(rDrawRectangle);
-                double minArea = aTempRectangle.getWidth() * aTempRectangle.getHeight();
-                size_t index = 0;
-
-                double area;
-                for (size_t i = 1; i < maRectangles.size(); ++i)
-                {
-                    aTempRectangle = basegfx::B2DRange(maRectangles[i]);
-                    aTempRectangle.expand(rDrawRectangle);
-                    area = aTempRectangle.getWidth() * aTempRectangle.getHeight();
-                    if (area < minArea)
-                        index = i;
-                }
-                maRectangles[index].expand(rDrawRectangle);
-            }
+            maOverlapTrackingRectangle.expand(rDrawRectangle);
         }
     }
 
@@ -138,6 +96,7 @@ public:
     void clear()
     {
         maRenderEntries.clear();
+        maOverlapTrackingRectangle.reset();
     }
 
     std::vector<RenderEntry>& getEntries()


More information about the Libreoffice-commits mailing list