Add new property to debug non-rectangular clip operations
This change adds a new property called "debug.hwui.show_stencil_clip" that accepts the following values: - "highlight", colorizes in green any drawing command that's tested against a non-rectangular clip region - "region", shows the non-rectangular clip region in blue every time it is used - "hide", default value, nothing is shown Change-Id: I83c8602310edc4aaeb8b905371cdd185b17d32b5
This commit is contained in:
@@ -91,6 +91,7 @@ void Caches::init() {
|
||||
|
||||
debugLayersUpdates = false;
|
||||
debugOverdraw = false;
|
||||
debugStencilClip = kStencilHide;
|
||||
|
||||
mInitialized = true;
|
||||
}
|
||||
@@ -132,6 +133,7 @@ void Caches::initConstraints() {
|
||||
bool Caches::initProperties() {
|
||||
bool prevDebugLayersUpdates = debugLayersUpdates;
|
||||
bool prevDebugOverdraw = debugOverdraw;
|
||||
StencilClipDebug prevDebugStencilClip = debugStencilClip;
|
||||
|
||||
char property[PROPERTY_VALUE_MAX];
|
||||
if (property_get(PROPERTY_DEBUG_LAYERS_UPDATES, property, NULL) > 0) {
|
||||
@@ -148,8 +150,23 @@ bool Caches::initProperties() {
|
||||
debugOverdraw = false;
|
||||
}
|
||||
|
||||
// See Properties.h for valid values
|
||||
if (property_get(PROPERTY_DEBUG_STENCIL_CLIP, property, NULL) > 0) {
|
||||
INIT_LOGD(" Stencil clip debug enabled: %s", property);
|
||||
if (!strcmp(property, "hide")) {
|
||||
debugStencilClip = kStencilHide;
|
||||
} else if (!strcmp(property, "highlight")) {
|
||||
debugStencilClip = kStencilShowHighlight;
|
||||
} else if (!strcmp(property, "region")) {
|
||||
debugStencilClip = kStencilShowRegion;
|
||||
}
|
||||
} else {
|
||||
debugStencilClip = kStencilHide;
|
||||
}
|
||||
|
||||
return (prevDebugLayersUpdates != debugLayersUpdates) ||
|
||||
(prevDebugOverdraw != debugOverdraw);
|
||||
(prevDebugOverdraw != debugOverdraw) ||
|
||||
(prevDebugStencilClip != debugStencilClip);
|
||||
}
|
||||
|
||||
void Caches::terminate() {
|
||||
|
||||
@@ -245,9 +245,18 @@ public:
|
||||
|
||||
// Misc
|
||||
GLint maxTextureSize;
|
||||
|
||||
// Debugging
|
||||
bool debugLayersUpdates;
|
||||
bool debugOverdraw;
|
||||
|
||||
enum StencilClipDebug {
|
||||
kStencilHide,
|
||||
kStencilShowHighlight,
|
||||
kStencilShowRegion
|
||||
};
|
||||
StencilClipDebug debugStencilClip;
|
||||
|
||||
TextureCache textureCache;
|
||||
LayerCache layerCache;
|
||||
RenderBufferCache renderBufferCache;
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
#define DEBUG_RENDER_BUFFERS 0
|
||||
|
||||
// Turn on to make stencil operations easier to debug
|
||||
// (writes 255 instead of 1 in the buffer, forces 8 bit stencil)
|
||||
#define DEBUG_STENCIL 0
|
||||
|
||||
// Turn on to display debug info about 9patch objects
|
||||
|
||||
@@ -1368,6 +1368,12 @@ void OpenGLRenderer::setStencilFromClip() {
|
||||
drawRegionRects(*mSnapshot->clipRegion, 0xff000000, SkXfermode::kSrc_Mode, false);
|
||||
|
||||
mCaches.stencil.enableTest();
|
||||
|
||||
// Draw the region used to generate the stencil if the appropriate debug
|
||||
// mode is enabled
|
||||
if (mCaches.debugStencilClip == Caches::kStencilShowRegion) {
|
||||
drawRegionRects(*mSnapshot->clipRegion, 0x7f0000ff, SkXfermode::kSrcOver_Mode);
|
||||
}
|
||||
} else {
|
||||
mCaches.stencil.disable();
|
||||
}
|
||||
@@ -1515,12 +1521,20 @@ void OpenGLRenderer::setupDraw(bool clear) {
|
||||
}
|
||||
setStencilFromClip();
|
||||
}
|
||||
|
||||
mDescription.reset();
|
||||
|
||||
mSetShaderColor = false;
|
||||
mColorSet = false;
|
||||
mColorA = mColorR = mColorG = mColorB = 0.0f;
|
||||
mTextureUnit = 0;
|
||||
mTrackDirtyRegions = true;
|
||||
|
||||
// Enable debug highlight when what we're about to draw is tested against
|
||||
// the stencil buffer and if stencil highlight debugging is on
|
||||
mDescription.hasDebugHighlight = !mCaches.debugOverdraw &&
|
||||
mCaches.debugStencilClip == Caches::kStencilShowHighlight &&
|
||||
mCaches.stencil.isTestEnabled();
|
||||
}
|
||||
|
||||
void OpenGLRenderer::setupDrawWithTexture(bool isAlpha8) {
|
||||
|
||||
@@ -83,6 +83,8 @@ namespace uirenderer {
|
||||
|
||||
#define PROGRAM_HAS_COLORS 42
|
||||
|
||||
#define PROGRAM_HAS_DEBUG_HIGHLIGHT 43
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Types
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@@ -159,6 +161,8 @@ struct ProgramDescription {
|
||||
bool hasGammaCorrection;
|
||||
float gamma;
|
||||
|
||||
bool hasDebugHighlight;
|
||||
|
||||
/**
|
||||
* Resets this description. All fields are reset back to the default
|
||||
* values they hold after building a new instance.
|
||||
@@ -199,6 +203,8 @@ struct ProgramDescription {
|
||||
|
||||
hasGammaCorrection = false;
|
||||
gamma = 2.2f;
|
||||
|
||||
hasDebugHighlight = false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -267,6 +273,7 @@ struct ProgramDescription {
|
||||
if (hasGammaCorrection) key |= programid(0x1) << PROGRAM_HAS_GAMMA_CORRECTION;
|
||||
if (isSimpleGradient) key |= programid(0x1) << PROGRAM_IS_SIMPLE_GRADIENT;
|
||||
if (hasColors) key |= programid(0x1) << PROGRAM_HAS_COLORS;
|
||||
if (hasDebugHighlight) key |= programid(0x1) << PROGRAM_HAS_DEBUG_HIGHLIGHT;
|
||||
return key;
|
||||
}
|
||||
|
||||
|
||||
@@ -351,6 +351,8 @@ const char* gFS_Main_ApplyColorOp[4] = {
|
||||
// PorterDuff
|
||||
" fragColor = blendColors(colorBlend, fragColor);\n"
|
||||
};
|
||||
const char* gFS_Main_DebugHighlight =
|
||||
" gl_FragColor.rgb = vec3(0.0, gl_FragColor.a, 0.0);\n";
|
||||
const char* gFS_Footer =
|
||||
"}\n\n";
|
||||
|
||||
@@ -604,7 +606,8 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti
|
||||
|
||||
// Optimization for common cases
|
||||
if (!description.isAA && !blendFramebuffer && !description.hasColors &&
|
||||
description.colorOp == ProgramDescription::kColorNone && !description.isPoint) {
|
||||
description.colorOp == ProgramDescription::kColorNone &&
|
||||
!description.isPoint && !description.hasDebugHighlight) {
|
||||
bool fast = false;
|
||||
|
||||
const bool noShader = !description.hasGradient && !description.hasBitmap;
|
||||
@@ -752,6 +755,9 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti
|
||||
if (description.hasColors) {
|
||||
shader.append(gFS_Main_FragColor_HasColors);
|
||||
}
|
||||
if (description.hasDebugHighlight) {
|
||||
shader.append(gFS_Main_DebugHighlight);
|
||||
}
|
||||
}
|
||||
// End the shader
|
||||
shader.append(gFS_Footer);
|
||||
|
||||
@@ -67,6 +67,20 @@ enum DebugLevel {
|
||||
*/
|
||||
#define PROPERTY_DEBUG_OVERDRAW "debug.hwui.show_overdraw"
|
||||
|
||||
/**
|
||||
* Used to enable/disable non-rectangular clipping debugging.
|
||||
*
|
||||
* The accepted values are:
|
||||
* "highlight", drawing commands clipped by the stencil will
|
||||
* be colored differently
|
||||
* "region", renders the clipping region on screen whenever
|
||||
* the stencil is set
|
||||
* "hide", don't show the clip
|
||||
*
|
||||
* The default value is "hide".
|
||||
*/
|
||||
#define PROPERTY_DEBUG_STENCIL_CLIP "debug.hwui.show_stencil_clip"
|
||||
|
||||
/**
|
||||
* Used to enable/disable scissor optimization. The accepted values are
|
||||
* "true" and "false". The default value is "false".
|
||||
|
||||
@@ -87,6 +87,13 @@ public:
|
||||
return mState != kDisabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates whether testing only is enabled.
|
||||
*/
|
||||
bool isTestEnabled() {
|
||||
return mState == kTest;
|
||||
}
|
||||
|
||||
private:
|
||||
void enable();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user