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

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: Fix for tests that pass NULL resource_provider/context_provider. 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
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 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 161 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
162 state->SetInteger("completed_count", stats.completed_count); 162 state->SetInteger("completed_count", stats.completed_count);
163 state->SetInteger("canceled_count", stats.canceled_count); 163 state->SetInteger("canceled_count", stats.canceled_count);
164 return state.PassAs<base::Value>(); 164 return state.PassAs<base::Value>();
165 } 165 }
166 166
167 // static 167 // static
168 scoped_ptr<TileManager> TileManager::Create( 168 scoped_ptr<TileManager> TileManager::Create(
169 TileManagerClient* client, 169 TileManagerClient* client,
170 ResourceProvider* resource_provider, 170 ResourceProvider* resource_provider,
171 ContextProvider* context_provider,
171 size_t num_raster_threads, 172 size_t num_raster_threads,
172 RenderingStatsInstrumentation* rendering_stats_instrumentation, 173 RenderingStatsInstrumentation* rendering_stats_instrumentation,
173 bool use_map_image, 174 bool use_map_image,
174 size_t max_transfer_buffer_usage_bytes, 175 size_t max_transfer_buffer_usage_bytes,
175 size_t max_raster_usage_bytes, 176 size_t max_raster_usage_bytes,
176 GLenum map_image_texture_target) { 177 GLenum map_image_texture_target) {
177 return make_scoped_ptr( 178 return make_scoped_ptr(
178 new TileManager(client, 179 new TileManager(client,
179 resource_provider, 180 resource_provider,
181 context_provider,
180 use_map_image ? 182 use_map_image ?
181 ImageRasterWorkerPool::Create( 183 ImageRasterWorkerPool::Create(
182 resource_provider, 184 resource_provider,
183 num_raster_threads, 185 num_raster_threads,
184 map_image_texture_target) : 186 map_image_texture_target) :
185 PixelBufferRasterWorkerPool::Create( 187 PixelBufferRasterWorkerPool::Create(
186 resource_provider, 188 resource_provider,
187 num_raster_threads, 189 num_raster_threads,
188 max_transfer_buffer_usage_bytes), 190 max_transfer_buffer_usage_bytes),
189 num_raster_threads, 191 num_raster_threads,
190 max_raster_usage_bytes, 192 max_raster_usage_bytes,
191 rendering_stats_instrumentation)); 193 rendering_stats_instrumentation));
192 } 194 }
193 195
194 TileManager::TileManager( 196 TileManager::TileManager(
195 TileManagerClient* client, 197 TileManagerClient* client,
196 ResourceProvider* resource_provider, 198 ResourceProvider* resource_provider,
199 ContextProvider* context_provider,
197 scoped_ptr<RasterWorkerPool> raster_worker_pool, 200 scoped_ptr<RasterWorkerPool> raster_worker_pool,
198 size_t num_raster_threads, 201 size_t num_raster_threads,
199 size_t max_raster_usage_bytes, 202 size_t max_raster_usage_bytes,
200 RenderingStatsInstrumentation* rendering_stats_instrumentation) 203 RenderingStatsInstrumentation* rendering_stats_instrumentation)
201 : client_(client), 204 : client_(client),
202 resource_pool_(ResourcePool::Create( 205 resource_pool_(ResourcePool::Create(
203 resource_provider, 206 resource_provider,
204 raster_worker_pool->GetResourceTarget(), 207 raster_worker_pool->GetResourceTarget(),
205 raster_worker_pool->GetResourceFormat())), 208 raster_worker_pool->GetResourceFormat())),
206 raster_worker_pool_(raster_worker_pool.Pass()), 209 raster_worker_pool_(raster_worker_pool.Pass()),
210 gpu_rasterizer_(GpuRasterizer::Create(
nduca 2013/12/02 19:50:17 you should have unit tests that ensure that tiles
slavi 2013/12/04 02:06:50 Done.
211 this, context_provider, resource_provider)),
207 prioritized_tiles_dirty_(false), 212 prioritized_tiles_dirty_(false),
208 all_tiles_that_need_to_be_rasterized_have_memory_(true), 213 all_tiles_that_need_to_be_rasterized_have_memory_(true),
209 all_tiles_required_for_activation_have_memory_(true), 214 all_tiles_required_for_activation_have_memory_(true),
210 memory_required_bytes_(0), 215 memory_required_bytes_(0),
211 memory_nice_to_have_bytes_(0), 216 memory_nice_to_have_bytes_(0),
212 bytes_releasable_(0), 217 bytes_releasable_(0),
213 resources_releasable_(0), 218 resources_releasable_(0),
214 max_raster_usage_bytes_(max_raster_usage_bytes), 219 max_raster_usage_bytes_(max_raster_usage_bytes),
215 ever_exceeded_memory_budget_(false), 220 ever_exceeded_memory_budget_(false),
216 rendering_stats_instrumentation_(rendering_stats_instrumentation), 221 rendering_stats_instrumentation_(rendering_stats_instrumentation),
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 if (mode != used_mode) 798 if (mode != used_mode)
794 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); 799 FreeResourceForTile(tile, static_cast<RasterMode>(mode));
795 } 800 }
796 } 801 }
797 802
798 void TileManager::ScheduleTasks( 803 void TileManager::ScheduleTasks(
799 const TileVector& tiles_that_need_to_be_rasterized) { 804 const TileVector& tiles_that_need_to_be_rasterized) {
800 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", 805 TRACE_EVENT1("cc", "TileManager::ScheduleTasks",
801 "count", tiles_that_need_to_be_rasterized.size()); 806 "count", tiles_that_need_to_be_rasterized.size());
802 RasterWorkerPool::RasterTask::Queue tasks; 807 RasterWorkerPool::RasterTask::Queue tasks;
808 GpuRasterizer::Queue gpu_raster_tasks;
803 809
804 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); 810 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_);
805 811
806 // Build a new task queue containing all task currently needed. Tasks 812 // Build a new task queue containing all task currently needed. Tasks
807 // are added in order of priority, highest priority task first. 813 // are added in order of priority, highest priority task first.
808 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); 814 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin();
809 it != tiles_that_need_to_be_rasterized.end(); 815 it != tiles_that_need_to_be_rasterized.end();
810 ++it) { 816 ++it) {
811 Tile* tile = *it; 817 Tile* tile = *it;
812 ManagedTileState& mts = tile->managed_state(); 818 ManagedTileState& mts = tile->managed_state();
813 ManagedTileState::TileVersion& tile_version = 819 ManagedTileState::TileVersion& tile_version =
814 mts.tile_versions[mts.raster_mode]; 820 mts.tile_versions[mts.raster_mode];
815 821
816 DCHECK(tile_version.requires_resource()); 822 DCHECK(tile_version.requires_resource());
817 DCHECK(!tile_version.resource_); 823 DCHECK(!tile_version.resource_);
818 824
819 if (tile_version.raster_task_.is_null()) 825 if (tile->use_gpu_rasterizer()) {
820 tile_version.raster_task_ = CreateRasterTask(tile); 826 scoped_ptr<ResourcePool::Resource> resource =
827 resource_pool_->AcquireResource(tile->tile_size_.size());
821 828
822 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); 829 gpu_raster_tasks.Append(tile, resource.Pass());
830 } else {
831 if (tile_version.raster_task_.is_null())
832 tile_version.raster_task_ = CreateRasterTask(tile);
833
834 tasks.Append(tile_version.raster_task_, tile->required_for_activation());
835 }
823 } 836 }
824 837
825 // We must reduce the amount of unused resoruces before calling 838 // We must reduce the amount of unused resoruces before calling
826 // ScheduleTasks to prevent usage from rising above limits. 839 // ScheduleTasks to prevent usage from rising above limits.
827 resource_pool_->ReduceResourceUsage(); 840 resource_pool_->ReduceResourceUsage();
828 841
829 // Schedule running of |tasks|. This replaces any previously 842 // Schedule running of |tasks|. This replaces any previously
830 // scheduled tasks and effectively cancels all tasks not present 843 // scheduled tasks and effectively cancels all tasks not present
831 // in |tasks|. 844 // in |tasks|.
832 raster_worker_pool_->ScheduleTasks(&tasks); 845 raster_worker_pool_->ScheduleTasks(&tasks);
833 846
834 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; 847 did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
848
849 gpu_rasterizer_->Rasterize(gpu_raster_tasks,
850 rendering_stats_instrumentation_);
835 } 851 }
836 852
837 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( 853 RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
838 Tile* tile, skia::LazyPixelRef* pixel_ref) { 854 Tile* tile, skia::LazyPixelRef* pixel_ref) {
839 return RasterWorkerPool::CreateImageDecodeTask( 855 return RasterWorkerPool::CreateImageDecodeTask(
840 pixel_ref, 856 pixel_ref,
841 tile->layer_id(), 857 tile->layer_id(),
842 rendering_stats_instrumentation_, 858 rendering_stats_instrumentation_,
843 base::Bind(&TileManager::OnImageDecodeTaskCompleted, 859 base::Bind(&TileManager::OnImageDecodeTaskCompleted,
844 base::Unretained(this), 860 base::Unretained(this),
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
957 973
958 bytes_releasable_ += BytesConsumedIfAllocated(tile); 974 bytes_releasable_ += BytesConsumedIfAllocated(tile);
959 ++resources_releasable_; 975 ++resources_releasable_;
960 } 976 }
961 977
962 FreeUnusedResourcesForTile(tile); 978 FreeUnusedResourcesForTile(tile);
963 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) 979 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
964 did_initialize_visible_tile_ = true; 980 did_initialize_visible_tile_ = true;
965 } 981 }
966 982
983 void TileManager::OnGpuRasterTaskCompleted(
984 Tile* tile,
985 scoped_ptr<ResourcePool::Resource> resource) {
986 ManagedTileState& mts = tile->managed_state();
987 ManagedTileState::TileVersion& tile_version =
988 mts.tile_versions[mts.raster_mode];
989 DCHECK(tile_version.raster_task_.is_null());
990
991 ++update_visible_tiles_stats_.completed_count;
992
993 tile_version.set_use_resource();
994 tile_version.resource_ = resource.Pass();
995
996 bytes_releasable_ += BytesConsumedIfAllocated(tile);
997 ++resources_releasable_;
998
999 FreeUnusedResourcesForTile(tile);
1000 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
1001 did_initialize_visible_tile_ = true;
1002 }
1003
967 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, 1004 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile,
968 gfx::Size tile_size, 1005 gfx::Size tile_size,
969 gfx::Rect content_rect, 1006 gfx::Rect content_rect,
970 gfx::Rect opaque_rect, 1007 gfx::Rect opaque_rect,
971 float contents_scale, 1008 float contents_scale,
972 int layer_id, 1009 int layer_id,
973 int source_frame_number, 1010 int source_frame_number,
974 bool can_use_lcd_text) { 1011 bool can_use_lcd_text,
1012 bool use_gpu_rasterizer) {
975 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, 1013 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this,
976 picture_pile, 1014 picture_pile,
977 tile_size, 1015 tile_size,
978 content_rect, 1016 content_rect,
979 opaque_rect, 1017 opaque_rect,
980 contents_scale, 1018 contents_scale,
981 layer_id, 1019 layer_id,
982 source_frame_number, 1020 source_frame_number,
983 can_use_lcd_text)); 1021 can_use_lcd_text,
1022 use_gpu_rasterizer));
984 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 1023 DCHECK(tiles_.find(tile->id()) == tiles_.end());
985 1024
986 tiles_[tile->id()] = tile; 1025 tiles_[tile->id()] = tile;
987 used_layer_counts_[tile->layer_id()]++; 1026 used_layer_counts_[tile->layer_id()]++;
988 prioritized_tiles_dirty_ = true; 1027 prioritized_tiles_dirty_ = true;
989 return tile; 1028 return tile;
990 } 1029 }
991 1030
992 } // namespace cc 1031 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698