[core] move depth/stencil buffer debug viz to gfx::Context

This commit is contained in:
Konstantin Käfer
2019-04-02 22:35:46 +02:00
parent 1d58850d0c
commit 7081d5e154
5 changed files with 73 additions and 50 deletions

View File

@@ -37,11 +37,8 @@ enum class MapDebugOptions : EnumType {
Timestamps = 1 << 3,
Collision = 1 << 4,
Overdraw = 1 << 5,
// FIXME: https://github.com/mapbox/mapbox-gl-native/issues/5117
#if not MBGL_USE_GLES2
StencilClip = 1 << 6,
DepthBuffer = 1 << 7,
#endif // MBGL_USE_GLES2
};
MBGL_CONSTEXPR MapDebugOptions operator|(MapDebugOptions lhs, MapDebugOptions rhs) {

View File

@@ -162,6 +162,12 @@ private:
public:
virtual std::unique_ptr<CommandEncoder> createCommandEncoder() = 0;
#if not defined(NDEBUG)
public:
virtual void visualizeStencilBuffer() = 0;
virtual void visualizeDepthBuffer(float depthRangeSize) = 0;
#endif
};
} // namespace gfx

View File

@@ -703,6 +703,9 @@ void Context::setColorMode(const gfx::ColorMode& color) {
std::unique_ptr<gfx::CommandEncoder> Context::createCommandEncoder() {
backend.updateAssumedState();
if (backend.contextIsShared()) {
setDirtyState();
}
return std::make_unique<gl::CommandEncoder>(*this);
}
@@ -811,5 +814,59 @@ void Context::performCleanup() {
}
}
#if not defined(NDEBUG)
void Context::visualizeStencilBuffer() {
#if not MBGL_USE_GLES2
setStencilMode(gfx::StencilMode::disabled());
setDepthMode(gfx::DepthMode::disabled());
setColorMode(gfx::ColorMode::unblended());
program = 0;
// Reset the value in case someone else changed it, or it's dirty.
pixelTransferStencil = gl::value::PixelTransferStencil::Default;
// Read the stencil buffer
const auto viewportValue = viewport.getCurrentValue();
auto image = readFramebuffer<AlphaImage, gfx::TexturePixelType::Stencil>(viewportValue.size, false);
// Scale the Stencil buffer to cover the entire color space.
auto it = image.data.get();
auto end = it + viewportValue.size.width * viewportValue.size.height;
const auto factor = 255.0f / *std::max_element(it, end);
for (; it != end; ++it) {
*it *= factor;
}
pixelZoom = { 1, 1 };
rasterPos = { -1, -1, 0, 1 };
drawPixels(image);
#endif
}
void Context::visualizeDepthBuffer(const float depthRangeSize) {
(void)depthRangeSize;
#if not MBGL_USE_GLES2
setStencilMode(gfx::StencilMode::disabled());
setDepthMode(gfx::DepthMode::disabled());
setColorMode(gfx::ColorMode::unblended());
program = 0;
// Scales the values in the depth buffer so that they cover the entire grayscale range. This
// makes it easier to spot tiny differences.
const float base = 1.0f / (1.0f - depthRangeSize);
pixelTransferDepth = { base, 1.0f - base };
// Read the stencil buffer
auto viewportValue = viewport.getCurrentValue();
auto image = readFramebuffer<AlphaImage, gfx::TexturePixelType::Depth>(viewportValue.size, false);
pixelZoom = { 1, 1 };
rasterPos = { -1, -1, 0, 1 };
drawPixels(image);
#endif
}
#endif
} // namespace gl
} // namespace mbgl

View File

@@ -241,6 +241,12 @@ private:
public:
// For testing
bool disableVAOExtension = false;
#if not defined(NDEBUG)
public:
void visualizeStencilBuffer() override;
void visualizeDepthBuffer(float depthRangeSize) override;
#endif
};
} // namespace gl

View File

@@ -369,10 +369,6 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
// TODO: remove cast
gl::Context& glContext = static_cast<gl::Context&>(parameters.context);
if (backend.contextIsShared()) {
glContext.setDirtyState();
}
// - UPLOAD PASS -------------------------------------------------------------------------------
// Uploads all required buffers and images before we do any actual rendering.
{
@@ -477,33 +473,10 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
}
}
#if not MBGL_USE_GLES2 and not defined(NDEBUG)
#if not defined(NDEBUG)
// Render tile clip boundaries, using stencil buffer to calculate fill color.
if (parameters.debugOptions & MapDebugOptions::StencilClip) {
glContext.setStencilMode(gfx::StencilMode::disabled());
glContext.setDepthMode(gfx::DepthMode::disabled());
glContext.setColorMode(gfx::ColorMode::unblended());
glContext.program = 0;
// Reset the value in case someone else changed it, or it's dirty.
glContext.pixelTransferStencil = gl::value::PixelTransferStencil::Default;
// Read the stencil buffer
const auto viewport = glContext.viewport.getCurrentValue();
auto image = glContext.readFramebuffer<AlphaImage, gfx::TexturePixelType::Stencil>(viewport.size, false);
// Scale the Stencil buffer to cover the entire color space.
auto it = image.data.get();
auto end = it + viewport.size.width * viewport.size.height;
const auto factor = 255.0f / *std::max_element(it, end);
for (; it != end; ++it) {
*it *= factor;
}
glContext.pixelZoom = { 1, 1 };
glContext.rasterPos = { -1, -1, 0, 1 };
glContext.drawPixels(image);
parameters.context.visualizeStencilBuffer();
return;
}
#endif
@@ -560,26 +533,10 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
}
}
#if not MBGL_USE_GLES2 and not defined(NDEBUG)
#if not defined(NDEBUG)
// Render the depth buffer.
if (parameters.debugOptions & MapDebugOptions::DepthBuffer) {
glContext.setStencilMode(gfx::StencilMode::disabled());
glContext.setDepthMode(gfx::DepthMode::disabled());
glContext.setColorMode(gfx::ColorMode::unblended());
glContext.program = 0;
// Scales the values in the depth buffer so that they cover the entire grayscale range. This
// makes it easier to spot tiny differences.
const float base = 1.0f / (1.0f - parameters.depthRangeSize);
glContext.pixelTransferDepth = { base, 1.0f - base };
// Read the stencil buffer
auto viewport = glContext.viewport.getCurrentValue();
auto image = glContext.readFramebuffer<AlphaImage, gfx::TexturePixelType::Depth>(viewport.size, false);
glContext.pixelZoom = { 1, 1 };
glContext.rasterPos = { -1, -1, 0, 1 };
glContext.drawPixels(image);
parameters.context.visualizeDepthBuffer(parameters.depthRangeSize);
}
#endif