diff options
| author | 2017-09-14 20:58:01 +0000 | |
|---|---|---|
| committer | 2017-09-14 20:58:01 +0000 | |
| commit | 843fb74ab5e25c187d503ac3a6a13f4b13be2856 (patch) | |
| tree | 2bb78f5ed606b003792d51339101747d6fdf93a8 /libs/hwui/renderthread | |
| parent | 90e7d66c52d76803b6cb475cfd69ae9f8c3c74ef (diff) | |
| parent | 8ec9e88cdae4febf9ca9ff9d575b9add0a19409d (diff) | |
Merge "Enable multi-threading of cpu intensive tasks when using Skia pipelines"
Diffstat (limited to 'libs/hwui/renderthread')
| -rw-r--r-- | libs/hwui/renderthread/CacheManager.cpp | 31 | ||||
| -rw-r--r-- | libs/hwui/renderthread/CacheManager.h | 8 |
2 files changed, 39 insertions, 0 deletions
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 */ |