diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp index 197466e94..0ea359677 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -242,6 +242,11 @@ private: VertexArrayObject backgroundPatternArray; VertexArrayObject backgroundArray; + VertexArrayObject coveringPlaingOverdrawArray; + VertexArrayObject coveringRasterOverdrawArray; + VertexArrayObject backgroundPatternOverdrawArray; + VertexArrayObject backgroundOverdrawArray; + // Set up the tile boundary lines we're using to draw the tile outlines. StaticVertexBuffer tileBorderBuffer = { { 0, 0 }, @@ -252,8 +257,6 @@ private: }; VertexArrayObject tileBorderArray; - - VertexArrayObject coveringRasterOverdrawArray; }; } // namespace mbgl diff --git a/src/mbgl/renderer/painter_background.cpp b/src/mbgl/renderer/painter_background.cpp index 507d5f0f2..7acb98aa2 100644 --- a/src/mbgl/renderer/painter_background.cpp +++ b/src/mbgl/renderer/painter_background.cpp @@ -21,8 +21,11 @@ void Painter::renderBackground(const BackgroundLayer& layer) { optional imagePosA; optional imagePosB; - const auto& shaderPattern = isOverdraw() ? patternOverdrawShader : patternShader; - const auto& shaderPlain = isOverdraw() ? plainOverdrawShader : plainShader; + const bool overdraw = isOverdraw(); + const auto& shaderPattern = overdraw ? patternOverdrawShader : patternShader; + const auto& shaderPlain = overdraw ? plainOverdrawShader : plainShader; + auto& arrayBackgroundPattern = overdraw ? backgroundPatternOverdrawArray : backgroundPatternArray; + auto& arrayBackground = overdraw ? backgroundOverdrawArray : backgroundArray; if (isPatterned) { imagePosA = spriteAtlas->getPosition(properties.backgroundPattern.value.from, true); @@ -41,14 +44,14 @@ void Painter::renderBackground(const BackgroundLayer& layer) { shaderPattern->u_opacity = properties.backgroundOpacity; spriteAtlas->bind(true, store); - backgroundPatternArray.bind(*shaderPattern, tileStencilBuffer, BUFFER_OFFSET(0), store); + arrayBackgroundPattern.bind(*shaderPattern, tileStencilBuffer, BUFFER_OFFSET(0), store); } else { config.program = shaderPlain->getID(); shaderPlain->u_color = properties.backgroundColor; shaderPlain->u_opacity = properties.backgroundOpacity; - backgroundArray.bind(*shaderPlain, tileStencilBuffer, BUFFER_OFFSET(0), store); + arrayBackground.bind(*shaderPlain, tileStencilBuffer, BUFFER_OFFSET(0), store); } config.stencilTest = GL_FALSE; diff --git a/src/mbgl/renderer/painter_clipping.cpp b/src/mbgl/renderer/painter_clipping.cpp index f0fc836f7..36e277d5a 100644 --- a/src/mbgl/renderer/painter_clipping.cpp +++ b/src/mbgl/renderer/painter_clipping.cpp @@ -11,10 +11,14 @@ namespace mbgl { void Painter::drawClippingMasks(const std::map& stencils) { MBGL_DEBUG_GROUP("clipping masks"); + const bool overdraw = isOverdraw(); + const auto& shaderPlain = overdraw ? plainOverdrawShader : plainShader; + auto& arrayCoveringPlain = overdraw ? coveringPlaingOverdrawArray : coveringPlainArray; + mat4 matrix; const GLuint mask = 0b11111111; - config.program = plainShader->getID(); + config.program = shaderPlain->getID(); config.stencilOp.reset(); config.stencilTest = GL_TRUE; config.depthTest = GL_FALSE; @@ -22,7 +26,7 @@ void Painter::drawClippingMasks(const std::map& stencil config.colorMask = { GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE }; config.stencilMask = mask; - coveringPlainArray.bind(*plainShader, tileStencilBuffer, BUFFER_OFFSET_0, store); + arrayCoveringPlain.bind(*shaderPlain, tileStencilBuffer, BUFFER_OFFSET_0, store); for (const auto& stencil : stencils) { const auto& id = stencil.first; @@ -31,7 +35,7 @@ void Painter::drawClippingMasks(const std::map& stencil MBGL_DEBUG_GROUP(std::string{ "mask: " } + util::toString(id)); state.matrixFor(matrix, id); matrix::multiply(matrix, projMatrix, matrix); - plainShader->u_matrix = matrix; + shaderPlain->u_matrix = matrix; const GLint ref = (GLint)(clip.reference.to_ulong()); config.stencilFunc = { GL_ALWAYS, ref, mask };