OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |