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

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

Issue 301493002: Revert 272635 "cc: Examine layers to determine if we're ready to..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: 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 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 color, 226 color,
227 width); 227 width);
228 quad_sink->Append(debug_border_quad.PassAs<DrawQuad>()); 228 quad_sink->Append(debug_border_quad.PassAs<DrawQuad>());
229 } 229 }
230 } 230 }
231 231
232 // Keep track of the tilings that were used so that tilings that are 232 // Keep track of the tilings that were used so that tilings that are
233 // unused can be considered for removal. 233 // unused can be considered for removal.
234 std::vector<PictureLayerTiling*> seen_tilings; 234 std::vector<PictureLayerTiling*> seen_tilings;
235 235
236 size_t missing_tile_count = 0u; 236 bool had_checkerboard_quads = false;
237 size_t on_demand_missing_tile_count = 0u;
238 for (PictureLayerTilingSet::CoverageIterator iter( 237 for (PictureLayerTilingSet::CoverageIterator iter(
239 tilings_.get(), contents_scale_x(), rect, ideal_contents_scale_); 238 tilings_.get(), contents_scale_x(), rect, ideal_contents_scale_);
240 iter; 239 iter;
241 ++iter) { 240 ++iter) {
242 gfx::Rect geometry_rect = iter.geometry_rect(); 241 gfx::Rect geometry_rect = iter.geometry_rect();
243 gfx::Rect visible_geometry_rect = 242 gfx::Rect visible_geometry_rect =
244 quad_sink->UnoccludedContentRect(geometry_rect, draw_transform()); 243 quad_sink->UnoccludedContentRect(geometry_rect, draw_transform());
245 if (visible_geometry_rect.IsEmpty()) 244 if (visible_geometry_rect.IsEmpty())
246 continue; 245 continue;
247 246
248 append_quads_data->visible_content_area += 247 append_quads_data->visible_content_area +=
249 visible_geometry_rect.width() * visible_geometry_rect.height(); 248 visible_geometry_rect.width() * visible_geometry_rect.height();
250 249
251 scoped_ptr<DrawQuad> draw_quad; 250 if (!*iter || !iter->IsReadyToDraw()) {
252 if (*iter && iter->IsReadyToDraw()) { 251 had_checkerboard_quads = true;
253 const ManagedTileState::TileVersion& tile_version =
254 iter->GetTileVersionForDrawing();
255 switch (tile_version.mode()) {
256 case ManagedTileState::TileVersion::RESOURCE_MODE: {
257 gfx::RectF texture_rect = iter.texture_rect();
258 gfx::Rect opaque_rect = iter->opaque_rect();
259 opaque_rect.Intersect(geometry_rect);
260
261 if (iter->contents_scale() != ideal_contents_scale_)
262 append_quads_data->had_incomplete_tile = true;
263
264 scoped_ptr<TileDrawQuad> quad = TileDrawQuad::Create();
265 quad->SetNew(shared_quad_state,
266 geometry_rect,
267 opaque_rect,
268 visible_geometry_rect,
269 tile_version.get_resource_id(),
270 texture_rect,
271 iter.texture_size(),
272 tile_version.contents_swizzled());
273 draw_quad = quad.PassAs<DrawQuad>();
274 break;
275 }
276 case ManagedTileState::TileVersion::PICTURE_PILE_MODE: {
277 if (!layer_tree_impl()
278 ->GetRendererCapabilities()
279 .allow_rasterize_on_demand) {
280 ++on_demand_missing_tile_count;
281 break;
282 }
283
284 gfx::RectF texture_rect = iter.texture_rect();
285 gfx::Rect opaque_rect = iter->opaque_rect();
286 opaque_rect.Intersect(geometry_rect);
287
288 ResourceProvider* resource_provider =
289 layer_tree_impl()->resource_provider();
290 ResourceFormat format =
291 resource_provider->memory_efficient_texture_format();
292 scoped_ptr<PictureDrawQuad> quad = PictureDrawQuad::Create();
293 quad->SetNew(shared_quad_state,
294 geometry_rect,
295 opaque_rect,
296 visible_geometry_rect,
297 texture_rect,
298 iter.texture_size(),
299 format,
300 iter->content_rect(),
301 iter->contents_scale(),
302 pile_);
303 draw_quad = quad.PassAs<DrawQuad>();
304 break;
305 }
306 case ManagedTileState::TileVersion::SOLID_COLOR_MODE: {
307 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
308 quad->SetNew(shared_quad_state,
309 geometry_rect,
310 visible_geometry_rect,
311 tile_version.get_solid_color(),
312 false);
313 draw_quad = quad.PassAs<DrawQuad>();
314 break;
315 }
316 }
317 }
318
319 if (!draw_quad) {
320 if (draw_checkerboard_for_missing_tiles()) { 252 if (draw_checkerboard_for_missing_tiles()) {
321 scoped_ptr<CheckerboardDrawQuad> quad = CheckerboardDrawQuad::Create(); 253 scoped_ptr<CheckerboardDrawQuad> quad = CheckerboardDrawQuad::Create();
322 SkColor color = DebugColors::DefaultCheckerboardColor(); 254 SkColor color = DebugColors::DefaultCheckerboardColor();
323 quad->SetNew( 255 quad->SetNew(
324 shared_quad_state, geometry_rect, visible_geometry_rect, color); 256 shared_quad_state, geometry_rect, visible_geometry_rect, color);
325 quad_sink->Append(quad.PassAs<DrawQuad>()); 257 quad_sink->Append(quad.PassAs<DrawQuad>());
326 } else { 258 } else {
327 SkColor color = SafeOpaqueBackgroundColor(); 259 SkColor color = SafeOpaqueBackgroundColor();
328 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); 260 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
329 quad->SetNew(shared_quad_state, 261 quad->SetNew(shared_quad_state,
330 geometry_rect, 262 geometry_rect,
331 visible_geometry_rect, 263 visible_geometry_rect,
332 color, 264 color,
333 false); 265 false);
334 quad_sink->Append(quad.PassAs<DrawQuad>()); 266 quad_sink->Append(quad.PassAs<DrawQuad>());
335 } 267 }
336 268
337 append_quads_data->num_missing_tiles++; 269 append_quads_data->num_missing_tiles++;
338 append_quads_data->had_incomplete_tile = true; 270 append_quads_data->had_incomplete_tile = true;
339 append_quads_data->approximated_visible_content_area += 271 append_quads_data->approximated_visible_content_area +=
340 visible_geometry_rect.width() * visible_geometry_rect.height(); 272 visible_geometry_rect.width() * visible_geometry_rect.height();
341 ++missing_tile_count;
342 continue; 273 continue;
343 } 274 }
344 275
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);
345 quad_sink->Append(draw_quad.Pass()); 336 quad_sink->Append(draw_quad.Pass());
346 337
347 if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) { 338 if (iter->priority(ACTIVE_TREE).resolution != HIGH_RESOLUTION) {
348 append_quads_data->approximated_visible_content_area += 339 append_quads_data->approximated_visible_content_area +=
349 visible_geometry_rect.width() * visible_geometry_rect.height(); 340 visible_geometry_rect.width() * visible_geometry_rect.height();
350 } 341 }
351 342
352 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling()) 343 if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling())
353 seen_tilings.push_back(iter.CurrentTiling()); 344 seen_tilings.push_back(iter.CurrentTiling());
354 } 345 }
355 346
356 if (missing_tile_count) { 347 if (had_checkerboard_quads) {
357 TRACE_EVENT_INSTANT2("cc", 348 TRACE_EVENT_INSTANT0("cc",
358 "PictureLayerImpl::AppendQuads checkerboard", 349 "PictureLayerImpl::AppendQuads checkerboard",
359 TRACE_EVENT_SCOPE_THREAD, 350 TRACE_EVENT_SCOPE_THREAD);
360 "missing_tile_count",
361 missing_tile_count,
362 "on_demand_missing_tile_count",
363 on_demand_missing_tile_count);
364 } 351 }
365 352
366 // Aggressively remove any tilings that are not seen to save memory. Note 353 // Aggressively remove any tilings that are not seen to save memory. Note
367 // that this is at the expense of doing cause more frequent re-painting. A 354 // that this is at the expense of doing cause more frequent re-painting. A
368 // better scheme would be to maintain a tighter visible_content_rect for the 355 // better scheme would be to maintain a tighter visible_content_rect for the
369 // finer tilings. 356 // finer tilings.
370 CleanUpTilingsOnActiveLayer(seen_tilings); 357 CleanUpTilingsOnActiveLayer(seen_tilings);
371 } 358 }
372 359
373 void PictureLayerImpl::DidUnregisterLayer() { 360 void PictureLayerImpl::DidUnregisterLayer() {
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 contents_scale_x(), 422 contents_scale_x(),
436 current_frame_time_in_seconds); 423 current_frame_time_in_seconds);
437 424
438 if (layer_tree_impl()->IsPendingTree()) 425 if (layer_tree_impl()->IsPendingTree())
439 MarkVisibleResourcesAsRequired(); 426 MarkVisibleResourcesAsRequired();
440 427
441 // Tile priorities were modified. 428 // Tile priorities were modified.
442 layer_tree_impl()->DidModifyTilePriorities(); 429 layer_tree_impl()->DidModifyTilePriorities();
443 } 430 }
444 431
445 void PictureLayerImpl::NotifyTileStateChanged(const Tile* tile) { 432 void PictureLayerImpl::NotifyTileInitialized(const Tile* tile) {
446 if (layer_tree_impl()->IsActiveTree()) { 433 if (layer_tree_impl()->IsActiveTree()) {
447 gfx::RectF layer_damage_rect = 434 gfx::RectF layer_damage_rect =
448 gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale()); 435 gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale());
449 AddDamageRect(layer_damage_rect); 436 AddDamageRect(layer_damage_rect);
450 } 437 }
451 } 438 }
452 439
453 void PictureLayerImpl::DidBecomeActive() { 440 void PictureLayerImpl::DidBecomeActive() {
454 LayerImpl::DidBecomeActive(); 441 LayerImpl::DidBecomeActive();
455 tilings_->DidBecomeActive(); 442 tilings_->DidBecomeActive();
(...skipping 904 matching lines...) Expand 10 before | Expand all | Expand 10 after
1360 } 1347 }
1361 1348
1362 WhichTree PictureLayerImpl::GetTree() const { 1349 WhichTree PictureLayerImpl::GetTree() const {
1363 return layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE; 1350 return layer_tree_impl()->IsActiveTree() ? ACTIVE_TREE : PENDING_TREE;
1364 } 1351 }
1365 1352
1366 bool PictureLayerImpl::IsOnActiveOrPendingTree() const { 1353 bool PictureLayerImpl::IsOnActiveOrPendingTree() const {
1367 return !layer_tree_impl()->IsRecycleTree(); 1354 return !layer_tree_impl()->IsRecycleTree();
1368 } 1355 }
1369 1356
1370 bool PictureLayerImpl::AllTilesRequiredForActivationAreReadyToDraw() const {
1371 if (!layer_tree_impl()->IsPendingTree())
1372 return true;
1373
1374 if (!tilings_)
1375 return true;
1376
1377 for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
1378 PictureLayerTiling* tiling = tilings_->tiling_at(i);
1379 if (tiling->resolution() != HIGH_RESOLUTION &&
1380 tiling->resolution() != LOW_RESOLUTION)
1381 continue;
1382
1383 gfx::Rect rect(visible_content_rect());
1384 for (PictureLayerTiling::CoverageIterator iter(
1385 tiling, contents_scale_x(), rect);
1386 iter;
1387 ++iter) {
1388 const Tile* tile = *iter;
1389 // A null tile (i.e. missing recording) can just be skipped.
1390 if (!tile)
1391 continue;
1392
1393 if (tile->required_for_activation() && !tile->IsReadyToDraw())
1394 return false;
1395 }
1396 }
1397
1398 return true;
1399 }
1400
1401 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator() 1357 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator()
1402 : layer_(NULL) {} 1358 : layer_(NULL) {}
1403 1359
1404 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator( 1360 PictureLayerImpl::LayerRasterTileIterator::LayerRasterTileIterator(
1405 PictureLayerImpl* layer, 1361 PictureLayerImpl* layer,
1406 bool prioritize_low_res) 1362 bool prioritize_low_res)
1407 : layer_(layer), current_stage_(0) { 1363 : layer_(layer), current_stage_(0) {
1408 DCHECK(layer_); 1364 DCHECK(layer_);
1409 if (!layer_->tilings_ || !layer_->tilings_->num_tilings()) { 1365 if (!layer_->tilings_ || !layer_->tilings_->num_tilings()) {
1410 current_stage_ = arraysize(stages_); 1366 current_stage_ = arraysize(stages_);
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
1614 return iterator_index_ < iterators_.size(); 1570 return iterator_index_ < iterators_.size();
1615 } 1571 }
1616 1572
1617 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType( 1573 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType(
1618 PictureLayerTiling::TilingEvictionTileIterator* it) const { 1574 PictureLayerTiling::TilingEvictionTileIterator* it) const {
1619 return it->get_type() == iteration_stage_ && 1575 return it->get_type() == iteration_stage_ &&
1620 (**it)->required_for_activation() == required_for_activation_; 1576 (**it)->required_for_activation() == required_for_activation_;
1621 } 1577 }
1622 1578
1623 } // namespace cc 1579 } // namespace cc
OLDNEW
« no previous file with comments | « trunk/src/cc/layers/picture_layer_impl.h ('k') | trunk/src/cc/layers/picture_layer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698