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::Size resource_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( | |
590 layer_rect.x() / static_cast<float>(resource_size.width()), | |
enne (OOO)
2013/09/03 23:18:26
Does this also need to have a device scale convers
ccameron
2013/09/04 02:36:47
YES!! I just discovered this as your email was com
| |
591 layer_rect.y() / static_cast<float>(resource_size.height())), | |
592 gfx::PointF( | |
593 (layer_rect.x() + layer_rect.width()) / | |
enne (OOO)
2013/09/03 23:18:26
style nit: layer_rect.right() and layer_rect.botto
ccameron
2013/09/04 02:36:47
Done.
| |
594 static_cast<float>(resource_size.width()), | |
595 (layer_rect.y() + layer_rect.height()) / | |
596 static_cast<float>(resource_size.height())), | |
597 screen_background_color, | |
598 vertex_opacity, | |
599 false); | |
600 quad_culler.Append(tex_quad.PassAs<DrawQuad>(), &append_quads_data); | |
601 } else { | |
602 // Skip the quad culler and just append the quads directly to avoid | |
603 // occlusion checks. | |
604 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); | |
605 quad->SetNew( | |
606 shared_quad_state, layer_rect, screen_background_color, false); | |
607 quad_culler.Append(quad.PassAs<DrawQuad>(), &append_quads_data); | |
608 } | |
581 } | 609 } |
582 } | 610 } |
583 | 611 |
584 bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { | 612 bool LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { |
585 DCHECK(frame->render_passes.empty()); | 613 DCHECK(frame->render_passes.empty()); |
586 | 614 |
587 if (!CanDraw() || !active_tree_->root_layer()) | 615 if (!CanDraw() || !active_tree_->root_layer()) |
588 return false; | 616 return false; |
589 | 617 |
590 TrackDamageForAllSurfaces(active_tree_->root_layer(), | 618 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) | 810 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); | 811 DCHECK(frame->render_passes[i]->quad_list[j]->shared_quad_state); |
784 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) | 812 DCHECK(frame->render_passes_by_id.find(frame->render_passes[i]->id) |
785 != frame->render_passes_by_id.end()); | 813 != frame->render_passes_by_id.end()); |
786 } | 814 } |
787 #endif | 815 #endif |
788 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); | 816 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); |
789 | 817 |
790 if (!active_tree_->has_transparent_background()) { | 818 if (!active_tree_->has_transparent_background()) { |
791 frame->render_passes.back()->has_transparent_background = false; | 819 frame->render_passes.back()->has_transparent_background = false; |
792 AppendQuadsToFillScreen(frame->render_passes.back(), | 820 AppendQuadsToFillScreen(ResourceIdForUIResource(overhang_ui_resource_id_), |
821 overhang_ui_resource_size_, | |
822 frame->render_passes.back(), | |
793 active_tree_->root_layer(), | 823 active_tree_->root_layer(), |
794 active_tree_->background_color(), | 824 active_tree_->background_color(), |
795 occlusion_tracker); | 825 occlusion_tracker); |
796 } | 826 } |
797 | 827 |
798 if (draw_frame) | 828 if (draw_frame) |
799 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); | 829 occlusion_tracker.overdraw_metrics()->RecordMetrics(this); |
800 else | 830 else |
801 DCHECK(!have_copy_request); | 831 DCHECK(!have_copy_request); |
802 | 832 |
(...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1785 | 1815 |
1786 void LayerTreeHostImpl::SetOverdrawBottomHeight(float overdraw_bottom_height) { | 1816 void LayerTreeHostImpl::SetOverdrawBottomHeight(float overdraw_bottom_height) { |
1787 if (overdraw_bottom_height == overdraw_bottom_height_) | 1817 if (overdraw_bottom_height == overdraw_bottom_height_) |
1788 return; | 1818 return; |
1789 overdraw_bottom_height_ = overdraw_bottom_height; | 1819 overdraw_bottom_height_ = overdraw_bottom_height; |
1790 | 1820 |
1791 UpdateMaxScrollOffset(); | 1821 UpdateMaxScrollOffset(); |
1792 SetFullRootLayerDamage(); | 1822 SetFullRootLayerDamage(); |
1793 } | 1823 } |
1794 | 1824 |
1825 void LayerTreeHostImpl::SetOverhangUIResource( | |
1826 UIResourceId overhang_ui_resource_id, | |
1827 gfx::Size overhang_ui_resource_size) { | |
1828 overhang_ui_resource_id_ = overhang_ui_resource_id; | |
1829 overhang_ui_resource_size_ = overhang_ui_resource_size; | |
1830 } | |
1831 | |
1795 void LayerTreeHostImpl::SetDeviceScaleFactor(float device_scale_factor) { | 1832 void LayerTreeHostImpl::SetDeviceScaleFactor(float device_scale_factor) { |
1796 if (device_scale_factor == device_scale_factor_) | 1833 if (device_scale_factor == device_scale_factor_) |
1797 return; | 1834 return; |
1798 device_scale_factor_ = device_scale_factor; | 1835 device_scale_factor_ = device_scale_factor; |
1799 | 1836 |
1800 if (renderer_) | 1837 if (renderer_) |
1801 renderer_->ViewportChanged(); | 1838 renderer_->ViewportChanged(); |
1802 | 1839 |
1803 UpdateMaxScrollOffset(); | 1840 UpdateMaxScrollOffset(); |
1804 SetFullRootLayerDamage(); | 1841 SetFullRootLayerDamage(); |
(...skipping 772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2577 | 2614 |
2578 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( | 2615 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( |
2579 UIResourceId uid) const { | 2616 UIResourceId uid) const { |
2580 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); | 2617 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); |
2581 if (iter != ui_resource_map_.end()) | 2618 if (iter != ui_resource_map_.end()) |
2582 return iter->second; | 2619 return iter->second; |
2583 return 0; | 2620 return 0; |
2584 } | 2621 } |
2585 | 2622 |
2586 } // namespace cc | 2623 } // namespace cc |
OLD | NEW |