Index: cc/resources/raster_worker_pool.cc |
diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc |
index 06fd18e62e0ec2bdc9d440ee0ae6eb925c867ef4..40b0546ef7bd004b9c19f43aa4c7ea6ca1b8f323 100644 |
--- a/cc/resources/raster_worker_pool.cc |
+++ b/cc/resources/raster_worker_pool.cc |
@@ -4,6 +4,7 @@ |
#include "cc/resources/raster_worker_pool.h" |
+#include "base/debug/trace_event_synthetic_delay.h" |
#include "base/json/json_writer.h" |
#include "base/metrics/histogram.h" |
#include "base/values.h" |
@@ -35,6 +36,20 @@ class IdentityAllocator : public SkBitmap::Allocator { |
// a tile is of solid color. |
const bool kUseColorEstimator = true; |
+template <const char* delay_name> |
+struct SyntheticDelayInitializer { |
+ SyntheticDelayInitializer() |
+ : delay(base::debug::TraceEventSyntheticDelay::Lookup(delay_name)) {} |
+ base::debug::TraceEventSyntheticDelay* delay; |
+}; |
+ |
+// Synthetic delay for raster tasks that are required for activation. Global to |
+// avoid static initializer on critical path. |
+const char kRasterRequiredForActivation[] = "cc.RasterRequiredForActivation"; |
+static base::LazyInstance< |
+ SyntheticDelayInitializer<kRasterRequiredForActivation> > |
+ g_raster_required_for_activation_delay = LAZY_INSTANCE_INITIALIZER; |
+ |
class DisableLCDTextFilter : public SkDrawFilter { |
public: |
// SkDrawFilter interface. |
@@ -291,14 +306,24 @@ class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
Callback; |
RasterFinishedWorkerPoolTaskImpl( |
- const Callback& on_raster_finished_callback) |
+ const Callback& on_raster_finished_callback, |
+ bool tasks_pending_for_activation) |
: origin_loop_(base::MessageLoopProxy::current().get()), |
- on_raster_finished_callback_(on_raster_finished_callback) { |
+ on_raster_finished_callback_(on_raster_finished_callback), |
+ tasks_pending_for_activation_(tasks_pending_for_activation) { |
+ if (tasks_pending_for_activation_) { |
+ g_raster_required_for_activation_delay.Get().delay->BeginParallel( |
+ &activation_delay_end_time_); |
+ } |
} |
// Overridden from internal::WorkerPoolTask: |
virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { |
TRACE_EVENT0("cc", "RasterFinishedWorkerPoolTaskImpl::RunOnWorkerThread"); |
+ if (tasks_pending_for_activation_) { |
brianderson
2013/12/17 21:59:16
To verify my understanding, this only applies the
Sami
2013/12/18 13:58:20
That's correct. Without this condition we were app
|
+ g_raster_required_for_activation_delay.Get().delay->EndParallel( |
brianderson
2013/12/17 21:59:16
Which patch contains the EndParallel and BeginPara
Sami
2013/12/18 13:58:20
Ah, looks like I forgot to cc you; it's over here:
|
+ activation_delay_end_time_); |
+ } |
origin_loop_->PostTask( |
FROM_HERE, |
base::Bind(&RasterFinishedWorkerPoolTaskImpl::RunOnOriginThread, |
@@ -315,6 +340,8 @@ class RasterFinishedWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
scoped_refptr<base::MessageLoopProxy> origin_loop_; |
const Callback on_raster_finished_callback_; |
+ const bool tasks_pending_for_activation_; |
+ base::TimeTicks activation_delay_end_time_; |
DISALLOW_COPY_AND_ASSIGN(RasterFinishedWorkerPoolTaskImpl); |
}; |
@@ -502,15 +529,18 @@ scoped_refptr<internal::WorkerPoolTask> |
return make_scoped_refptr( |
new RasterFinishedWorkerPoolTaskImpl( |
base::Bind(&RasterWorkerPool::OnRasterFinished, |
- weak_ptr_factory_.GetWeakPtr()))); |
+ weak_ptr_factory_.GetWeakPtr()), |
+ false)); |
} |
scoped_refptr<internal::WorkerPoolTask> |
- RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask() { |
+ RasterWorkerPool::CreateRasterRequiredForActivationFinishedTask( |
+ size_t num_tasks_pending_for_activation) { |
return make_scoped_refptr( |
new RasterFinishedWorkerPoolTaskImpl( |
base::Bind(&RasterWorkerPool::OnRasterRequiredForActivationFinished, |
- weak_ptr_factory_.GetWeakPtr()))); |
+ weak_ptr_factory_.GetWeakPtr()), |
+ num_tasks_pending_for_activation > 0u)); |
} |
void RasterWorkerPool::OnRasterFinished( |