Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ff0bfdd authored by Romain Guy's avatar Romain Guy
Browse files

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
parent 01d159d8
Loading
Loading
Loading
Loading
+18 −1
Original line number Original line Diff line number Diff line
@@ -91,6 +91,7 @@ void Caches::init() {


    debugLayersUpdates = false;
    debugLayersUpdates = false;
    debugOverdraw = false;
    debugOverdraw = false;
    debugStencilClip = kStencilHide;


    mInitialized = true;
    mInitialized = true;
}
}
@@ -132,6 +133,7 @@ void Caches::initConstraints() {
bool Caches::initProperties() {
bool Caches::initProperties() {
    bool prevDebugLayersUpdates = debugLayersUpdates;
    bool prevDebugLayersUpdates = debugLayersUpdates;
    bool prevDebugOverdraw = debugOverdraw;
    bool prevDebugOverdraw = debugOverdraw;
    StencilClipDebug prevDebugStencilClip = debugStencilClip;


    char property[PROPERTY_VALUE_MAX];
    char property[PROPERTY_VALUE_MAX];
    if (property_get(PROPERTY_DEBUG_LAYERS_UPDATES, property, NULL) > 0) {
    if (property_get(PROPERTY_DEBUG_LAYERS_UPDATES, property, NULL) > 0) {
@@ -148,8 +150,23 @@ bool Caches::initProperties() {
        debugOverdraw = false;
        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) ||
    return (prevDebugLayersUpdates != debugLayersUpdates) ||
            (prevDebugOverdraw != debugOverdraw);
            (prevDebugOverdraw != debugOverdraw) ||
            (prevDebugStencilClip != debugStencilClip);
}
}


void Caches::terminate() {
void Caches::terminate() {
+9 −0
Original line number Original line Diff line number Diff line
@@ -245,9 +245,18 @@ public:


    // Misc
    // Misc
    GLint maxTextureSize;
    GLint maxTextureSize;

    // Debugging
    bool debugLayersUpdates;
    bool debugLayersUpdates;
    bool debugOverdraw;
    bool debugOverdraw;


    enum StencilClipDebug {
        kStencilHide,
        kStencilShowHighlight,
        kStencilShowRegion
    };
    StencilClipDebug debugStencilClip;

    TextureCache textureCache;
    TextureCache textureCache;
    LayerCache layerCache;
    LayerCache layerCache;
    RenderBufferCache renderBufferCache;
    RenderBufferCache renderBufferCache;
+1 −0
Original line number Original line Diff line number Diff line
@@ -48,6 +48,7 @@
#define DEBUG_RENDER_BUFFERS 0
#define DEBUG_RENDER_BUFFERS 0


// Turn on to make stencil operations easier to debug
// 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
#define DEBUG_STENCIL 0


// Turn on to display debug info about 9patch objects
// Turn on to display debug info about 9patch objects
+14 −0
Original line number Original line Diff line number Diff line
@@ -1368,6 +1368,12 @@ void OpenGLRenderer::setStencilFromClip() {
            drawRegionRects(*mSnapshot->clipRegion, 0xff000000, SkXfermode::kSrc_Mode, false);
            drawRegionRects(*mSnapshot->clipRegion, 0xff000000, SkXfermode::kSrc_Mode, false);


            mCaches.stencil.enableTest();
            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 {
        } else {
            mCaches.stencil.disable();
            mCaches.stencil.disable();
        }
        }
@@ -1515,12 +1521,20 @@ void OpenGLRenderer::setupDraw(bool clear) {
        }
        }
        setStencilFromClip();
        setStencilFromClip();
    }
    }

    mDescription.reset();
    mDescription.reset();

    mSetShaderColor = false;
    mSetShaderColor = false;
    mColorSet = false;
    mColorSet = false;
    mColorA = mColorR = mColorG = mColorB = 0.0f;
    mColorA = mColorR = mColorG = mColorB = 0.0f;
    mTextureUnit = 0;
    mTextureUnit = 0;
    mTrackDirtyRegions = true;
    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) {
void OpenGLRenderer::setupDrawWithTexture(bool isAlpha8) {
+7 −0
Original line number Original line Diff line number Diff line
@@ -83,6 +83,8 @@ namespace uirenderer {


#define PROGRAM_HAS_COLORS 42
#define PROGRAM_HAS_COLORS 42


#define PROGRAM_HAS_DEBUG_HIGHLIGHT 43

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// Types
// Types
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
@@ -159,6 +161,8 @@ struct ProgramDescription {
    bool hasGammaCorrection;
    bool hasGammaCorrection;
    float gamma;
    float gamma;


    bool hasDebugHighlight;

    /**
    /**
     * Resets this description. All fields are reset back to the default
     * Resets this description. All fields are reset back to the default
     * values they hold after building a new instance.
     * values they hold after building a new instance.
@@ -199,6 +203,8 @@ struct ProgramDescription {


        hasGammaCorrection = false;
        hasGammaCorrection = false;
        gamma = 2.2f;
        gamma = 2.2f;

        hasDebugHighlight = false;
    }
    }


    /**
    /**
@@ -267,6 +273,7 @@ struct ProgramDescription {
        if (hasGammaCorrection) key |= programid(0x1) << PROGRAM_HAS_GAMMA_CORRECTION;
        if (hasGammaCorrection) key |= programid(0x1) << PROGRAM_HAS_GAMMA_CORRECTION;
        if (isSimpleGradient) key |= programid(0x1) << PROGRAM_IS_SIMPLE_GRADIENT;
        if (isSimpleGradient) key |= programid(0x1) << PROGRAM_IS_SIMPLE_GRADIENT;
        if (hasColors) key |= programid(0x1) << PROGRAM_HAS_COLORS;
        if (hasColors) key |= programid(0x1) << PROGRAM_HAS_COLORS;
        if (hasDebugHighlight) key |= programid(0x1) << PROGRAM_HAS_DEBUG_HIGHLIGHT;
        return key;
        return key;
    }
    }


Loading