aboutsummaryrefslogtreecommitdiffhomepage
path: root/dm
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-04-30 20:47:30 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-04-30 20:47:30 +0000
commitb0c7156d5be00509d0f80a8d223d5355122b6a3f (patch)
tree8ffbb46d8e12a65d47aa93f35b9a807739fd9b6a /dm
parent4521add17df4b76dee1b0b78e148322b285e39a1 (diff)
DM: run child tasks that are already on the CPU threadpool serially
These tasks tend to do similar things with similar sized bitmaps, so running them serially means we tend to hold 2x bitmaps at a time (golden and comparison) instead of (1+k)x bitmaps (golden and k concurrent comparisons). We still migrate GPU task's children over to the main CPU thread pool, because they'll run faster there and free up capacity on the GPU thread. Before Debug: 54s, 2.9G peak Release: 13s, 2.4G peak After Debug: 48s, 1.5G peak Release: 15s, 2.0G peak BUG=skia:2478 R=borenet@google.com, mtklein@google.com Author: mtklein@chromium.org Review URL: https://codereview.chromium.org/261593008 git-svn-id: http://skia.googlecode.com/svn/trunk@14486 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'dm')
-rw-r--r--dm/DMTask.cpp12
-rw-r--r--dm/DMTask.h6
2 files changed, 15 insertions, 3 deletions
diff --git a/dm/DMTask.cpp b/dm/DMTask.cpp
index 8b6a94e52a..83df84933f 100644
--- a/dm/DMTask.cpp
+++ b/dm/DMTask.cpp
@@ -37,7 +37,7 @@ void Task::finish() {
fReporter->finish(this->name(), SkTime::GetMSecs() - fStart);
}
-void Task::spawnChild(CpuTask* task) {
+void Task::reallySpawnChild(CpuTask* task) {
fTaskRunner->add(task);
}
@@ -53,6 +53,11 @@ void CpuTask::run() {
SkDELETE(this);
}
+void CpuTask::spawnChild(CpuTask* task) {
+ // Run children serially on this (CPU) thread. This tends to save RAM and is usually no slower.
+ task->run();
+}
+
GpuTask::GpuTask(Reporter* reporter, TaskRunner* taskRunner) : Task(reporter, taskRunner) {}
void GpuTask::run(GrContextFactory& factory) {
@@ -64,6 +69,9 @@ void GpuTask::run(GrContextFactory& factory) {
SkDELETE(this);
}
-
+void GpuTask::spawnChild(CpuTask* task) {
+ // Really spawn a new task so it runs on the CPU threadpool instead of the GPU one we're on now.
+ this->reallySpawnChild(task);
+}
} // namespace DM
diff --git a/dm/DMTask.h b/dm/DMTask.h
index 76efbf924b..02d8a22011 100644
--- a/dm/DMTask.h
+++ b/dm/DMTask.h
@@ -36,7 +36,7 @@ protected:
void fail(const char* msg = NULL);
void finish();
- void spawnChild(CpuTask* task); // For now we don't allow GPU child tasks.
+ void reallySpawnChild(CpuTask* task); // For now we don't allow GPU child tasks.
private:
Reporter* fReporter; // Unowned.
@@ -53,6 +53,8 @@ public:
void run() SK_OVERRIDE;
virtual void draw() = 0;
+
+ void spawnChild(CpuTask* task);
};
class GpuTask : public Task, public SkTRunnable<GrContextFactory> {
@@ -62,6 +64,8 @@ class GpuTask : public Task, public SkTRunnable<GrContextFactory> {
void run(GrContextFactory&) SK_OVERRIDE;
virtual void draw(GrContextFactory*) = 0;
+
+ void spawnChild(CpuTask* task);
};
} // namespace DM