From bfd128128589e3941a6895e6d4b2fe3624fd577c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Wed, 13 Aug 2014 17:46:15 +0200 Subject: [PATCH] only set changed glDepthRange values --- include/mbgl/renderer/painter.hpp | 2 ++ src/renderer/painter.cpp | 8 ++++++++ src/renderer/painter_clipping.cpp | 2 +- src/renderer/painter_fill.cpp | 8 ++++---- src/renderer/painter_line.cpp | 2 +- src/renderer/painter_prerender.cpp | 2 +- src/renderer/painter_raster.cpp | 2 +- src/renderer/painter_symbol.cpp | 6 +++--- 8 files changed, 21 insertions(+), 11 deletions(-) diff --git a/include/mbgl/renderer/painter.hpp b/include/mbgl/renderer/painter.hpp index 26e1bd395..4cf99f102 100644 --- a/include/mbgl/renderer/painter.hpp +++ b/include/mbgl/renderer/painter.hpp @@ -130,6 +130,7 @@ public: void useProgram(uint32_t program); void lineWidth(float lineWidth); void depthMask(bool value); + void depthRange(float near, float far); public: mat4 vtxMatrix; @@ -156,6 +157,7 @@ private: float gl_lineWidth = 0; bool gl_depthMask = true; std::array gl_viewport = {{ 0, 0 }}; + std::array gl_depthRange = {{ 0, 1 }}; float strata = 0; RenderPass pass = RenderPass::Opaque; const float strata_epsilon = 1.0f / (1 << 16); diff --git a/src/renderer/painter.cpp b/src/renderer/painter.cpp index 956543d26..9f889fb3f 100644 --- a/src/renderer/painter.cpp +++ b/src/renderer/painter.cpp @@ -118,6 +118,14 @@ void Painter::depthMask(bool value) { } } +void Painter::depthRange(const float near, const float far) { + if (gl_depthRange[0] != near || gl_depthRange[1] != far) { + glDepthRange(near, far); + gl_depthRange = {{ near, far }}; + } +} + + void Painter::changeMatrix() { // Initialize projection matrix matrix::ortho(projMatrix, 0, map.getState().getWidth(), map.getState().getHeight(), 0, 0, 1); diff --git a/src/renderer/painter_clipping.cpp b/src/renderer/painter_clipping.cpp index 95e97eadc..e94646d92 100644 --- a/src/renderer/painter_clipping.cpp +++ b/src/renderer/painter_clipping.cpp @@ -13,7 +13,7 @@ void Painter::drawClippingMasks(const std::set> &so glDisable(GL_DEPTH_TEST); depthMask(false); glColorMask(false, false, false, false); - glDepthRange(1.0f, 1.0f); + depthRange(1.0f, 1.0f); glStencilMask(0xFF); coveringPlainArray.bind(*plainShader, tileStencilBuffer, BUFFER_OFFSET(0)); diff --git a/src/renderer/painter_fill.cpp b/src/renderer/painter_fill.cpp index 8306dd0a2..f99cc93bb 100644 --- a/src/renderer/painter_fill.cpp +++ b/src/renderer/painter_fill.cpp @@ -50,7 +50,7 @@ void Painter::renderFill(FillBucket& bucket, const FillProperties& properties, c static_cast(map.getState().getFramebufferWidth()), static_cast(map.getState().getFramebufferHeight()) }}); - glDepthRange(strata, 1.0f); + depthRange(strata, 1.0f); bucket.drawVertices(*outlineShader); } else if (fringeline) { // // We're only drawing to the first seven bits (== support a maximum of @@ -109,7 +109,7 @@ void Painter::renderFill(FillBucket& bucket, const FillProperties& properties, c spriteAtlas.bind(true); // Draw the actual triangles into the color & stencil buffer. - glDepthRange(strata + strata_epsilon, 1.0f); + depthRange(strata + strata_epsilon, 1.0f); bucket.drawElements(*patternShader); } else { // Only draw the fill when it's either opaque and we're drawing opaque @@ -121,7 +121,7 @@ void Painter::renderFill(FillBucket& bucket, const FillProperties& properties, c plainShader->setColor(fill_color); // Draw the actual triangles into the color & stencil buffer. - glDepthRange(strata + strata_epsilon, 1.0f); + depthRange(strata + strata_epsilon, 1.0f); bucket.drawElements(*plainShader); } } @@ -141,7 +141,7 @@ void Painter::renderFill(FillBucket& bucket, const FillProperties& properties, c static_cast(map.getState().getFramebufferHeight()) }}); - glDepthRange(strata + strata_epsilon, 1.0f); + depthRange(strata + strata_epsilon, 1.0f); bucket.drawVertices(*outlineShader); } } diff --git a/src/renderer/painter_line.cpp b/src/renderer/painter_line.cpp index 375b99297..24358c51d 100644 --- a/src/renderer/painter_line.cpp +++ b/src/renderer/painter_line.cpp @@ -33,7 +33,7 @@ void Painter::renderLine(LineBucket& bucket, std::shared_ptr layer_d const mat4 &vtxMatrix = translatedMatrix(matrix, properties.translate, id, properties.translateAnchor); - glDepthRange(strata, 1.0f); + depthRange(strata, 1.0f); // We're only drawing end caps + round line joins if the line is > 2px. Otherwise, they aren't visible anyway. if (bucket.hasPoints() && outset > 1.0f) { diff --git a/src/renderer/painter_prerender.cpp b/src/renderer/painter_prerender.cpp index 1a5433692..14a15effe 100644 --- a/src/renderer/painter_prerender.cpp +++ b/src/renderer/painter_prerender.cpp @@ -28,7 +28,7 @@ void Painter::renderPrerenderedTexture(RasterBucket &bucket, const mat4 &matrix, rasterShader->setMatrix(matrix); rasterShader->setOpacity(1); - glDepthRange(strata, 1.0f); + depthRange(strata, 1.0f); glActiveTexture(GL_TEXTURE0); rasterShader->setImage(0); diff --git a/src/renderer/painter_raster.cpp b/src/renderer/painter_raster.cpp index b67b4b553..946f6216c 100644 --- a/src/renderer/painter_raster.cpp +++ b/src/renderer/painter_raster.cpp @@ -71,7 +71,7 @@ void Painter::renderRaster(RasterBucket& bucket, std::shared_ptr lay rasterShader->setContrast(properties.contrast); rasterShader->setSpin(spinWeights(properties.hue_rotate)); - glDepthRange(strata + strata_epsilon, 1.0f); + depthRange(strata + strata_epsilon, 1.0f); bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray); diff --git a/src/renderer/painter_symbol.cpp b/src/renderer/painter_symbol.cpp index 720f84d24..491b848e1 100644 --- a/src/renderer/painter_symbol.cpp +++ b/src/renderer/painter_symbol.cpp @@ -143,7 +143,7 @@ void Painter::renderSymbol(SymbolBucket &bucket, std::shared_ptr lay textShader->setColor(properties.text.halo_color); } textShader->setBuffer(haloWidth); - glDepthRange(strata, 1.0f); + depthRange(strata, 1.0f); bucket.drawGlyphs(*textShader); } @@ -161,7 +161,7 @@ void Painter::renderSymbol(SymbolBucket &bucket, std::shared_ptr lay textShader->setColor(properties.text.color); } textShader->setBuffer((256.0f - 64.0f) / 256.0f); - glDepthRange(strata + strata_epsilon, 1.0f); + depthRange(strata + strata_epsilon, 1.0f); bucket.drawGlyphs(*textShader); } } @@ -210,7 +210,7 @@ void Painter::renderSymbol(SymbolBucket &bucket, std::shared_ptr lay iconShader->setFadeZoom(map.getState().getNormalizedZoom() * 10); iconShader->setOpacity(properties.icon.opacity); - glDepthRange(strata, 1.0f); + depthRange(strata, 1.0f); bucket.drawIcons(*iconShader); } }