Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Support GL face culling #12725

Merged
merged 3 commits into from
Sep 13, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cmake/core-files.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ src/mbgl/gl/color_mode.cpp
src/mbgl/gl/color_mode.hpp
src/mbgl/gl/context.cpp
src/mbgl/gl/context.hpp
src/mbgl/gl/cull_face_mode.cpp
src/mbgl/gl/cull_face_mode.hpp
src/mbgl/gl/debugging.cpp
src/mbgl/gl/debugging.hpp
src/mbgl/gl/debugging_extension.cpp
Expand Down
2 changes: 1 addition & 1 deletion mapbox-gl-js
Submodule mapbox-gl-js updated 78 files
+8 −2 CONTRIBUTING.md
+2 −1 batfish.config.js
+1 −1 debug/.eslintrc
+117 −0 debug/custom3d.html
+101 −0 debug/threejs.html
+1 −1 debug/wms.html
+1 −0 docs/documentation.yml
+52 −0 docs/pages/example/change-building-color-based-on-zoom-level.html
+10 −0 docs/pages/example/change-building-color-based-on-zoom-level.js
+52 −0 docs/pages/example/custom-style-layer.html
+10 −0 docs/pages/example/custom-style-layer.js
+25 −0 docs/pages/example/display-and-style-rich-text-labels.html
+10 −0 docs/pages/example/display-and-style-rich-text-labels.js
+1 −1 docs/pages/example/hover-styles.html
+29 −0 docs/pages/example/marker-from-geocode.html
+10 −0 docs/pages/example/marker-from-geocode.js
+41 −0 docs/pages/example/style-ocean-depth-data.html
+10 −0 docs/pages/example/style-ocean-depth-data.js
+1 −1 docs/pages/example/wms.html
+4 −0 docs/pages/plugins.js
+1 −1 docs/pages/style-spec.js
+5 −5 package.json
+9 −3 src/data/bucket/fill_extrusion_bucket.js
+9 −0 src/geo/transform.js
+66 −1 src/gl/context.js
+26 −0 src/gl/cull_face_mode.js
+5 −11 src/gl/index_buffer.js
+14 −0 src/gl/types.js
+391 −53 src/gl/value.js
+2 −1 src/render/draw_background.js
+2 −1 src/render/draw_circle.js
+2 −0 src/render/draw_collision_debug.js
+58 −0 src/render/draw_custom.js
+4 −3 src/render/draw_debug.js
+2 −1 src/render/draw_fill.js
+6 −53 src/render/draw_fill_extrusion.js
+3 −2 src/render/draw_heatmap.js
+4 −3 src/render/draw_hillshade.js
+2 −1 src/render/draw_line.js
+4 −3 src/render/draw_raster.js
+2 −1 src/render/draw_symbol.js
+1 −1 src/render/glyph_atlas.js
+1 −1 src/render/image_manager.js
+64 −0 src/render/offscreen.js
+39 −5 src/render/painter.js
+3 −0 src/render/program.js
+2 −3 src/render/program/fill_extrusion_program.js
+4 −6 src/render/texture.js
+1 −1 src/source/canvas_source.js
+1 −1 src/source/video_source.js
+20 −6 src/style-spec/reference/v8.json
+8 −2 src/style/create_style_layer.js
+40 −15 src/style/style.js
+24 −13 src/style/style_layer.js
+216 −0 src/style/style_layer/custom_style_layer.js
+20 −1 src/symbol/placement.js
+2 −2 src/ui/camera.js
+16 −6 src/ui/map.js
+2 −0 src/util/util.js
+123 −0 test/integration/custom_layer_implementations.js
+ test/integration/render-tests/custom-layer-js/null-island/expected.png
+18 −0 test/integration/render-tests/custom-layer-js/null-island/style.json
+ test/integration/render-tests/custom-layer-js/tent-3d/expected.png
+137 −0 test/integration/render-tests/custom-layer-js/tent-3d/style.json
+ test/integration/render-tests/fill-extrusion-pattern/@2x/expected.png
+ test/integration/render-tests/fill-extrusion-pattern/feature-expression/expected.png
+ test/integration/render-tests/fill-extrusion-pattern/function-2/expected.png
+ test/integration/render-tests/fill-extrusion-pattern/function/expected.png
+ test/integration/render-tests/fill-extrusion-pattern/literal/expected.png
+ test/integration/render-tests/fill-extrusion-pattern/opacity/expected.png
+ test/integration/render-tests/regressions/mapbox-gl-js#7172/expected.png
+67 −0 test/integration/render-tests/regressions/mapbox-gl-js#7172/style.json
+ test/integration/render-tests/regressions/mapbox-gl-native#12812/expected.png
+55 −0 test/integration/render-tests/regressions/mapbox-gl-native#12812/style.json
+5 −0 test/suite_implementation.js
+1 −1 test/unit/source/canvas_source.test.js
+2 −2 test/unit/ui/map/requestRenderFrame.test.js
+376 −235 yarn.lock
2 changes: 2 additions & 0 deletions platform/node/test/ignores.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@
"render-tests/bright-v9/z0-wide": "https://github.com/mapbox/mapbox-gl-native/pull/12611",
"render-tests/collator/resolved-locale": "Some test platforms don't resolve 'en' locale",
"render-tests/collator/default": "Some test platforms don't resolve 'en' locale",
"render-tests/custom-layer-js/null-island": "Not implemented",
"render-tests/custom-layer-js/tent-3d": "Not implemented",
"render-tests/debug/collision": "https://github.com/mapbox/mapbox-gl-native/issues/3841",
"render-tests/debug/collision-lines": "https://github.com/mapbox/mapbox-gl-native/issues/10412",
"render-tests/debug/collision-lines-overscaled": "https://github.com/mapbox/mapbox-gl-native/issues/10412",
Expand Down
13 changes: 13 additions & 0 deletions src/mbgl/gl/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -617,6 +617,9 @@ void Context::setDirtyState() {
clearDepth.setDirty();
clearColor.setDirty();
clearStencil.setDirty();
cullFace.setDirty();
cullFaceSide.setDirty();
frontFace.setDirty();
program.setDirty();
lineWidth.setDirty();
activeTextureUnit.setDirty();
Expand Down Expand Up @@ -663,6 +666,16 @@ void Context::clear(optional<mbgl::Color> color,
MBGL_CHECK_ERROR(glClear(mask));
}

void Context::setCullFaceMode(const CullFaceMode& mode) {
cullFace = mode.cullFace;

// These shouldn't need to be updated when face culling is disabled, but we
// might end up having the same isssues with Adreno 2xx GPUs as noted in
// Context::setDepthMode.
cullFaceSide = mode.side;
frontFace = mode.frontFace;
}

#if not MBGL_USE_GLES2
void Context::setDrawMode(const Points& points) {
pointSize = points.pointSize;
Expand Down
4 changes: 4 additions & 0 deletions src/mbgl/gl/context.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ class Context {
void setDepthMode(const DepthMode&);
void setStencilMode(const StencilMode&);
void setColorMode(const ColorMode&);
void setCullFaceMode(const CullFaceMode&);

void draw(PrimitiveType,
std::size_t indexOffset,
Expand Down Expand Up @@ -263,6 +264,9 @@ class Context {
State<value::ClearStencil> clearStencil;
State<value::LineWidth> lineWidth;
State<value::BindRenderbuffer> bindRenderbuffer;
State<value::CullFace> cullFace;
State<value::CullFaceSide> cullFaceSide;
State<value::FrontFace> frontFace;
#if not MBGL_USE_GLES2
State<value::PointSize> pointSize;
#endif // MBGL_USE_GLES2
Expand Down
16 changes: 16 additions & 0 deletions src/mbgl/gl/cull_face_mode.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#include <mbgl/gl/cull_face_mode.hpp>
#include <mbgl/gl/gl.hpp>
#include <mbgl/util/traits.hpp>

namespace mbgl {
namespace gl {

static_assert(underlying_type(CullFaceMode::Front) == GL_FRONT, "OpenGL enum mismatch");
static_assert(underlying_type(CullFaceMode::Back) == GL_BACK, "OpenGL enum mismatch");
static_assert(underlying_type(CullFaceMode::FrontAndBack) == GL_FRONT_AND_BACK, "OpenGL enum mismatch");

static_assert(underlying_type(CullFaceMode::Clockwise) == GL_CW, "OpenGL enum mismatch");
static_assert(underlying_type(CullFaceMode::CounterClockwise) == GL_CCW, "OpenGL enum mismatch");

} // namespace gl
} // namespace mbgl
40 changes: 40 additions & 0 deletions src/mbgl/gl/cull_face_mode.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#pragma once

#include <cstdint>

namespace mbgl {
namespace gl {

class CullFaceMode {
public:
enum CullFace : bool {
Disable = false,
Enable = true,
};

enum CullFaceSide : uint32_t {
Front = 0x0404,
Back = 0x0405,
FrontAndBack = 0x0408,
};

enum FrontFace : uint32_t {
Clockwise = 0x0900,
CounterClockwise = 0x0901
};

CullFace cullFace;
CullFaceSide side;
FrontFace frontFace;

static CullFaceMode disabled() {
return CullFaceMode { Disable, CullFaceSide::Back, FrontFace::CounterClockwise };
}

static CullFaceMode backCCW() {
return CullFaceMode { Enable, CullFaceSide::Back, FrontFace::CounterClockwise };
}
};

} // namespace gl
} // namespace mbgl
2 changes: 2 additions & 0 deletions src/mbgl/gl/program.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ class Program {
DepthMode depthMode,
StencilMode stencilMode,
ColorMode colorMode,
CullFaceMode cullFaceMode,
const UniformValues& uniformValues,
VertexArray& vertexArray,
const AttributeBindings& attributeBindings,
Expand All @@ -130,6 +131,7 @@ class Program {
context.setDepthMode(depthMode);
context.setStencilMode(stencilMode);
context.setColorMode(colorMode);
context.setCullFaceMode(cullFaceMode);

context.program = program;

Expand Down
36 changes: 36 additions & 0 deletions src/mbgl/gl/value.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,42 @@ BindRenderbuffer::Type BindRenderbuffer::Get() {
return binding;
}

const constexpr CullFace::Type CullFace::Default;

void CullFace::Set(const Type& value) {
MBGL_CHECK_ERROR(value == CullFaceMode::Enable ? glEnable(GL_CULL_FACE) : glDisable(GL_CULL_FACE));
}

CullFace::Type CullFace::Get() {
GLboolean cullFace;
MBGL_CHECK_ERROR(cullFace = glIsEnabled(GL_CULL_FACE));
return cullFace ? CullFaceMode::Enable : CullFaceMode::Disable;
}

const constexpr CullFaceSide::Type CullFaceSide::Default;

void CullFaceSide::Set(const Type& value) {
MBGL_CHECK_ERROR(glCullFace(static_cast<GLenum>(value)));
}

CullFaceSide::Type CullFaceSide::Get() {
GLint cullFaceMode;
MBGL_CHECK_ERROR(glGetIntegerv(GL_CULL_FACE_MODE, &cullFaceMode));
return static_cast<Type>(cullFaceMode);
}

const constexpr FrontFace::Type FrontFace::Default;

void FrontFace::Set(const Type& value) {
MBGL_CHECK_ERROR(glFrontFace(static_cast<GLenum>(value)));
}

FrontFace::Type FrontFace::Get() {
GLint frontFace;
MBGL_CHECK_ERROR(glGetIntegerv(GL_FRONT_FACE, &frontFace));
return static_cast<Type>(frontFace);
}

const constexpr BindTexture::Type BindTexture::Default;

void BindTexture::Set(const Type& value) {
Expand Down
22 changes: 22 additions & 0 deletions src/mbgl/gl/value.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <mbgl/gl/depth_mode.hpp>
#include <mbgl/gl/stencil_mode.hpp>
#include <mbgl/gl/color_mode.hpp>
#include <mbgl/gl/cull_face_mode.hpp>
#include <mbgl/gl/attribute.hpp>
#include <mbgl/util/color.hpp>
#include <mbgl/util/size.hpp>
Expand Down Expand Up @@ -212,6 +213,27 @@ struct BindRenderbuffer {
static Type Get();
};

struct CullFace {
using Type = CullFaceMode::CullFace;
static const constexpr Type Default = CullFaceMode::Disable;
static void Set(const Type&);
static Type Get();
};

struct CullFaceSide {
using Type = CullFaceMode::CullFaceSide;
static const constexpr Type Default = CullFaceMode::Back;
static void Set(const Type&);
static Type Get();
};

struct FrontFace {
using Type = CullFaceMode::FrontFace;
static const constexpr Type Default = CullFaceMode::CounterClockwise;
static void Set(const Type&);
static Type Get();
};

struct BindTexture {
using Type = gl::TextureID;
static const constexpr Type Default = 0;
Expand Down
4 changes: 4 additions & 0 deletions src/mbgl/programs/collision_box_program.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class CollisionBoxProgram : public Program<
gl::DepthMode depthMode,
gl::StencilMode stencilMode,
gl::ColorMode colorMode,
gl::CullFaceMode cullFaceMode,
const UniformValues& uniformValues,
const gl::VertexBuffer<CollisionBoxLayoutAttributes::Vertex>& layoutVertexBuffer,
const gl::VertexBuffer<CollisionBoxDynamicAttributes::Vertex>& dynamicVertexBuffer,
Expand Down Expand Up @@ -92,6 +93,7 @@ class CollisionBoxProgram : public Program<
std::move(depthMode),
std::move(stencilMode),
std::move(colorMode),
std::move(cullFaceMode),
allUniformValues,
vertexArrayIt->second,
Attributes::offsetBindings(allAttributeBindings, segment.vertexOffset),
Expand Down Expand Up @@ -140,6 +142,7 @@ class CollisionCircleProgram : public Program<
gl::DepthMode depthMode,
gl::StencilMode stencilMode,
gl::ColorMode colorMode,
gl::CullFaceMode cullFaceMode,
const UniformValues& uniformValues,
const gl::VertexBuffer<CollisionBoxLayoutAttributes::Vertex>& layoutVertexBuffer,
const gl::VertexBuffer<CollisionBoxDynamicAttributes::Vertex>& dynamicVertexBuffer,
Expand Down Expand Up @@ -169,6 +172,7 @@ class CollisionCircleProgram : public Program<
std::move(depthMode),
std::move(stencilMode),
std::move(colorMode),
std::move(cullFaceMode),
allUniformValues,
vertexArrayIt->second,
Attributes::offsetBindings(allAttributeBindings, segment.vertexOffset),
Expand Down
2 changes: 2 additions & 0 deletions src/mbgl/programs/program.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ class Program {
gl::DepthMode depthMode,
gl::StencilMode stencilMode,
gl::ColorMode colorMode,
gl::CullFaceMode cullFaceMode,
const gl::IndexBuffer<DrawMode>& indexBuffer,
const SegmentVector<Attributes>& segments,
const typename AllUniforms::Values& allUniformValues,
Expand All @@ -91,6 +92,7 @@ class Program {
std::move(depthMode),
std::move(stencilMode),
std::move(colorMode),
std::move(cullFaceMode),
allUniformValues,
vertexArrayIt->second,
Attributes::offsetBindings(allAttributeBindings, segment.vertexOffset),
Expand Down
2 changes: 2 additions & 0 deletions src/mbgl/programs/symbol_program.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@ class SymbolProgram {
gl::DepthMode depthMode,
gl::StencilMode stencilMode,
gl::ColorMode colorMode,
gl::CullFaceMode cullFaceMode,
const gl::IndexBuffer<DrawMode>& indexBuffer,
const SegmentVector<Attributes>& segments,
const typename AllUniforms::Values& allUniformValues,
Expand All @@ -329,6 +330,7 @@ class SymbolProgram {
std::move(depthMode),
std::move(stencilMode),
std::move(colorMode),
std::move(cullFaceMode),
allUniformValues,
vertexArrayIt->second,
Attributes::offsetBindings(allAttributeBindings, segment.vertexOffset),
Expand Down
12 changes: 9 additions & 3 deletions src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,12 @@ void FillExtrusionBucket::addFeature(const GeometryTileFeature& feature,
vertices.emplace_back(
FillExtrusionProgram::layoutVertex(p2, perp.x, perp.y, 0, 1, edgeDistance));

triangles.emplace_back(triangleIndex, triangleIndex + 1, triangleIndex + 2);
// ┌──────┐
// │ 0 1 │ Counter-Clockwise winding order.
// │ │ Triangle 1: 0 => 2 => 1
// │ 2 3 │ Triangle 2: 1 => 2 => 3
// └──────┘
triangles.emplace_back(triangleIndex, triangleIndex + 2, triangleIndex + 1);
triangles.emplace_back(triangleIndex + 1, triangleIndex + 2, triangleIndex + 3);
triangleIndex += 4;
triangleSegment.vertexLength += 4;
Expand All @@ -141,8 +146,9 @@ void FillExtrusionBucket::addFeature(const GeometryTileFeature& feature,
assert(nIndices % 3 == 0);

for (uint32_t i = 0; i < nIndices; i += 3) {
triangles.emplace_back(flatIndices[indices[i]], flatIndices[indices[i + 1]],
flatIndices[indices[i + 2]]);
// Counter-Clockwise winding order.
triangles.emplace_back(flatIndices[indices[i]], flatIndices[indices[i + 2]],
flatIndices[indices[i + 1]]);
}

triangleSegment.vertexLength += totalVertices;
Expand Down
1 change: 1 addition & 0 deletions src/mbgl/renderer/layers/render_background_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ void RenderBackgroundLayer::render(PaintParameters& parameters, RenderSource*) {
parameters.depthModeForSublayer(0, gl::DepthMode::ReadOnly),
gl::StencilMode::disabled(),
parameters.colorModeForRenderPass(),
gl::CullFaceMode::disabled(),
parameters.staticData.quadTriangleIndexBuffer,
parameters.staticData.tileTriangleSegments,
allUniformValues,
Expand Down
1 change: 1 addition & 0 deletions src/mbgl/renderer/layers/render_circle_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ void RenderCircleLayer::render(PaintParameters& parameters, RenderSource*) {
? parameters.stencilModeForClipping(tile.clip)
: gl::StencilMode::disabled(),
parameters.colorModeForRenderPass(),
gl::CullFaceMode::disabled(),
*bucket.indexBuffer,
bucket.segments,
allUniformValues,
Expand Down
1 change: 1 addition & 0 deletions src/mbgl/renderer/layers/render_custom_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ void RenderCustomLayer::render(PaintParameters& paintParameters, RenderSource*)
glContext.setDepthMode(paintParameters.depthModeForSublayer(0, gl::DepthMode::ReadOnly));
glContext.setStencilMode(gl::StencilMode::disabled());
glContext.setColorMode(paintParameters.colorModeForRenderPass());
glContext.setCullFaceMode(gl::CullFaceMode::disabled());

CustomLayerRenderParameters parameters;

Expand Down
2 changes: 2 additions & 0 deletions src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource*
parameters.depthModeFor3D(gl::DepthMode::ReadWrite),
gl::StencilMode::disabled(),
parameters.colorModeForRenderPass(),
gl::CullFaceMode::backCCW(),
*tileBucket.indexBuffer,
tileBucket.triangleSegments,
allUniformValues,
Expand Down Expand Up @@ -209,6 +210,7 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource*
gl::DepthMode::disabled(),
gl::StencilMode::disabled(),
parameters.colorModeForRenderPass(),
gl::CullFaceMode::disabled(),
parameters.staticData.quadTriangleIndexBuffer,
parameters.staticData.extrusionTextureSegments,
allUniformValues,
Expand Down
2 changes: 2 additions & 0 deletions src/mbgl/renderer/layers/render_fill_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ void RenderFillLayer::render(PaintParameters& parameters, RenderSource*) {
depthMode,
parameters.stencilModeForClipping(tile.clip),
parameters.colorModeForRenderPass(),
gl::CullFaceMode::disabled(),
indexBuffer,
segments,
allUniformValues,
Expand Down Expand Up @@ -208,6 +209,7 @@ void RenderFillLayer::render(PaintParameters& parameters, RenderSource*) {
depthMode,
parameters.stencilModeForClipping(tile.clip),
parameters.colorModeForRenderPass(),
gl::CullFaceMode::disabled(),
indexBuffer,
segments,
allUniformValues,
Expand Down
2 changes: 2 additions & 0 deletions src/mbgl/renderer/layers/render_heatmap_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ void RenderHeatmapLayer::render(PaintParameters& parameters, RenderSource*) {
parameters.depthModeForSublayer(0, gl::DepthMode::ReadOnly),
stencilMode,
gl::ColorMode::additive(),
gl::CullFaceMode::disabled(),
*bucket.indexBuffer,
bucket.segments,
allUniformValues,
Expand Down Expand Up @@ -174,6 +175,7 @@ void RenderHeatmapLayer::render(PaintParameters& parameters, RenderSource*) {
gl::DepthMode::disabled(),
gl::StencilMode::disabled(),
parameters.colorModeForRenderPass(),
gl::CullFaceMode::disabled(),
parameters.staticData.quadTriangleIndexBuffer,
parameters.staticData.extrusionTextureSegments,
allUniformValues,
Expand Down
2 changes: 2 additions & 0 deletions src/mbgl/renderer/layers/render_hillshade_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ void RenderHillshadeLayer::render(PaintParameters& parameters, RenderSource* src
parameters.depthModeForSublayer(0, gl::DepthMode::ReadOnly),
gl::StencilMode::disabled(),
parameters.colorModeForRenderPass(),
gl::CullFaceMode::disabled(),
indexBuffer,
segments,
allUniformValues,
Expand Down Expand Up @@ -165,6 +166,7 @@ void RenderHillshadeLayer::render(PaintParameters& parameters, RenderSource* src
parameters.depthModeForSublayer(0, gl::DepthMode::ReadOnly),
gl::StencilMode::disabled(),
parameters.colorModeForRenderPass(),
gl::CullFaceMode::disabled(),
parameters.staticData.quadTriangleIndexBuffer,
parameters.staticData.rasterSegments,
allUniformValues,
Expand Down
Loading