Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/surfaces/surface_aggregator.h" | 5 #include "cc/surfaces/surface_aggregator.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 | 10 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 66 gfx::Transform inverse_transform(gfx::Transform::kSkipInitialization); | 66 gfx::Transform inverse_transform(gfx::Transform::kSkipInitialization); |
| 67 bool inverse_valid = quad_to_root_transform.GetInverse(&inverse_transform); | 67 bool inverse_valid = quad_to_root_transform.GetInverse(&inverse_transform); |
| 68 if (!inverse_valid) | 68 if (!inverse_valid) |
| 69 return false; | 69 return false; |
| 70 | 70 |
| 71 *quad_space_damage_rect = MathUtil::ProjectEnclosingClippedRect( | 71 *quad_space_damage_rect = MathUtil::ProjectEnclosingClippedRect( |
| 72 inverse_transform, root_damage_rect); | 72 inverse_transform, root_damage_rect); |
| 73 return true; | 73 return true; |
| 74 } | 74 } |
| 75 | 75 |
| 76 // Recursively update the flag |has_damage_on_surface_quad|. | |
| 77 bool UpdateHasDamageOnSurfaceQuadRecursive( | |
|
weiliangc
2017/06/07 21:19:01
Since UpdateHasDamageOnSurfaceQuad is called at th
wutao
2017/06/09 02:31:32
Will push the info up in CopyQuadsToPass and Handl
| |
| 78 RenderPass* pass, | |
| 79 base::flat_map<int, std::unique_ptr<RenderPass>>* passes_id_map, | |
| 80 base::flat_set<int>* updated_passes_id) { | |
| 81 if (updated_passes_id->count(pass->id)) | |
| 82 return pass->has_damage_on_surface_quad; | |
| 83 | |
| 84 updated_passes_id->insert(pass->id); | |
| 85 bool has_damage_on_surface_quad = false; | |
| 86 if (pass->has_damage_on_surface_quad) | |
| 87 has_damage_on_surface_quad = true; | |
| 88 for (auto* quad : pass->quad_list) { | |
| 89 if (quad->material == DrawQuad::RENDER_PASS) { | |
| 90 const RenderPassDrawQuad* pass_quad = | |
| 91 RenderPassDrawQuad::MaterialCast(quad); | |
| 92 if (!pass_quad) | |
|
jbauman
2017/05/30 22:04:07
DCHECK instead of if
wutao
2017/05/30 23:12:52
Will do.
| |
| 93 continue; | |
| 94 auto iter = passes_id_map->find(pass_quad->render_pass_id); | |
| 95 if (iter == passes_id_map->end()) | |
| 96 continue; | |
| 97 auto* ref_pass = iter->second.get(); | |
| 98 if (!ref_pass) | |
| 99 continue; | |
| 100 | |
| 101 has_damage_on_surface_quad |= UpdateHasDamageOnSurfaceQuadRecursive( | |
| 102 ref_pass, passes_id_map, updated_passes_id); | |
|
jbauman
2017/05/30 22:04:07
Could you check the performance on SurfaceAggregat
wutao
2017/05/30 23:12:52
Comparing the changes with ToT:
It is very simila
| |
| 103 } | |
| 104 } | |
| 105 pass->has_damage_on_surface_quad = has_damage_on_surface_quad; | |
| 106 return has_damage_on_surface_quad; | |
| 107 } | |
| 108 | |
| 109 void UpdateHasDamageOnSurfaceQuad( | |
| 110 RenderPassList* dest_pass_list_, | |
| 111 std::vector<int>* dest_pass_id_list, | |
| 112 base::flat_map<int, std::unique_ptr<RenderPass>>* passes_id_map) { | |
| 113 base::flat_set<int> updated_passes_id; | |
| 114 for (int pass_id : *dest_pass_id_list) { | |
| 115 UpdateHasDamageOnSurfaceQuadRecursive( | |
|
weiliangc
2017/06/07 21:19:00
We only need the bool has_damage_in_on_surface_qua
wutao
2017/06/09 02:31:32
Yes.
| |
| 116 passes_id_map->find(pass_id)->second.get(), passes_id_map, | |
| 117 &updated_passes_id); | |
| 118 } | |
| 119 | |
| 120 for (int pass_id : *dest_pass_id_list) { | |
| 121 dest_pass_list_->push_back(std::move(passes_id_map->find(pass_id)->second)); | |
| 122 } | |
| 123 } | |
| 124 | |
| 76 } // namespace | 125 } // namespace |
| 77 | 126 |
| 78 SurfaceAggregator::SurfaceAggregator(SurfaceManager* manager, | 127 SurfaceAggregator::SurfaceAggregator(SurfaceManager* manager, |
| 79 ResourceProvider* provider, | 128 ResourceProvider* provider, |
| 80 bool aggregate_only_damaged) | 129 bool aggregate_only_damaged) |
| 81 : manager_(manager), | 130 : manager_(manager), |
| 82 provider_(provider), | 131 provider_(provider), |
| 83 next_render_pass_id_(1), | 132 next_render_pass_id_(1), |
| 84 aggregate_only_damaged_(aggregate_only_damaged), | 133 aggregate_only_damaged_(aggregate_only_damaged), |
| 85 weak_factory_(this) { | 134 weak_factory_(this) { |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 259 size_t sqs_size = source.shared_quad_state_list.size(); | 308 size_t sqs_size = source.shared_quad_state_list.size(); |
| 260 size_t dq_size = source.quad_list.size(); | 309 size_t dq_size = source.quad_list.size(); |
| 261 std::unique_ptr<RenderPass> copy_pass( | 310 std::unique_ptr<RenderPass> copy_pass( |
| 262 RenderPass::Create(sqs_size, dq_size)); | 311 RenderPass::Create(sqs_size, dq_size)); |
| 263 | 312 |
| 264 int remapped_pass_id = RemapPassId(source.id, surface_id); | 313 int remapped_pass_id = RemapPassId(source.id, surface_id); |
| 265 | 314 |
| 266 copy_pass->SetAll(remapped_pass_id, source.output_rect, source.output_rect, | 315 copy_pass->SetAll(remapped_pass_id, source.output_rect, source.output_rect, |
| 267 source.transform_to_root_target, source.filters, | 316 source.transform_to_root_target, source.filters, |
| 268 source.background_filters, blending_color_space_, | 317 source.background_filters, blending_color_space_, |
| 269 source.has_transparent_background); | 318 source.has_transparent_background, |
| 319 source.force_render_surface, | |
| 320 source.has_property_change_on_contributing_render_surface, | |
| 321 source.has_damage_on_surface_quad); | |
| 270 | 322 |
| 271 MoveMatchingRequests(source.id, ©_requests, ©_pass->copy_requests); | 323 MoveMatchingRequests(source.id, ©_requests, ©_pass->copy_requests); |
| 272 | 324 |
| 273 // Contributing passes aggregated in to the pass list need to take the | 325 // Contributing passes aggregated in to the pass list need to take the |
| 274 // transform of the surface quad into account to update their transform to | 326 // transform of the surface quad into account to update their transform to |
| 275 // the root surface. | 327 // the root surface. |
| 276 copy_pass->transform_to_root_target.ConcatTransform( | 328 copy_pass->transform_to_root_target.ConcatTransform( |
| 277 surface_quad->shared_quad_state->quad_to_target_transform); | 329 surface_quad->shared_quad_state->quad_to_target_transform); |
| 278 copy_pass->transform_to_root_target.ConcatTransform(target_transform); | 330 copy_pass->transform_to_root_target.ConcatTransform(target_transform); |
| 279 copy_pass->transform_to_root_target.ConcatTransform( | 331 copy_pass->transform_to_root_target.ConcatTransform( |
| 280 dest_pass->transform_to_root_target); | 332 dest_pass->transform_to_root_target); |
| 281 | 333 |
| 282 CopyQuadsToPass(source.quad_list, source.shared_quad_state_list, | 334 CopyQuadsToPass(source.quad_list, source.shared_quad_state_list, |
| 283 child_to_parent_map, gfx::Transform(), ClipData(), | 335 child_to_parent_map, gfx::Transform(), ClipData(), |
| 284 copy_pass.get(), surface_id); | 336 copy_pass.get(), surface_id); |
| 285 | 337 |
| 286 if (!copy_request_passes_.count(remapped_pass_id) && | 338 if (!copy_request_passes_.count(remapped_pass_id) && |
| 339 !force_render_surface_passes_.count(remapped_pass_id) && | |
| 287 !moved_pixel_passes_.count(remapped_pass_id)) { | 340 !moved_pixel_passes_.count(remapped_pass_id)) { |
| 288 gfx::Transform inverse_transform(gfx::Transform::kSkipInitialization); | 341 gfx::Transform inverse_transform(gfx::Transform::kSkipInitialization); |
| 289 if (copy_pass->transform_to_root_target.GetInverse(&inverse_transform)) { | 342 if (copy_pass->transform_to_root_target.GetInverse(&inverse_transform)) { |
| 290 gfx::Rect damage_rect_in_render_pass_space = | 343 gfx::Rect damage_rect_in_render_pass_space = |
| 291 MathUtil::ProjectEnclosingClippedRect(inverse_transform, | 344 MathUtil::ProjectEnclosingClippedRect(inverse_transform, |
| 292 root_damage_rect_); | 345 root_damage_rect_); |
| 293 copy_pass->damage_rect.Intersect(damage_rect_in_render_pass_space); | 346 copy_pass->damage_rect.Intersect(damage_rect_in_render_pass_space); |
| 294 } | 347 } |
| 295 } | 348 } |
| 296 | 349 |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 404 void SurfaceAggregator::CopyQuadsToPass( | 457 void SurfaceAggregator::CopyQuadsToPass( |
| 405 const QuadList& source_quad_list, | 458 const QuadList& source_quad_list, |
| 406 const SharedQuadStateList& source_shared_quad_state_list, | 459 const SharedQuadStateList& source_shared_quad_state_list, |
| 407 const ResourceProvider::ResourceIdMap& child_to_parent_map, | 460 const ResourceProvider::ResourceIdMap& child_to_parent_map, |
| 408 const gfx::Transform& target_transform, | 461 const gfx::Transform& target_transform, |
| 409 const ClipData& clip_rect, | 462 const ClipData& clip_rect, |
| 410 RenderPass* dest_pass, | 463 RenderPass* dest_pass, |
| 411 const SurfaceId& surface_id) { | 464 const SurfaceId& surface_id) { |
| 412 const SharedQuadState* last_copied_source_shared_quad_state = nullptr; | 465 const SharedQuadState* last_copied_source_shared_quad_state = nullptr; |
| 413 const SharedQuadState* dest_shared_quad_state = nullptr; | 466 const SharedQuadState* dest_shared_quad_state = nullptr; |
| 414 // If the current frame has copy requests then aggregate the entire | 467 // If the current frame has copy requests or force use of render surface, then |
| 415 // thing, as otherwise parts of the copy requests may be ignored. | 468 // aggregate the entire thing, as otherwise parts of the copy requests or |
| 416 const bool ignore_undamaged = aggregate_only_damaged_ && | 469 // render surface may be ignored. |
| 417 !has_copy_requests_ && | 470 const bool ignore_undamaged = |
| 418 !moved_pixel_passes_.count(dest_pass->id); | 471 aggregate_only_damaged_ && !has_copy_requests_ && |
| 472 !has_force_render_surfaces_ && !moved_pixel_passes_.count(dest_pass->id); | |
| 419 // Damage rect in the quad space of the current shared quad state. | 473 // Damage rect in the quad space of the current shared quad state. |
| 420 // TODO(jbauman): This rect may contain unnecessary area if | 474 // TODO(jbauman): This rect may contain unnecessary area if |
| 421 // transform isn't axis-aligned. | 475 // transform isn't axis-aligned. |
| 422 gfx::Rect damage_rect_in_quad_space; | 476 gfx::Rect damage_rect_in_quad_space; |
| 423 bool damage_rect_in_quad_space_valid = false; | 477 bool damage_rect_in_quad_space_valid = false; |
| 424 | 478 |
| 425 #if DCHECK_IS_ON() | 479 #if DCHECK_IS_ON() |
| 426 // If quads have come in with SharedQuadState out of order, or when quads have | 480 // If quads have come in with SharedQuadState out of order, or when quads have |
| 427 // invalid SharedQuadState pointer, it should DCHECK. | 481 // invalid SharedQuadState pointer, it should DCHECK. |
| 428 SharedQuadStateList::ConstIterator sqs_iter = | 482 SharedQuadStateList::ConstIterator sqs_iter = |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 441 const SurfaceDrawQuad* surface_quad = SurfaceDrawQuad::MaterialCast(quad); | 495 const SurfaceDrawQuad* surface_quad = SurfaceDrawQuad::MaterialCast(quad); |
| 442 // HandleSurfaceQuad may add other shared quad state, so reset the | 496 // HandleSurfaceQuad may add other shared quad state, so reset the |
| 443 // current data. | 497 // current data. |
| 444 last_copied_source_shared_quad_state = nullptr; | 498 last_copied_source_shared_quad_state = nullptr; |
| 445 | 499 |
| 446 // The primary SurfaceDrawQuad should have already dealt with the fallback | 500 // The primary SurfaceDrawQuad should have already dealt with the fallback |
| 447 // DrawQuad. | 501 // DrawQuad. |
| 448 if (surface_quad->surface_draw_quad_type == SurfaceDrawQuadType::FALLBACK) | 502 if (surface_quad->surface_draw_quad_type == SurfaceDrawQuadType::FALLBACK) |
| 449 continue; | 503 continue; |
| 450 | 504 |
| 505 // Check if the surface_quad has damage. | |
| 506 Surface* surface = manager_->GetSurfaceForId(surface_quad->surface_id); | |
| 507 if (surface->HasActiveFrame()) { | |
| 508 RenderPass* last_pass = | |
| 509 surface->GetActiveFrame().render_pass_list.back().get(); | |
| 510 gfx::Rect damage_rect = | |
| 511 DamageRectForSurface(surface, *last_pass, last_pass->output_rect); | |
| 512 dest_pass->has_damage_on_surface_quad |= !damage_rect.IsEmpty(); | |
| 513 } | |
| 514 | |
| 451 HandleSurfaceQuad(surface_quad, target_transform, clip_rect, dest_pass, | 515 HandleSurfaceQuad(surface_quad, target_transform, clip_rect, dest_pass, |
| 452 ignore_undamaged, &damage_rect_in_quad_space, | 516 ignore_undamaged, &damage_rect_in_quad_space, |
| 453 &damage_rect_in_quad_space_valid); | 517 &damage_rect_in_quad_space_valid); |
| 454 } else { | 518 } else { |
| 455 if (quad->shared_quad_state != last_copied_source_shared_quad_state) { | 519 if (quad->shared_quad_state != last_copied_source_shared_quad_state) { |
| 456 dest_shared_quad_state = CopySharedQuadState( | 520 dest_shared_quad_state = CopySharedQuadState( |
| 457 quad->shared_quad_state, target_transform, clip_rect, dest_pass); | 521 quad->shared_quad_state, target_transform, clip_rect, dest_pass); |
| 458 last_copied_source_shared_quad_state = quad->shared_quad_state; | 522 last_copied_source_shared_quad_state = quad->shared_quad_state; |
| 459 if (aggregate_only_damaged_ && !has_copy_requests_) { | 523 if (aggregate_only_damaged_ && !has_copy_requests_ && |
| 524 !has_force_render_surfaces_) { | |
| 460 damage_rect_in_quad_space_valid = CalculateQuadSpaceDamageRect( | 525 damage_rect_in_quad_space_valid = CalculateQuadSpaceDamageRect( |
| 461 dest_shared_quad_state->quad_to_target_transform, | 526 dest_shared_quad_state->quad_to_target_transform, |
| 462 dest_pass->transform_to_root_target, root_damage_rect_, | 527 dest_pass->transform_to_root_target, root_damage_rect_, |
| 463 &damage_rect_in_quad_space); | 528 &damage_rect_in_quad_space); |
| 464 } | 529 } |
| 465 } | 530 } |
| 466 | 531 |
| 467 if (ignore_undamaged) { | 532 if (ignore_undamaged) { |
| 468 if (damage_rect_in_quad_space_valid && | 533 if (damage_rect_in_quad_space_valid && |
| 469 !damage_rect_in_quad_space.Intersects(quad->visible_rect)) | 534 !damage_rect_in_quad_space.Intersects(quad->visible_rect)) |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 524 DCHECK(valid_surfaces_.count(surface->surface_id())); | 589 DCHECK(valid_surfaces_.count(surface->surface_id())); |
| 525 if (!valid_surfaces_.count(surface->surface_id())) | 590 if (!valid_surfaces_.count(surface->surface_id())) |
| 526 return; | 591 return; |
| 527 | 592 |
| 528 // TODO(vmpstr): provider check is a hack for unittests that don't set up a | 593 // TODO(vmpstr): provider check is a hack for unittests that don't set up a |
| 529 // resource provider. | 594 // resource provider. |
| 530 ResourceProvider::ResourceIdMap empty_map; | 595 ResourceProvider::ResourceIdMap empty_map; |
| 531 const ResourceProvider::ResourceIdMap& child_to_parent_map = | 596 const ResourceProvider::ResourceIdMap& child_to_parent_map = |
| 532 provider_ ? provider_->GetChildToParentMap(ChildIdForSurface(surface)) | 597 provider_ ? provider_->GetChildToParentMap(ChildIdForSurface(surface)) |
| 533 : empty_map; | 598 : empty_map; |
| 599 std::vector<int> temp_dest_pass_id_list; | |
| 600 base::flat_map<int, std::unique_ptr<RenderPass>> passes_id_map; | |
| 534 for (size_t i = 0; i < source_pass_list.size(); ++i) { | 601 for (size_t i = 0; i < source_pass_list.size(); ++i) { |
| 535 const RenderPass& source = *source_pass_list[i]; | 602 const RenderPass& source = *source_pass_list[i]; |
| 536 | 603 |
| 537 size_t sqs_size = source.shared_quad_state_list.size(); | 604 size_t sqs_size = source.shared_quad_state_list.size(); |
| 538 size_t dq_size = source.quad_list.size(); | 605 size_t dq_size = source.quad_list.size(); |
| 539 std::unique_ptr<RenderPass> copy_pass( | 606 std::unique_ptr<RenderPass> copy_pass( |
| 540 RenderPass::Create(sqs_size, dq_size)); | 607 RenderPass::Create(sqs_size, dq_size)); |
| 541 | 608 |
| 542 MoveMatchingRequests(source.id, ©_requests, ©_pass->copy_requests); | 609 MoveMatchingRequests(source.id, ©_requests, ©_pass->copy_requests); |
| 543 | 610 |
| 544 int remapped_pass_id = RemapPassId(source.id, surface->surface_id()); | 611 int remapped_pass_id = RemapPassId(source.id, surface->surface_id()); |
| 545 | 612 |
| 546 copy_pass->SetAll(remapped_pass_id, source.output_rect, source.output_rect, | 613 copy_pass->SetAll(remapped_pass_id, source.output_rect, source.output_rect, |
| 547 source.transform_to_root_target, source.filters, | 614 source.transform_to_root_target, source.filters, |
| 548 source.background_filters, blending_color_space_, | 615 source.background_filters, blending_color_space_, |
| 549 source.has_transparent_background); | 616 source.has_transparent_background, |
| 617 source.force_render_surface, | |
| 618 source.has_property_change_on_contributing_render_surface, | |
| 619 source.has_damage_on_surface_quad); | |
| 550 | 620 |
| 551 CopyQuadsToPass(source.quad_list, source.shared_quad_state_list, | 621 CopyQuadsToPass(source.quad_list, source.shared_quad_state_list, |
| 552 child_to_parent_map, gfx::Transform(), ClipData(), | 622 child_to_parent_map, gfx::Transform(), ClipData(), |
| 553 copy_pass.get(), surface->surface_id()); | 623 copy_pass.get(), surface->surface_id()); |
| 554 if (!copy_request_passes_.count(remapped_pass_id) && | 624 if (!copy_request_passes_.count(remapped_pass_id) && |
| 625 !force_render_surface_passes_.count(remapped_pass_id) && | |
| 555 !moved_pixel_passes_.count(remapped_pass_id)) { | 626 !moved_pixel_passes_.count(remapped_pass_id)) { |
| 556 gfx::Transform inverse_transform(gfx::Transform::kSkipInitialization); | 627 gfx::Transform inverse_transform(gfx::Transform::kSkipInitialization); |
| 557 if (copy_pass->transform_to_root_target.GetInverse(&inverse_transform)) { | 628 if (copy_pass->transform_to_root_target.GetInverse(&inverse_transform)) { |
| 558 gfx::Rect damage_rect_in_render_pass_space = | 629 gfx::Rect damage_rect_in_render_pass_space = |
| 559 MathUtil::ProjectEnclosingClippedRect(inverse_transform, | 630 MathUtil::ProjectEnclosingClippedRect(inverse_transform, |
| 560 root_damage_rect_); | 631 root_damage_rect_); |
| 561 copy_pass->damage_rect.Intersect(damage_rect_in_render_pass_space); | 632 copy_pass->damage_rect.Intersect(damage_rect_in_render_pass_space); |
| 562 } | 633 } |
| 563 } | 634 } |
| 564 | 635 |
| 565 dest_pass_list_->push_back(std::move(copy_pass)); | 636 temp_dest_pass_id_list.push_back(copy_pass->id); |
| 637 passes_id_map.insert(std::make_pair(copy_pass->id, std::move(copy_pass))); | |
| 566 } | 638 } |
| 639 | |
| 640 UpdateHasDamageOnSurfaceQuad(dest_pass_list_, &temp_dest_pass_id_list, | |
| 641 &passes_id_map); | |
| 567 } | 642 } |
| 568 | 643 |
| 569 void SurfaceAggregator::ProcessAddedAndRemovedSurfaces() { | 644 void SurfaceAggregator::ProcessAddedAndRemovedSurfaces() { |
| 570 for (const auto& surface : previous_contained_surfaces_) { | 645 for (const auto& surface : previous_contained_surfaces_) { |
| 571 if (!contained_surfaces_.count(surface.first)) { | 646 if (!contained_surfaces_.count(surface.first)) { |
| 572 // Release resources of removed surface. | 647 // Release resources of removed surface. |
| 573 auto it = surface_id_to_resource_child_id_.find(surface.first); | 648 auto it = surface_id_to_resource_child_id_.find(surface.first); |
| 574 if (it != surface_id_to_resource_child_id_.end()) { | 649 if (it != surface_id_to_resource_child_id_.end()) { |
| 575 provider_->DestroyChild(it->second); | 650 provider_->DestroyChild(it->second); |
| 576 surface_id_to_resource_child_id_.erase(it); | 651 surface_id_to_resource_child_id_.erase(it); |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 758 } | 833 } |
| 759 | 834 |
| 760 CHECK(debug_weak_this.get()); | 835 CHECK(debug_weak_this.get()); |
| 761 // TODO(staraz): It shouldn't need to call the callback when the damage is | 836 // TODO(staraz): It shouldn't need to call the callback when the damage is |
| 762 // from |surface| and not from |child_surfaces|. | 837 // from |surface| and not from |child_surfaces|. |
| 763 if (!damage_rect.IsEmpty()) | 838 if (!damage_rect.IsEmpty()) |
| 764 surface->RunWillDrawCallback(damage_rect); | 839 surface->RunWillDrawCallback(damage_rect); |
| 765 | 840 |
| 766 CHECK(debug_weak_this.get()); | 841 CHECK(debug_weak_this.get()); |
| 767 for (const auto& render_pass : frame.render_pass_list) { | 842 for (const auto& render_pass : frame.render_pass_list) { |
| 768 if (!render_pass->copy_requests.empty()) { | 843 int remapped_pass_id = RemapPassId(render_pass->id, surface_id); |
| 769 int remapped_pass_id = RemapPassId(render_pass->id, surface_id); | 844 if (!render_pass->copy_requests.empty()) |
| 770 copy_request_passes_.insert(remapped_pass_id); | 845 copy_request_passes_.insert(remapped_pass_id); |
| 771 } | 846 if (render_pass->force_render_surface) |
| 847 force_render_surface_passes_.insert(remapped_pass_id); | |
| 772 } | 848 } |
| 773 | 849 |
| 774 referenced_surfaces_.erase(referenced_surfaces_.find(surface->surface_id())); | 850 referenced_surfaces_.erase(referenced_surfaces_.find(surface->surface_id())); |
| 775 if (!damage_rect.IsEmpty() && frame.metadata.may_contain_video) | 851 if (!damage_rect.IsEmpty() && frame.metadata.may_contain_video) |
| 776 result->may_contain_video = true; | 852 result->may_contain_video = true; |
| 777 return damage_rect; | 853 return damage_rect; |
| 778 } | 854 } |
| 779 | 855 |
| 780 void SurfaceAggregator::CopyUndrawnSurfaces(PrewalkResult* prewalk_result) { | 856 void SurfaceAggregator::CopyUndrawnSurfaces(PrewalkResult* prewalk_result) { |
| 781 // undrawn_surfaces are Surfaces that were identified by prewalk as being | 857 // undrawn_surfaces are Surfaces that were identified by prewalk as being |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 812 } | 888 } |
| 813 } | 889 } |
| 814 } else { | 890 } else { |
| 815 auto it = referenced_surfaces_.insert(surface_id).first; | 891 auto it = referenced_surfaces_.insert(surface_id).first; |
| 816 CopyPasses(frame, surface); | 892 CopyPasses(frame, surface); |
| 817 referenced_surfaces_.erase(it); | 893 referenced_surfaces_.erase(it); |
| 818 } | 894 } |
| 819 } | 895 } |
| 820 } | 896 } |
| 821 | 897 |
| 822 void SurfaceAggregator::PropagateCopyRequestPasses() { | 898 void SurfaceAggregator::PropagatePasses(base::flat_set<int>* passes) { |
| 823 std::vector<int> copy_requests_to_iterate(copy_request_passes_.begin(), | 899 std::vector<int> copy_requests_to_iterate(passes->begin(), passes->end()); |
| 824 copy_request_passes_.end()); | |
| 825 while (!copy_requests_to_iterate.empty()) { | 900 while (!copy_requests_to_iterate.empty()) { |
| 826 int first = copy_requests_to_iterate.back(); | 901 int first = copy_requests_to_iterate.back(); |
| 827 copy_requests_to_iterate.pop_back(); | 902 copy_requests_to_iterate.pop_back(); |
| 828 auto it = render_pass_dependencies_.find(first); | 903 auto it = render_pass_dependencies_.find(first); |
| 829 if (it == render_pass_dependencies_.end()) | 904 if (it == render_pass_dependencies_.end()) |
| 830 continue; | 905 continue; |
| 831 for (auto pass : it->second) { | 906 for (auto pass : it->second) { |
| 832 if (copy_request_passes_.insert(pass).second) { | 907 if (passes->insert(pass).second) { |
| 833 copy_requests_to_iterate.push_back(pass); | 908 copy_requests_to_iterate.push_back(pass); |
| 834 } | 909 } |
| 835 } | 910 } |
| 836 } | 911 } |
| 837 } | 912 } |
| 838 | 913 |
| 839 CompositorFrame SurfaceAggregator::Aggregate(const SurfaceId& surface_id) { | 914 CompositorFrame SurfaceAggregator::Aggregate(const SurfaceId& surface_id) { |
| 840 uma_stats_.Reset(); | 915 uma_stats_.Reset(); |
| 841 | 916 |
| 842 Surface* surface = manager_->GetSurfaceForId(surface_id); | 917 Surface* surface = manager_->GetSurfaceForId(surface_id); |
| 843 DCHECK(surface); | 918 DCHECK(surface); |
| 844 contained_surfaces_[surface_id] = surface->frame_index(); | 919 contained_surfaces_[surface_id] = surface->frame_index(); |
| 845 | 920 |
| 846 if (!surface->HasActiveFrame()) | 921 if (!surface->HasActiveFrame()) |
| 847 return CompositorFrame(); | 922 return CompositorFrame(); |
| 848 | 923 |
| 849 const CompositorFrame& root_surface_frame = surface->GetActiveFrame(); | 924 const CompositorFrame& root_surface_frame = surface->GetActiveFrame(); |
| 850 TRACE_EVENT0("cc", "SurfaceAggregator::Aggregate"); | 925 TRACE_EVENT0("cc", "SurfaceAggregator::Aggregate"); |
| 851 | 926 |
| 852 CompositorFrame frame; | 927 CompositorFrame frame; |
| 853 | 928 |
| 854 dest_pass_list_ = &frame.render_pass_list; | 929 dest_pass_list_ = &frame.render_pass_list; |
| 855 | 930 |
| 856 valid_surfaces_.clear(); | 931 valid_surfaces_.clear(); |
| 857 PrewalkResult prewalk_result; | 932 PrewalkResult prewalk_result; |
| 858 root_damage_rect_ = PrewalkTree(surface_id, false, 0, &prewalk_result); | 933 root_damage_rect_ = PrewalkTree(surface_id, false, 0, &prewalk_result); |
| 859 PropagateCopyRequestPasses(); | 934 PropagatePasses(©_request_passes_); |
| 935 PropagatePasses(&force_render_surface_passes_); | |
| 860 has_copy_requests_ = !copy_request_passes_.empty(); | 936 has_copy_requests_ = !copy_request_passes_.empty(); |
| 937 has_force_render_surfaces_ = !force_render_surface_passes_.empty(); | |
| 861 frame.metadata.may_contain_video = prewalk_result.may_contain_video; | 938 frame.metadata.may_contain_video = prewalk_result.may_contain_video; |
| 862 | 939 |
| 863 CopyUndrawnSurfaces(&prewalk_result); | 940 CopyUndrawnSurfaces(&prewalk_result); |
| 864 referenced_surfaces_.insert(surface_id); | 941 referenced_surfaces_.insert(surface_id); |
| 865 CopyPasses(root_surface_frame, surface); | 942 CopyPasses(root_surface_frame, surface); |
| 866 // CopyPasses may have mutated container, need to re-query to erase. | 943 // CopyPasses may have mutated container, need to re-query to erase. |
| 867 referenced_surfaces_.erase(referenced_surfaces_.find(surface_id)); | 944 referenced_surfaces_.erase(referenced_surfaces_.find(surface_id)); |
| 868 AddColorConversionPass(); | 945 AddColorConversionPass(); |
| 869 | 946 |
| 870 moved_pixel_passes_.clear(); | 947 moved_pixel_passes_.clear(); |
| 871 copy_request_passes_.clear(); | 948 copy_request_passes_.clear(); |
| 949 force_render_surface_passes_.clear(); | |
| 872 render_pass_dependencies_.clear(); | 950 render_pass_dependencies_.clear(); |
| 873 | 951 |
| 874 // Remove all render pass mappings that weren't used in the current frame. | 952 // Remove all render pass mappings that weren't used in the current frame. |
| 875 for (auto it = render_pass_allocator_map_.begin(); | 953 for (auto it = render_pass_allocator_map_.begin(); |
| 876 it != render_pass_allocator_map_.end();) { | 954 it != render_pass_allocator_map_.end();) { |
| 877 if (it->second.in_use) { | 955 if (it->second.in_use) { |
| 878 it->second.in_use = false; | 956 it->second.in_use = false; |
| 879 it++; | 957 it++; |
| 880 } else { | 958 } else { |
| 881 it = render_pass_allocator_map_.erase(it); | 959 it = render_pass_allocator_map_.erase(it); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 930 } | 1008 } |
| 931 | 1009 |
| 932 void SurfaceAggregator::SetOutputColorSpace( | 1010 void SurfaceAggregator::SetOutputColorSpace( |
| 933 const gfx::ColorSpace& blending_color_space, | 1011 const gfx::ColorSpace& blending_color_space, |
| 934 const gfx::ColorSpace& output_color_space) { | 1012 const gfx::ColorSpace& output_color_space) { |
| 935 blending_color_space_ = blending_color_space; | 1013 blending_color_space_ = blending_color_space; |
| 936 output_color_space_ = output_color_space; | 1014 output_color_space_ = output_color_space; |
| 937 } | 1015 } |
| 938 | 1016 |
| 939 } // namespace cc | 1017 } // namespace cc |
| OLD | NEW |