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 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |