Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(312)

Side by Side Diff: cc/resources/tile_manager.cc

Issue 69343005: Added preliminary support for tile rasterization with Ganesh (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase (ScopedResource). Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/resources/tile_manager_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/resources/tile_manager.h" 5 #include "cc/resources/tile_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 10
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 160 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
161 state->SetInteger("completed_count", stats.completed_count); 161 state->SetInteger("completed_count", stats.completed_count);
162 state->SetInteger("canceled_count", stats.canceled_count); 162 state->SetInteger("canceled_count", stats.canceled_count);
163 return state.PassAs<base::Value>(); 163 return state.PassAs<base::Value>();
164 } 164 }
165 165
166 // static 166 // static
167 scoped_ptr<TileManager> TileManager::Create( 167 scoped_ptr<TileManager> TileManager::Create(
168 TileManagerClient* client, 168 TileManagerClient* client,
169 ResourceProvider* resource_provider, 169 ResourceProvider* resource_provider,
170 ContextProvider* context_provider,
170 size_t num_raster_threads, 171 size_t num_raster_threads,
171 RenderingStatsInstrumentation* rendering_stats_instrumentation, 172 RenderingStatsInstrumentation* rendering_stats_instrumentation,
172 bool use_map_image, 173 bool use_map_image,
173 size_t max_transfer_buffer_usage_bytes, 174 size_t max_transfer_buffer_usage_bytes,
174 size_t max_raster_usage_bytes, 175 size_t max_raster_usage_bytes,
175 GLenum map_image_texture_target) { 176 GLenum map_image_texture_target) {
176 return make_scoped_ptr( 177 return make_scoped_ptr(
177 new TileManager(client, 178 new TileManager(client,
178 resource_provider, 179 resource_provider,
180 GpuRasterizer::Create(
181 context_provider, resource_provider),
179 use_map_image ? 182 use_map_image ?
180 ImageRasterWorkerPool::Create( 183 ImageRasterWorkerPool::Create(
181 resource_provider, 184 resource_provider,
182 num_raster_threads, 185 num_raster_threads,
183 map_image_texture_target) : 186 map_image_texture_target) :
184 PixelBufferRasterWorkerPool::Create( 187 PixelBufferRasterWorkerPool::Create(
185 resource_provider, 188 resource_provider,
186 num_raster_threads, 189 num_raster_threads,
187 max_transfer_buffer_usage_bytes), 190 max_transfer_buffer_usage_bytes),
188 num_raster_threads, 191 num_raster_threads,
189 max_raster_usage_bytes, 192 max_raster_usage_bytes,
190 rendering_stats_instrumentation)); 193 rendering_stats_instrumentation));
191 } 194 }
192 195
193 TileManager::TileManager( 196 TileManager::TileManager(
194 TileManagerClient* client, 197 TileManagerClient* client,
195 ResourceProvider* resource_provider, 198 ResourceProvider* resource_provider,
199 scoped_ptr<GpuRasterizer> gpu_rasterizer,
196 scoped_ptr<RasterWorkerPool> raster_worker_pool, 200 scoped_ptr<RasterWorkerPool> raster_worker_pool,
197 size_t num_raster_threads, 201 size_t num_raster_threads,
198 size_t max_raster_usage_bytes, 202 size_t max_raster_usage_bytes,
199 RenderingStatsInstrumentation* rendering_stats_instrumentation) 203 RenderingStatsInstrumentation* rendering_stats_instrumentation)
200 : client_(client), 204 : client_(client),
201 resource_pool_(ResourcePool::Create( 205 resource_pool_(ResourcePool::Create(
202 resource_provider, 206 resource_provider,
203 raster_worker_pool->GetResourceTarget(), 207 raster_worker_pool->GetResourceTarget(),
204 raster_worker_pool->GetResourceFormat())), 208 raster_worker_pool->GetResourceFormat())),
209 gpu_rasterizer_(gpu_rasterizer.Pass()),
205 raster_worker_pool_(raster_worker_pool.Pass()), 210 raster_worker_pool_(raster_worker_pool.Pass()),
206 prioritized_tiles_dirty_(false), 211 prioritized_tiles_dirty_(false),
207 all_tiles_that_need_to_be_rasterized_have_memory_(true), 212 all_tiles_that_need_to_be_rasterized_have_memory_(true),
208 all_tiles_required_for_activation_have_memory_(true), 213 all_tiles_required_for_activation_have_memory_(true),
209 memory_required_bytes_(0), 214 memory_required_bytes_(0),
210 memory_nice_to_have_bytes_(0), 215 memory_nice_to_have_bytes_(0),
211 bytes_releasable_(0), 216 bytes_releasable_(0),
212 resources_releasable_(0), 217 resources_releasable_(0),
213 max_raster_usage_bytes_(max_raster_usage_bytes), 218 max_raster_usage_bytes_(max_raster_usage_bytes),
214 ever_exceeded_memory_budget_(false), 219 ever_exceeded_memory_budget_(false),
215 rendering_stats_instrumentation_(rendering_stats_instrumentation), 220 rendering_stats_instrumentation_(rendering_stats_instrumentation),
216 did_initialize_visible_tile_(false), 221 did_initialize_visible_tile_(false),
217 did_check_for_completed_tasks_since_last_schedule_tasks_(true) { 222 did_check_for_completed_tasks_since_last_schedule_tasks_(true) {
223 gpu_rasterizer_->SetClient(this);
218 raster_worker_pool_->SetClient(this); 224 raster_worker_pool_->SetClient(this);
219 } 225 }
220 226
221 TileManager::~TileManager() { 227 TileManager::~TileManager() {
222 // Reset global state and manage. This should cause 228 // Reset global state and manage. This should cause
223 // our memory usage to drop to zero. 229 // our memory usage to drop to zero.
224 global_state_ = GlobalStateThatImpactsTilePriority(); 230 global_state_ = GlobalStateThatImpactsTilePriority();
225 231
226 CleanUpReleasedTiles(); 232 CleanUpReleasedTiles();
227 DCHECK_EQ(0u, bundles_.size()); 233 DCHECK_EQ(0u, bundles_.size());
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 if (mode != used_mode) 822 if (mode != used_mode)
817 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); 823 FreeResourceForTile(tile, static_cast<RasterMode>(mode));
818 } 824 }
819 } 825 }
820 826
821 void TileManager::ScheduleTasks( 827 void TileManager::ScheduleTasks(
822 const TileVector& tiles_that_need_to_be_rasterized) { 828 const TileVector& tiles_that_need_to_be_rasterized) {
823 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", 829 TRACE_EVENT1("cc", "TileManager::ScheduleTasks",
824 "count", tiles_that_need_to_be_rasterized.size()); 830 "count", tiles_that_need_to_be_rasterized.size());
825 RasterWorkerPool::RasterTask::Queue tasks; 831 RasterWorkerPool::RasterTask::Queue tasks;
832 GpuRasterizer::Queue gpu_raster_tasks;
826 833
827 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); 834 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_);
828 835
829 // Build a new task queue containing all task currently needed. Tasks 836 // Build a new task queue containing all task currently needed. Tasks
830 // are added in order of priority, highest priority task first. 837 // are added in order of priority, highest priority task first.
831 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); 838 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin();
832 it != tiles_that_need_to_be_rasterized.end(); 839 it != tiles_that_need_to_be_rasterized.end();
833 ++it) { 840 ++it) {
834 Tile* tile = *it; 841 Tile* tile = *it;
835 ManagedTileState& mts = tile->managed_state(); 842 ManagedTileState& mts = tile->managed_state();
836 ManagedTileState::TileVersion& tile_version = 843 ManagedTileState::TileVersion& tile_version =
837 mts.tile_versions[mts.raster_mode]; 844 mts.tile_versions[mts.raster_mode];
838 845
839 DCHECK(tile_version.requires_resource()); 846 DCHECK(tile_version.requires_resource());
840 DCHECK(!tile_version.resource_); 847 DCHECK(!tile_version.resource_);
841 848
842 if (tile_version.raster_task_.is_null()) 849 if (tile->use_gpu_rasterization()) {
843 tile_version.raster_task_ = CreateRasterTask(tile); 850 scoped_ptr<ScopedResource> resource =
851 resource_pool_->AcquireResource(tile->tile_size_.size());
844 852
845 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); 853 gpu_raster_tasks.Append(tile, resource.Pass());
854 } else {
855 if (tile_version.raster_task_.is_null())
856 tile_version.raster_task_ = CreateRasterTask(tile);
857
858 tasks.Append(tile_version.raster_task_, tile->required_for_activation());
859 }
846 } 860 }
847 861
848 // We must reduce the amount of unused resoruces before calling 862 // We must reduce the amount of unused resoruces before calling
849 // ScheduleTasks to prevent usage from rising above limits. 863 // ScheduleTasks to prevent usage from rising above limits.
850 resource_pool_->ReduceResourceUsage(); 864 resource_pool_->ReduceResourceUsage();
851 865
852 // Schedule running of |tasks|. This replaces any previously 866 // Schedule running of |tasks|. This replaces any previously
853 // scheduled tasks and effectively cancels all tasks not present 867 // scheduled tasks and effectively cancels all tasks not present
854 // in |tasks|. 868 // in |tasks|.
855 raster_worker_pool_->ScheduleTasks(&tasks); 869 raster_worker_pool_->ScheduleTasks(&tasks);
856 870
857 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; 871 did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
872
873 gpu_rasterizer_->Rasterize(gpu_raster_tasks,
874 rendering_stats_instrumentation_);
858 } 875 }
859 876
860 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( 877 RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
861 Tile* tile, skia::LazyPixelRef* pixel_ref) { 878 Tile* tile, skia::LazyPixelRef* pixel_ref) {
862 return RasterWorkerPool::CreateImageDecodeTask( 879 return RasterWorkerPool::CreateImageDecodeTask(
863 pixel_ref, 880 pixel_ref,
864 tile->layer_id(), 881 tile->layer_id(),
865 rendering_stats_instrumentation_, 882 rendering_stats_instrumentation_,
866 base::Bind(&TileManager::OnImageDecodeTaskCompleted, 883 base::Bind(&TileManager::OnImageDecodeTaskCompleted,
867 base::Unretained(this), 884 base::Unretained(this),
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
980 997
981 bytes_releasable_ += BytesConsumedIfAllocated(tile); 998 bytes_releasable_ += BytesConsumedIfAllocated(tile);
982 ++resources_releasable_; 999 ++resources_releasable_;
983 } 1000 }
984 1001
985 FreeUnusedResourcesForTile(tile); 1002 FreeUnusedResourcesForTile(tile);
986 if (tile->is_visible()) 1003 if (tile->is_visible())
987 did_initialize_visible_tile_ = true; 1004 did_initialize_visible_tile_ = true;
988 } 1005 }
989 1006
1007 void TileManager::OnGpuRasterTaskCompleted(
1008 Tile* tile,
1009 scoped_ptr<ScopedResource> resource) {
1010 ManagedTileState& mts = tile->managed_state();
1011 ManagedTileState::TileVersion& tile_version =
1012 mts.tile_versions[mts.raster_mode];
1013 DCHECK(tile_version.raster_task_.is_null());
1014
1015 ++update_visible_tiles_stats_.completed_count;
1016
1017 tile_version.set_use_resource();
1018 tile_version.resource_ = resource.Pass();
1019
1020 bytes_releasable_ += BytesConsumedIfAllocated(tile);
1021 ++resources_releasable_;
1022
1023 FreeUnusedResourcesForTile(tile);
1024 if (tile->is_visible())
1025 did_initialize_visible_tile_ = true;
1026 }
1027
990 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, 1028 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile,
991 gfx::Size tile_size, 1029 gfx::Size tile_size,
992 gfx::Rect content_rect, 1030 gfx::Rect content_rect,
993 gfx::Rect opaque_rect, 1031 gfx::Rect opaque_rect,
994 float contents_scale, 1032 float contents_scale,
995 int layer_id, 1033 int layer_id,
996 int source_frame_number, 1034 int source_frame_number,
997 int flags) { 1035 int flags) {
998 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, 1036 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this,
999 picture_pile, 1037 picture_pile,
(...skipping 16 matching lines...) Expand all
1016 int offset_y, 1054 int offset_y,
1017 int width, 1055 int width,
1018 int height) { 1056 int height) {
1019 scoped_refptr<TileBundle> bundle = make_scoped_refptr( 1057 scoped_refptr<TileBundle> bundle = make_scoped_refptr(
1020 new TileBundle(this, offset_x, offset_y, width, height)); 1058 new TileBundle(this, offset_x, offset_y, width, height));
1021 bundles_[bundle->id()] = bundle; 1059 bundles_[bundle->id()] = bundle;
1022 return bundle; 1060 return bundle;
1023 } 1061 }
1024 1062
1025 } // namespace cc 1063 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/resources/tile_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698