OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/trees/layer_tree_host_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 if (layer->has_replica()) { | 546 if (layer->has_replica()) { |
547 is_replica = true; | 547 is_replica = true; |
548 layer->render_surface()->AppendQuads(&quad_culler, | 548 layer->render_surface()->AppendQuads(&quad_culler, |
549 append_quads_data, | 549 append_quads_data, |
550 is_replica, | 550 is_replica, |
551 contributing_render_pass->id); | 551 contributing_render_pass->id); |
552 } | 552 } |
553 } | 553 } |
554 | 554 |
555 static void AppendQuadsToFillScreen( | 555 static void AppendQuadsToFillScreen( |
556 ResourceProvider::ResourceId resource_id, | 556 ResourceProvider::ResourceId overhang_resource_id, |
557 gfx::SizeF resource_scaled_size, | 557 gfx::SizeF overhang_resource_scaled_size, |
| 558 gfx::Rect root_scroll_layer_rect, |
558 RenderPass* target_render_pass, | 559 RenderPass* target_render_pass, |
559 LayerImpl* root_layer, | 560 LayerImpl* root_layer, |
560 SkColor screen_background_color, | 561 SkColor screen_background_color, |
561 const OcclusionTrackerImpl& occlusion_tracker) { | 562 const OcclusionTrackerImpl& occlusion_tracker) { |
562 if (!root_layer || !SkColorGetA(screen_background_color)) | 563 if (!root_layer || !SkColorGetA(screen_background_color)) |
563 return; | 564 return; |
564 | 565 |
565 Region fill_region = occlusion_tracker.ComputeVisibleRegionInScreen(); | 566 Region fill_region = occlusion_tracker.ComputeVisibleRegionInScreen(); |
566 if (fill_region.IsEmpty()) | 567 if (fill_region.IsEmpty()) |
567 return; | 568 return; |
568 | 569 |
| 570 // Divide the fill region into the part to be filled with the overhang |
| 571 // resource and the part to be filled with the background color. |
| 572 Region screen_background_color_region = fill_region; |
| 573 Region overhang_region; |
| 574 if (overhang_resource_id) { |
| 575 overhang_region = fill_region; |
| 576 overhang_region.Subtract(root_scroll_layer_rect); |
| 577 screen_background_color_region.Intersect(root_scroll_layer_rect); |
| 578 } |
| 579 |
569 bool for_surface = false; | 580 bool for_surface = false; |
570 QuadCuller quad_culler(&target_render_pass->quad_list, | 581 QuadCuller quad_culler(&target_render_pass->quad_list, |
571 &target_render_pass->shared_quad_state_list, | 582 &target_render_pass->shared_quad_state_list, |
572 root_layer, | 583 root_layer, |
573 occlusion_tracker, | 584 occlusion_tracker, |
574 root_layer->ShowDebugBorders(), | 585 root_layer->ShowDebugBorders(), |
575 for_surface); | 586 for_surface); |
576 | 587 |
577 // Manually create the quad state for the gutter quads, as the root layer | 588 // Manually create the quad state for the gutter quads, as the root layer |
578 // doesn't have any bounds and so can't generate this itself. | 589 // doesn't have any bounds and so can't generate this itself. |
(...skipping 10 matching lines...) Expand all Loading... |
589 root_target_rect, | 600 root_target_rect, |
590 false, | 601 false, |
591 opacity); | 602 opacity); |
592 | 603 |
593 AppendQuadsData append_quads_data; | 604 AppendQuadsData append_quads_data; |
594 | 605 |
595 gfx::Transform transform_to_layer_space(gfx::Transform::kSkipInitialization); | 606 gfx::Transform transform_to_layer_space(gfx::Transform::kSkipInitialization); |
596 bool did_invert = root_layer->screen_space_transform().GetInverse( | 607 bool did_invert = root_layer->screen_space_transform().GetInverse( |
597 &transform_to_layer_space); | 608 &transform_to_layer_space); |
598 DCHECK(did_invert); | 609 DCHECK(did_invert); |
599 for (Region::Iterator fill_rects(fill_region); | 610 for (Region::Iterator fill_rects(screen_background_color_region); |
600 fill_rects.has_rect(); | 611 fill_rects.has_rect(); |
601 fill_rects.next()) { | 612 fill_rects.next()) { |
602 // The root layer transform is composed of translations and scales only, | 613 // The root layer transform is composed of translations and scales only, |
603 // no perspective, so mapping is sufficient (as opposed to projecting). | 614 // no perspective, so mapping is sufficient (as opposed to projecting). |
604 gfx::Rect layer_rect = | 615 gfx::Rect layer_rect = |
605 MathUtil::MapClippedRect(transform_to_layer_space, fill_rects.rect()); | 616 MathUtil::MapClippedRect(transform_to_layer_space, fill_rects.rect()); |
606 if (resource_id) { | 617 // Skip the quad culler and just append the quads directly to avoid |
607 scoped_ptr<TextureDrawQuad> tex_quad = TextureDrawQuad::Create(); | 618 // occlusion checks. |
608 const float vertex_opacity[4] = {1.f, 1.f, 1.f, 1.f}; | 619 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); |
609 tex_quad->SetNew( | 620 quad->SetNew( |
610 shared_quad_state, | 621 shared_quad_state, layer_rect, screen_background_color, false); |
611 layer_rect, | 622 quad_culler.Append(quad.PassAs<DrawQuad>(), &append_quads_data); |
612 layer_rect, | 623 } |
613 resource_id, | 624 for (Region::Iterator fill_rects(overhang_region); |
614 false, | 625 fill_rects.has_rect(); |
615 gfx::PointF(layer_rect.x() / resource_scaled_size.width(), | 626 fill_rects.next()) { |
616 layer_rect.y() / resource_scaled_size.height()), | 627 DCHECK(overhang_resource_id); |
617 gfx::PointF(layer_rect.right() / resource_scaled_size.width(), | 628 gfx::Rect layer_rect = |
618 layer_rect.bottom() / resource_scaled_size.height()), | 629 MathUtil::MapClippedRect(transform_to_layer_space, fill_rects.rect()); |
619 screen_background_color, | 630 scoped_ptr<TextureDrawQuad> tex_quad = TextureDrawQuad::Create(); |
620 vertex_opacity, | 631 const float vertex_opacity[4] = {1.f, 1.f, 1.f, 1.f}; |
621 false); | 632 tex_quad->SetNew( |
622 quad_culler.Append(tex_quad.PassAs<DrawQuad>(), &append_quads_data); | 633 shared_quad_state, |
623 } else { | 634 layer_rect, |
624 // Skip the quad culler and just append the quads directly to avoid | 635 layer_rect, |
625 // occlusion checks. | 636 overhang_resource_id, |
626 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); | 637 false, |
627 quad->SetNew( | 638 gfx::PointF(layer_rect.x() / overhang_resource_scaled_size.width(), |
628 shared_quad_state, layer_rect, screen_background_color, false); | 639 layer_rect.y() / overhang_resource_scaled_size.height()), |
629 quad_culler.Append(quad.PassAs<DrawQuad>(), &append_quads_data); | 640 gfx::PointF(layer_rect.right() / |
630 } | 641 overhang_resource_scaled_size.width(), |
| 642 layer_rect.bottom() / |
| 643 overhang_resource_scaled_size.height()), |
| 644 screen_background_color, |
| 645 vertex_opacity, |
| 646 false); |
| 647 quad_culler.Append(tex_quad.PassAs<DrawQuad>(), &append_quads_data); |
631 } | 648 } |
632 } | 649 } |
633 | 650 |
634 bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { | 651 bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { |
635 DCHECK(frame->render_passes.empty()); | 652 DCHECK(frame->render_passes.empty()); |
636 | 653 |
637 if (!CanDraw() || !active_tree_->root_layer()) | 654 if (!CanDraw() || !active_tree_->root_layer()) |
638 return false; | 655 return false; |
639 | 656 |
640 TrackDamageForAllSurfaces(active_tree_->root_layer(), | 657 TrackDamageForAllSurfaces(active_tree_->root_layer(), |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
819 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) | 836 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) |
820 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); | 837 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); |
821 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) | 838 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) |
822 != frame->render_passes_by_id.end()); | 839 != frame->render_passes_by_id.end()); |
823 } | 840 } |
824 #endif | 841 #endif |
825 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); | 842 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); |
826 | 843 |
827 if (!active_tree_->has_transparent_background()) { | 844 if (!active_tree_->has_transparent_background()) { |
828 frame->render_passes.back()->has_transparent_background = false; | 845 frame->render_passes.back()->has_transparent_background = false; |
829 AppendQuadsToFillScreen(ResourceIdForUIResource(overhang_ui_resource_id_), | 846 AppendQuadsToFillScreen( |
830 gfx::ScaleSize(overhang_ui_resource_size_, | 847 ResourceIdForUIResource(overhang_ui_resource_id_), |
831 device_scale_factor_), | 848 gfx::ScaleSize(overhang_ui_resource_size_, device_scale_factor_), |
832 frame->render_passes.back(), | 849 active_tree_->RootScrollLayerDeviceViewportBounds(), |
833 active_tree_->root_layer(), | 850 frame->render_passes.back(), |
834 active_tree_->background_color(), | 851 active_tree_->root_layer(), |
835 occlusion_tracker); | 852 active_tree_->background_color(), |
| 853 occlusion_tracker); |
836 } | 854 } |
837 | 855 |
838 if (draw_frame) | 856 if (draw_frame) |
839 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); | 857 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); |
840 else | 858 else |
841 DCHECK(!have_copy_request); | 859 DCHECK(!have_copy_request); |
842 | 860 |
843 RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); | 861 RemoveRenderPasses(CullRenderPassesWithNoQuads(), frame); |
844 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); | 862 renderer_->DecideRenderPassAllocationsForFrame(frame->render_passes); |
845 | 863 |
(...skipping 1956 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2802 std::set<UIResourceId>::iterator found_in_evicted = | 2820 std::set<UIResourceId>::iterator found_in_evicted = |
2803 evicted_ui_resources_.find(uid); | 2821 evicted_ui_resources_.find(uid); |
2804 if (found_in_evicted == evicted_ui_resources_.end()) | 2822 if (found_in_evicted == evicted_ui_resources_.end()) |
2805 return; | 2823 return; |
2806 evicted_ui_resources_.erase(found_in_evicted); | 2824 evicted_ui_resources_.erase(found_in_evicted); |
2807 if (evicted_ui_resources_.empty()) | 2825 if (evicted_ui_resources_.empty()) |
2808 client_->OnCanDrawStateChanged(CanDraw()); | 2826 client_->OnCanDrawStateChanged(CanDraw()); |
2809 } | 2827 } |
2810 | 2828 |
2811 } // namespace cc | 2829 } // namespace cc |
OLD | NEW |