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

Commit 2509437e authored by Romain Guy's avatar Romain Guy Committed by Android (Google) Code Review
Browse files

Merge "Avoid multiple font cache texture uploads Bug #8378964" into jb-mr2-dev

parents 82718153 96885eb4
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