From 85e222c8258654c5b75860d086d169fe998c8f63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Tue, 6 Sep 2016 12:57:08 +0200 Subject: [PATCH] [core] change bool overdraw to PaintMode::Overdraw --- src/mbgl/renderer/fill_bucket.cpp | 32 +++++++++++++++++----------- src/mbgl/renderer/fill_bucket.hpp | 8 +++---- src/mbgl/renderer/line_bucket.cpp | 15 +++++++------ src/mbgl/renderer/line_bucket.hpp | 6 +++--- src/mbgl/renderer/painter.cpp | 6 +++--- src/mbgl/renderer/painter.hpp | 11 +++++++--- src/mbgl/renderer/painter_fill.cpp | 10 ++++----- src/mbgl/renderer/painter_line.cpp | 6 +++--- src/mbgl/renderer/painter_symbol.cpp | 8 +++---- src/mbgl/renderer/render_pass.hpp | 6 ++++++ src/mbgl/renderer/symbol_bucket.cpp | 24 +++++++++++++-------- src/mbgl/renderer/symbol_bucket.hpp | 6 +++--- 12 files changed, 83 insertions(+), 55 deletions(-) diff --git a/src/mbgl/renderer/fill_bucket.cpp b/src/mbgl/renderer/fill_bucket.cpp index 4622c2097..b92f3184e 100644 --- a/src/mbgl/renderer/fill_bucket.cpp +++ b/src/mbgl/renderer/fill_bucket.cpp @@ -119,49 +119,57 @@ bool FillBucket::needsClipping() const { return true; } -void FillBucket::drawElements(PlainShader& shader, gl::ObjectStore& store, bool overdraw) { +void FillBucket::drawElements(PlainShader& shader, gl::ObjectStore& store, PaintMode paintMode) { GLbyte* vertex_index = BUFFER_OFFSET(0); GLbyte* elements_index = BUFFER_OFFSET(0); for (auto& group : triangleGroups) { assert(group); - group->array[overdraw ? 1 : 0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index, store); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index)); + group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind( + shader, vertexBuffer, triangleElementsBuffer, vertex_index, store); + MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, + elements_index)); vertex_index += group->vertex_length * vertexBuffer.itemSize; elements_index += group->elements_length * triangleElementsBuffer.itemSize; } } -void FillBucket::drawElements(PatternShader& shader, gl::ObjectStore& store, bool overdraw) { +void FillBucket::drawElements(PatternShader& shader, gl::ObjectStore& store, PaintMode paintMode) { GLbyte* vertex_index = BUFFER_OFFSET(0); GLbyte* elements_index = BUFFER_OFFSET(0); for (auto& group : triangleGroups) { assert(group); - group->array[overdraw ? 3 : 2].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index, store); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index)); + group->array[paintMode == PaintMode::Overdraw ? 3 : 2].bind( + shader, vertexBuffer, triangleElementsBuffer, vertex_index, store); + MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, + elements_index)); vertex_index += group->vertex_length * vertexBuffer.itemSize; elements_index += group->elements_length * triangleElementsBuffer.itemSize; } } -void FillBucket::drawVertices(OutlineShader& shader, gl::ObjectStore& store, bool overdraw) { +void FillBucket::drawVertices(OutlineShader& shader, gl::ObjectStore& store, PaintMode paintMode) { GLbyte* vertex_index = BUFFER_OFFSET(0); GLbyte* elements_index = BUFFER_OFFSET(0); for (auto& group : lineGroups) { assert(group); - group->array[overdraw ? 1 : 0].bind(shader, vertexBuffer, lineElementsBuffer, vertex_index, store); - MBGL_CHECK_ERROR(glDrawElements(GL_LINES, group->elements_length * 2, GL_UNSIGNED_SHORT, elements_index)); + group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind( + shader, vertexBuffer, lineElementsBuffer, vertex_index, store); + MBGL_CHECK_ERROR(glDrawElements(GL_LINES, group->elements_length * 2, GL_UNSIGNED_SHORT, + elements_index)); vertex_index += group->vertex_length * vertexBuffer.itemSize; elements_index += group->elements_length * lineElementsBuffer.itemSize; } } -void FillBucket::drawVertices(OutlinePatternShader& shader, gl::ObjectStore& store, bool overdraw) { +void FillBucket::drawVertices(OutlinePatternShader& shader, gl::ObjectStore& store, PaintMode paintMode) { GLbyte* vertex_index = BUFFER_OFFSET(0); GLbyte* elements_index = BUFFER_OFFSET(0); for (auto& group : lineGroups) { assert(group); - group->array[overdraw? 3 : 2].bind(shader, vertexBuffer, lineElementsBuffer, vertex_index, store); - MBGL_CHECK_ERROR(glDrawElements(GL_LINES, group->elements_length * 2, GL_UNSIGNED_SHORT, elements_index)); + group->array[paintMode == PaintMode::Overdraw ? 3 : 2].bind( + shader, vertexBuffer, lineElementsBuffer, vertex_index, store); + MBGL_CHECK_ERROR(glDrawElements(GL_LINES, group->elements_length * 2, GL_UNSIGNED_SHORT, + elements_index)); vertex_index += group->vertex_length * vertexBuffer.itemSize; elements_index += group->elements_length * lineElementsBuffer.itemSize; } diff --git a/src/mbgl/renderer/fill_bucket.hpp b/src/mbgl/renderer/fill_bucket.hpp index cacda975f..135bf3721 100644 --- a/src/mbgl/renderer/fill_bucket.hpp +++ b/src/mbgl/renderer/fill_bucket.hpp @@ -27,10 +27,10 @@ public: void addGeometry(const GeometryCollection&); - void drawElements(PlainShader&, gl::ObjectStore&, bool overdraw); - void drawElements(PatternShader&, gl::ObjectStore&, bool overdraw); - void drawVertices(OutlineShader&, gl::ObjectStore&, bool overdraw); - void drawVertices(OutlinePatternShader&, gl::ObjectStore&, bool overdraw); + void drawElements(PlainShader&, gl::ObjectStore&, PaintMode); + void drawElements(PatternShader&, gl::ObjectStore&, PaintMode); + void drawVertices(OutlineShader&, gl::ObjectStore&, PaintMode); + void drawVertices(OutlinePatternShader&, gl::ObjectStore&, PaintMode); private: FillVertexBuffer vertexBuffer; diff --git a/src/mbgl/renderer/line_bucket.cpp b/src/mbgl/renderer/line_bucket.cpp index e9f920efa..ee8ee66b0 100644 --- a/src/mbgl/renderer/line_bucket.cpp +++ b/src/mbgl/renderer/line_bucket.cpp @@ -460,7 +460,7 @@ bool LineBucket::needsClipping() const { return true; } -void LineBucket::drawLines(LineShader& shader, gl::ObjectStore& store, bool overdraw) { +void LineBucket::drawLines(LineShader& shader, gl::ObjectStore& store, PaintMode paintMode) { GLbyte* vertex_index = BUFFER_OFFSET(0); GLbyte* elements_index = BUFFER_OFFSET(0); for (auto& group : triangleGroups) { @@ -468,7 +468,8 @@ void LineBucket::drawLines(LineShader& shader, gl::ObjectStore& store, bool over if (!group->elements_length) { continue; } - group->array[overdraw ? 1 : 0].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index, store); + group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind( + shader, vertexBuffer, triangleElementsBuffer, vertex_index, store); MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index)); vertex_index += group->vertex_length * vertexBuffer.itemSize; @@ -476,7 +477,7 @@ void LineBucket::drawLines(LineShader& shader, gl::ObjectStore& store, bool over } } -void LineBucket::drawLineSDF(LineSDFShader& shader, gl::ObjectStore& store, bool overdraw) { +void LineBucket::drawLineSDF(LineSDFShader& shader, gl::ObjectStore& store, PaintMode paintMode) { GLbyte* vertex_index = BUFFER_OFFSET(0); GLbyte* elements_index = BUFFER_OFFSET(0); for (auto& group : triangleGroups) { @@ -484,7 +485,8 @@ void LineBucket::drawLineSDF(LineSDFShader& shader, gl::ObjectStore& store, bool if (!group->elements_length) { continue; } - group->array[overdraw ? 3 : 2].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index, store); + group->array[paintMode == PaintMode::Overdraw ? 3 : 2].bind( + shader, vertexBuffer, triangleElementsBuffer, vertex_index, store); MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index)); vertex_index += group->vertex_length * vertexBuffer.itemSize; @@ -492,7 +494,7 @@ void LineBucket::drawLineSDF(LineSDFShader& shader, gl::ObjectStore& store, bool } } -void LineBucket::drawLinePatterns(LinepatternShader& shader, gl::ObjectStore& store, bool overdraw) { +void LineBucket::drawLinePatterns(LinepatternShader& shader, gl::ObjectStore& store, PaintMode paintMode) { GLbyte* vertex_index = BUFFER_OFFSET(0); GLbyte* elements_index = BUFFER_OFFSET(0); for (auto& group : triangleGroups) { @@ -500,7 +502,8 @@ void LineBucket::drawLinePatterns(LinepatternShader& shader, gl::ObjectStore& st if (!group->elements_length) { continue; } - group->array[overdraw ? 5 : 4].bind(shader, vertexBuffer, triangleElementsBuffer, vertex_index, store); + group->array[paintMode == PaintMode::Overdraw ? 5 : 4].bind( + shader, vertexBuffer, triangleElementsBuffer, vertex_index, store); MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index)); vertex_index += group->vertex_length * vertexBuffer.itemSize; diff --git a/src/mbgl/renderer/line_bucket.hpp b/src/mbgl/renderer/line_bucket.hpp index 6687faab4..d24becdf0 100644 --- a/src/mbgl/renderer/line_bucket.hpp +++ b/src/mbgl/renderer/line_bucket.hpp @@ -32,9 +32,9 @@ public: void addGeometry(const GeometryCollection&); void addGeometry(const GeometryCoordinates& line); - void drawLines(LineShader&, gl::ObjectStore&, bool overdraw); - void drawLineSDF(LineSDFShader&, gl::ObjectStore&, bool overdraw); - void drawLinePatterns(LinepatternShader&, gl::ObjectStore&, bool overdraw); + void drawLines(LineShader&, gl::ObjectStore&, PaintMode); + void drawLineSDF(LineSDFShader&, gl::ObjectStore&, PaintMode); + void drawLinePatterns(LinepatternShader&, gl::ObjectStore&, PaintMode); private: struct TriangleElement { diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index e0c482015..c0357eda3 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -68,7 +68,7 @@ void Painter::render(const Style& style, const FrameData& frame_, SpriteAtlas& a PaintParameters parameters { #ifndef NDEBUG - isOverdraw() ? *overdrawShaders : *shaders + paintMode() == PaintMode::Overdraw ? *overdrawShaders : *shaders #else *shaders #endif @@ -127,7 +127,7 @@ void Painter::render(const Style& style, const FrameData& frame_, SpriteAtlas& a config.depthMask = GL_TRUE; config.colorMask = { GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE }; - if (isOverdraw()) { + if (paintMode() == PaintMode::Overdraw) { config.blend = GL_TRUE; config.blendFunc = { GL_CONSTANT_COLOR, GL_ONE }; const float overdraw = 1.0f / 8.0f; @@ -245,7 +245,7 @@ void Painter::renderPass(PaintParameters& parameters, if (!layer.baseImpl->hasRenderPass(pass)) continue; - if (isOverdraw()) { + if (paintMode() == PaintMode::Overdraw) { config.blend = GL_TRUE; } else if (pass == RenderPass::Translucent) { config.blendFunc.reset(); diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp index 119155e01..66ce60ba0 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -125,7 +125,7 @@ private: float scaleDivisor, std::array texsize, SDFShader& sdfShader, - void (SymbolBucket::*drawSDF)(SDFShader&, gl::ObjectStore&, bool), + void (SymbolBucket::*drawSDF)(SDFShader&, gl::ObjectStore&, PaintMode), // Layout style::AlignmentType rotationAlignment, @@ -145,9 +145,14 @@ private: void setDepthSublayer(int n); #ifndef NDEBUG - bool isOverdraw() const { return frame.debugOptions & MapDebugOptions::Overdraw; } + PaintMode paintMode() const { + return frame.debugOptions & MapDebugOptions::Overdraw ? PaintMode::Overdraw + : PaintMode::Regular; + } #else - bool isOverdraw() const { return false; } + PaintMode paintMode() const { + return PaintMode::Regular; + } #endif mat4 projMatrix; diff --git a/src/mbgl/renderer/painter_fill.cpp b/src/mbgl/renderer/painter_fill.cpp index 106d030fc..7d952caa1 100644 --- a/src/mbgl/renderer/painter_fill.cpp +++ b/src/mbgl/renderer/painter_fill.cpp @@ -69,7 +69,7 @@ void Painter::renderFill(PaintParameters& parameters, // the (non-antialiased) fill. setDepthSublayer(0); // OK } - bucket.drawVertices(outlineShader, store, isOverdraw()); + bucket.drawVertices(outlineShader, store, paintMode()); } if (pattern) { @@ -105,7 +105,7 @@ void Painter::renderFill(PaintParameters& parameters, // Draw the actual triangles into the color & stencil buffer. setDepthSublayer(0); - bucket.drawElements(patternShader, store, isOverdraw()); + bucket.drawElements(patternShader, store, paintMode()); if (properties.fillAntialias && !isOutlineColorDefined) { config.program = outlinePatternShader.getID(); @@ -132,7 +132,7 @@ void Painter::renderFill(PaintParameters& parameters, spriteAtlas->bind(true, store, config, 0); setDepthSublayer(2); - bucket.drawVertices(outlinePatternShader, store, isOverdraw()); + bucket.drawVertices(outlinePatternShader, store, paintMode()); } } } else { @@ -149,7 +149,7 @@ void Painter::renderFill(PaintParameters& parameters, // Draw the actual triangles into the color & stencil buffer. setDepthSublayer(1); - bucket.drawElements(plainShader, store, isOverdraw()); + bucket.drawElements(plainShader, store, paintMode()); } } @@ -166,7 +166,7 @@ void Painter::renderFill(PaintParameters& parameters, outlineShader.u_world = worldSize; setDepthSublayer(2); - bucket.drawVertices(outlineShader, store, isOverdraw()); + bucket.drawVertices(outlineShader, store, paintMode()); } } diff --git a/src/mbgl/renderer/painter_line.cpp b/src/mbgl/renderer/painter_line.cpp index b0b2bf692..2702440d2 100644 --- a/src/mbgl/renderer/painter_line.cpp +++ b/src/mbgl/renderer/painter_line.cpp @@ -96,7 +96,7 @@ void Painter::renderLine(PaintParameters& parameters, linesdfShader.u_image = 0; lineAtlas->bind(store, config, 0); - bucket.drawLineSDF(linesdfShader, store, isOverdraw()); + bucket.drawLineSDF(linesdfShader, store, paintMode()); } else if (!properties.linePattern.value.from.empty()) { optional imagePosA = spriteAtlas->getPosition( @@ -139,7 +139,7 @@ void Painter::renderLine(PaintParameters& parameters, linepatternShader.u_image = 0; spriteAtlas->bind(true, store, config, 0); - bucket.drawLinePatterns(linepatternShader, store, isOverdraw()); + bucket.drawLinePatterns(linepatternShader, store, paintMode()); } else { config.program = lineShader.getID(); @@ -157,7 +157,7 @@ void Painter::renderLine(PaintParameters& parameters, lineShader.u_color = color; lineShader.u_opacity = opacity; - bucket.drawLines(lineShader, store, isOverdraw()); + bucket.drawLines(lineShader, store, paintMode()); } } diff --git a/src/mbgl/renderer/painter_symbol.cpp b/src/mbgl/renderer/painter_symbol.cpp index 859932984..aa5d4f0d9 100644 --- a/src/mbgl/renderer/painter_symbol.cpp +++ b/src/mbgl/renderer/painter_symbol.cpp @@ -20,7 +20,7 @@ void Painter::renderSDF(SymbolBucket& bucket, float sdfFontSize, std::array texsize, SDFShader& sdfShader, - void (SymbolBucket::*drawSDF)(SDFShader&, gl::ObjectStore&, bool), + void (SymbolBucket::*drawSDF)(SDFShader&, gl::ObjectStore&, PaintMode), // Layout AlignmentType rotationAlignment, @@ -96,7 +96,7 @@ void Painter::renderSDF(SymbolBucket& bucket, sdfShader.u_buffer = (haloOffset - haloWidth / fontScale) / sdfPx; setDepthSublayer(0); - (bucket.*drawSDF)(sdfShader, store, isOverdraw()); + (bucket.*drawSDF)(sdfShader, store, paintMode()); } // Then, we draw the text/icon over the halo @@ -107,7 +107,7 @@ void Painter::renderSDF(SymbolBucket& bucket, sdfShader.u_buffer = (256.0f - 64.0f) / 256.0f; setDepthSublayer(1); - (bucket.*drawSDF)(sdfShader, store, isOverdraw()); + (bucket.*drawSDF)(sdfShader, store, paintMode()); } } @@ -219,7 +219,7 @@ void Painter::renderSymbol(PaintParameters& parameters, iconShader.u_fadetexture = 1; setDepthSublayer(0); - bucket.drawIcons(iconShader, store, isOverdraw()); + bucket.drawIcons(iconShader, store, paintMode()); } } diff --git a/src/mbgl/renderer/render_pass.hpp b/src/mbgl/renderer/render_pass.hpp index 93edac203..d273e34ff 100644 --- a/src/mbgl/renderer/render_pass.hpp +++ b/src/mbgl/renderer/render_pass.hpp @@ -24,4 +24,10 @@ constexpr RenderPass operator&(RenderPass a, RenderPass b) { return RenderPass(mbgl::underlying_type(a) & mbgl::underlying_type(b)); } +// Defines whether the overdraw shaders should be used instead of the regular shaders. +enum class PaintMode : bool { + Regular = false, + Overdraw = true, +}; + } // namespace mbgl diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp index 842322ddc..420ca27f0 100644 --- a/src/mbgl/renderer/symbol_bucket.cpp +++ b/src/mbgl/renderer/symbol_bucket.cpp @@ -601,40 +601,46 @@ void SymbolBucket::swapRenderData() { } } -void SymbolBucket::drawGlyphs(SDFShader& shader, gl::ObjectStore& store, bool overdraw) { +void SymbolBucket::drawGlyphs(SDFShader& shader, gl::ObjectStore& store, PaintMode paintMode) { GLbyte *vertex_index = BUFFER_OFFSET_0; GLbyte *elements_index = BUFFER_OFFSET_0; auto& text = renderData->text; for (auto &group : text.groups) { assert(group); - group->array[overdraw ? 1 : 0].bind(shader, text.vertices, text.triangles, vertex_index, store); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index)); + group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind( + shader, text.vertices, text.triangles, vertex_index, store); + MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, + elements_index)); vertex_index += group->vertex_length * text.vertices.itemSize; elements_index += group->elements_length * text.triangles.itemSize; } } -void SymbolBucket::drawIcons(SDFShader& shader, gl::ObjectStore& store, bool overdraw) { +void SymbolBucket::drawIcons(SDFShader& shader, gl::ObjectStore& store, PaintMode paintMode) { GLbyte *vertex_index = BUFFER_OFFSET_0; GLbyte *elements_index = BUFFER_OFFSET_0; auto& icon = renderData->icon; for (auto &group : icon.groups) { assert(group); - group->array[overdraw ? 1 : 0].bind(shader, icon.vertices, icon.triangles, vertex_index, store); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index)); + group->array[paintMode == PaintMode::Overdraw ? 1 : 0].bind( + shader, icon.vertices, icon.triangles, vertex_index, store); + MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, + elements_index)); vertex_index += group->vertex_length * icon.vertices.itemSize; elements_index += group->elements_length * icon.triangles.itemSize; } } -void SymbolBucket::drawIcons(IconShader& shader, gl::ObjectStore& store, bool overdraw) { +void SymbolBucket::drawIcons(IconShader& shader, gl::ObjectStore& store, PaintMode paintMode) { GLbyte *vertex_index = BUFFER_OFFSET_0; GLbyte *elements_index = BUFFER_OFFSET_0; auto& icon = renderData->icon; for (auto &group : icon.groups) { assert(group); - group->array[overdraw ? 3 : 2].bind(shader, icon.vertices, icon.triangles, vertex_index, store); - MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, elements_index)); + group->array[paintMode == PaintMode::Overdraw ? 3 : 2].bind( + shader, icon.vertices, icon.triangles, vertex_index, store); + MBGL_CHECK_ERROR(glDrawElements(GL_TRIANGLES, group->elements_length * 3, GL_UNSIGNED_SHORT, + elements_index)); vertex_index += group->vertex_length * icon.vertices.itemSize; elements_index += group->elements_length * icon.triangles.itemSize; } diff --git a/src/mbgl/renderer/symbol_bucket.hpp b/src/mbgl/renderer/symbol_bucket.hpp index 79c32e9d8..0b95dd8b4 100644 --- a/src/mbgl/renderer/symbol_bucket.hpp +++ b/src/mbgl/renderer/symbol_bucket.hpp @@ -82,9 +82,9 @@ public: GlyphAtlas&, GlyphStore&); - void drawGlyphs(SDFShader&, gl::ObjectStore&, bool overdraw); - void drawIcons(SDFShader&, gl::ObjectStore&, bool overdraw); - void drawIcons(IconShader&, gl::ObjectStore&, bool overdraw); + void drawGlyphs(SDFShader&, gl::ObjectStore&, PaintMode); + void drawIcons(SDFShader&, gl::ObjectStore&, PaintMode); + void drawIcons(IconShader&, gl::ObjectStore&, PaintMode); void drawCollisionBoxes(CollisionBoxShader&, gl::ObjectStore&); void parseFeatures(const GeometryTileLayer&, const style::Filter&);