Index: dm/DMTaskRunner.cpp |
diff --git a/dm/DMTaskRunner.cpp b/dm/DMTaskRunner.cpp |
index 22269a4d7046739a1689d1b08d33987f3ddafcc6..bd53ce615a61134271a1751add333c4eec480ff6 100644 |
--- a/dm/DMTaskRunner.cpp |
+++ b/dm/DMTaskRunner.cpp |
@@ -3,10 +3,21 @@ |
namespace DM { |
-TaskRunner::TaskRunner(int cputhreads, int gpuThreads) |
+ |
+TaskRunner::TaskRunner(int cputhreads) |
: fMain(cputhreads) |
- , fGpu(gpuThreads) |
- {} |
+ , fGpu(1) { |
+ // Enqueue a task on the GPU thread to create a GrContextFactory. |
+ struct Create : public SkRunnable { |
+ Create(GrContextFactory** ptr) : fPtr(ptr) {} |
+ void run() SK_OVERRIDE { |
+ *fPtr = SkNEW(GrContextFactory); |
+ delete this; |
+ } |
+ GrContextFactory** fPtr; |
+ }; |
+ fGpu.add(SkNEW_ARGS(Create, (&fGrContextFactory))); |
+} |
void TaskRunner::add(Task* task) { |
if (task->usesGpu()) { |
@@ -17,6 +28,17 @@ void TaskRunner::add(Task* task) { |
} |
void TaskRunner::wait() { |
+ // Enqueue a task on the GPU thread to destroy the GrContextFactory. |
+ struct Delete : public SkRunnable { |
+ Delete(GrContextFactory* ptr) : fPtr(ptr) {} |
+ void run() SK_OVERRIDE { |
+ delete fPtr; |
+ delete this; |
+ } |
+ GrContextFactory* fPtr; |
+ }; |
+ fGpu.add(SkNEW_ARGS(Delete, (fGrContextFactory))); |
+ |
// These wait calls block until the threadpool is done. We don't allow |
// children to spawn new GPU tasks so we can wait for that first knowing |
// we'll never try to add to it later. Same can't be said of fMain: fGpu |