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

Commit 6a2296d8 authored by John Reck's avatar John Reck Committed by Android Git Automerger
Browse files

am 9da6e743: am d988a45d: Merge "Cleanup DeferredLayerUpdater" into lmp-dev

* commit '9da6e743':
  Cleanup DeferredLayerUpdater
parents f2ab6612 9da6e743
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -493,7 +493,6 @@ public class ThreadedRenderer extends HardwareRenderer {

    private static native void nInvokeFunctor(long functor, boolean waitForCompletion);

    private static native long nCreateDisplayListLayer(long nativeProxy, int width, int height);
    private static native long nCreateTextureLayer(long nativeProxy);
    private static native void nBuildLayer(long nativeProxy, long node);
    private static native boolean nCopyLayerInto(long nativeProxy, long layer, long bitmap);
+0 −8
Original line number Diff line number Diff line
@@ -320,13 +320,6 @@ static void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject cla
    RenderProxy::invokeFunctor(functor, waitForCompletion);
}

static jlong android_view_ThreadedRenderer_createDisplayListLayer(JNIEnv* env, jobject clazz,
        jlong proxyPtr, jint width, jint height) {
    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
    DeferredLayerUpdater* layer = proxy->createDisplayListLayer(width, height);
    return reinterpret_cast<jlong>(layer);
}

static jlong android_view_ThreadedRenderer_createTextureLayer(JNIEnv* env, jobject clazz,
        jlong proxyPtr) {
    RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
@@ -443,7 +436,6 @@ static JNINativeMethod gMethods[] = {
    { "nDestroy", "(J)V", (void*) android_view_ThreadedRenderer_destroy },
    { "nRegisterAnimatingRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_registerAnimatingRenderNode },
    { "nInvokeFunctor", "(JZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor },
    { "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer },
    { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer },
    { "nBuildLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_buildLayer },
    { "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto },
+30 −11
Original line number Diff line number Diff line
@@ -18,38 +18,52 @@
#include "OpenGLRenderer.h"

#include "LayerRenderer.h"
#include "renderthread/EglManager.h"
#include "renderthread/RenderTask.h"

namespace android {
namespace uirenderer {

static void defaultLayerDestroyer(Layer* layer) {
    Caches::getInstance().resourceCache.decrementRefcount(layer);
class DeleteLayerTask : public renderthread::RenderTask {
public:
    DeleteLayerTask(renderthread::EglManager& eglManager, Layer* layer)
        : mEglManager(eglManager)
        , mLayer(layer)
    {}

    virtual void run() {
        mEglManager.requireGlContext();
        LayerRenderer::destroyLayer(mLayer);
        mLayer = 0;
        delete this;
    }

DeferredLayerUpdater::DeferredLayerUpdater(Layer* layer, LayerDestroyer destroyer)
private:
    renderthread::EglManager& mEglManager;
    Layer* mLayer;
};

DeferredLayerUpdater::DeferredLayerUpdater(renderthread::RenderThread& thread, Layer* layer)
        : mSurfaceTexture(0)
        , mTransform(0)
        , mNeedsGLContextAttach(false)
        , mUpdateTexImage(false)
        , mLayer(layer)
        , mCaches(Caches::getInstance())
        , mDestroyer(destroyer) {
        , mRenderThread(thread) {
    mWidth = mLayer->layer.getWidth();
    mHeight = mLayer->layer.getHeight();
    mBlend = mLayer->isBlend();
    mColorFilter = SkSafeRef(mLayer->getColorFilter());
    mAlpha = mLayer->getAlpha();
    mMode = mLayer->getMode();

    if (!mDestroyer) {
        mDestroyer = defaultLayerDestroyer;
    }
}

DeferredLayerUpdater::~DeferredLayerUpdater() {
    SkSafeUnref(mColorFilter);
    setTransform(0);
    mDestroyer(mLayer);
    mRenderThread.queue(new DeleteLayerTask(mRenderThread.eglManager(), mLayer));
    mLayer = 0;
}

void DeferredLayerUpdater::setPaint(const SkPaint* paint) {
@@ -121,7 +135,12 @@ void DeferredLayerUpdater::doUpdateTexImage() {

void DeferredLayerUpdater::detachSurfaceTexture() {
    if (mSurfaceTexture.get()) {
        mSurfaceTexture->detachFromContext();
        mRenderThread.eglManager().requireGlContext();
        status_t err = mSurfaceTexture->detachFromContext();
        if (err != 0) {
            // TODO: Elevate to fatal exception
            ALOGE("Failed to detach SurfaceTexture from context %d", err);
        }
        mSurfaceTexture = 0;
        mLayer->clearTexture();
    }
+3 −5
Original line number Diff line number Diff line
@@ -25,19 +25,18 @@
#include "Layer.h"
#include "Rect.h"
#include "RenderNode.h"
#include "renderthread/RenderThread.h"

namespace android {
namespace uirenderer {

typedef void (*LayerDestroyer)(Layer* layer);

// Container to hold the properties a layer should be set to at the start
// of a render pass
class DeferredLayerUpdater : public VirtualLightRefBase {
public:
    // Note that DeferredLayerUpdater assumes it is taking ownership of the layer
    // and will not call incrementRef on it as a result.
    ANDROID_API DeferredLayerUpdater(Layer* layer, LayerDestroyer = 0);
    ANDROID_API DeferredLayerUpdater(renderthread::RenderThread& thread, Layer* layer);
    ANDROID_API ~DeferredLayerUpdater();

    ANDROID_API bool setSize(uint32_t width, uint32_t height) {
@@ -99,8 +98,7 @@ private:

    Layer* mLayer;
    Caches& mCaches;

    LayerDestroyer mDestroyer;
    renderthread::RenderThread& mRenderThread;

    void doUpdateTexImage();
};
+0 −5
Original line number Diff line number Diff line
@@ -344,11 +344,6 @@ void CanvasContext::runWithGlContext(RenderTask* task) {
    task->run();
}

Layer* CanvasContext::createRenderLayer(int width, int height) {
    requireSurface();
    return LayerRenderer::createRenderLayer(mRenderThread.renderState(), width, height);
}

Layer* CanvasContext::createTextureLayer() {
    requireSurface();
    return LayerRenderer::createTextureLayer(mRenderThread.renderState());
Loading