DMTaskRunner.cpp revision 0dc5bd149a8b69e8dc6d3b4713b827659c9b0a6b
1d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#include "DMTaskRunner.h"
2d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#include "DMTask.h"
3d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
4d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.comnamespace DM {
5d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
60dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org
70dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.orgTaskRunner::TaskRunner(int cputhreads)
8d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    : fMain(cputhreads)
90dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    , fGpu(1) {
100dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    // Enqueue a task on the GPU thread to create a GrContextFactory.
110dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    struct Create : public SkRunnable {
120dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org        Create(GrContextFactory** ptr) : fPtr(ptr) {}
130dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org        void run() SK_OVERRIDE {
140dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org            *fPtr = SkNEW(GrContextFactory);
150dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org            delete this;
160dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org        }
170dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org        GrContextFactory** fPtr;
180dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    };
190dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    fGpu.add(SkNEW_ARGS(Create, (&fGrContextFactory)));
200dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org}
21d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
22d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.comvoid TaskRunner::add(Task* task) {
23d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    if (task->usesGpu()) {
24d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com        fGpu.add(task);
25d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    } else {
26d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com        fMain.add(task);
27d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    }
28d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}
29d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
30d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.comvoid TaskRunner::wait() {
310dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    // Enqueue a task on the GPU thread to destroy the GrContextFactory.
320dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    struct Delete : public SkRunnable {
330dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org        Delete(GrContextFactory* ptr) : fPtr(ptr) {}
340dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org        void run() SK_OVERRIDE {
350dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org            delete fPtr;
360dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org            delete this;
370dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org        }
380dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org        GrContextFactory* fPtr;
390dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    };
400dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    fGpu.add(SkNEW_ARGS(Delete, (fGrContextFactory)));
410dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org
42d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    // These wait calls block until the threadpool is done.  We don't allow
43d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    // children to spawn new GPU tasks so we can wait for that first knowing
44d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    // we'll never try to add to it later.  Same can't be said of fMain: fGpu
45d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    // and fMain can both add tasks to fMain, so we have to wait for that last.
46d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    fGpu.wait();
47d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    fMain.wait();
48d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}
49d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
50d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}  // namespace DM
51