| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/tiles/tile_manager.h" | 5 #include "cc/tiles/tile_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| 11 #include <limits> | 11 #include <limits> |
| 12 #include <string> | 12 #include <string> |
| 13 | 13 |
| 14 #include "base/bind.h" | 14 #include "base/bind.h" |
| 15 #include "base/json/json_writer.h" | 15 #include "base/json/json_writer.h" |
| 16 #include "base/logging.h" | 16 #include "base/logging.h" |
| 17 #include "base/macros.h" | 17 #include "base/macros.h" |
| 18 #include "base/memory/ptr_util.h" | 18 #include "base/memory/ptr_util.h" |
| 19 #include "base/metrics/histogram.h" | 19 #include "base/metrics/histogram.h" |
| 20 #include "base/numerics/safe_conversions.h" | 20 #include "base/numerics/safe_conversions.h" |
| 21 #include "base/threading/thread_checker.h" |
| 21 #include "base/trace_event/trace_event_argument.h" | 22 #include "base/trace_event/trace_event_argument.h" |
| 22 #include "cc/base/histograms.h" | 23 #include "cc/base/histograms.h" |
| 23 #include "cc/debug/devtools_instrumentation.h" | 24 #include "cc/debug/devtools_instrumentation.h" |
| 24 #include "cc/debug/frame_viewer_instrumentation.h" | 25 #include "cc/debug/frame_viewer_instrumentation.h" |
| 25 #include "cc/debug/traced_value.h" | 26 #include "cc/debug/traced_value.h" |
| 26 #include "cc/layers/picture_layer_impl.h" | 27 #include "cc/layers/picture_layer_impl.h" |
| 27 #include "cc/raster/raster_buffer.h" | 28 #include "cc/raster/raster_buffer.h" |
| 28 #include "cc/raster/task_category.h" | 29 #include "cc/raster/task_category.h" |
| 29 #include "cc/tiles/tile.h" | 30 #include "cc/tiles/tile.h" |
| 30 #include "ui/gfx/geometry/rect_conversions.h" | 31 #include "ui/gfx/geometry/rect_conversions.h" |
| 31 | 32 |
| 32 namespace cc { | 33 namespace cc { |
| 33 namespace { | 34 namespace { |
| 34 | 35 |
| 35 // Flag to indicate whether we should try and detect that | 36 // Flag to indicate whether we should try and detect that |
| 36 // a tile is of solid color. | 37 // a tile is of solid color. |
| 37 const bool kUseColorEstimator = true; | 38 const bool kUseColorEstimator = true; |
| 38 | 39 |
| 39 DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER( | 40 DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER( |
| 40 ScopedRasterTaskTimer, | 41 ScopedRasterTaskTimer, |
| 41 "Compositing.%s.RasterTask.RasterUs", | 42 "Compositing.%s.RasterTask.RasterUs", |
| 42 "Compositing.%s.RasterTask.RasterPixelsPerMs"); | 43 "Compositing.%s.RasterTask.RasterPixelsPerMs"); |
| 43 | 44 |
| 44 // TODO(prashant.n): Separate out members needed in RunOnWorkerThread() and | |
| 45 // OnTaskCompleted() in RasterTaskImpl. crbug.com/613812. | |
| 46 class RasterTaskImpl : public TileTask { | 45 class RasterTaskImpl : public TileTask { |
| 47 public: | 46 public: |
| 48 RasterTaskImpl(TileManager* tile_manager, | 47 RasterTaskImpl(TileManager* tile_manager, |
| 48 Tile* tile, |
| 49 Resource* resource, | 49 Resource* resource, |
| 50 scoped_refptr<RasterSource> raster_source, | 50 scoped_refptr<RasterSource> raster_source, |
| 51 const gfx::Rect& content_rect, | |
| 52 const gfx::Rect& invalid_content_rect, | |
| 53 float contents_scale, | |
| 54 const RasterSource::PlaybackSettings& playback_settings, | 51 const RasterSource::PlaybackSettings& playback_settings, |
| 55 TileResolution tile_resolution, | 52 TileResolution tile_resolution, |
| 56 int layer_id, | |
| 57 uint64_t source_prepare_tiles_id, | 53 uint64_t source_prepare_tiles_id, |
| 58 Tile* tile, | |
| 59 uint64_t new_content_id, | |
| 60 int source_frame_number, | |
| 61 std::unique_ptr<RasterBuffer> raster_buffer, | 54 std::unique_ptr<RasterBuffer> raster_buffer, |
| 62 TileTask::Vector* dependencies, | 55 TileTask::Vector* dependencies, |
| 63 bool supports_concurrent_execution) | 56 bool supports_concurrent_execution) |
| 64 : TileTask(supports_concurrent_execution, dependencies), | 57 : TileTask(supports_concurrent_execution, dependencies), |
| 65 tile_manager_(tile_manager), | 58 tile_manager_(tile_manager), |
| 59 tile_(tile), |
| 66 resource_(resource), | 60 resource_(resource), |
| 67 raster_source_(std::move(raster_source)), | 61 raster_source_(std::move(raster_source)), |
| 68 content_rect_(content_rect), | 62 content_rect_(tile->content_rect()), |
| 69 invalid_content_rect_(invalid_content_rect), | 63 invalid_content_rect_(tile->invalidated_content_rect()), |
| 70 contents_scale_(contents_scale), | 64 contents_scale_(tile->contents_scale()), |
| 71 playback_settings_(playback_settings), | 65 playback_settings_(playback_settings), |
| 72 tile_resolution_(tile_resolution), | 66 tile_resolution_(tile_resolution), |
| 73 layer_id_(layer_id), | 67 layer_id_(tile->layer_id()), |
| 74 source_prepare_tiles_id_(source_prepare_tiles_id), | 68 source_prepare_tiles_id_(source_prepare_tiles_id), |
| 75 tile_(tile), | 69 tile_tracing_id_(static_cast<void*>(tile)), |
| 76 new_content_id_(new_content_id), | 70 new_content_id_(tile->id()), |
| 77 source_frame_number_(source_frame_number), | 71 source_frame_number_(tile->source_frame_number()), |
| 78 raster_buffer_(std::move(raster_buffer)) {} | 72 raster_buffer_(std::move(raster_buffer)) { |
| 73 DCHECK(origin_thread_checker_.CalledOnValidThread()); |
| 74 } |
| 79 | 75 |
| 80 // Overridden from Task: | 76 // Overridden from Task: |
| 81 void RunOnWorkerThread() override { | 77 void RunOnWorkerThread() override { |
| 82 TRACE_EVENT1("cc", "RasterizerTaskImpl::RunOnWorkerThread", | 78 TRACE_EVENT1("cc", "RasterizerTaskImpl::RunOnWorkerThread", |
| 83 "source_prepare_tiles_id", source_prepare_tiles_id_); | 79 "source_prepare_tiles_id", source_prepare_tiles_id_); |
| 84 | 80 |
| 85 DCHECK(raster_source_.get()); | 81 DCHECK(raster_source_.get()); |
| 86 DCHECK(raster_buffer_); | 82 DCHECK(raster_buffer_); |
| 87 | 83 |
| 88 frame_viewer_instrumentation::ScopedRasterTask raster_task( | 84 frame_viewer_instrumentation::ScopedRasterTask raster_task( |
| 89 tile_, tile_resolution_, source_frame_number_, layer_id_); | 85 tile_tracing_id_, tile_resolution_, source_frame_number_, layer_id_); |
| 90 ScopedRasterTaskTimer timer; | 86 ScopedRasterTaskTimer timer; |
| 91 timer.SetArea(content_rect_.size().GetArea()); | 87 timer.SetArea(content_rect_.size().GetArea()); |
| 92 | 88 |
| 93 DCHECK(raster_source_); | 89 DCHECK(raster_source_); |
| 94 | 90 |
| 95 raster_buffer_->Playback(raster_source_.get(), content_rect_, | 91 raster_buffer_->Playback(raster_source_.get(), content_rect_, |
| 96 invalid_content_rect_, new_content_id_, | 92 invalid_content_rect_, new_content_id_, |
| 97 contents_scale_, playback_settings_); | 93 contents_scale_, playback_settings_); |
| 98 } | 94 } |
| 99 | 95 |
| 100 // Overridden from TileTask: | 96 // Overridden from TileTask: |
| 101 void OnTaskCompleted() override { | 97 void OnTaskCompleted() override { |
| 98 DCHECK(origin_thread_checker_.CalledOnValidThread()); |
| 99 |
| 102 tile_manager_->OnRasterTaskCompleted(std::move(raster_buffer_), tile_, | 100 tile_manager_->OnRasterTaskCompleted(std::move(raster_buffer_), tile_, |
| 103 resource_, state().IsCanceled()); | 101 resource_, state().IsCanceled()); |
| 104 } | 102 } |
| 105 | 103 |
| 106 protected: | 104 protected: |
| 107 ~RasterTaskImpl() override { DCHECK(!raster_buffer_); } | 105 ~RasterTaskImpl() override { |
| 106 DCHECK(origin_thread_checker_.CalledOnValidThread()); |
| 107 DCHECK(!raster_buffer_); |
| 108 } |
| 108 | 109 |
| 109 private: | 110 private: |
| 111 base::ThreadChecker origin_thread_checker_; |
| 112 |
| 113 // The following members are needed for processing completion of this task on |
| 114 // origin thread. These are not thread-safe and should be accessed only in |
| 115 // origin thread. Ensure their access by checking CalledOnValidThread(). |
| 110 TileManager* tile_manager_; | 116 TileManager* tile_manager_; |
| 117 Tile* tile_; |
| 111 Resource* resource_; | 118 Resource* resource_; |
| 119 |
| 120 // The following members should be used for running the task. |
| 112 scoped_refptr<RasterSource> raster_source_; | 121 scoped_refptr<RasterSource> raster_source_; |
| 113 gfx::Rect content_rect_; | 122 gfx::Rect content_rect_; |
| 114 gfx::Rect invalid_content_rect_; | 123 gfx::Rect invalid_content_rect_; |
| 115 float contents_scale_; | 124 float contents_scale_; |
| 116 RasterSource::PlaybackSettings playback_settings_; | 125 RasterSource::PlaybackSettings playback_settings_; |
| 117 TileResolution tile_resolution_; | 126 TileResolution tile_resolution_; |
| 118 int layer_id_; | 127 int layer_id_; |
| 119 uint64_t source_prepare_tiles_id_; | 128 uint64_t source_prepare_tiles_id_; |
| 120 Tile* tile_; | 129 void* tile_tracing_id_; |
| 121 uint64_t new_content_id_; | 130 uint64_t new_content_id_; |
| 122 int source_frame_number_; | 131 int source_frame_number_; |
| 123 std::unique_ptr<RasterBuffer> raster_buffer_; | 132 std::unique_ptr<RasterBuffer> raster_buffer_; |
| 124 | 133 |
| 125 DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl); | 134 DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl); |
| 126 }; | 135 }; |
| 127 | 136 |
| 128 TaskCategory TaskCategoryForTileTask(TileTask* task, | 137 TaskCategory TaskCategoryForTileTask(TileTask* task, |
| 129 bool use_foreground_category) { | 138 bool use_foreground_category) { |
| 130 if (!task->supports_concurrent_execution()) | 139 if (!task->supports_concurrent_execution()) |
| (...skipping 798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 929 ++it; | 938 ++it; |
| 930 else | 939 else |
| 931 it = images.erase(it); | 940 it = images.erase(it); |
| 932 } | 941 } |
| 933 | 942 |
| 934 bool supports_concurrent_execution = !use_gpu_rasterization_; | 943 bool supports_concurrent_execution = !use_gpu_rasterization_; |
| 935 std::unique_ptr<RasterBuffer> raster_buffer = | 944 std::unique_ptr<RasterBuffer> raster_buffer = |
| 936 tile_task_manager_->GetRasterBufferProvider()->AcquireBufferForRaster( | 945 tile_task_manager_->GetRasterBufferProvider()->AcquireBufferForRaster( |
| 937 resource, resource_content_id, tile->invalidated_id()); | 946 resource, resource_content_id, tile->invalidated_id()); |
| 938 return make_scoped_refptr(new RasterTaskImpl( | 947 return make_scoped_refptr(new RasterTaskImpl( |
| 939 this, resource, prioritized_tile.raster_source(), tile->content_rect(), | 948 this, tile, resource, prioritized_tile.raster_source(), playback_settings, |
| 940 tile->invalidated_content_rect(), tile->contents_scale(), | 949 prioritized_tile.priority().resolution, prepare_tiles_count_, |
| 941 playback_settings, prioritized_tile.priority().resolution, | 950 std::move(raster_buffer), &decode_tasks, supports_concurrent_execution)); |
| 942 tile->layer_id(), prepare_tiles_count_, tile, tile->id(), | |
| 943 tile->source_frame_number(), std::move(raster_buffer), &decode_tasks, | |
| 944 supports_concurrent_execution)); | |
| 945 } | 951 } |
| 946 | 952 |
| 947 void TileManager::OnRasterTaskCompleted( | 953 void TileManager::OnRasterTaskCompleted( |
| 948 std::unique_ptr<RasterBuffer> raster_buffer, | 954 std::unique_ptr<RasterBuffer> raster_buffer, |
| 949 Tile* tile, | 955 Tile* tile, |
| 950 Resource* resource, | 956 Resource* resource, |
| 951 bool was_canceled) { | 957 bool was_canceled) { |
| 952 DCHECK(tile); | 958 DCHECK(tile); |
| 953 DCHECK(tiles_.find(tile->id()) != tiles_.end()); | 959 DCHECK(tiles_.find(tile->id()) != tiles_.end()); |
| 954 tile_task_manager_->GetRasterBufferProvider()->ReleaseBufferForRaster( | 960 tile_task_manager_->GetRasterBufferProvider()->ReleaseBufferForRaster( |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1276 void TileManager::Signals::reset() { | 1282 void TileManager::Signals::reset() { |
| 1277 ready_to_activate = false; | 1283 ready_to_activate = false; |
| 1278 did_notify_ready_to_activate = false; | 1284 did_notify_ready_to_activate = false; |
| 1279 ready_to_draw = false; | 1285 ready_to_draw = false; |
| 1280 did_notify_ready_to_draw = false; | 1286 did_notify_ready_to_draw = false; |
| 1281 all_tile_tasks_completed = false; | 1287 all_tile_tasks_completed = false; |
| 1282 did_notify_all_tile_tasks_completed = false; | 1288 did_notify_all_tile_tasks_completed = false; |
| 1283 } | 1289 } |
| 1284 | 1290 |
| 1285 } // namespace cc | 1291 } // namespace cc |
| OLD | NEW |