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

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

Merge "Simplify shadow task cleanup"

parents b6aae689 d8165e86
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -663,7 +663,7 @@ static void renderShadow(BakedOpRenderer& renderer, const BakedOpState& state, f
}

void BakedOpDispatcher::onShadowOp(BakedOpRenderer& renderer, const ShadowOp& op, const BakedOpState& state) {
    TessellationCache::vertexBuffer_pair_t buffers = *(op.shadowTask->getResult());
    TessellationCache::vertexBuffer_pair_t buffers = op.shadowTask->getResult();
    renderShadow(renderer, state, op.casterAlpha, buffers.first, buffers.second);
}

+6 −15
Original line number Diff line number Diff line
@@ -242,23 +242,21 @@ void tessellateShadows(
            spotBuffer);
}

class ShadowProcessor : public TaskProcessor<TessellationCache::vertexBuffer_pair_t*> {
class ShadowProcessor : public TaskProcessor<TessellationCache::vertexBuffer_pair_t> {
public:
    ShadowProcessor(Caches& caches)
            : TaskProcessor<TessellationCache::vertexBuffer_pair_t*>(&caches.tasks) {}
            : TaskProcessor<TessellationCache::vertexBuffer_pair_t>(&caches.tasks) {}
    ~ShadowProcessor() {}

    virtual void onProcess(const sp<Task<TessellationCache::vertexBuffer_pair_t*> >& task) override {
    virtual void onProcess(const sp<Task<TessellationCache::vertexBuffer_pair_t> >& task) override {
        TessellationCache::ShadowTask* t = static_cast<TessellationCache::ShadowTask*>(task.get());
        ATRACE_NAME("shadow tessellation");

        VertexBuffer* ambientBuffer = new VertexBuffer;
        VertexBuffer* spotBuffer = new VertexBuffer;
        tessellateShadows(&t->drawTransform, &t->localClip, t->opaque, &t->casterPerimeter,
                &t->transformXY, &t->transformZ, t->lightCenter, t->lightRadius,
                *ambientBuffer, *spotBuffer);
                t->ambientBuffer, t->spotBuffer);

        t->setResult(new TessellationCache::vertexBuffer_pair_t(ambientBuffer, spotBuffer));
        t->setResult(TessellationCache::vertexBuffer_pair_t(&t->ambientBuffer, &t->spotBuffer));
    }
};

@@ -373,7 +371,7 @@ void TessellationCache::getShadowBuffers(const Matrix4* drawTransform, const Rec
        task = static_cast<ShadowTask*>(mShadowCache.get(key));
    }
    LOG_ALWAYS_FATAL_IF(task == nullptr, "shadow not precached");
    outBuffers = *(task->getResult());
    outBuffers = task->getResult();
}

sp<TessellationCache::ShadowTask> TessellationCache::getShadowTask(
@@ -392,13 +390,6 @@ sp<TessellationCache::ShadowTask> TessellationCache::getShadowTask(
    return task;
}

TessellationCache::ShadowTask::~ShadowTask() {
    TessellationCache::vertexBuffer_pair_t* bufferPair = getResult();
    delete bufferPair->getFirst();
    delete bufferPair->getSecond();
    delete bufferPair;
}

///////////////////////////////////////////////////////////////////////////////
// Tessellation precaching
///////////////////////////////////////////////////////////////////////////////
+9 −8
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include "Matrix.h"
#include "Rect.h"
#include "Vector.h"
#include "VertexBuffer.h"
#include "thread/TaskProcessor.h"
#include "utils/Macros.h"
#include "utils/Pair.h"
@@ -89,7 +90,7 @@ public:
        hash_t hash() const;
    };

    class ShadowTask : public Task<TessellationCache::vertexBuffer_pair_t*> {
    class ShadowTask : public Task<vertexBuffer_pair_t> {
    public:
        ShadowTask(const Matrix4* drawTransform, const Rect& localClip, bool opaque,
                const SkPath* casterPerimeter, const Matrix4* transformXY, const Matrix4* transformZ,
@@ -104,13 +105,11 @@ public:
            , lightRadius(lightRadius) {
        }

        ~ShadowTask();

        /* Note - we deep copy all task parameters, because *even though* pointers into Allocator
         * controlled objects (like the SkPath and Matrix4s) should be safe for the entire frame,
         * certain Allocators are destroyed before trim() is called to flush incomplete tasks.
         *
         * These deep copies could be avoided, long term, by cancelling or flushing outstanding
         * These deep copies could be avoided, long term, by canceling or flushing outstanding
         * tasks before tearing down single-frame LinearAllocators.
         */
        const Matrix4 drawTransform;
@@ -121,6 +120,8 @@ public:
        const Matrix4 transformZ;
        const Vector3 lightCenter;
        const float lightRadius;
        VertexBuffer ambientBuffer;
        VertexBuffer spotBuffer;
    };

    TessellationCache();
@@ -217,12 +218,12 @@ private:
    ///////////////////////////////////////////////////////////////////////////////
    // Shadow tessellation caching
    ///////////////////////////////////////////////////////////////////////////////
    sp<TaskProcessor<vertexBuffer_pair_t*> > mShadowProcessor;
    sp<TaskProcessor<vertexBuffer_pair_t> > mShadowProcessor;

    // holds a pointer, and implicit strong ref to each shadow task of the frame
    LruCache<ShadowDescription, Task<vertexBuffer_pair_t*>*> mShadowCache;
    class BufferPairRemovedListener : public OnEntryRemoved<ShadowDescription, Task<vertexBuffer_pair_t*>*> {
        void operator()(ShadowDescription& description, Task<vertexBuffer_pair_t*>*& bufferPairTask) override {
    LruCache<ShadowDescription, Task<vertexBuffer_pair_t>*> mShadowCache;
    class BufferPairRemovedListener : public OnEntryRemoved<ShadowDescription, Task<vertexBuffer_pair_t>*> {
        void operator()(ShadowDescription& description, Task<vertexBuffer_pair_t>*& bufferPairTask) override {
            bufferPairTask->decStrong(nullptr);
        }
    };