From 556e88f8b7a335f4f308e633a8f347f760c451bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Mon, 10 Aug 2015 17:50:50 +0300 Subject: experiment: remove stencil-buffer based clipping [skip ci] --- src/mbgl/map/source.cpp | 8 ------- src/mbgl/renderer/painter.cpp | 24 +++------------------ src/mbgl/renderer/painter.hpp | 5 ----- src/mbgl/renderer/painter_clipping.cpp | 39 ---------------------------------- src/mbgl/renderer/painter_debug.cpp | 2 -- src/mbgl/renderer/painter_fill.cpp | 1 - src/mbgl/renderer/painter_line.cpp | 1 - src/mbgl/renderer/painter_raster.cpp | 1 - src/mbgl/renderer/painter_symbol.cpp | 13 ------------ 9 files changed, 3 insertions(+), 91 deletions(-) delete mode 100644 src/mbgl/renderer/painter_clipping.cpp diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index 518468af6e..3abdf810f3 100644 --- a/src/mbgl/map/source.cpp +++ b/src/mbgl/map/source.cpp @@ -183,14 +183,6 @@ void Source::updateMatrices(const mat4 &projMatrix, const TransformState &transf } } -void Source::drawClippingMasks(Painter &painter) { - for (const auto& pair : tiles) { - Tile &tile = *pair.second; - MBGL_DEBUG_GROUP(std::string { "mask: " } + std::string(tile.id)); - painter.drawClippingMask(tile.matrix, tile.clip); - } -} - void Source::finishRender(Painter &painter) { for (const auto& pair : tiles) { Tile &tile = *pair.second; diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index 8011dfd05f..a39a68415a 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -80,10 +80,6 @@ void Painter::setup() { // Set clear values config.clearColor = { 0.0f, 0.0f, 0.0f, 0.0f }; config.clearDepth = 1.0f; - config.clearStencil = 0x0; - - // Stencil test - MBGL_CHECK_ERROR(glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE)); // Depth test glDepthFunc(GL_LEQUAL); @@ -148,24 +144,16 @@ void Painter::changeMatrix() { void Painter::clear() { MBGL_DEBUG_GROUP("clear"); - config.stencilTest = true; - config.stencilMask = 0xFF; config.depthTest = false; config.depthMask = GL_TRUE; config.clearColor = { 0.0f, 0.0f, 0.0f, 0.0f }; - MBGL_CHECK_ERROR(glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); + MBGL_CHECK_ERROR(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); } void Painter::setStrata(float value) { strata = value; } -void Painter::prepareTile(const Tile& tile) { - const GLint ref = (GLint)tile.clip.reference.to_ulong(); - const GLuint mask = (GLuint)tile.clip.mask.to_ulong(); - config.stencilFunc = { GL_EQUAL, ref, mask }; -} - void Painter::render(const Style& style, TransformState state_, const FrameData& frame_, const TimePoint& time) { state = state_; frame = frame_; @@ -206,21 +194,17 @@ void Painter::render(const Style& style, TransformState state_, const FrameData& } - // - CLIPPING MASKS ---------------------------------------------------------------------------- - // Draws the clipping masks to the stencil buffer. + // - MATRIX UPDATES ---------------------------------------------------------------------------- + // Updates all matrices for all tiles. { MBGL_DEBUG_GROUP("clip"); // Update all clipping IDs. - ClipIDGenerator generator; for (const auto& source : sources) { - generator.update(source->getLoadedTiles()); source->updateMatrices(projMatrix, state); } clear(); - - drawClippingMasks(sources); } frameHistory.record(time, state.getNormalizedZoom()); @@ -291,7 +275,6 @@ void Painter::renderPass(RenderPass pass_, if (item.hasRenderPass(pass)) { MBGL_DEBUG_GROUP(item.layer.id + " - " + std::string(item.tile->id)); setStrata(i * strataThickness); - prepareTile(*item.tile); item.bucket->render(*this, item.layer, item.tile->id, item.tile->matrix); } } else { @@ -460,7 +443,6 @@ void Painter::renderBackground(const StyleLayer &layer_desc) { backgroundArray.bind(*plainShader, backgroundBuffer, BUFFER_OFFSET(0)); } - config.stencilTest = false; config.depthTest = true; config.depthRange = { strata + strata_epsilon, 1.0f }; MBGL_CHECK_ERROR(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)); diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp index 869aaa49cf..93c5959e01 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -130,9 +130,6 @@ public: // Configures the painter strata that is used for early z-culling of fragments. void setStrata(float strata); - void drawClippingMasks(const std::set&); - void drawClippingMask(const mat4& matrix, const ClipID& clip); - void resetFramebuffer(); void bindFramebuffer(); void pushFramebuffer(); @@ -154,8 +151,6 @@ private: std::size_t i, int8_t iIncrement, const float strataThickness); - void prepareTile(const Tile& tile); - template void renderSDF(SymbolBucket &bucket, const TileID &id, diff --git a/src/mbgl/renderer/painter_clipping.cpp b/src/mbgl/renderer/painter_clipping.cpp deleted file mode 100644 index 332d2876f5..0000000000 --- a/src/mbgl/renderer/painter_clipping.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include -#include -#include -#include -#include - -using namespace mbgl; - -void Painter::drawClippingMasks(const std::set& sources) { - MBGL_DEBUG_GROUP("clipping masks"); - - useProgram(plainShader->program); - config.stencilTest = true; - config.depthTest = true; - config.depthMask = GL_FALSE; - config.colorMask = { false, false, false, false }; - config.depthRange = { 1.0f, 1.0f }; - - coveringPlainArray.bind(*plainShader, tileStencilBuffer, BUFFER_OFFSET(0)); - - for (const auto& source : sources) { - source->drawClippingMasks(*this); - } - - config.depthTest = true; - config.colorMask = { true, true, true, true }; - config.depthMask = GL_TRUE; - config.stencilMask = 0x0; -} - -void Painter::drawClippingMask(const mat4& matrix, const ClipID &clip) { - plainShader->u_matrix = matrix; - - const GLint ref = (GLint)(clip.reference.to_ulong()); - const GLuint mask = (GLuint)(clip.mask.to_ulong()); - config.stencilFunc = { GL_ALWAYS, ref, mask }; - config.stencilMask = mask; - MBGL_CHECK_ERROR(glDrawArrays(GL_TRIANGLES, 0, (GLsizei)tileStencilBuffer.index())); -} diff --git a/src/mbgl/renderer/painter_debug.cpp b/src/mbgl/renderer/painter_debug.cpp index f4f3a19cba..9c89cb1b96 100644 --- a/src/mbgl/renderer/painter_debug.cpp +++ b/src/mbgl/renderer/painter_debug.cpp @@ -13,7 +13,6 @@ void Painter::renderTileDebug(const Tile& tile) { MBGL_DEBUG_GROUP(std::string { "debug " } + std::string(tile.id)); assert(tile.data); if (debug) { - prepareTile(tile); renderDebugText(tile.data->debugBucket, tile.matrix); renderDebugFrame(tile.matrix); } @@ -53,7 +52,6 @@ void Painter::renderDebugFrame(const mat4 &matrix) { // but *don't* disable stencil test, as we want to clip the red tile border // to the tile viewport. config.depthTest = false; - config.stencilTest = true; useProgram(plainShader->program); plainShader->u_matrix = matrix; diff --git a/src/mbgl/renderer/painter_fill.cpp b/src/mbgl/renderer/painter_fill.cpp index 414ec2bbcb..6bc25b32d8 100644 --- a/src/mbgl/renderer/painter_fill.cpp +++ b/src/mbgl/renderer/painter_fill.cpp @@ -38,7 +38,6 @@ void Painter::renderFill(FillBucket& bucket, const StyleLayer &layer_desc, const bool outline = properties.antialias && !pattern && stroke_color != fill_color; bool fringeline = properties.antialias && !pattern && stroke_color == fill_color; - config.stencilTest = true; config.depthTest = true; // Because we're drawing top-to-bottom, and we update the stencil mask diff --git a/src/mbgl/renderer/painter_line.cpp b/src/mbgl/renderer/painter_line.cpp index f406c0d8f1..203ea0ddd6 100644 --- a/src/mbgl/renderer/painter_line.cpp +++ b/src/mbgl/renderer/painter_line.cpp @@ -18,7 +18,6 @@ void Painter::renderLine(LineBucket& bucket, const StyleLayer &layer_desc, const // Abort early. if (pass == RenderPass::Opaque) return; - config.stencilTest = true; config.depthTest = true; config.depthMask = GL_FALSE; diff --git a/src/mbgl/renderer/painter_raster.cpp b/src/mbgl/renderer/painter_raster.cpp index 2a8f8e7078..c3195eb4e7 100644 --- a/src/mbgl/renderer/painter_raster.cpp +++ b/src/mbgl/renderer/painter_raster.cpp @@ -22,7 +22,6 @@ void Painter::renderRaster(RasterBucket& bucket, const StyleLayer &layer_desc, c rasterShader->u_contrast_factor = contrastFactor(properties.contrast); rasterShader->u_spin_weights = spinWeights(properties.hue_rotate); - config.stencilTest = true; config.depthTest = true; config.depthRange = { strata + strata_epsilon, 1.0f }; bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray); diff --git a/src/mbgl/renderer/painter_symbol.cpp b/src/mbgl/renderer/painter_symbol.cpp index 6d12768e2f..82cab0e38d 100644 --- a/src/mbgl/renderer/painter_symbol.cpp +++ b/src/mbgl/renderer/painter_symbol.cpp @@ -124,8 +124,6 @@ void Painter::renderSymbol(SymbolBucket &bucket, const StyleLayer &layer_desc, c config.depthMask = GL_FALSE; if (bucket.hasCollisionBoxData()) { - config.stencilTest = true; - useProgram(collisionBoxShader->program); collisionBoxShader->u_matrix = matrix; collisionBoxShader->u_scale = std::pow(2, state.getNormalizedZoom() - id.z); @@ -138,17 +136,6 @@ void Painter::renderSymbol(SymbolBucket &bucket, const StyleLayer &layer_desc, c } - // TODO remove the `|| true` when #1673 is implemented - const bool drawAcrossEdges = !(layout.text.allow_overlap || layout.icon.allow_overlap || - layout.text.ignore_placement || layout.icon.ignore_placement) || true; - - // Disable the stencil test so that labels aren't clipped to tile boundaries. - // - // Layers with features that may be drawn overlapping aren't clipped. These - // layers are sorted in the y direction, and to draw the correct ordering near - // tile edges the icons are included in both tiles and clipped when drawing. - config.stencilTest = drawAcrossEdges ? false : true; - if (bucket.hasIconData()) { bool sdf = bucket.sdfIcons; -- cgit v1.2.1