vcl/opengl/combinedTextureFragmentShader.glsl | 7 +++++++ vcl/opengl/combinedTextureVertexShader.glsl | 9 +++++++++ 2 files changed, 16 insertions(+)
New commits: commit df6b2fdc1587f4529290978f3b5ffba547de2b27 Author: Tomaž Vajngerl <tomaz.vajng...@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.vajng...@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.vajng...@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.vajng...@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()
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits