DMTaskRunner.cpp revision 0dc5bd149a8b69e8dc6d3b4713b827659c9b0a6b
1#include "DMTaskRunner.h" 2#include "DMTask.h" 3 4namespace DM { 5 6 7TaskRunner::TaskRunner(int cputhreads) 8 : fMain(cputhreads) 9 , fGpu(1) { 10 // Enqueue a task on the GPU thread to create a GrContextFactory. 11 struct Create : public SkRunnable { 12 Create(GrContextFactory** ptr) : fPtr(ptr) {} 13 void run() SK_OVERRIDE { 14 *fPtr = SkNEW(GrContextFactory); 15 delete this; 16 } 17 GrContextFactory** fPtr; 18 }; 19 fGpu.add(SkNEW_ARGS(Create, (&fGrContextFactory))); 20} 21 22void TaskRunner::add(Task* task) { 23 if (task->usesGpu()) { 24 fGpu.add(task); 25 } else { 26 fMain.add(task); 27 } 28} 29 30void TaskRunner::wait() { 31 // Enqueue a task on the GPU thread to destroy the GrContextFactory. 32 struct Delete : public SkRunnable { 33 Delete(GrContextFactory* ptr) : fPtr(ptr) {} 34 void run() SK_OVERRIDE { 35 delete fPtr; 36 delete this; 37 } 38 GrContextFactory* fPtr; 39 }; 40 fGpu.add(SkNEW_ARGS(Delete, (fGrContextFactory))); 41 42 // These wait calls block until the threadpool is done. We don't allow 43 // children to spawn new GPU tasks so we can wait for that first knowing 44 // we'll never try to add to it later. Same can't be said of fMain: fGpu 45 // and fMain can both add tasks to fMain, so we have to wait for that last. 46 fGpu.wait(); 47 fMain.wait(); 48} 49 50} // namespace DM 51