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