diff --git a/include/mbgl/map/mode.hpp b/include/mbgl/map/mode.hpp index c9b9f6095..2efc8b18e 100644 --- a/include/mbgl/map/mode.hpp +++ b/include/mbgl/map/mode.hpp @@ -47,6 +47,7 @@ enum class MapDebugOptions : EnumType { // FIXME: https://github.com/mapbox/mapbox-gl-native/issues/5117 #ifndef GL_ES_VERSION_2_0 StencilClip = 1 << 6, + DepthBuffer = 1 << 7, #endif // GL_ES_VERSION_2_0 }; @@ -55,11 +56,19 @@ constexpr MapDebugOptions operator|(MapDebugOptions lhs, MapDebugOptions rhs) { } constexpr MapDebugOptions& operator|=(MapDebugOptions& lhs, MapDebugOptions rhs) { - return (lhs = lhs | rhs); + return (lhs = MapDebugOptions(mbgl::underlying_type(lhs) | mbgl::underlying_type(rhs))); } constexpr bool operator&(MapDebugOptions lhs, MapDebugOptions rhs) { return mbgl::underlying_type(lhs) & mbgl::underlying_type(rhs); } +constexpr MapDebugOptions& operator&=(MapDebugOptions& lhs, MapDebugOptions rhs) { + return (lhs = MapDebugOptions(mbgl::underlying_type(lhs) & mbgl::underlying_type(rhs))); +} + +constexpr MapDebugOptions operator~(MapDebugOptions value) { + return MapDebugOptions(~mbgl::underlying_type(value)); +} + } // namespace mbgl diff --git a/platform/default/glfw_view.cpp b/platform/default/glfw_view.cpp index 863f42ec7..b84bbfdf8 100644 --- a/platform/default/glfw_view.cpp +++ b/platform/default/glfw_view.cpp @@ -97,6 +97,7 @@ GLFWView::GLFWView(bool fullscreen_, bool benchmark_) printf("- Press `Z` to cycle through north orientations\n"); printf("- Prezz `X` to cycle through the viewport modes\n"); printf("- Press `A` to cycle through Mapbox offices in the world + dateline monument\n"); + printf("- Press `B` to cycle through the color, stencil, and depth buffer\n"); printf("\n"); printf("- Press `1` through `6` to add increasing numbers of point annotations for testing\n"); printf("- Press `7` through `0` to add increasing numbers of shape annotations for testing\n"); @@ -155,6 +156,18 @@ void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action, } } break; + case GLFW_KEY_B: { + auto debug = view->map->getDebug(); + if (debug & mbgl::MapDebugOptions::StencilClip) { + debug &= ~mbgl::MapDebugOptions::StencilClip; + debug |= mbgl::MapDebugOptions::DepthBuffer; + } else if (debug & mbgl::MapDebugOptions::DepthBuffer) { + debug &= ~mbgl::MapDebugOptions::DepthBuffer; + } else { + debug |= mbgl::MapDebugOptions::StencilClip; + } + view->map->setDebug(debug); + } break; case GLFW_KEY_N: if (!mods) view->map->resetNorth(); diff --git a/platform/macos/app/Base.lproj/MainMenu.xib b/platform/macos/app/Base.lproj/MainMenu.xib index fae2a7db7..716872a32 100644 --- a/platform/macos/app/Base.lproj/MainMenu.xib +++ b/platform/macos/app/Base.lproj/MainMenu.xib @@ -474,6 +474,12 @@ + + + + + + diff --git a/platform/macos/app/MapDocument.m b/platform/macos/app/MapDocument.m index 9e6553999..3bb8f5872 100644 --- a/platform/macos/app/MapDocument.m +++ b/platform/macos/app/MapDocument.m @@ -283,12 +283,19 @@ NS_ARRAY_OF(id ) *MBXFlattenedShapes(NS_ARRAY_OF(id ) *MBXFlattenedShapes(NS_ARRAY_OF(id ) *MBXFlattenedShapes(NS_ARRAY_OF(id setDebug(options); } diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index 8500a946f..163095d85 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -198,6 +198,12 @@ void Painter::render(const Style& style, const FrameData& frame_, SpriteAtlas& a } } +#ifndef NDEBUG + if (frame.debugOptions & MapDebugOptions::DepthBuffer) { + renderDepthBuffer(); + } +#endif + // TODO: Find a better way to unbind VAOs after we're done with them without introducing // unnecessary bind(0)/bind(N) sequences. { diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp index 2b6c1efde..119155e01 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -89,6 +89,8 @@ public: #ifndef NDEBUG // Renders tile clip boundaries, using stencil buffer to calculate fill color. void renderClipMasks(); + // Renders the depth buffer. + void renderDepthBuffer(); #endif void renderDebugText(Tile&, const mat4&); diff --git a/src/mbgl/renderer/painter_debug.cpp b/src/mbgl/renderer/painter_debug.cpp index d6336b843..7c24f67fb 100644 --- a/src/mbgl/renderer/painter_debug.cpp +++ b/src/mbgl/renderer/painter_debug.cpp @@ -125,4 +125,39 @@ void Painter::renderClipMasks() { } #endif // NDEBUG +#ifndef NDEBUG +void Painter::renderDepthBuffer() { + config.stencilTest = GL_FALSE; + config.depthTest = GL_FALSE; + config.program = 0; + config.colorMask = { GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE }; + +#ifndef GL_ES_VERSION_2_0 + config.pixelZoom = { 1, 1 }; + config.rasterPos = {{ -1, -1, 0, 0 }}; + + // Read the stencil buffer + const auto& fbSize = frame.framebufferSize; + auto pixels = std::make_unique(fbSize[0] * fbSize[1]); + + const double base = 1.0 / (1.0 - depthRangeSize); + glPixelTransferf(GL_DEPTH_SCALE, base); + glPixelTransferf(GL_DEPTH_BIAS, 1.0 - base); + + MBGL_CHECK_ERROR(glReadPixels( + 0, // GLint x + 0, // GLint y + fbSize[0], // GLsizei width + fbSize[1], // GLsizei height + GL_DEPTH_COMPONENT, // GLenum format + GL_UNSIGNED_BYTE, // GLenum type + pixels.get() // GLvoid * data + )); + + MBGL_CHECK_ERROR(glWindowPos2i(0, 0)); + MBGL_CHECK_ERROR(glDrawPixels(fbSize[0], fbSize[1], GL_LUMINANCE, GL_UNSIGNED_BYTE, pixels.get())); +#endif // GL_ES_VERSION_2_0 +} +#endif // NDEBUG + } // namespace mbgl