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

Commit d8165e86 authored by Chris Craik's avatar Chris Craik
Browse files

Simplify shadow task cleanup

bug:26964750

Removes 3 news/deletes per task, as well as the waitOnTask inside destruction

Change-Id: Iec11165bcfa7f98ca41574885734c2ad39328cc8
parent 6e068c01
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);
        }
    };