summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2015-08-10 17:50:50 +0300
committerKonstantin Käfer <mail@kkaefer.com>2015-08-19 19:12:19 -0400
commit556e88f8b7a335f4f308e633a8f347f760c451bb (patch)
treecd47643eba1033bae4628ee2f85f0f06084baef0
parentc53a9fd00d4c0584eaf6c20157f1599bda21acd8 (diff)
downloadqtlocation-mapboxgl-upstream/drop-stencil-clipping.tar.gz
experiment: remove stencil-buffer based clippingupstream/drop-stencil-clipping
[skip ci]
-rw-r--r--src/mbgl/map/source.cpp8
-rw-r--r--src/mbgl/renderer/painter.cpp24
-rw-r--r--src/mbgl/renderer/painter.hpp5
-rw-r--r--src/mbgl/renderer/painter_clipping.cpp39
-rw-r--r--src/mbgl/renderer/painter_debug.cpp2
-rw-r--r--src/mbgl/renderer/painter_fill.cpp1
-rw-r--r--src/mbgl/renderer/painter_line.cpp1
-rw-r--r--src/mbgl/renderer/painter_raster.cpp1
-rw-r--r--src/mbgl/renderer/painter_symbol.cpp13
9 files changed, 3 insertions, 91 deletions
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<Source*>&);
- 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 <typename BucketProperties, typename StyleProperties>
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 <mbgl/renderer/painter.hpp>
-#include <mbgl/map/source.hpp>
-#include <mbgl/shader/plain_shader.hpp>
-#include <mbgl/util/clip_id.hpp>
-#include <mbgl/gl/debugging.hpp>
-
-using namespace mbgl;
-
-void Painter::drawClippingMasks(const std::set<Source*>& 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;