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