| Index: cc/resources/tile_manager.cc
|
| diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
|
| index 1391daf7bb62e97d23722f9ef9de5ef7b8078716..610e9967549ec0a8826eeef3eb6b42264228940c 100644
|
| --- a/cc/resources/tile_manager.cc
|
| +++ b/cc/resources/tile_manager.cc
|
| @@ -16,6 +16,7 @@
|
| #include "cc/debug/devtools_instrumentation.h"
|
| #include "cc/debug/frame_viewer_instrumentation.h"
|
| #include "cc/debug/traced_value.h"
|
| +#include "cc/debug/worker_thread_cost_tracker.h"
|
| #include "cc/layers/picture_layer_impl.h"
|
| #include "cc/resources/raster_buffer.h"
|
| #include "cc/resources/tile.h"
|
| @@ -31,19 +32,21 @@ const bool kUseColorEstimator = true;
|
|
|
| class RasterTaskImpl : public RasterTask {
|
| public:
|
| - RasterTaskImpl(
|
| - const Resource* resource,
|
| - RasterSource* raster_source,
|
| - const gfx::Rect& content_rect,
|
| - float contents_scale,
|
| - TileResolution tile_resolution,
|
| - int layer_id,
|
| - const void* tile_id,
|
| - int source_frame_number,
|
| - bool analyze_picture,
|
| - const base::Callback<void(const RasterSource::SolidColorAnalysis&, bool)>&
|
| - reply,
|
| - ImageDecodeTask::Vector* dependencies)
|
| + RasterTaskImpl(const Resource* resource,
|
| + RasterSource* raster_source,
|
| + const gfx::Rect& content_rect,
|
| + float contents_scale,
|
| + TileResolution tile_resolution,
|
| + int layer_id,
|
| + const void* tile_id,
|
| + int source_frame_number,
|
| + bool analyze_picture,
|
| + scoped_ptr<WorkerThreadCostTracker::Probe> cost_tracker_probe,
|
| + const base::Callback<
|
| + void(const RasterSource::SolidColorAnalysis&,
|
| + bool,
|
| + scoped_ptr<WorkerThreadCostTracker::Probe>)>& reply,
|
| + ImageDecodeTask::Vector* dependencies)
|
| : RasterTask(resource, dependencies),
|
| raster_source_(raster_source),
|
| content_rect_(content_rect),
|
| @@ -53,6 +56,7 @@ class RasterTaskImpl : public RasterTask {
|
| tile_id_(tile_id),
|
| source_frame_number_(source_frame_number),
|
| analyze_picture_(analyze_picture),
|
| + cost_tracker_probe_(cost_tracker_probe.Pass()),
|
| reply_(reply) {}
|
|
|
| // Overridden from Task:
|
| @@ -62,13 +66,17 @@ class RasterTaskImpl : public RasterTask {
|
| DCHECK(raster_source_.get());
|
| DCHECK(raster_buffer_);
|
|
|
| + cost_tracker_probe_->Start(source_frame_number_);
|
| if (analyze_picture_) {
|
| Analyze(raster_source_.get());
|
| - if (analysis_.is_solid_color)
|
| + if (analysis_.is_solid_color) {
|
| + cost_tracker_probe_->Stop();
|
| return;
|
| + }
|
| }
|
|
|
| Raster(raster_source_.get());
|
| + cost_tracker_probe_->Stop();
|
| }
|
|
|
| // Overridden from TileTask:
|
| @@ -81,7 +89,7 @@ class RasterTaskImpl : public RasterTask {
|
| }
|
| void RunReplyOnOriginThread() override {
|
| DCHECK(!raster_buffer_);
|
| - reply_.Run(analysis_, !HasFinishedRunning());
|
| + reply_.Run(analysis_, !HasFinishedRunning(), cost_tracker_probe_.Pass());
|
| }
|
|
|
| protected:
|
| @@ -124,8 +132,10 @@ class RasterTaskImpl : public RasterTask {
|
| const void* tile_id_;
|
| int source_frame_number_;
|
| bool analyze_picture_;
|
| - const base::Callback<void(const RasterSource::SolidColorAnalysis&, bool)>
|
| - reply_;
|
| + scoped_ptr<WorkerThreadCostTracker::Probe> cost_tracker_probe_;
|
| + const base::Callback<void(const RasterSource::SolidColorAnalysis&,
|
| + bool,
|
| + scoped_ptr<WorkerThreadCostTracker::Probe>)> reply_;
|
| scoped_ptr<RasterBuffer> raster_buffer_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl);
|
| @@ -133,28 +143,39 @@ class RasterTaskImpl : public RasterTask {
|
|
|
| class ImageDecodeTaskImpl : public ImageDecodeTask {
|
| public:
|
| - ImageDecodeTaskImpl(SkPixelRef* pixel_ref,
|
| - int layer_id,
|
| - const base::Callback<void(bool was_canceled)>& reply)
|
| + ImageDecodeTaskImpl(
|
| + SkPixelRef* pixel_ref,
|
| + int layer_id,
|
| + int source_frame_number,
|
| + scoped_ptr<WorkerThreadCostTracker::Probe> cost_tracker_probe,
|
| + const base::Callback<
|
| + void(bool was_canceled,
|
| + scoped_ptr<WorkerThreadCostTracker::Probe> probe)>& reply)
|
| : pixel_ref_(skia::SharePtr(pixel_ref)),
|
| layer_id_(layer_id),
|
| + source_frame_number_(source_frame_number),
|
| + cost_tracker_probe_(cost_tracker_probe.Pass()),
|
| reply_(reply) {}
|
|
|
| // Overridden from Task:
|
| void RunOnWorkerThread() override {
|
| TRACE_EVENT0("cc", "ImageDecodeTaskImpl::RunOnWorkerThread");
|
|
|
| + cost_tracker_probe_->Start(source_frame_number_);
|
| devtools_instrumentation::ScopedImageDecodeTask image_decode_task(
|
| pixel_ref_.get());
|
| // This will cause the image referred to by pixel ref to be decoded.
|
| pixel_ref_->lockPixels();
|
| pixel_ref_->unlockPixels();
|
| + cost_tracker_probe_->Stop();
|
| }
|
|
|
| // Overridden from TileTask:
|
| void ScheduleOnOriginThread(TileTaskClient* client) override {}
|
| void CompleteOnOriginThread(TileTaskClient* client) override {}
|
| - void RunReplyOnOriginThread() override { reply_.Run(!HasFinishedRunning()); }
|
| + void RunReplyOnOriginThread() override {
|
| + reply_.Run(!HasFinishedRunning(), cost_tracker_probe_.Pass());
|
| + }
|
|
|
| protected:
|
| ~ImageDecodeTaskImpl() override {}
|
| @@ -162,7 +183,10 @@ class ImageDecodeTaskImpl : public ImageDecodeTask {
|
| private:
|
| skia::RefPtr<SkPixelRef> pixel_ref_;
|
| int layer_id_;
|
| - const base::Callback<void(bool was_canceled)> reply_;
|
| + int source_frame_number_;
|
| + scoped_ptr<WorkerThreadCostTracker::Probe> cost_tracker_probe_;
|
| + const base::Callback<void(bool was_canceled,
|
| + scoped_ptr<WorkerThreadCostTracker::Probe>)> reply_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(ImageDecodeTaskImpl);
|
| };
|
| @@ -201,10 +225,11 @@ scoped_ptr<TileManager> TileManager::Create(
|
| base::SequencedTaskRunner* task_runner,
|
| ResourcePool* resource_pool,
|
| TileTaskRunner* tile_task_runner,
|
| - size_t scheduled_raster_task_limit) {
|
| - return make_scoped_ptr(new TileManager(client, task_runner, resource_pool,
|
| - tile_task_runner,
|
| - scheduled_raster_task_limit));
|
| + size_t scheduled_raster_task_limit,
|
| + WorkerThreadCostTracker* worker_thread_cost_tracker) {
|
| + return make_scoped_ptr(
|
| + new TileManager(client, task_runner, resource_pool, tile_task_runner,
|
| + scheduled_raster_task_limit, worker_thread_cost_tracker));
|
| }
|
|
|
| TileManager::TileManager(
|
| @@ -212,7 +237,8 @@ TileManager::TileManager(
|
| const scoped_refptr<base::SequencedTaskRunner>& task_runner,
|
| ResourcePool* resource_pool,
|
| TileTaskRunner* tile_task_runner,
|
| - size_t scheduled_raster_task_limit)
|
| + size_t scheduled_raster_task_limit,
|
| + WorkerThreadCostTracker* worker_thread_cost_tracker)
|
| : client_(client),
|
| task_runner_(task_runner),
|
| resource_pool_(resource_pool),
|
| @@ -229,7 +255,8 @@ TileManager::TileManager(
|
| task_runner_.get(),
|
| base::Bind(&TileManager::CheckIfReadyToDraw, base::Unretained(this))),
|
| did_notify_ready_to_activate_(false),
|
| - did_notify_ready_to_draw_(false) {
|
| + did_notify_ready_to_draw_(false),
|
| + worker_thread_cost_tracker_(worker_thread_cost_tracker) {
|
| tile_task_runner_->SetClient(this);
|
| }
|
|
|
| @@ -706,11 +733,10 @@ scoped_refptr<ImageDecodeTask> TileManager::CreateImageDecodeTask(
|
| Tile* tile,
|
| SkPixelRef* pixel_ref) {
|
| return make_scoped_refptr(new ImageDecodeTaskImpl(
|
| - pixel_ref,
|
| - tile->layer_id(),
|
| + pixel_ref, tile->layer_id(), tile->source_frame_number(),
|
| + worker_thread_cost_tracker_->CreateProbe(),
|
| base::Bind(&TileManager::OnImageDecodeTaskCompleted,
|
| - base::Unretained(this),
|
| - tile->layer_id(),
|
| + base::Unretained(this), tile->layer_id(),
|
| base::Unretained(pixel_ref))));
|
| }
|
|
|
| @@ -744,26 +770,21 @@ scoped_refptr<RasterTask> TileManager::CreateRasterTask(Tile* tile) {
|
| existing_pixel_refs[id] = decode_task;
|
| }
|
|
|
| - return make_scoped_refptr(
|
| - new RasterTaskImpl(const_resource,
|
| - tile->raster_source(),
|
| - tile->content_rect(),
|
| - tile->contents_scale(),
|
| - mts.resolution,
|
| - tile->layer_id(),
|
| - static_cast<const void*>(tile),
|
| - tile->source_frame_number(),
|
| - tile->use_picture_analysis(),
|
| - base::Bind(&TileManager::OnRasterTaskCompleted,
|
| - base::Unretained(this),
|
| - tile->id(),
|
| - base::Passed(&resource)),
|
| - &decode_tasks));
|
| -}
|
| -
|
| -void TileManager::OnImageDecodeTaskCompleted(int layer_id,
|
| - SkPixelRef* pixel_ref,
|
| - bool was_canceled) {
|
| + return make_scoped_refptr(new RasterTaskImpl(
|
| + const_resource, tile->raster_source(), tile->content_rect(),
|
| + tile->contents_scale(), mts.resolution, tile->layer_id(),
|
| + static_cast<const void*>(tile), tile->source_frame_number(),
|
| + tile->use_picture_analysis(), worker_thread_cost_tracker_->CreateProbe(),
|
| + base::Bind(&TileManager::OnRasterTaskCompleted, base::Unretained(this),
|
| + tile->id(), base::Passed(&resource)),
|
| + &decode_tasks));
|
| +}
|
| +
|
| +void TileManager::OnImageDecodeTaskCompleted(
|
| + int layer_id,
|
| + SkPixelRef* pixel_ref,
|
| + bool was_canceled,
|
| + scoped_ptr<WorkerThreadCostTracker::Probe> cost_tracker_probe) {
|
| // If the task was canceled, we need to clean it up
|
| // from |image_decode_tasks_|.
|
| if (!was_canceled)
|
| @@ -785,7 +806,8 @@ void TileManager::OnRasterTaskCompleted(
|
| Tile::Id tile_id,
|
| scoped_ptr<ScopedResource> resource,
|
| const RasterSource::SolidColorAnalysis& analysis,
|
| - bool was_canceled) {
|
| + bool was_canceled,
|
| + scoped_ptr<WorkerThreadCostTracker::Probe> cost_tracker_probe) {
|
| DCHECK(tiles_.find(tile_id) != tiles_.end());
|
|
|
| Tile* tile = tiles_[tile_id];
|
|
|