| 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
|
|
|