Enable multi-threading of cpu intensive tasks when using Skia pipelines

Test: CtsUiRenderingTestCases
Change-Id: Ifa36371f55d3f2d78faf0a23fb283c904ff1af5f
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
index a967d2a..6f117de 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
@@ -46,7 +46,7 @@
 }
 
 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 19ffc46..2b0c419 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.h
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.h
@@ -126,7 +126,6 @@
      */
     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 f6b23e1..0572a8d 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 @@
     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 @@
     // 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 90362f3..3ba2690 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 @@
     size_t getCacheSize() const { return mMaxResourceBytes; }
     size_t getBackgroundCacheSize() const { return mBackgroundResourceBytes; }
 
+    TaskManager* getTaskManager() { return &mTaskManager; }
 private:
     friend class RenderThread;
 
@@ -77,6 +81,10 @@
     };
 
     sp<skiapipeline::VectorDrawableAtlas> mVectorDrawableAtlas;
+
+    class SkiaTaskProcessor;
+    sp<SkiaTaskProcessor> mTaskProcessor;
+    TaskManager mTaskManager;
 };
 
 } /* namespace renderthread */