Loading libs/hwui/BakedOpDispatcher.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -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); } Loading libs/hwui/TessellationCache.cpp +6 −15 Original line number Diff line number Diff line Loading @@ -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)); } }; Loading Loading @@ -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( Loading @@ -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 /////////////////////////////////////////////////////////////////////////////// Loading libs/hwui/TessellationCache.h +9 −8 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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, Loading @@ -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; Loading @@ -121,6 +120,8 @@ public: const Matrix4 transformZ; const Vector3 lightCenter; const float lightRadius; VertexBuffer ambientBuffer; VertexBuffer spotBuffer; }; TessellationCache(); Loading Loading @@ -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); } }; Loading Loading
libs/hwui/BakedOpDispatcher.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -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); } Loading
libs/hwui/TessellationCache.cpp +6 −15 Original line number Diff line number Diff line Loading @@ -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)); } }; Loading Loading @@ -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( Loading @@ -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 /////////////////////////////////////////////////////////////////////////////// Loading
libs/hwui/TessellationCache.h +9 −8 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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, Loading @@ -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; Loading @@ -121,6 +120,8 @@ public: const Matrix4 transformZ; const Vector3 lightCenter; const float lightRadius; VertexBuffer ambientBuffer; VertexBuffer spotBuffer; }; TessellationCache(); Loading Loading @@ -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); } }; Loading