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

Commit ec5dc76a authored by Chris Craik's avatar Chris Craik Committed by Android (Google) Code Review
Browse files

Merge "Make layer double drawing visible in overdraw debug mode" into jb-mr2-dev

parents 61527436 34416eaa
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -45,6 +45,7 @@ Layer::Layer(const uint32_t layerWidth, const uint32_t layerHeight) {
    fbo = 0;
    fbo = 0;
    stencil = NULL;
    stencil = NULL;
    debugDrawUpdate = false;
    debugDrawUpdate = false;
    hasDrawnSinceUpdate = false;
    deferredList = NULL;
    deferredList = NULL;
    Caches::getInstance().resourceCache.incrementRefcount(this);
    Caches::getInstance().resourceCache.incrementRefcount(this);
}
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -317,6 +317,7 @@ struct Layer {
    DisplayList* displayList;
    DisplayList* displayList;
    Rect dirtyRect;
    Rect dirtyRect;
    bool debugDrawUpdate;
    bool debugDrawUpdate;
    bool hasDrawnSinceUpdate;


private:
private:
    /**
    /**
+29 −6
Original line number Original line Diff line number Diff line
@@ -550,6 +550,7 @@ bool OpenGLRenderer::updateLayer(Layer* layer, bool inFrame) {
        }
        }


        layer->debugDrawUpdate = mCaches.debugLayersUpdates;
        layer->debugDrawUpdate = mCaches.debugLayersUpdates;
        layer->hasDrawnSinceUpdate = false;


        return true;
        return true;
    }
    }
@@ -1088,11 +1089,28 @@ void OpenGLRenderer::composeLayerRect(Layer* layer, const Rect& rect, bool swap)
    }
    }
}
}


/**
 * Issues the command X, and if we're composing a save layer to the fbo or drawing a newly updated
 * hardware layer with overdraw debug on, draws again to the stencil only, so that these draw
 * operations are correctly counted twice for overdraw. NOTE: assumes composeLayerRegion only used
 * by saveLayer's restore
 */
#define DRAW_DOUBLE_STENCIL_IF(COND, DRAW_COMMAND) {                             \
        DRAW_COMMAND;                                                            \
        if (CC_UNLIKELY(mCaches.debugOverdraw && getTargetFbo() == 0 && COND)) { \
            glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);                 \
            DRAW_COMMAND;                                                        \
            glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);                     \
        }                                                                        \
    }

#define DRAW_DOUBLE_STENCIL(DRAW_COMMAND) DRAW_DOUBLE_STENCIL_IF(true, DRAW_COMMAND)

void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) {
void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) {
    if (layer->region.isRect()) {
    if (layer->region.isRect()) {
        layer->setRegionAsRect();
        layer->setRegionAsRect();


        composeLayerRect(layer, layer->regionRect);
        DRAW_DOUBLE_STENCIL(composeLayerRect(layer, layer->regionRect));


        layer->region.clear();
        layer->region.clear();
        return;
        return;
@@ -1162,14 +1180,16 @@ void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) {
            numQuads++;
            numQuads++;


            if (numQuads >= REGION_MESH_QUAD_COUNT) {
            if (numQuads >= REGION_MESH_QUAD_COUNT) {
                glDrawElements(GL_TRIANGLES, numQuads * 6, GL_UNSIGNED_SHORT, NULL);
                DRAW_DOUBLE_STENCIL(glDrawElements(GL_TRIANGLES, numQuads * 6,
                                GL_UNSIGNED_SHORT, NULL));
                numQuads = 0;
                numQuads = 0;
                mesh = mCaches.getRegionMesh();
                mesh = mCaches.getRegionMesh();
            }
            }
        }
        }


        if (numQuads > 0) {
        if (numQuads > 0) {
            glDrawElements(GL_TRIANGLES, numQuads * 6, GL_UNSIGNED_SHORT, NULL);
            DRAW_DOUBLE_STENCIL(glDrawElements(GL_TRIANGLES, numQuads * 6,
                            GL_UNSIGNED_SHORT, NULL));
        }
        }


        finishDrawTexture();
        finishDrawTexture();
@@ -3042,7 +3062,8 @@ status_t OpenGLRenderer::drawLayer(Layer* layer, float x, float y) {
        mDrawModifiers.mColorFilter = layer->getColorFilter();
        mDrawModifiers.mColorFilter = layer->getColorFilter();


        if (layer->region.isRect()) {
        if (layer->region.isRect()) {
            composeLayerRect(layer, layer->regionRect);
            DRAW_DOUBLE_STENCIL_IF(!layer->hasDrawnSinceUpdate,
                    composeLayerRect(layer, layer->regionRect));
        } else if (layer->mesh) {
        } else if (layer->mesh) {
            const float a = getLayerAlpha(layer);
            const float a = getLayerAlpha(layer);
            setupDraw();
            setupDraw();
@@ -3068,8 +3089,9 @@ status_t OpenGLRenderer::drawLayer(Layer* layer, float x, float y) {
            }
            }
            setupDrawMesh(&layer->mesh[0].position[0], &layer->mesh[0].texture[0]);
            setupDrawMesh(&layer->mesh[0].position[0], &layer->mesh[0].texture[0]);


            DRAW_DOUBLE_STENCIL_IF(!layer->hasDrawnSinceUpdate,
                    glDrawElements(GL_TRIANGLES, layer->meshElementCount,
                    glDrawElements(GL_TRIANGLES, layer->meshElementCount,
                    GL_UNSIGNED_SHORT, layer->meshIndices);
                            GL_UNSIGNED_SHORT, layer->meshIndices));


            finishDrawTexture();
            finishDrawTexture();


@@ -3086,6 +3108,7 @@ status_t OpenGLRenderer::drawLayer(Layer* layer, float x, float y) {
                    0x7f00ff00, SkXfermode::kSrcOver_Mode);
                    0x7f00ff00, SkXfermode::kSrcOver_Mode);
        }
        }
    }
    }
    layer->hasDrawnSinceUpdate = true;


    if (transform && !transform->isIdentity()) {
    if (transform && !transform->isIdentity()) {
        restore();
        restore();