Chromium Code Reviews| 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 |