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