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

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 53303006: Only draw the overhang pattern on overhang areas. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | cc/trees/layer_tree_impl.h » ('j') | cc/trees/layer_tree_impl.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | cc/trees/layer_tree_impl.h » ('j') | cc/trees/layer_tree_impl.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698