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

Commit 49195f8b authored by Romain Guy's avatar Romain Guy Committed by Android Git Automerger
Browse files

am 28459117: Merge "Precache glyphs at final raster size" into jb-mr2-dev

* commit '28459117':
  Precache glyphs at final raster size
parents e0c5569d 28459117
Loading
Loading
Loading
Loading
+24 −4
Original line number Diff line number Diff line
@@ -50,9 +50,9 @@ namespace uirenderer {
Caches::Caches(): Singleton<Caches>(), mExtensions(Extensions::getInstance()), mInitialized(false) {
    init();
    initFont();
    initExtensions();
    initConstraints();
    initProperties();
    initExtensions();

    mDebugLevel = readDebugLevel();
    ALOGD("Enabling debug mode %d", mDebugLevel);
@@ -103,15 +103,21 @@ void Caches::initFont() {
void Caches::initExtensions() {
    if (mExtensions.hasDebugMarker()) {
        eventMark = glInsertEventMarkerEXT;
        if ((drawDeferDisabled || drawReorderDisabled)) {
            startMark = glPushGroupMarkerEXT;
            endMark = glPopGroupMarkerEXT;
        } else {
            startMark = startMarkNull;
            endMark = endMarkNull;
        }

    } else {
        eventMark = eventMarkNull;
        startMark = startMarkNull;
        endMark = endMarkNull;
    }

    if (mExtensions.hasDebugLabel()) {
    if (mExtensions.hasDebugLabel() && (drawDeferDisabled || drawReorderDisabled)) {
        setLabel = glLabelObjectEXT;
        getLabel = glGetObjectLabelEXT;
    } else {
@@ -164,6 +170,20 @@ bool Caches::initProperties() {
        debugStencilClip = kStencilHide;
    }

    if (property_get(PROPERTY_DISABLE_DRAW_DEFER, property, "false")) {
        drawDeferDisabled = !strcasecmp(property, "true");
        INIT_LOGD("  Draw defer %s", drawDeferDisabled ? "disabled" : "enabled");
    } else {
        INIT_LOGD("  Draw defer enabled");
    }

    if (property_get(PROPERTY_DISABLE_DRAW_REORDER, property, "false")) {
        drawReorderDisabled = !strcasecmp(property, "true");
        INIT_LOGD("  Draw reorder %s", drawReorderDisabled ? "disabled" : "enabled");
    } else {
        INIT_LOGD("  Draw reorder enabled");
    }

    return (prevDebugLayersUpdates != debugLayersUpdates) ||
            (prevDebugOverdraw != debugOverdraw) ||
            (prevDebugStencilClip != debugStencilClip);
+3 −0
Original line number Diff line number Diff line
@@ -240,6 +240,9 @@ public:
    Program* currentProgram;
    bool scissorEnabled;

    bool drawDeferDisabled;
    bool drawReorderDisabled;

    // VBO to draw with
    GLuint meshBuffer;

+3 −0
Original line number Diff line number Diff line
@@ -146,6 +146,8 @@ status_t DeferredDisplayList::flush(OpenGLRenderer& renderer, Rect& dirty, int32
    if (isEmpty()) return status; // nothing to flush

    DEFER_LOGD("--flushing");
    renderer.eventMark("Flush");

    DrawModifiers restoreDrawModifiers = renderer.getDrawModifiers();
    int restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
    int opCount = 0;
@@ -166,6 +168,7 @@ status_t DeferredDisplayList::flush(OpenGLRenderer& renderer, Rect& dirty, int32
    }

    DEFER_LOGD("--flushed, drew %d batches (total %d ops)", mBatches.size(), opCount);

    renderer.restoreToCount(restoreTo);
    renderer.setDrawModifiers(restoreDrawModifiers);
    clear();
+24 −1
Original line number Diff line number Diff line
@@ -147,7 +147,8 @@ public:

        if (!renderer.storeDisplayState(state)) {
            // op wasn't quick-rejected, so defer
            deferredList->add(this, renderer.disallowReorder());
            deferredList->add(this, renderer.getCaches().drawReorderDisabled);
            onDrawOpDeferred(renderer);
        }

        return DrawGlInfo::kStatusDone;
@@ -156,6 +157,9 @@ public:
    virtual status_t applyDraw(OpenGLRenderer& renderer, Rect& dirty, uint32_t level,
            bool caching, int multipliedAlpha) = 0;

    virtual void onDrawOpDeferred(OpenGLRenderer& renderer) {
    }

    // returns true if bounds exist
    virtual bool getLocalBounds(Rect& localBounds) { return false; }

@@ -1081,6 +1085,12 @@ public:
        OP_LOG("Draw some text, %d bytes", mBytesCount);
    }

    virtual void onDrawOpDeferred(OpenGLRenderer& renderer) {
        SkPaint* paint = getPaint(renderer);
        FontRenderer& fontRenderer = renderer.getCaches().fontRenderer->getFontRenderer(paint);
        fontRenderer.precache(paint, mText, mCount, mat4::identity());
    }

    virtual DeferredDisplayList::OpBatchId getBatchId() {
        return mPaint->getColor() == 0xff000000 ?
                DeferredDisplayList::kOpBatch_Text :
@@ -1156,6 +1166,19 @@ public:
        mLocalBounds.set(x, mY + metrics.fTop, x + length, mY + metrics.fBottom);
    }

    /*
     * When this method is invoked the state field  is initialized to have the
     * final rendering state. We can thus use it to process data as it will be
     * used at draw time.
     */
    virtual void onDrawOpDeferred(OpenGLRenderer& renderer) {
        SkPaint* paint = getPaint(renderer);
        FontRenderer& fontRenderer = renderer.getCaches().fontRenderer->getFontRenderer(paint);
        const bool pureTranslate = state.mMatrix.isPureTranslate();
        fontRenderer.precache(paint, mText, mCount,
                pureTranslate ? mat4::identity() : state.mMatrix);
    }

    virtual status_t applyDraw(OpenGLRenderer& renderer, Rect& dirty, uint32_t level,
            bool caching, int multipliedAlpha) {
        return renderer.drawText(mText, mBytesCount, mCount, mX, mY,
+5 −21
Original line number Diff line number Diff line
@@ -403,11 +403,7 @@ status_t DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, i

    DrawOp* op = new (alloc()) DrawTextOnPathOp(text, bytesCount, count, path,
            hOffset, vOffset, paint);
    if (addDrawOp(op)) {
        // precache if draw operation is visible
        FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(paint);
        fontRenderer.precache(paint, text, count, mat4::identity());
    }
    addDrawOp(op);
    return DrawGlInfo::kStatusDone;
}

@@ -420,11 +416,7 @@ status_t DisplayListRenderer::drawPosText(const char* text, int bytesCount, int
    paint = refPaint(paint);

    DrawOp* op = new (alloc()) DrawPosTextOp(text, bytesCount, count, positions, paint);
    if (addDrawOp(op)) {
        // precache if draw operation is visible
        FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(paint);
        fontRenderer.precache(paint, text, count, mat4::identity());
    }
    addDrawOp(op);
    return DrawGlInfo::kStatusDone;
}

@@ -439,13 +431,7 @@ status_t DisplayListRenderer::drawText(const char* text, int bytesCount, int cou
    paint = refPaint(paint);

    DrawOp* op = new (alloc()) DrawTextOp(text, bytesCount, count, x, y, positions, paint, length);
    if (addDrawOp(op)) {
        // precache if draw operation is visible
        FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(paint);
        const bool pureTranslate = mSnapshot->transform->isPureTranslate();
        fontRenderer.precache(paint, text, count,
                pureTranslate ? mat4::identity() : *mSnapshot->transform);
    }
    addDrawOp(op);
    return DrawGlInfo::kStatusDone;
}

@@ -515,17 +501,15 @@ void DisplayListRenderer::addStateOp(StateOp* op) {
    addOpInternal(op);
}

bool DisplayListRenderer::addDrawOp(DrawOp* op) {
    bool rejected = false;
void DisplayListRenderer::addDrawOp(DrawOp* op) {
    Rect localBounds;
    if (op->getLocalBounds(localBounds)) {
        rejected = quickRejectNoScissor(localBounds.left, localBounds.top,
        bool rejected = quickRejectNoScissor(localBounds.left, localBounds.top,
                localBounds.right, localBounds.bottom);
        op->setQuickRejected(rejected);
    }
    mHasDrawOps = true;
    addOpInternal(op);
    return !rejected;
}

}; // namespace uirenderer
Loading