[core] Move GLFW stencil clip debug to core

This makes the stencil clip debug available to all platforms.

Fixes #4669.
This commit is contained in:
Bruno de Oliveira Abinader
2016-05-23 19:15:10 +03:00
parent 876bf0687a
commit 1769e6fcb4
7 changed files with 57 additions and 56 deletions

View File

@@ -43,6 +43,10 @@ enum class MapDebugOptions : EnumType {
Timestamps = 1 << 3,
Collision = 1 << 4,
Wireframe = 1 << 5,
// FIXME: https://github.com/mapbox/mapbox-gl-native/issues/5117
#ifndef GL_ES_VERSION_2_0
StencilClip = 1 << 6,
#endif // GL_ES_VERSION_2_0
};
inline MapDebugOptions operator| (const MapDebugOptions& lhs, const MapDebugOptions& rhs) {

View File

@@ -49,9 +49,6 @@ private:
makeSpriteImage(int width, int height, float pixelRatio);
void nextOrientation();
void toggleClipMasks();
void renderClipMasks();
void addRandomPointAnnotations(int count);
void addRandomShapeAnnotations(int count);
@@ -81,8 +78,6 @@ private:
int fbHeight;
float pixelRatio;
bool showClipMasks = false;
double lastX = 0, lastY = 0;
double lastClick = -1;

View File

@@ -141,9 +141,6 @@ void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action,
if (!mods)
view->map->resetPosition();
break;
case GLFW_KEY_C:
view->toggleClipMasks();
break;
case GLFW_KEY_S:
if (view->changeStyleCallback)
view->changeStyleCallback();
@@ -256,11 +253,6 @@ void GLFWView::nextOrientation() {
}
}
void GLFWView::toggleClipMasks() {
showClipMasks = !showClipMasks;
map->update(mbgl::Update::Repaint);
}
void GLFWView::addRandomCustomPointAnnotations(int count) {
std::vector<mbgl::PointAnnotation> points;
@@ -432,10 +424,6 @@ void GLFWView::run() {
map->render();
if (showClipMasks) {
renderClipMasks();
}
glfwSwapBuffers(window);
report(1000 * (glfwGetTime() - started));
@@ -480,45 +468,6 @@ void GLFWView::invalidate() {
glfwPostEmptyEvent();
}
void GLFWView::renderClipMasks() {
// Read the stencil buffer
auto pixels = std::make_unique<uint8_t[]>(fbWidth * fbHeight);
glReadPixels(0, // GLint x
0, // GLint y
fbWidth, // GLsizei width
fbHeight, // GLsizei height
GL_STENCIL_INDEX, // GLenum format
GL_UNSIGNED_BYTE, // GLenum type
pixels.get() // GLvoid * data
);
// Scale the Stencil buffer to cover the entire color space.
auto it = pixels.get();
auto end = it + fbWidth * fbHeight;
const auto factor = 255.0f / *std::max_element(it, end);
for (; it != end; ++it) {
*it *= factor;
}
using namespace mbgl::gl;
Preserve<PixelZoom> pixelZoom;
Preserve<RasterPos> rasterPos;
Preserve<StencilTest> stencilTest;
Preserve<DepthTest> depthTest;
Preserve<Program> program;
Preserve<ColorMask> colorMask;
MBGL_CHECK_ERROR(glPixelZoom(1.0f, 1.0f));
MBGL_CHECK_ERROR(glRasterPos2f(-1.0f, -1.0f));
MBGL_CHECK_ERROR(glDisable(GL_STENCIL_TEST));
MBGL_CHECK_ERROR(glDisable(GL_DEPTH_TEST));
MBGL_CHECK_ERROR(glUseProgram(0));
MBGL_CHECK_ERROR(glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE));
MBGL_CHECK_ERROR(glWindowPos2i(0, 0));
MBGL_CHECK_ERROR(glDrawPixels(fbWidth, fbHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, pixels.get()));
}
void GLFWView::report(float duration) {
frames++;
frameTime += duration;

View File

@@ -797,8 +797,15 @@ void Map::setDebug(MapDebugOptions debugOptions) {
}
void Map::cycleDebugOptions() {
#ifndef GL_ES_VERSION_2_0
if (impl->debugOptions & MapDebugOptions::StencilClip)
impl->debugOptions = MapDebugOptions::NoDebug;
else if (impl->debugOptions & MapDebugOptions::Wireframe)
impl->debugOptions = MapDebugOptions::StencilClip;
#else
if (impl->debugOptions & MapDebugOptions::Wireframe)
impl->debugOptions = MapDebugOptions::NoDebug;
#endif // GL_ES_VERSION_2_0
else if (impl->debugOptions & MapDebugOptions::Collision)
impl->debugOptions = MapDebugOptions::Collision | MapDebugOptions::Wireframe;
else if (impl->debugOptions & MapDebugOptions::Timestamps)

View File

@@ -169,6 +169,11 @@ void Painter::render(const Style& style, const FrameData& frame_, SpriteAtlas& a
drawClippingMasks(generator.getStencils());
}
if (frame.debugOptions & MapDebugOptions::StencilClip) {
renderClipMasks();
return;
}
// Actually render the layers
if (debug::renderTree) { Log::Info(Event::Render, "{"); indent++; }

View File

@@ -99,6 +99,8 @@ public:
// Renders the red debug frame around a tile, visualizing its perimeter.
void renderDebugFrame(const mat4 &matrix);
void renderClipMasks();
void renderDebugText(TileData&, const mat4&);
void renderFill(FillBucket&, const FillLayer&, const UnwrappedTileID&, const mat4&);
void renderLine(LineBucket&, const LineLayer&, const UnwrappedTileID&, const mat4&);

View File

@@ -5,6 +5,9 @@
#include <mbgl/shader/plain_shader.hpp>
#include <mbgl/util/string.hpp>
#include <mbgl/gl/debugging.hpp>
#include <mbgl/gl/gl.hpp>
#include <mbgl/gl/gl_values.hpp>
#include <mbgl/gl/gl_helper.hpp>
using namespace mbgl;
@@ -75,3 +78,39 @@ void Painter::renderDebugFrame(const mat4 &matrix) {
config.lineWidth = 4.0f * frame.pixelRatio;
MBGL_CHECK_ERROR(glDrawArrays(GL_LINE_STRIP, 0, (GLsizei)tileBorderBuffer.index()));
}
void Painter::renderClipMasks() {
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<uint8_t[]>(fbSize[0] * fbSize[1]);
MBGL_CHECK_ERROR(glReadPixels(
0, // GLint x
0, // GLint y
fbSize[0], // GLsizei width
fbSize[1], // GLsizei height
GL_STENCIL_INDEX, // GLenum format
GL_UNSIGNED_BYTE, // GLenum type
pixels.get() // GLvoid * data
));
// Scale the Stencil buffer to cover the entire color space.
auto it = pixels.get();
auto end = it + fbSize[0] * fbSize[1];
const auto factor = 255.0f / *std::max_element(it, end);
for (; it != end; ++it) {
*it *= factor;
}
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
}