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

Side by Side Diff: cc/layers/picture_layer_impl.cc

Issue 287643004: Re-land: cc: Examine layers to determine if we're ready to activate. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address review feeback Created 6 years, 7 months 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
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/layers/picture_layer_impl.h" 5 #include "cc/layers/picture_layer_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/time/time.h" 10 #include "base/time/time.h"
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 ++iter) { 240 ++iter) {
241 gfx::Rect geometry_rect = iter.geometry_rect(); 241 gfx::Rect geometry_rect = iter.geometry_rect();
242 gfx::Rect visible_geometry_rect = 242 gfx::Rect visible_geometry_rect =
243 quad_sink->UnoccludedContentRect(geometry_rect, draw_transform()); 243 quad_sink->UnoccludedContentRect(geometry_rect, draw_transform());
244 if (visible_geometry_rect.IsEmpty()) 244 if (visible_geometry_rect.IsEmpty())
245 continue; 245 continue;
246 246
247 append_quads_data->visible_content_area += 247 append_quads_data->visible_content_area +=
248 visible_geometry_rect.width() * visible_geometry_rect.height(); 248 visible_geometry_rect.width() * visible_geometry_rect.height();
249 249
250 if (!*iter || !iter->IsReadyToDraw()) { 250 scoped_ptr<DrawQuad> draw_quad;
enne (OOO) 2014/05/16 21:18:32 What is the change to AppendQuads for? It's very h
reveman 2014/05/21 22:11:39 This is just moving the code and adding the allow_
251 had_checkerboard_quads = true; 251 if (*iter && iter->IsReadyToDraw()) {
252 const ManagedTileState::TileVersion& tile_version =
253 iter->GetTileVersionForDrawing();
254 switch (tile_version.mode()) {
255 case ManagedTileState::TileVersion::RESOURCE_MODE: {
256 gfx::RectF texture_rect = iter.texture_rect();
257 gfx::Rect opaque_rect = iter->opaque_rect();
258 opaque_rect.Intersect(geometry_rect);
259
260 if (iter->contents_scale() != ideal_contents_scale_)
261 append_quads_data->had_incomplete_tile = true;
262
263 scoped_ptr<TileDrawQuad> quad = TileDrawQuad::Create();
264 quad->SetNew(shared_quad_state,
265 geometry_rect,
266 opaque_rect,
267 visible_geometry_rect,
268 tile_version.get_resource_id(),
269 texture_rect,
270 iter.texture_size(),
271 tile_version.contents_swizzled());
272 draw_quad = quad.PassAs<DrawQuad>();
273 break;
274 }
275 case ManagedTileState::TileVersion::PICTURE_PILE_MODE: {
276 if (layer_tree_impl()
277 ->GetRendererCapabilities()
278 .allow_rasterize_on_demand) {
vmpstr 2014/05/16 17:09:06 can you flip this if: if (!...) break; ... Al
reveman 2014/05/21 22:11:39 Done.
279 gfx::RectF texture_rect = iter.texture_rect();
280 gfx::Rect opaque_rect = iter->opaque_rect();
281 opaque_rect.Intersect(geometry_rect);
282
283 ResourceProvider* resource_provider =
284 layer_tree_impl()->resource_provider();
285 ResourceFormat format =
286 resource_provider->memory_efficient_texture_format();
287 scoped_ptr<PictureDrawQuad> quad = PictureDrawQuad::Create();
288 quad->SetNew(shared_quad_state,
289 geometry_rect,
290 opaque_rect,
291 visible_geometry_rect,
292 texture_rect,
293 iter.texture_size(),
294 format,
295 iter->content_rect(),
296 iter->contents_scale(),
297 pile_);
298 draw_quad = quad.PassAs<DrawQuad>();
299 }
300 break;
301 }
302 case ManagedTileState::TileVersion::SOLID_COLOR_MODE: {
303 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
304 quad->SetNew(shared_quad_state,
305 geometry_rect,
306 visible_geometry_rect,
307 tile_version.get_solid_color(),
308 false);
309 draw_quad = quad.PassAs<DrawQuad>();
310 break;
311 }
312 }
313 }
314
315 if (!draw_quad) {
252 if (draw_checkerboard_for_missing_tiles()) { 316 if (draw_checkerboard_for_missing_tiles()) {
253 scoped_ptr<CheckerboardDrawQuad> quad = CheckerboardDrawQuad::Create(); 317 scoped_ptr<CheckerboardDrawQuad> quad = CheckerboardDrawQuad::Create();
254 SkColor color = DebugColors::DefaultCheckerboardColor(); 318 SkColor color = DebugColors::DefaultCheckerboardColor();
255 quad->SetNew( 319 quad->SetNew(
256 shared_quad_state, geometry_rect, visible_geometry_rect, color); 320 shared_quad_state, geometry_rect, visible_geometry_rect, color);
257 quad_sink->Append(quad.PassAs<DrawQuad>()); 321 quad_sink->Append(quad.PassAs<DrawQuad>());
258 } else { 322 } else {
259 SkColor color = SafeOpaqueBackgroundColor(); 323 SkColor color = SafeOpaqueBackgroundColor();
260 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); 324 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
261 quad->SetNew(shared_quad_state, 325 quad->SetNew(shared_quad_state,
262 geometry_rect, 326 geometry_rect,
263 visible_geometry_rect, 327 visible_geometry_rect,
264 color, 328 color,
265 false); 329 false);
266 quad_sink->Append(quad.PassAs<DrawQuad>()); 330 quad_sink->Append(quad.PassAs<DrawQuad>());
267 } 331 }
268 332
269 append_quads_data->num_missing_tiles++; 333 append_quads_data->num_missing_tiles++;
270 append_quads_data->had_incomplete_tile = true; 334 append_quads_data->had_incomplete_tile = true;
271 append_quads_data->approximated_visible_content_area += 335 append_quads_data->approximated_visible_content_area +=
272 visible_geometry_rect.width() * visible_geometry_rect.height(); 336 visible_geometry_rect.width() * visible_geometry_rect.height();
337 had_checkerboard_quads = true;
273 continue; 338 continue;
274 } 339 }
275 340
276 const ManagedTileState::TileVersion& tile_version =
277 iter->GetTileVersionForDrawing();
278 scoped_ptr<DrawQuad> draw_quad;
279 switch (tile_version.mode()) {
280 case ManagedTileState::TileVersion::RESOURCE_MODE: {
281 gfx::RectF texture_rect = iter.texture_rect();
282 gfx::Rect opaque_rect = iter->opaque_rect();
283 opaque_rect.Intersect(geometry_rect);
284
285 if (iter->contents_scale() != ideal_contents_scale_)
286 append_quads_data->had_incomplete_tile = true;
287
288 scoped_ptr<TileDrawQuad> quad = TileDrawQuad::Create();
289 quad->SetNew(shared_quad_state,
290 geometry_rect,
291 opaque_rect,
292 visible_geometry_rect,
293 tile_version.get_resource_id(),
294 texture_rect,
295 iter.texture_size(),
296 tile_version.contents_swizzled());
297 draw_quad = quad.PassAs<DrawQuad>();
298 break;
299 }
300 case ManagedTileState::TileVersion::PICTURE_PILE_MODE: {
301 gfx::RectF texture_rect = iter.texture_rect();
302 gfx::Rect opaque_rect = iter->opaque_rect();
303 opaque_rect.Intersect(geometry_rect);
304
305 ResourceProvider* resource_provider =
306 layer_tree_impl()->resource_provider();
307 ResourceFormat format =
308 resource_provider->memory_efficient_texture_format();
309 scoped_ptr<PictureDrawQuad> quad = PictureDrawQuad::Create();
310 quad->SetNew(shared_quad_state,
311 geometry_rect,
312 opaque_rect,
313 visible_geometry_rect,
314 texture_rect,
315 iter.texture_size(),
316 format,
317 iter->content_rect(),
318 iter->contents_scale(),
319 pile_);
320 draw_quad = quad.PassAs<DrawQuad>();
321 break;
322 }
323 case ManagedTileState::TileVersion::SOLID_COLOR_MODE: {
324 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
325 quad->SetNew(shared_quad_state,
326 geometry_rect,
327 visible_geometry_rect,
328 tile_version.get_solid_color(),
329 false);
330 draw_quad = quad.PassAs<DrawQuad>();
331 break;
332 }
333 }
334
335 DCHECK(draw_quad);
336 quad_sink->Append(draw_quad.Pass()); 341 quad_sink->Append(draw_quad.Pass());
337 342
338 if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) { 343 if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) {
339 append_quads_data->approximated_visible_content_area += 344 append_quads_data->approximated_visible_content_area +=
340 visible_geometry_rect.width() * visible_geometry_rect.height(); 345 visible_geometry_rect.width() * visible_geometry_rect.height();
341 } 346 }
342 347
343 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling()) 348 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling())
344 seen_tilings.push_back(iter.CurrentTiling()); 349 seen_tilings.push_back(iter.CurrentTiling());
345 } 350 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 contents_scale_x(), 423 contents_scale_x(),
419 current_frame_time_in_seconds); 424 current_frame_time_in_seconds);
420 425
421 if (layer_tree_impl()->IsPendingTree()) 426 if (layer_tree_impl()->IsPendingTree())
422 MarkVisibleResourcesAsRequired(); 427 MarkVisibleResourcesAsRequired();
423 428
424 // Tile priorities were modified. 429 // Tile priorities were modified.
425 layer_tree_impl()->DidModifyTilePriorities(); 430 layer_tree_impl()->DidModifyTilePriorities();
426 } 431 }
427 432
428 void PictureLayerImpl::NotifyTileInitialized(const Tile* tile) { 433 void PictureLayerImpl::NotifyTileStateChanged(const Tile* tile) {
429 if (layer_tree_impl()->IsActiveTree()) { 434 if (layer_tree_impl()->IsActiveTree()) {
430 gfx::RectF layer_damage_rect = 435 gfx::RectF layer_damage_rect =
431 gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale()); 436 gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale());
432 AddDamageRect(layer_damage_rect); 437 AddDamageRect(layer_damage_rect);
433 } 438 }
434 } 439 }
435 440
436 void PictureLayerImpl::DidBecomeActive() { 441 void PictureLayerImpl::DidBecomeActive() {
437 LayerImpl::DidBecomeActive(); 442 LayerImpl::DidBecomeActive();
438 tilings_->DidBecomeActive(); 443 tilings_->DidBecomeActive();
(...skipping 895 matching lines...) Expand 10 before | Expand all | Expand 10 after
1334 } 1339 }
1335 1340
1336 WhichTree PictureLayerImpl::GetTree() const { 1341 WhichTree PictureLayerImpl::GetTree() const {
1337 return layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE; 1342 return layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE;
1338 } 1343 }
1339 1344
1340 bool PictureLayerImpl::IsOnActiveOrPendingTree() const { 1345 bool PictureLayerImpl::IsOnActiveOrPendingTree() const {
1341 return !layer_tree_impl()->IsRecycleTree(); 1346 return !layer_tree_impl()->IsRecycleTree();
1342 } 1347 }
1343 1348
1349 bool PictureLayerImpl::AllTilesRequiredForActivationAreReadyToDraw() const {
1350 if (!layer_tree_impl()->IsPendingTree())
1351 return true;
1352
1353 if (!tilings_)
1354 return true;
1355
1356 gfx::Rect rect(visible_content_rect());
1357 for (PictureLayerTilingSet::CoverageIterator iter(
enne (OOO) 2014/05/16 21:18:32 Sorry but I think this is not correct. What you n
1358 tilings_.get(), contents_scale_x(), rect, ideal_contents_scale_);
1359 iter;
1360 ++iter) {
1361 const Tile* tile = *iter;
1362 // A null tile (i.e. missing recording) can just be skipped.
1363 if (!tile)
1364 continue;
1365
1366 if (tile->required_for_activation() && !tile->IsReadyToDraw())
1367 return false;
1368 }
1369
1370 return true;
1371 }
1372
1344 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator() 1373 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator()
1345 : layer_(NULL) {} 1374 : layer_(NULL) {}
1346 1375
1347 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator( 1376 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator(
1348 PictureLayerImpl* layer, 1377 PictureLayerImpl* layer,
1349 bool prioritize_low_res) 1378 bool prioritize_low_res)
1350 : layer_(layer), current_stage_(0) { 1379 : layer_(layer), current_stage_(0) {
1351 DCHECK(layer_); 1380 DCHECK(layer_);
1352 if (!layer_->tilings_ || !layer_->tilings_->num_tilings()) { 1381 if (!layer_->tilings_ || !layer_->tilings_->num_tilings()) {
1353 current_stage_ = arraysize(stages_); 1382 current_stage_ = arraysize(stages_);
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
1557 return iterator_index_ < iterators_.size(); 1586 return iterator_index_ < iterators_.size();
1558 } 1587 }
1559 1588
1560 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType( 1589 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType(
1561 PictureLayerTiling::TilingEvictionTileIterator* it) const { 1590 PictureLayerTiling::TilingEvictionTileIterator* it) const {
1562 return it->get_type() == iteration_stage_ && 1591 return it->get_type() == iteration_stage_ &&
1563 (**it)->required_for_activation() == required_for_activation_; 1592 (**it)->required_for_activation() == required_for_activation_;
1564 } 1593 }
1565 1594
1566 } // namespace cc 1595 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698