diff options
| author | 2017-08-24 16:36:08 -0400 | |
|---|---|---|
| committer | 2017-09-08 10:24:27 -0400 | |
| commit | 8ec9e88cdae4febf9ca9ff9d575b9add0a19409d (patch) | |
| tree | d3e6bd5ec21d5d92d1e4c61830e2b84dd88e9d6f /libs/hwui | |
| parent | 10c41c2727aa5566ff6aed0c4709657c6517c855 (diff) | |
Enable multi-threading of cpu intensive tasks when using Skia pipelines
Test: CtsUiRenderingTestCases
Change-Id: Ifa36371f55d3f2d78faf0a23fb283c904ff1af5f
Diffstat (limited to 'libs/hwui')
| -rw-r--r-- | libs/hwui/pipeline/skia/SkiaPipeline.cpp | 2 | ||||
| -rw-r--r-- | libs/hwui/pipeline/skia/SkiaPipeline.h | 1 | ||||
| -rw-r--r-- | libs/hwui/renderthread/CacheManager.cpp | 31 | ||||
| -rw-r--r-- | libs/hwui/renderthread/CacheManager.h | 8 |
4 files changed, 40 insertions, 2 deletions
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp index a967d2a10b58..6f117de23864 100644 --- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp @@ -46,7 +46,7 @@ SkiaPipeline::SkiaPipeline(RenderThread& thread) : mRenderThread(thread) { } TaskManager* SkiaPipeline::getTaskManager() { - return &mTaskManager; + return mRenderThread.cacheManager().getTaskManager(); } void SkiaPipeline::onDestroyHardwareResources() { diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.h b/libs/hwui/pipeline/skia/SkiaPipeline.h index 19ffc463c121..2b0c419aa1a1 100644 --- a/libs/hwui/pipeline/skia/SkiaPipeline.h +++ b/libs/hwui/pipeline/skia/SkiaPipeline.h @@ -126,7 +126,6 @@ private: */ void renderVectorDrawableCache(); - TaskManager mTaskManager; std::vector<sk_sp<SkImage>> mPinnedImages; /** diff --git a/libs/hwui/renderthread/CacheManager.cpp b/libs/hwui/renderthread/CacheManager.cpp index f6b23e1a0723..0572a8d0afac 100644 --- a/libs/hwui/renderthread/CacheManager.cpp +++ b/libs/hwui/renderthread/CacheManager.cpp @@ -22,6 +22,7 @@ #include <gui/Surface.h> #include <GrContextOptions.h> +#include <SkExecutor.h> #include <math.h> #include <set> @@ -73,6 +74,29 @@ void CacheManager::updateContextCacheSizes() { mGrContext->setResourceCacheLimits(mMaxResources, mMaxResourceBytes); } +class CacheManager::SkiaTaskProcessor : public TaskProcessor<bool>, public SkExecutor { +public: + explicit SkiaTaskProcessor(TaskManager* taskManager) : TaskProcessor<bool>(taskManager) {} + + // This is really a Task<void> but that doesn't really work when Future<> + // expects to be able to get/set a value + struct SkiaTask : public Task<bool> { + std::function<void()> func; + }; + + virtual void add(std::function<void(void)> func) override { + sp<SkiaTask> task(new SkiaTask()); + task->func = func; + TaskProcessor<bool>::add(task); + } + + virtual void onProcess(const sp<Task<bool> >& task) override { + SkiaTask* t = static_cast<SkiaTask*>(task.get()); + t->func(); + task->setResult(true); + } +}; + void CacheManager::configureContext(GrContextOptions* contextOptions) { contextOptions->fAllowPathMaskCaching = true; @@ -95,6 +119,13 @@ void CacheManager::configureContext(GrContextOptions* contextOptions) { // Skia's implementation doesn't provide a mechanism to resize the font cache due to // the potential cost of recreating the glyphs. contextOptions->fGlyphCacheTextureMaximumBytes = fontCacheMB * 1024 * 1024; + + if (mTaskManager.canRunTasks()) { + if (!mTaskProcessor.get()) { + mTaskProcessor = new SkiaTaskProcessor(&mTaskManager); + } + contextOptions->fExecutor = mTaskProcessor.get(); + } } void CacheManager::trimMemory(TrimMemoryMode mode) { diff --git a/libs/hwui/renderthread/CacheManager.h b/libs/hwui/renderthread/CacheManager.h index 90362f33358d..3ba2690caf31 100644 --- a/libs/hwui/renderthread/CacheManager.h +++ b/libs/hwui/renderthread/CacheManager.h @@ -22,7 +22,10 @@ #include <ui/DisplayInfo.h> #include <utils/String8.h> #include <vector> + #include "pipeline/skia/VectorDrawableAtlas.h" +#include "thread/TaskManager.h" +#include "thread/TaskProcessor.h" namespace android { @@ -54,6 +57,7 @@ public: size_t getCacheSize() const { return mMaxResourceBytes; } size_t getBackgroundCacheSize() const { return mBackgroundResourceBytes; } + TaskManager* getTaskManager() { return &mTaskManager; } private: friend class RenderThread; @@ -77,6 +81,10 @@ private: }; sp<skiapipeline::VectorDrawableAtlas> mVectorDrawableAtlas; + + class SkiaTaskProcessor; + sp<SkiaTaskProcessor> mTaskProcessor; + TaskManager mTaskManager; }; } /* namespace renderthread */ |