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 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
(...skipping 20 matching lines...) Expand all Loading... |
31 #include "cc/layers/painted_scrollbar_layer_impl.h" | 31 #include "cc/layers/painted_scrollbar_layer_impl.h" |
32 #include "cc/layers/render_surface_impl.h" | 32 #include "cc/layers/render_surface_impl.h" |
33 #include "cc/output/compositor_frame_metadata.h" | 33 #include "cc/output/compositor_frame_metadata.h" |
34 #include "cc/output/copy_output_request.h" | 34 #include "cc/output/copy_output_request.h" |
35 #include "cc/output/delegating_renderer.h" | 35 #include "cc/output/delegating_renderer.h" |
36 #include "cc/output/gl_renderer.h" | 36 #include "cc/output/gl_renderer.h" |
37 #include "cc/output/software_renderer.h" | 37 #include "cc/output/software_renderer.h" |
38 #include "cc/quads/render_pass_draw_quad.h" | 38 #include "cc/quads/render_pass_draw_quad.h" |
39 #include "cc/quads/shared_quad_state.h" | 39 #include "cc/quads/shared_quad_state.h" |
40 #include "cc/quads/solid_color_draw_quad.h" | 40 #include "cc/quads/solid_color_draw_quad.h" |
| 41 #include "cc/quads/texture_draw_quad.h" |
41 #include "cc/resources/memory_history.h" | 42 #include "cc/resources/memory_history.h" |
42 #include "cc/resources/picture_layer_tiling.h" | 43 #include "cc/resources/picture_layer_tiling.h" |
43 #include "cc/resources/prioritized_resource_manager.h" | 44 #include "cc/resources/prioritized_resource_manager.h" |
44 #include "cc/resources/ui_resource_bitmap.h" | 45 #include "cc/resources/ui_resource_bitmap.h" |
45 #include "cc/scheduler/delay_based_time_source.h" | 46 #include "cc/scheduler/delay_based_time_source.h" |
46 #include "cc/scheduler/texture_uploader.h" | 47 #include "cc/scheduler/texture_uploader.h" |
47 #include "cc/trees/damage_tracker.h" | 48 #include "cc/trees/damage_tracker.h" |
48 #include "cc/trees/layer_tree_host.h" | 49 #include "cc/trees/layer_tree_host.h" |
49 #include "cc/trees/layer_tree_host_common.h" | 50 #include "cc/trees/layer_tree_host_common.h" |
50 #include "cc/trees/layer_tree_impl.h" | 51 #include "cc/trees/layer_tree_impl.h" |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 fps_counter_(FrameRateCounter::Create(proxy_->HasImplThread())), | 188 fps_counter_(FrameRateCounter::Create(proxy_->HasImplThread())), |
188 paint_time_counter_(PaintTimeCounter::Create()), | 189 paint_time_counter_(PaintTimeCounter::Create()), |
189 memory_history_(MemoryHistory::Create()), | 190 memory_history_(MemoryHistory::Create()), |
190 debug_rect_history_(DebugRectHistory::Create()), | 191 debug_rect_history_(DebugRectHistory::Create()), |
191 max_memory_needed_bytes_(0), | 192 max_memory_needed_bytes_(0), |
192 last_sent_memory_visible_bytes_(0), | 193 last_sent_memory_visible_bytes_(0), |
193 last_sent_memory_visible_and_nearby_bytes_(0), | 194 last_sent_memory_visible_and_nearby_bytes_(0), |
194 last_sent_memory_use_bytes_(0), | 195 last_sent_memory_use_bytes_(0), |
195 zero_budget_(false), | 196 zero_budget_(false), |
196 device_scale_factor_(1.f), | 197 device_scale_factor_(1.f), |
| 198 overhang_ui_resource_id_(0), |
197 overdraw_bottom_height_(0.f), | 199 overdraw_bottom_height_(0.f), |
198 external_stencil_test_enabled_(false), | 200 external_stencil_test_enabled_(false), |
199 animation_registrar_(AnimationRegistrar::Create()), | 201 animation_registrar_(AnimationRegistrar::Create()), |
200 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 202 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
201 need_to_update_visible_tiles_before_draw_(false) { | 203 need_to_update_visible_tiles_before_draw_(false) { |
202 DCHECK(proxy_->IsImplThread()); | 204 DCHECK(proxy_->IsImplThread()); |
203 DidVisibilityChange(this, visible_); | 205 DidVisibilityChange(this, visible_); |
204 | 206 |
205 SetDebugState(settings.initial_debug_state); | 207 SetDebugState(settings.initial_debug_state); |
206 | 208 |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 if (layer->has_replica()) { | 520 if (layer->has_replica()) { |
519 is_replica = true; | 521 is_replica = true; |
520 layer->render_surface()->AppendQuads(&quad_culler, | 522 layer->render_surface()->AppendQuads(&quad_culler, |
521 append_quads_data, | 523 append_quads_data, |
522 is_replica, | 524 is_replica, |
523 contributing_render_pass->id); | 525 contributing_render_pass->id); |
524 } | 526 } |
525 } | 527 } |
526 | 528 |
527 static void AppendQuadsToFillScreen( | 529 static void AppendQuadsToFillScreen( |
| 530 ResourceProvider::ResourceId resource_id, |
| 531 gfx::SizeF resource_scaled_size, |
528 RenderPass* target_render_pass, | 532 RenderPass* target_render_pass, |
529 LayerImpl* root_layer, | 533 LayerImpl* root_layer, |
530 SkColor screen_background_color, | 534 SkColor screen_background_color, |
531 const OcclusionTrackerImpl& occlusion_tracker) { | 535 const OcclusionTrackerImpl& occlusion_tracker) { |
532 if (!root_layer || !SkColorGetA(screen_background_color)) | 536 if (!root_layer || !SkColorGetA(screen_background_color)) |
533 return; | 537 return; |
534 | 538 |
535 Region fill_region = occlusion_tracker.ComputeVisibleRegionInScreen(); | 539 Region fill_region = occlusion_tracker.ComputeVisibleRegionInScreen(); |
536 if (fill_region.IsEmpty()) | 540 if (fill_region.IsEmpty()) |
537 return; | 541 return; |
(...skipping 28 matching lines...) Expand all Loading... |
566 bool did_invert = root_layer->screen_space_transform().GetInverse( | 570 bool did_invert = root_layer->screen_space_transform().GetInverse( |
567 &transform_to_layer_space); | 571 &transform_to_layer_space); |
568 DCHECK(did_invert); | 572 DCHECK(did_invert); |
569 for (Region::Iterator fill_rects(fill_region); | 573 for (Region::Iterator fill_rects(fill_region); |
570 fill_rects.has_rect(); | 574 fill_rects.has_rect(); |
571 fill_rects.next()) { | 575 fill_rects.next()) { |
572 // The root layer transform is composed of translations and scales only, | 576 // The root layer transform is composed of translations and scales only, |
573 // no perspective, so mapping is sufficient (as opposed to projecting). | 577 // no perspective, so mapping is sufficient (as opposed to projecting). |
574 gfx::Rect layer_rect = | 578 gfx::Rect layer_rect = |
575 MathUtil::MapClippedRect(transform_to_layer_space, fill_rects.rect()); | 579 MathUtil::MapClippedRect(transform_to_layer_space, fill_rects.rect()); |
576 // Skip the quad culler and just append the quads directly to avoid | 580 if (resource_id) { |
577 // occlusion checks. | 581 scoped_ptr<TextureDrawQuad> tex_quad = TextureDrawQuad::Create(); |
578 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); | 582 const float vertex_opacity[4] = {1.f, 1.f, 1.f, 1.f}; |
579 quad->SetNew(shared_quad_state, layer_rect, screen_background_color, false); | 583 tex_quad->SetNew( |
580 quad_culler.Append(quad.PassAs<DrawQuad>(), &append_quads_data); | 584 shared_quad_state, |
| 585 layer_rect, |
| 586 layer_rect, |
| 587 resource_id, |
| 588 false, |
| 589 gfx::PointF(layer_rect.x() / resource_scaled_size.width(), |
| 590 layer_rect.y() / resource_scaled_size.height()), |
| 591 gfx::PointF(layer_rect.right() / resource_scaled_size.width(), |
| 592 layer_rect.bottom() / resource_scaled_size.height()), |
| 593 screen_background_color, |
| 594 vertex_opacity, |
| 595 false); |
| 596 quad_culler.Append(tex_quad.PassAs<DrawQuad>(), &append_quads_data); |
| 597 } else { |
| 598 // Skip the quad culler and just append the quads directly to avoid |
| 599 // occlusion checks. |
| 600 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); |
| 601 quad->SetNew( |
| 602 shared_quad_state, layer_rect, screen_background_color, false); |
| 603 quad_culler.Append(quad.PassAs<DrawQuad>(), &append_quads_data); |
| 604 } |
581 } | 605 } |
582 } | 606 } |
583 | 607 |
584 bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { | 608 bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { |
585 DCHECK(frame->render_passes.empty()); | 609 DCHECK(frame->render_passes.empty()); |
586 | 610 |
587 if (!CanDraw() || !active_tree_->root_layer()) | 611 if (!CanDraw() || !active_tree_->root_layer()) |
588 return false; | 612 return false; |
589 | 613 |
590 TrackDamageForAllSurfaces(active_tree_->root_layer(), | 614 TrackDamageForAllSurfaces(active_tree_->root_layer(), |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
782 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) | 806 for (size_t j = 0; j < frame->render_passes[i]->quad_list.size(); ++j) |
783 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); | 807 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); |
784 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) | 808 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) |
785 != frame->render_passes_by_id.end()); | 809 != frame->render_passes_by_id.end()); |
786 } | 810 } |
787 #endif | 811 #endif |
788 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); | 812 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); |
789 | 813 |
790 if (!active_tree_->has_transparent_background()) { | 814 if (!active_tree_->has_transparent_background()) { |
791 frame->render_passes.back()->has_transparent_background = false; | 815 frame->render_passes.back()->has_transparent_background = false; |
792 AppendQuadsToFillScreen(frame->render_passes.back(), | 816 AppendQuadsToFillScreen(ResourceIdForUIResource(overhang_ui_resource_id_), |
| 817 gfx::ScaleSize(overhang_ui_resource_size_, |
| 818 device_scale_factor_), |
| 819 frame->render_passes.back(), |
793 active_tree_->root_layer(), | 820 active_tree_->root_layer(), |
794 active_tree_->background_color(), | 821 active_tree_->background_color(), |
795 occlusion_tracker); | 822 occlusion_tracker); |
796 } | 823 } |
797 | 824 |
798 if (draw_frame) | 825 if (draw_frame) |
799 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); | 826 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); |
800 else | 827 else |
801 DCHECK(!have_copy_request); | 828 DCHECK(!have_copy_request); |
802 | 829 |
(...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1785 | 1812 |
1786 void LayerTreeHostImpl::SetOverdrawBottomHeight(float overdraw_bottom_height) { | 1813 void LayerTreeHostImpl::SetOverdrawBottomHeight(float overdraw_bottom_height) { |
1787 if (overdraw_bottom_height == overdraw_bottom_height_) | 1814 if (overdraw_bottom_height == overdraw_bottom_height_) |
1788 return; | 1815 return; |
1789 overdraw_bottom_height_ = overdraw_bottom_height; | 1816 overdraw_bottom_height_ = overdraw_bottom_height; |
1790 | 1817 |
1791 UpdateMaxScrollOffset(); | 1818 UpdateMaxScrollOffset(); |
1792 SetFullRootLayerDamage(); | 1819 SetFullRootLayerDamage(); |
1793 } | 1820 } |
1794 | 1821 |
| 1822 void LayerTreeHostImpl::SetOverhangUIResource( |
| 1823 UIResourceId overhang_ui_resource_id, |
| 1824 gfx::Size overhang_ui_resource_size) { |
| 1825 overhang_ui_resource_id_ = overhang_ui_resource_id; |
| 1826 overhang_ui_resource_size_ = overhang_ui_resource_size; |
| 1827 } |
| 1828 |
1795 void LayerTreeHostImpl::SetDeviceScaleFactor(float device_scale_factor) { | 1829 void LayerTreeHostImpl::SetDeviceScaleFactor(float device_scale_factor) { |
1796 if (device_scale_factor == device_scale_factor_) | 1830 if (device_scale_factor == device_scale_factor_) |
1797 return; | 1831 return; |
1798 device_scale_factor_ = device_scale_factor; | 1832 device_scale_factor_ = device_scale_factor; |
1799 | 1833 |
1800 if (renderer_) | 1834 if (renderer_) |
1801 renderer_->ViewportChanged(); | 1835 renderer_->ViewportChanged(); |
1802 | 1836 |
1803 UpdateMaxScrollOffset(); | 1837 UpdateMaxScrollOffset(); |
1804 SetFullRootLayerDamage(); | 1838 SetFullRootLayerDamage(); |
(...skipping 772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2577 | 2611 |
2578 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( | 2612 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( |
2579 UIResourceId uid) const { | 2613 UIResourceId uid) const { |
2580 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); | 2614 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); |
2581 if (iter != ui_resource_map_.end()) | 2615 if (iter != ui_resource_map_.end()) |
2582 return iter->second; | 2616 return iter->second; |
2583 return 0; | 2617 return 0; |
2584 } | 2618 } |
2585 | 2619 |
2586 } // namespace cc | 2620 } // namespace cc |
OLD | NEW |