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

Commit 96885eb4 authored by Romain Guy's avatar Romain Guy
Browse files

Avoid multiple font cache texture uploads

Bug #8378964

This change defers drawing into layers until after the renderer for FBO0
is ready to draw. At that point, all the precaching is done which means
all glyphs can be uploaded at once in the font caches.

Change-Id: Ie1f7a7ff30f76f06fb3dbc72c7d05e66207d1ecb
parent 7c566bf3
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -428,6 +428,8 @@ public abstract class HardwareRenderer {
    interface HardwareDrawCallbacks {
        /**
         * Invoked before a view is drawn by a hardware renderer.
         * This method can be used to apply transformations to the
         * canvas but no drawing command should be issued.
         * 
         * @param canvas The Canvas used to render the view.
         */
@@ -435,6 +437,7 @@ public abstract class HardwareRenderer {

        /**
         * Invoked after a view is drawn by a hardware renderer.
         * It is safe to invoke drawing commands from this method.
         * 
         * @param canvas The Canvas used to render the view.
         */
+2 −2
Original line number Diff line number Diff line
@@ -52,6 +52,8 @@ public:
        kOpBatch_Count, // Add other batch ids before this
    };

    void clear();

    bool isEmpty() { return mBatches.isEmpty(); }

    /**
@@ -78,8 +80,6 @@ private:
     */
    void resetBatchingState();

    void clear();

    void storeStateOpBarrier(OpenGLRenderer& renderer, StateOp* op);
    void storeRestoreToCountBarrier(int newSaveCount);

+45 −2
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@

#include <utils/Log.h>

#include "DisplayList.h"
#include "DeferredDisplayList.h"
#include "Layer.h"
#include "LayerRenderer.h"
#include "OpenGLRenderer.h"
@@ -43,15 +45,18 @@ Layer::Layer(const uint32_t layerWidth, const uint32_t layerHeight) {
    fbo = 0;
    stencil = NULL;
    debugDrawUpdate = false;
    deferredList = NULL;
    Caches::getInstance().resourceCache.incrementRefcount(this);
}

Layer::~Layer() {
    if (mesh) delete mesh;
    if (meshIndices) delete meshIndices;
    if (colorFilter) Caches::getInstance().resourceCache.decrementRefcount(colorFilter);
    removeFbo();
    deleteTexture();

    delete[] mesh;
    delete[] meshIndices;
    delete deferredList;
}

uint32_t Layer::computeIdealWidth(uint32_t layerWidth) {
@@ -133,5 +138,43 @@ void Layer::setColorFilter(SkiaColorFilter* filter) {
    }
}

void Layer::defer() {
    if (!deferredList) {
        deferredList = new DeferredDisplayList;
    }
    DeferStateStruct deferredState(*deferredList, *renderer,
            DisplayList::kReplayFlag_ClipChildren);

    const float width = layer.getWidth();
    const float height = layer.getHeight();

    if (dirtyRect.isEmpty() || (dirtyRect.left <= 0 && dirtyRect.top <= 0 &&
            dirtyRect.right >= width && dirtyRect.bottom >= height)) {
        dirtyRect.set(0, 0, width, height);
    }

    renderer->initViewport(width, height);
    renderer->setupFrameState(dirtyRect.left, dirtyRect.top,
            dirtyRect.right, dirtyRect.bottom, !isBlend());

    displayList->defer(deferredState, 0);
}

void Layer::flush() {
    if (deferredList && !deferredList->isEmpty()) {
        renderer->setViewport(layer.getWidth(), layer.getHeight());
        renderer->prepareDirty(dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom,
                !isBlend());

        deferredList->flush(*renderer, dirtyRect);

        renderer->finish();
        renderer = NULL;

        dirtyRect.setEmpty();
        deferredList->clear();
    }
}

}; // namespace uirenderer
}; // namespace android
+11 −0
Original line number Diff line number Diff line
@@ -42,6 +42,8 @@ namespace uirenderer {
// Forward declarations
class OpenGLRenderer;
class DisplayList;
class DeferredDisplayList;
class DeferStateStruct;

/**
 * A layer has dimensions and is backed by an OpenGL texture or FBO.
@@ -271,6 +273,9 @@ struct Layer {
        return transform;
    }

    void defer();
    void flush();

    /**
     * Bounds of the layer.
     */
@@ -379,6 +384,12 @@ private:
     */
    mat4 transform;

    /**
     * Used to defer display lists when the layer is updated with a
     * display list.
     */
    DeferredDisplayList* deferredList;

}; // struct Layer

}; // namespace uirenderer
+4 −4
Original line number Diff line number Diff line
@@ -129,8 +129,8 @@ Region* LayerRenderer::getRegion() const {
void LayerRenderer::generateMesh() {
    if (mLayer->region.isRect() || mLayer->region.isEmpty()) {
        if (mLayer->mesh) {
            delete mLayer->mesh;
            delete mLayer->meshIndices;
            delete[] mLayer->mesh;
            delete[] mLayer->meshIndices;

            mLayer->mesh = NULL;
            mLayer->meshIndices = NULL;
@@ -153,8 +153,8 @@ void LayerRenderer::generateMesh() {
    GLsizei elementCount = count * 6;

    if (mLayer->mesh && mLayer->meshElementCount < elementCount) {
        delete mLayer->mesh;
        delete mLayer->meshIndices;
        delete[] mLayer->mesh;
        delete[] mLayer->meshIndices;

        mLayer->mesh = NULL;
        mLayer->meshIndices = NULL;
Loading