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

Side by Side Diff: cc/tile_manager.cc

Issue 11348384: cc: Use asynchronous set pixels API for impl-side painting. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove ManagedTileState::resource_id. Created 8 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 | Annotate | Revision Log
« no previous file with comments | « cc/tile_manager.h ('k') | no next file » | 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/tile_manager.h" 5 #include "cc/tile_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 DCHECK(!resource_is_being_initialized); 109 DCHECK(!resource_is_being_initialized);
110 } 110 }
111 111
112 TileManager::TileManager( 112 TileManager::TileManager(
113 TileManagerClient* client, 113 TileManagerClient* client,
114 ResourceProvider* resource_provider, 114 ResourceProvider* resource_provider,
115 size_t num_raster_threads) 115 size_t num_raster_threads)
116 : client_(client), 116 : client_(client),
117 resource_pool_(ResourcePool::Create(resource_provider, 117 resource_pool_(ResourcePool::Create(resource_provider,
118 Renderer::ImplPool)), 118 Renderer::ImplPool)),
119 manage_tiles_pending_(false) { 119 manage_tiles_pending_(false),
120 check_for_completed_set_pixels_pending_(false) {
120 // Initialize all threads. 121 // Initialize all threads.
121 const std::string thread_name_prefix = kRasterThreadNamePrefix; 122 const std::string thread_name_prefix = kRasterThreadNamePrefix;
122 while (raster_threads_.size() < num_raster_threads) { 123 while (raster_threads_.size() < num_raster_threads) {
123 int thread_number = raster_threads_.size() + 1; 124 int thread_number = raster_threads_.size() + 1;
124 scoped_ptr<RasterThread> thread = make_scoped_ptr( 125 scoped_ptr<RasterThread> thread = make_scoped_ptr(
125 new RasterThread(thread_name_prefix + 126 new RasterThread(thread_name_prefix +
126 StringPrintf("Worker%d", thread_number).c_str())); 127 StringPrintf("Worker%d", thread_number).c_str()));
127 raster_threads_.append(thread.Pass()); 128 raster_threads_.append(thread.Pass());
128 } 129 }
129 } 130 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 ScheduleManageTiles(); 169 ScheduleManageTiles();
169 } 170 }
170 171
171 void TileManager::ScheduleManageTiles() { 172 void TileManager::ScheduleManageTiles() {
172 if (manage_tiles_pending_) 173 if (manage_tiles_pending_)
173 return; 174 return;
174 client_->ScheduleManageTiles(); 175 client_->ScheduleManageTiles();
175 manage_tiles_pending_ = true; 176 manage_tiles_pending_ = true;
176 } 177 }
177 178
179 void TileManager::ScheduleCheckForCompletedSetPixels() {
180 if (check_for_completed_set_pixels_pending_)
181 return;
182 client_->ScheduleCheckForCompletedSetPixels();
183 check_for_completed_set_pixels_pending_ = true;
184 }
185
178 class BinComparator { 186 class BinComparator {
179 public: 187 public:
180 bool operator() (const Tile* a, const Tile* b) const { 188 bool operator() (const Tile* a, const Tile* b) const {
181 const ManagedTileState& ams = a->managed_state(); 189 const ManagedTileState& ams = a->managed_state();
182 const ManagedTileState& bms = b->managed_state(); 190 const ManagedTileState& bms = b->managed_state();
183 if (ams.bin != bms.bin) 191 if (ams.bin != bms.bin)
184 return ams.bin < bms.bin; 192 return ams.bin < bms.bin;
185 193
186 if (ams.resolution != bms.resolution) 194 if (ams.resolution != bms.resolution)
187 return ams.resolution < ams.resolution; 195 return ams.resolution < ams.resolution;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 // Sort by bin. 280 // Sort by bin.
273 std::sort(tiles_.begin(), tiles_.end(), BinComparator()); 281 std::sort(tiles_.begin(), tiles_.end(), BinComparator());
274 282
275 // Assign gpu memory and determine what tiles need to be rasterized. 283 // Assign gpu memory and determine what tiles need to be rasterized.
276 AssignGpuMemoryToTiles(); 284 AssignGpuMemoryToTiles();
277 285
278 // Finally, kick the rasterizer. 286 // Finally, kick the rasterizer.
279 DispatchMoreRasterTasks(); 287 DispatchMoreRasterTasks();
280 } 288 }
281 289
290 void TileManager::CheckForCompletedSetPixels() {
291 check_for_completed_set_pixels_pending_ = false;
292
293 while (!tiles_with_pending_set_pixels_.empty()) {
294 Tile* tile = tiles_with_pending_set_pixels_.front();
295 DCHECK(tile->managed_state().resource);
296
297 // Set pixel tasks complete in the order they are posted.
298 if (!resource_pool_->resource_provider()->didSetPixelsComplete(
299 tile->managed_state().resource->id())) {
300 ScheduleCheckForCompletedSetPixels();
301 break;
302 }
303
304 // It's now safe to release the pixel buffer.
305 resource_pool_->resource_provider()->releasePixelBuffer(
306 tile->managed_state().resource->id());
307
308 DidFinishTileInitialization(tile);
309 tiles_with_pending_set_pixels_.pop();
310 }
311 }
312
282 void TileManager::renderingStats(RenderingStats* stats) { 313 void TileManager::renderingStats(RenderingStats* stats) {
283 stats->totalRasterizeTimeInSeconds = 314 stats->totalRasterizeTimeInSeconds =
284 rendering_stats_.totalRasterizeTimeInSeconds; 315 rendering_stats_.totalRasterizeTimeInSeconds;
285 stats->totalPixelsRasterized = rendering_stats_.totalPixelsRasterized; 316 stats->totalPixelsRasterized = rendering_stats_.totalPixelsRasterized;
286 } 317 }
287 318
288 void TileManager::AssignGpuMemoryToTiles() { 319 void TileManager::AssignGpuMemoryToTiles() {
289 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); 320 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles");
290 // Some memory cannot be released. Figure out which. 321 // Some memory cannot be released. Figure out which.
291 size_t unreleasable_bytes = 0; 322 size_t unreleasable_bytes = 0;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 // Tile can be freed after the completion of the raster task. Call 444 // Tile can be freed after the completion of the raster task. Call
414 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority 445 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority
415 // tiles. The result of this could be that this tile is no longer 446 // tiles. The result of this could be that this tile is no longer
416 // allowed to use gpu memory and in that case we need to abort 447 // allowed to use gpu memory and in that case we need to abort
417 // initialization and free all associated resources before calling 448 // initialization and free all associated resources before calling
418 // DispatchMoreRasterTasks(). 449 // DispatchMoreRasterTasks().
419 AssignGpuMemoryToTiles(); 450 AssignGpuMemoryToTiles();
420 451
421 // Finish resource initialization if |can_use_gpu_memory| is true. 452 // Finish resource initialization if |can_use_gpu_memory| is true.
422 if (managed_tile_state.can_use_gpu_memory) { 453 if (managed_tile_state.can_use_gpu_memory) {
423 resource_pool_->resource_provider()->setPixelsFromBuffer(resource->id()); 454 // The component order may be bgra if we're uploading bgra pixels to rgba
424 resource_pool_->resource_provider()->releasePixelBuffer(resource->id());
425
426 // The component order may be bgra if we uploaded bgra pixels to rgba
427 // texture. Mark contents as swizzled if image component order is 455 // texture. Mark contents as swizzled if image component order is
428 // different than texture format. 456 // different than texture format.
429 managed_tile_state.contents_swizzled = 457 managed_tile_state.contents_swizzled =
430 !PlatformColor::sameComponentOrder(tile->format_); 458 !PlatformColor::sameComponentOrder(tile->format_);
431 459
432 DidFinishTileInitialization(tile, resource.Pass()); 460 // Tile resources can't be freed until upload has completed.
461 managed_tile_state.can_be_freed = false;
462
463 resource_pool_->resource_provider()->beginSetPixels(resource->id());
464 managed_tile_state.resource = resource.Pass();
465 tiles_with_pending_set_pixels_.push(tile);
466
467 ScheduleCheckForCompletedSetPixels();
433 } else { 468 } else {
434 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); 469 resource_pool_->resource_provider()->releasePixelBuffer(resource->id());
435 resource_pool_->ReleaseResource(resource.Pass()); 470 resource_pool_->ReleaseResource(resource.Pass());
436 managed_tile_state.resource_is_being_initialized = false; 471 managed_tile_state.resource_is_being_initialized = false;
437 } 472 }
438 473
439 DispatchMoreRasterTasks(); 474 DispatchMoreRasterTasks();
440 } 475 }
441 476
442 void TileManager::DidFinishTileInitialization( 477 void TileManager::DidFinishTileInitialization(Tile* tile) {
443 Tile* tile, scoped_ptr<ResourcePool::Resource> resource) {
444 ManagedTileState& managed_tile_state = tile->managed_state(); 478 ManagedTileState& managed_tile_state = tile->managed_state();
445 DCHECK(!managed_tile_state.resource); 479 DCHECK(managed_tile_state.resource);
446 managed_tile_state.resource = resource.Pass();
447 managed_tile_state.resource_is_being_initialized = false; 480 managed_tile_state.resource_is_being_initialized = false;
448 // TODO(qinmin): Make this conditional on managed_tile_state.bin == NOW_BIN. 481 managed_tile_state.can_be_freed = true;
449 client_->ScheduleRedraw();
450 } 482 }
451 483
452 } 484 }
OLDNEW
« no previous file with comments | « cc/tile_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698