| 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 |