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

Side by Side Diff: cc/surfaces/surface_aggregator.cc

Issue 2873593002: Force use of and cache render surface. (Closed)
Patch Set: Fix for comments in patch 4. Created 3 years, 6 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
OLDNEW
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 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 size_t sqs_size = source.shared_quad_state_list.size(); 260 size_t sqs_size = source.shared_quad_state_list.size();
261 size_t dq_size = source.quad_list.size(); 261 size_t dq_size = source.quad_list.size();
262 std::unique_ptr<RenderPass> copy_pass( 262 std::unique_ptr<RenderPass> copy_pass(
263 RenderPass::Create(sqs_size, dq_size)); 263 RenderPass::Create(sqs_size, dq_size));
264 264
265 RenderPassId remapped_pass_id = RemapPassId(source.id, surface_id); 265 RenderPassId remapped_pass_id = RemapPassId(source.id, surface_id);
266 266
267 copy_pass->SetAll(remapped_pass_id, source.output_rect, source.output_rect, 267 copy_pass->SetAll(remapped_pass_id, source.output_rect, source.output_rect,
268 source.transform_to_root_target, source.filters, 268 source.transform_to_root_target, source.filters,
269 source.background_filters, blending_color_space_, 269 source.background_filters, blending_color_space_,
270 source.has_transparent_background); 270 source.has_transparent_background,
271 source.cache_render_surface,
272 source.has_damage_from_contributing_content);
271 273
272 MoveMatchingRequests(source.id, &copy_requests, &copy_pass->copy_requests); 274 MoveMatchingRequests(source.id, &copy_requests, &copy_pass->copy_requests);
273 275
274 // Contributing passes aggregated in to the pass list need to take the 276 // Contributing passes aggregated in to the pass list need to take the
275 // transform of the surface quad into account to update their transform to 277 // transform of the surface quad into account to update their transform to
276 // the root surface. 278 // the root surface.
277 copy_pass->transform_to_root_target.ConcatTransform( 279 copy_pass->transform_to_root_target.ConcatTransform(
278 surface_quad->shared_quad_state->quad_to_target_transform); 280 surface_quad->shared_quad_state->quad_to_target_transform);
279 copy_pass->transform_to_root_target.ConcatTransform(target_transform); 281 copy_pass->transform_to_root_target.ConcatTransform(target_transform);
280 copy_pass->transform_to_root_target.ConcatTransform( 282 copy_pass->transform_to_root_target.ConcatTransform(
281 dest_pass->transform_to_root_target); 283 dest_pass->transform_to_root_target);
282 284
283 CopyQuadsToPass(source.quad_list, source.shared_quad_state_list, 285 CopyQuadsToPass(source.quad_list, source.shared_quad_state_list,
284 child_to_parent_map, gfx::Transform(), ClipData(), 286 child_to_parent_map, gfx::Transform(), ClipData(),
285 copy_pass.get(), surface_id); 287 copy_pass.get(), surface_id);
286 288
287 if (!copy_request_passes_.count(remapped_pass_id) && 289 if (!copy_request_passes_.count(remapped_pass_id) &&
290 !cache_render_surface_passes_.count(remapped_pass_id) &&
288 !moved_pixel_passes_.count(remapped_pass_id)) { 291 !moved_pixel_passes_.count(remapped_pass_id)) {
289 gfx::Transform inverse_transform(gfx::Transform::kSkipInitialization); 292 gfx::Transform inverse_transform(gfx::Transform::kSkipInitialization);
290 if (copy_pass->transform_to_root_target.GetInverse(&inverse_transform)) { 293 if (copy_pass->transform_to_root_target.GetInverse(&inverse_transform)) {
291 gfx::Rect damage_rect_in_render_pass_space = 294 gfx::Rect damage_rect_in_render_pass_space =
292 MathUtil::ProjectEnclosingClippedRect(inverse_transform, 295 MathUtil::ProjectEnclosingClippedRect(inverse_transform,
293 root_damage_rect_); 296 root_damage_rect_);
294 copy_pass->damage_rect.Intersect(damage_rect_in_render_pass_space); 297 copy_pass->damage_rect.Intersect(damage_rect_in_render_pass_space);
295 } 298 }
296 } 299 }
297 300
301 passes_id_map.insert(std::make_pair(copy_pass->id, copy_pass.get()));
298 dest_pass_list_->push_back(std::move(copy_pass)); 302 dest_pass_list_->push_back(std::move(copy_pass));
299 } 303 }
300 304
301 gfx::Transform surface_transform = 305 gfx::Transform surface_transform =
302 surface_quad->shared_quad_state->quad_to_target_transform; 306 surface_quad->shared_quad_state->quad_to_target_transform;
303 surface_transform.ConcatTransform(target_transform); 307 surface_transform.ConcatTransform(target_transform);
304 308
305 const RenderPass& last_pass = *render_pass_list.back(); 309 const RenderPass& last_pass = *render_pass_list.back();
310 // Check if the surface_quad has damage.
311 if (dest_pass->cache_render_surface) {
312 dest_pass->has_damage_from_contributing_content |=
313 !DamageRectForSurface(surface, last_pass, last_pass.output_rect)
314 .IsEmpty();
315 }
316
306 if (merge_pass) { 317 if (merge_pass) {
307 // TODO(jamesr): Clean up last pass special casing. 318 // TODO(jamesr): Clean up last pass special casing.
308 const QuadList& quads = last_pass.quad_list; 319 const QuadList& quads = last_pass.quad_list;
309 320
310 // Intersect the transformed visible rect and the clip rect to create a 321 // Intersect the transformed visible rect and the clip rect to create a
311 // smaller cliprect for the quad. 322 // smaller cliprect for the quad.
312 ClipData surface_quad_clip_rect( 323 ClipData surface_quad_clip_rect(
313 true, MathUtil::MapEnclosingClippedRect( 324 true, MathUtil::MapEnclosingClippedRect(
314 surface_quad->shared_quad_state->quad_to_target_transform, 325 surface_quad->shared_quad_state->quad_to_target_transform,
315 surface_quad->visible_rect)); 326 surface_quad->visible_rect));
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 void SurfaceAggregator::CopyQuadsToPass( 416 void SurfaceAggregator::CopyQuadsToPass(
406 const QuadList& source_quad_list, 417 const QuadList& source_quad_list,
407 const SharedQuadStateList& source_shared_quad_state_list, 418 const SharedQuadStateList& source_shared_quad_state_list,
408 const ResourceProvider::ResourceIdMap& child_to_parent_map, 419 const ResourceProvider::ResourceIdMap& child_to_parent_map,
409 const gfx::Transform& target_transform, 420 const gfx::Transform& target_transform,
410 const ClipData& clip_rect, 421 const ClipData& clip_rect,
411 RenderPass* dest_pass, 422 RenderPass* dest_pass,
412 const SurfaceId& surface_id) { 423 const SurfaceId& surface_id) {
413 const SharedQuadState* last_copied_source_shared_quad_state = nullptr; 424 const SharedQuadState* last_copied_source_shared_quad_state = nullptr;
414 const SharedQuadState* dest_shared_quad_state = nullptr; 425 const SharedQuadState* dest_shared_quad_state = nullptr;
415 // If the current frame has copy requests then aggregate the entire 426 // If the current frame has copy requests or cache render surface, then
416 // thing, as otherwise parts of the copy requests may be ignored. 427 // aggregate the entire thing, as otherwise parts of the copy requests or
417 const bool ignore_undamaged = aggregate_only_damaged_ && 428 // render surface may be ignored.
418 !has_copy_requests_ && 429 const bool ignore_undamaged =
419 !moved_pixel_passes_.count(dest_pass->id); 430 aggregate_only_damaged_ && !has_copy_requests_ &&
431 !has_cache_render_surfaces_ && !moved_pixel_passes_.count(dest_pass->id);
420 // Damage rect in the quad space of the current shared quad state. 432 // Damage rect in the quad space of the current shared quad state.
421 // TODO(jbauman): This rect may contain unnecessary area if 433 // TODO(jbauman): This rect may contain unnecessary area if
422 // transform isn't axis-aligned. 434 // transform isn't axis-aligned.
423 gfx::Rect damage_rect_in_quad_space; 435 gfx::Rect damage_rect_in_quad_space;
424 bool damage_rect_in_quad_space_valid = false; 436 bool damage_rect_in_quad_space_valid = false;
425 437
426 #if DCHECK_IS_ON() 438 #if DCHECK_IS_ON()
427 // If quads have come in with SharedQuadState out of order, or when quads have 439 // If quads have come in with SharedQuadState out of order, or when quads have
428 // invalid SharedQuadState pointer, it should DCHECK. 440 // invalid SharedQuadState pointer, it should DCHECK.
429 SharedQuadStateList::ConstIterator sqs_iter = 441 SharedQuadStateList::ConstIterator sqs_iter =
(...skipping 20 matching lines...) Expand all
450 continue; 462 continue;
451 463
452 HandleSurfaceQuad(surface_quad, target_transform, clip_rect, dest_pass, 464 HandleSurfaceQuad(surface_quad, target_transform, clip_rect, dest_pass,
453 ignore_undamaged, &damage_rect_in_quad_space, 465 ignore_undamaged, &damage_rect_in_quad_space,
454 &damage_rect_in_quad_space_valid); 466 &damage_rect_in_quad_space_valid);
455 } else { 467 } else {
456 if (quad->shared_quad_state != last_copied_source_shared_quad_state) { 468 if (quad->shared_quad_state != last_copied_source_shared_quad_state) {
457 dest_shared_quad_state = CopySharedQuadState( 469 dest_shared_quad_state = CopySharedQuadState(
458 quad->shared_quad_state, target_transform, clip_rect, dest_pass); 470 quad->shared_quad_state, target_transform, clip_rect, dest_pass);
459 last_copied_source_shared_quad_state = quad->shared_quad_state; 471 last_copied_source_shared_quad_state = quad->shared_quad_state;
460 if (aggregate_only_damaged_ && !has_copy_requests_) { 472 if (aggregate_only_damaged_ && !has_copy_requests_ &&
473 !has_cache_render_surfaces_) {
461 damage_rect_in_quad_space_valid = CalculateQuadSpaceDamageRect( 474 damage_rect_in_quad_space_valid = CalculateQuadSpaceDamageRect(
462 dest_shared_quad_state->quad_to_target_transform, 475 dest_shared_quad_state->quad_to_target_transform,
463 dest_pass->transform_to_root_target, root_damage_rect_, 476 dest_pass->transform_to_root_target, root_damage_rect_,
464 &damage_rect_in_quad_space); 477 &damage_rect_in_quad_space);
465 } 478 }
466 } 479 }
467 480
468 if (ignore_undamaged) { 481 if (ignore_undamaged) {
469 if (damage_rect_in_quad_space_valid && 482 if (damage_rect_in_quad_space_valid &&
470 !damage_rect_in_quad_space.Intersects(quad->visible_rect)) 483 !damage_rect_in_quad_space.Intersects(quad->visible_rect))
471 continue; 484 continue;
472 } 485 }
473 486
474 DrawQuad* dest_quad; 487 DrawQuad* dest_quad;
475 if (quad->material == DrawQuad::RENDER_PASS) { 488 if (quad->material == DrawQuad::RENDER_PASS) {
476 const RenderPassDrawQuad* pass_quad = 489 const RenderPassDrawQuad* pass_quad =
477 RenderPassDrawQuad::MaterialCast(quad); 490 RenderPassDrawQuad::MaterialCast(quad);
478 int original_pass_id = pass_quad->render_pass_id; 491 int original_pass_id = pass_quad->render_pass_id;
479 int remapped_pass_id = RemapPassId(original_pass_id, surface_id); 492 int remapped_pass_id = RemapPassId(original_pass_id, surface_id);
480 493 if (dest_pass->cache_render_surface) {
494 auto iter = passes_id_map.find(remapped_pass_id);
495 if (iter != passes_id_map.end()) {
496 dest_pass->has_damage_from_contributing_content |=
497 iter->second->has_damage_from_contributing_content;
498 }
499 }
481 dest_quad = dest_pass->CopyFromAndAppendRenderPassDrawQuad( 500 dest_quad = dest_pass->CopyFromAndAppendRenderPassDrawQuad(
482 pass_quad, dest_shared_quad_state, remapped_pass_id); 501 pass_quad, dest_shared_quad_state, remapped_pass_id);
483 } else if (quad->material == DrawQuad::TEXTURE_CONTENT) { 502 } else if (quad->material == DrawQuad::TEXTURE_CONTENT) {
484 const TextureDrawQuad* texture_quad = 503 const TextureDrawQuad* texture_quad =
485 TextureDrawQuad::MaterialCast(quad); 504 TextureDrawQuad::MaterialCast(quad);
486 if (texture_quad->secure_output_only && 505 if (texture_quad->secure_output_only &&
487 (!output_is_secure_ || copy_request_passes_.count(dest_pass->id))) { 506 (!output_is_secure_ || copy_request_passes_.count(dest_pass->id))) {
488 SolidColorDrawQuad* solid_color_quad = 507 SolidColorDrawQuad* solid_color_quad =
489 dest_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 508 dest_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
490 solid_color_quad->SetNew(dest_shared_quad_state, quad->rect, 509 solid_color_quad->SetNew(dest_shared_quad_state, quad->rect,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 RenderPass::Create(sqs_size, dq_size)); 560 RenderPass::Create(sqs_size, dq_size));
542 561
543 MoveMatchingRequests(source.id, &copy_requests, &copy_pass->copy_requests); 562 MoveMatchingRequests(source.id, &copy_requests, &copy_pass->copy_requests);
544 563
545 RenderPassId remapped_pass_id = 564 RenderPassId remapped_pass_id =
546 RemapPassId(source.id, surface->surface_id()); 565 RemapPassId(source.id, surface->surface_id());
547 566
548 copy_pass->SetAll(remapped_pass_id, source.output_rect, source.output_rect, 567 copy_pass->SetAll(remapped_pass_id, source.output_rect, source.output_rect,
549 source.transform_to_root_target, source.filters, 568 source.transform_to_root_target, source.filters,
550 source.background_filters, blending_color_space_, 569 source.background_filters, blending_color_space_,
551 source.has_transparent_background); 570 source.has_transparent_background,
571 source.cache_render_surface,
572 source.has_damage_from_contributing_content);
552 573
553 CopyQuadsToPass(source.quad_list, source.shared_quad_state_list, 574 CopyQuadsToPass(source.quad_list, source.shared_quad_state_list,
554 child_to_parent_map, gfx::Transform(), ClipData(), 575 child_to_parent_map, gfx::Transform(), ClipData(),
555 copy_pass.get(), surface->surface_id()); 576 copy_pass.get(), surface->surface_id());
556 if (!copy_request_passes_.count(remapped_pass_id) && 577 if (!copy_request_passes_.count(remapped_pass_id) &&
578 !cache_render_surface_passes_.count(remapped_pass_id) &&
557 !moved_pixel_passes_.count(remapped_pass_id)) { 579 !moved_pixel_passes_.count(remapped_pass_id)) {
558 gfx::Transform inverse_transform(gfx::Transform::kSkipInitialization); 580 gfx::Transform inverse_transform(gfx::Transform::kSkipInitialization);
559 if (copy_pass->transform_to_root_target.GetInverse(&inverse_transform)) { 581 if (copy_pass->transform_to_root_target.GetInverse(&inverse_transform)) {
560 gfx::Rect damage_rect_in_render_pass_space = 582 gfx::Rect damage_rect_in_render_pass_space =
561 MathUtil::ProjectEnclosingClippedRect(inverse_transform, 583 MathUtil::ProjectEnclosingClippedRect(inverse_transform,
562 root_damage_rect_); 584 root_damage_rect_);
563 copy_pass->damage_rect.Intersect(damage_rect_in_render_pass_space); 585 copy_pass->damage_rect.Intersect(damage_rect_in_render_pass_space);
564 } 586 }
565 } 587 }
566 588
589 passes_id_map.insert(std::make_pair(copy_pass->id, copy_pass.get()));
567 dest_pass_list_->push_back(std::move(copy_pass)); 590 dest_pass_list_->push_back(std::move(copy_pass));
568 } 591 }
569 } 592 }
570 593
571 void SurfaceAggregator::ProcessAddedAndRemovedSurfaces() { 594 void SurfaceAggregator::ProcessAddedAndRemovedSurfaces() {
572 for (const auto& surface : previous_contained_surfaces_) { 595 for (const auto& surface : previous_contained_surfaces_) {
573 if (!contained_surfaces_.count(surface.first)) { 596 if (!contained_surfaces_.count(surface.first)) {
574 // Release resources of removed surface. 597 // Release resources of removed surface.
575 auto it = surface_id_to_resource_child_id_.find(surface.first); 598 auto it = surface_id_to_resource_child_id_.find(surface.first);
576 if (it != surface_id_to_resource_child_id_.end()) { 599 if (it != surface_id_to_resource_child_id_.end()) {
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
760 } 783 }
761 784
762 CHECK(debug_weak_this.get()); 785 CHECK(debug_weak_this.get());
763 // TODO(staraz): It shouldn't need to call the callback when the damage is 786 // TODO(staraz): It shouldn't need to call the callback when the damage is
764 // from |surface| and not from |child_surfaces|. 787 // from |surface| and not from |child_surfaces|.
765 if (!damage_rect.IsEmpty()) 788 if (!damage_rect.IsEmpty())
766 surface->RunWillDrawCallback(damage_rect); 789 surface->RunWillDrawCallback(damage_rect);
767 790
768 CHECK(debug_weak_this.get()); 791 CHECK(debug_weak_this.get());
769 for (const auto& render_pass : frame.render_pass_list) { 792 for (const auto& render_pass : frame.render_pass_list) {
770 if (!render_pass->copy_requests.empty()) { 793 RenderPassId remapped_pass_id = RemapPassId(render_pass->id, surface_id);
771 RenderPassId remapped_pass_id = RemapPassId(render_pass->id, surface_id); 794 if (!render_pass->copy_requests.empty())
772 copy_request_passes_.insert(remapped_pass_id); 795 copy_request_passes_.insert(remapped_pass_id);
773 } 796 if (render_pass->cache_render_surface)
797 cache_render_surface_passes_.insert(remapped_pass_id);
774 } 798 }
775 799
776 referenced_surfaces_.erase(referenced_surfaces_.find(surface->surface_id())); 800 referenced_surfaces_.erase(referenced_surfaces_.find(surface->surface_id()));
777 if (!damage_rect.IsEmpty() && frame.metadata.may_contain_video) 801 if (!damage_rect.IsEmpty() && frame.metadata.may_contain_video)
778 result->may_contain_video = true; 802 result->may_contain_video = true;
779 return damage_rect; 803 return damage_rect;
780 } 804 }
781 805
782 void SurfaceAggregator::CopyUndrawnSurfaces(PrewalkResult* prewalk_result) { 806 void SurfaceAggregator::CopyUndrawnSurfaces(PrewalkResult* prewalk_result) {
783 // undrawn_surfaces are Surfaces that were identified by prewalk as being 807 // undrawn_surfaces are Surfaces that were identified by prewalk as being
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 } 840 }
817 } else { 841 } else {
818 referenced_surfaces_.insert(surface_id); 842 referenced_surfaces_.insert(surface_id);
819 CopyPasses(frame, surface); 843 CopyPasses(frame, surface);
820 // CopyPasses may have mutated container, need to re-query to erase. 844 // CopyPasses may have mutated container, need to re-query to erase.
821 referenced_surfaces_.erase(referenced_surfaces_.find(surface_id)); 845 referenced_surfaces_.erase(referenced_surfaces_.find(surface_id));
822 } 846 }
823 } 847 }
824 } 848 }
825 849
826 void SurfaceAggregator::PropagateCopyRequestPasses() { 850 void SurfaceAggregator::PropagatePasses(base::flat_set<RenderPassId>* passes) {
827 std::vector<RenderPassId> copy_requests_to_iterate( 851 std::vector<RenderPassId> passes_to_iterate(passes->begin(), passes->end());
828 copy_request_passes_.begin(), copy_request_passes_.end()); 852 while (!passes_to_iterate.empty()) {
829 while (!copy_requests_to_iterate.empty()) { 853 RenderPassId first = passes_to_iterate.back();
830 int first = copy_requests_to_iterate.back(); 854 passes_to_iterate.pop_back();
831 copy_requests_to_iterate.pop_back();
832 auto it = render_pass_dependencies_.find(first); 855 auto it = render_pass_dependencies_.find(first);
833 if (it == render_pass_dependencies_.end()) 856 if (it == render_pass_dependencies_.end())
834 continue; 857 continue;
835 for (auto pass : it->second) { 858 for (auto pass : it->second) {
836 if (copy_request_passes_.insert(pass).second) { 859 if (passes->insert(pass).second) {
837 copy_requests_to_iterate.push_back(pass); 860 passes_to_iterate.push_back(pass);
838 } 861 }
839 } 862 }
840 } 863 }
841 } 864 }
842 865
843 CompositorFrame SurfaceAggregator::Aggregate(const SurfaceId& surface_id) { 866 CompositorFrame SurfaceAggregator::Aggregate(const SurfaceId& surface_id) {
844 uma_stats_.Reset(); 867 uma_stats_.Reset();
845 868
846 Surface* surface = manager_->GetSurfaceForId(surface_id); 869 Surface* surface = manager_->GetSurfaceForId(surface_id);
847 DCHECK(surface); 870 DCHECK(surface);
848 contained_surfaces_[surface_id] = surface->frame_index(); 871 contained_surfaces_[surface_id] = surface->frame_index();
849 872
850 if (!surface->HasActiveFrame()) 873 if (!surface->HasActiveFrame())
851 return CompositorFrame(); 874 return CompositorFrame();
852 875
853 const CompositorFrame& root_surface_frame = surface->GetActiveFrame(); 876 const CompositorFrame& root_surface_frame = surface->GetActiveFrame();
854 TRACE_EVENT0("cc", "SurfaceAggregator::Aggregate"); 877 TRACE_EVENT0("cc", "SurfaceAggregator::Aggregate");
855 878
856 CompositorFrame frame; 879 CompositorFrame frame;
857 880
858 dest_pass_list_ = &frame.render_pass_list; 881 dest_pass_list_ = &frame.render_pass_list;
859 882
860 valid_surfaces_.clear(); 883 valid_surfaces_.clear();
861 PrewalkResult prewalk_result; 884 PrewalkResult prewalk_result;
862 root_damage_rect_ = PrewalkTree(surface_id, false, 0, &prewalk_result); 885 root_damage_rect_ = PrewalkTree(surface_id, false, 0, &prewalk_result);
863 PropagateCopyRequestPasses(); 886 PropagatePasses(&copy_request_passes_);
887 PropagatePasses(&cache_render_surface_passes_);
864 has_copy_requests_ = !copy_request_passes_.empty(); 888 has_copy_requests_ = !copy_request_passes_.empty();
889 has_cache_render_surfaces_ = !cache_render_surface_passes_.empty();
865 frame.metadata.may_contain_video = prewalk_result.may_contain_video; 890 frame.metadata.may_contain_video = prewalk_result.may_contain_video;
866 891
867 CopyUndrawnSurfaces(&prewalk_result); 892 CopyUndrawnSurfaces(&prewalk_result);
868 referenced_surfaces_.insert(surface_id); 893 referenced_surfaces_.insert(surface_id);
869 CopyPasses(root_surface_frame, surface); 894 CopyPasses(root_surface_frame, surface);
870 // CopyPasses may have mutated container, need to re-query to erase. 895 // CopyPasses may have mutated container, need to re-query to erase.
871 referenced_surfaces_.erase(referenced_surfaces_.find(surface_id)); 896 referenced_surfaces_.erase(referenced_surfaces_.find(surface_id));
872 AddColorConversionPass(); 897 AddColorConversionPass();
873 898
874 moved_pixel_passes_.clear(); 899 moved_pixel_passes_.clear();
875 copy_request_passes_.clear(); 900 copy_request_passes_.clear();
901 cache_render_surface_passes_.clear();
876 render_pass_dependencies_.clear(); 902 render_pass_dependencies_.clear();
877 903
878 // Remove all render pass mappings that weren't used in the current frame. 904 // Remove all render pass mappings that weren't used in the current frame.
879 for (auto it = render_pass_allocator_map_.begin(); 905 for (auto it = render_pass_allocator_map_.begin();
880 it != render_pass_allocator_map_.end();) { 906 it != render_pass_allocator_map_.end();) {
881 if (it->second.in_use) { 907 if (it->second.in_use) {
882 it->second.in_use = false; 908 it->second.in_use = false;
883 it++; 909 it++;
884 } else { 910 } else {
885 it = render_pass_allocator_map_.erase(it); 911 it = render_pass_allocator_map_.erase(it);
886 } 912 }
887 } 913 }
888 914
889 DCHECK(referenced_surfaces_.empty()); 915 DCHECK(referenced_surfaces_.empty());
890 916
891 if (dest_pass_list_->empty()) 917 if (dest_pass_list_->empty())
892 return CompositorFrame(); 918 return CompositorFrame();
893 919
894 dest_pass_list_ = NULL; 920 dest_pass_list_ = NULL;
921 passes_id_map.clear();
895 ProcessAddedAndRemovedSurfaces(); 922 ProcessAddedAndRemovedSurfaces();
896 contained_surfaces_.swap(previous_contained_surfaces_); 923 contained_surfaces_.swap(previous_contained_surfaces_);
897 contained_surfaces_.clear(); 924 contained_surfaces_.clear();
898 925
899 for (auto it : previous_contained_surfaces_) { 926 for (auto it : previous_contained_surfaces_) {
900 Surface* surface = manager_->GetSurfaceForId(it.first); 927 Surface* surface = manager_->GetSurfaceForId(it.first);
901 if (surface) 928 if (surface)
902 surface->TakeLatencyInfo(&frame.metadata.latency_info); 929 surface->TakeLatencyInfo(&frame.metadata.latency_info);
903 } 930 }
904 931
(...skipping 29 matching lines...) Expand all
934 } 961 }
935 962
936 void SurfaceAggregator::SetOutputColorSpace( 963 void SurfaceAggregator::SetOutputColorSpace(
937 const gfx::ColorSpace& blending_color_space, 964 const gfx::ColorSpace& blending_color_space,
938 const gfx::ColorSpace& output_color_space) { 965 const gfx::ColorSpace& output_color_space) {
939 blending_color_space_ = blending_color_space; 966 blending_color_space_ = blending_color_space;
940 output_color_space_ = output_color_space; 967 output_color_space_ = output_color_space;
941 } 968 }
942 969
943 } // namespace cc 970 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698