| 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 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 !output_surface_->capabilities().can_force_reclaim_resources && | 701 !output_surface_->capabilities().can_force_reclaim_resources && |
| 702 !hud_wants_to_draw_) { | 702 !hud_wants_to_draw_) { |
| 703 TRACE_EVENT0("cc", | 703 TRACE_EVENT0("cc", |
| 704 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); | 704 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); |
| 705 frame->has_no_damage = true; | 705 frame->has_no_damage = true; |
| 706 DCHECK(!output_surface_->capabilities() | 706 DCHECK(!output_surface_->capabilities() |
| 707 .draw_and_swap_full_viewport_every_frame); | 707 .draw_and_swap_full_viewport_every_frame); |
| 708 return DRAW_SUCCESS; | 708 return DRAW_SUCCESS; |
| 709 } | 709 } |
| 710 | 710 |
| 711 TRACE_EVENT1("cc", | 711 TRACE_EVENT_BEGIN2( |
| 712 "LayerTreeHostImpl::CalculateRenderPasses", | 712 "cc", "LayerTreeHostImpl::CalculateRenderPasses", |
| 713 "render_surface_layer_list.size()", | 713 "render_surface_layer_list.size()", |
| 714 static_cast<uint64>(frame->render_surface_layer_list->size())); | 714 static_cast<uint64>(frame->render_surface_layer_list->size()), |
| 715 "RequiresHighResToDraw", RequiresHighResToDraw()); |
| 715 | 716 |
| 716 // Create the render passes in dependency order. | 717 // Create the render passes in dependency order. |
| 717 for (int surface_index = frame->render_surface_layer_list->size() - 1; | 718 for (int surface_index = frame->render_surface_layer_list->size() - 1; |
| 718 surface_index >= 0; | 719 surface_index >= 0; |
| 719 --surface_index) { | 720 --surface_index) { |
| 720 LayerImpl* render_surface_layer = | 721 LayerImpl* render_surface_layer = |
| 721 (*frame->render_surface_layer_list)[surface_index]; | 722 (*frame->render_surface_layer_list)[surface_index]; |
| 722 RenderSurfaceImpl* render_surface = render_surface_layer->render_surface(); | 723 RenderSurfaceImpl* render_surface = render_surface_layer->render_surface(); |
| 723 | 724 |
| 724 bool should_draw_into_render_pass = | 725 bool should_draw_into_render_pass = |
| (...skipping 22 matching lines...) Expand all Loading... |
| 747 // UpdateDrawProperties again. The value inside the Region is not actually | 748 // UpdateDrawProperties again. The value inside the Region is not actually |
| 748 // changed until UpdateDrawProperties happens, so a reference to it is safe. | 749 // changed until UpdateDrawProperties happens, so a reference to it is safe. |
| 749 const Region& unoccluded_screen_space_region = | 750 const Region& unoccluded_screen_space_region = |
| 750 active_tree_->UnoccludedScreenSpaceRegion(); | 751 active_tree_->UnoccludedScreenSpaceRegion(); |
| 751 | 752 |
| 752 // Typically when we are missing a texture and use a checkerboard quad, we | 753 // Typically when we are missing a texture and use a checkerboard quad, we |
| 753 // still draw the frame. However when the layer being checkerboarded is moving | 754 // still draw the frame. However when the layer being checkerboarded is moving |
| 754 // due to an impl-animation, we drop the frame to avoid flashing due to the | 755 // due to an impl-animation, we drop the frame to avoid flashing due to the |
| 755 // texture suddenly appearing in the future. | 756 // texture suddenly appearing in the future. |
| 756 DrawResult draw_result = DRAW_SUCCESS; | 757 DrawResult draw_result = DRAW_SUCCESS; |
| 757 // When we have a copy request for a layer, we need to draw no matter | |
| 758 // what, as the layer may disappear after this frame. | |
| 759 bool have_copy_request = false; | |
| 760 | 758 |
| 761 int layers_drawn = 0; | 759 int layers_drawn = 0; |
| 762 | 760 |
| 763 const DrawMode draw_mode = GetDrawMode(); | 761 const DrawMode draw_mode = GetDrawMode(); |
| 764 | 762 |
| 765 int num_missing_tiles = 0; | 763 int num_missing_tiles = 0; |
| 766 int num_incomplete_tiles = 0; | 764 int num_incomplete_tiles = 0; |
| 765 bool have_copy_request = false; |
| 766 bool have_missing_animated_tiles = false; |
| 767 | 767 |
| 768 auto end = LayerIterator<LayerImpl>::End(frame->render_surface_layer_list); | 768 auto end = LayerIterator<LayerImpl>::End(frame->render_surface_layer_list); |
| 769 for (auto it = | 769 for (auto it = |
| 770 LayerIterator<LayerImpl>::Begin(frame->render_surface_layer_list); | 770 LayerIterator<LayerImpl>::Begin(frame->render_surface_layer_list); |
| 771 it != end; ++it) { | 771 it != end; ++it) { |
| 772 RenderPassId target_render_pass_id = | 772 RenderPassId target_render_pass_id = |
| 773 it.target_render_surface_layer()->render_surface()->GetRenderPassId(); | 773 it.target_render_surface_layer()->render_surface()->GetRenderPassId(); |
| 774 RenderPass* target_render_pass = | 774 RenderPass* target_render_pass = |
| 775 frame->render_passes_by_id[target_render_pass_id]; | 775 frame->render_passes_by_id[target_render_pass_id]; |
| 776 | 776 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 841 append_quads_data.approximated_visible_content_area); | 841 append_quads_data.approximated_visible_content_area); |
| 842 | 842 |
| 843 num_missing_tiles += append_quads_data.num_missing_tiles; | 843 num_missing_tiles += append_quads_data.num_missing_tiles; |
| 844 num_incomplete_tiles += append_quads_data.num_incomplete_tiles; | 844 num_incomplete_tiles += append_quads_data.num_incomplete_tiles; |
| 845 | 845 |
| 846 if (append_quads_data.num_missing_tiles) { | 846 if (append_quads_data.num_missing_tiles) { |
| 847 bool layer_has_animating_transform = | 847 bool layer_has_animating_transform = |
| 848 it->screen_space_transform_is_animating() || | 848 it->screen_space_transform_is_animating() || |
| 849 it->draw_transform_is_animating(); | 849 it->draw_transform_is_animating(); |
| 850 if (layer_has_animating_transform) | 850 if (layer_has_animating_transform) |
| 851 draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; | 851 have_missing_animated_tiles = true; |
| 852 } | |
| 853 | |
| 854 if (append_quads_data.num_incomplete_tiles || | |
| 855 append_quads_data.num_missing_tiles) { | |
| 856 if (RequiresHighResToDraw()) | |
| 857 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; | |
| 858 } | 852 } |
| 859 } | 853 } |
| 860 | 854 |
| 861 if (have_copy_request || | 855 if (have_missing_animated_tiles) |
| 862 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) | 856 draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; |
| 857 |
| 858 // When we have a copy request for a layer, we need to draw even if there |
| 859 // would be animating checkerboards, because failing under those conditions |
| 860 // triggers a new main frame, which may cause the copy request layer to be |
| 861 // destroyed. |
| 862 // TODO(danakj): Leaking scheduler internals into LayerTreeHostImpl here. |
| 863 if (have_copy_request) |
| 864 draw_result = DRAW_SUCCESS; |
| 865 |
| 866 // When we require high res to draw, abort the draw (almost) always. This does |
| 867 // not cause the scheduler to do a main frame, instead it will continue to try |
| 868 // drawing until we finally complete, so the copy request will not be lost. |
| 869 if (num_incomplete_tiles || num_missing_tiles) { |
| 870 if (RequiresHighResToDraw()) |
| 871 draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT; |
| 872 } |
| 873 |
| 874 // When this capability is set we don't have control over the surface the |
| 875 // compositor draws to, so even though the frame may not be complete, the |
| 876 // previous frame has already been potentially lost, so an incomplete frame is |
| 877 // better than nothing, so this takes highest precidence. |
| 878 if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) |
| 863 draw_result = DRAW_SUCCESS; | 879 draw_result = DRAW_SUCCESS; |
| 864 | 880 |
| 865 #if DCHECK_IS_ON() | 881 #if DCHECK_IS_ON() |
| 866 for (const auto& render_pass : frame->render_passes) { | 882 for (const auto& render_pass : frame->render_passes) { |
| 867 for (const auto& quad : render_pass->quad_list) | 883 for (const auto& quad : render_pass->quad_list) |
| 868 DCHECK(quad->shared_quad_state); | 884 DCHECK(quad->shared_quad_state); |
| 869 DCHECK(frame->render_passes_by_id.find(render_pass->id) != | 885 DCHECK(frame->render_passes_by_id.find(render_pass->id) != |
| 870 frame->render_passes_by_id.end()); | 886 frame->render_passes_by_id.end()); |
| 871 } | 887 } |
| 872 #endif | 888 #endif |
| (...skipping 30 matching lines...) Expand all Loading... |
| 903 UMA_HISTOGRAM_COUNTS_100( | 919 UMA_HISTOGRAM_COUNTS_100( |
| 904 "Compositing.RenderPass.AppendQuadData.NumIncompleteTiles", | 920 "Compositing.RenderPass.AppendQuadData.NumIncompleteTiles", |
| 905 num_incomplete_tiles); | 921 num_incomplete_tiles); |
| 906 } | 922 } |
| 907 | 923 |
| 908 // Should only have one render pass in resourceless software mode. | 924 // Should only have one render pass in resourceless software mode. |
| 909 DCHECK(draw_mode != DRAW_MODE_RESOURCELESS_SOFTWARE || | 925 DCHECK(draw_mode != DRAW_MODE_RESOURCELESS_SOFTWARE || |
| 910 frame->render_passes.size() == 1u) | 926 frame->render_passes.size() == 1u) |
| 911 << frame->render_passes.size(); | 927 << frame->render_passes.size(); |
| 912 | 928 |
| 929 TRACE_EVENT_END2("cc", "LayerTreeHostImpl::CalculateRenderPasses", |
| 930 "draw_result", draw_result, "missing tiles", |
| 931 num_missing_tiles); |
| 932 |
| 913 return draw_result; | 933 return draw_result; |
| 914 } | 934 } |
| 915 | 935 |
| 916 void LayerTreeHostImpl::MainThreadHasStoppedFlinging() { | 936 void LayerTreeHostImpl::MainThreadHasStoppedFlinging() { |
| 917 top_controls_manager_->MainThreadHasStoppedFlinging(); | 937 top_controls_manager_->MainThreadHasStoppedFlinging(); |
| 918 if (input_handler_client_) | 938 if (input_handler_client_) |
| 919 input_handler_client_->MainThreadHasStoppedFlinging(); | 939 input_handler_client_->MainThreadHasStoppedFlinging(); |
| 920 } | 940 } |
| 921 | 941 |
| 922 void LayerTreeHostImpl::DidAnimateScrollOffset() { | 942 void LayerTreeHostImpl::DidAnimateScrollOffset() { |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1048 UMA_HISTOGRAM_CUSTOM_COUNTS( | 1068 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 1049 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); | 1069 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); |
| 1050 | 1070 |
| 1051 bool update_lcd_text = false; | 1071 bool update_lcd_text = false; |
| 1052 bool ok = active_tree_->UpdateDrawProperties(update_lcd_text); | 1072 bool ok = active_tree_->UpdateDrawProperties(update_lcd_text); |
| 1053 DCHECK(ok) << "UpdateDrawProperties failed during draw"; | 1073 DCHECK(ok) << "UpdateDrawProperties failed during draw"; |
| 1054 | 1074 |
| 1055 // This will cause NotifyTileStateChanged() to be called for any visible tiles | 1075 // This will cause NotifyTileStateChanged() to be called for any visible tiles |
| 1056 // that completed, which will add damage to the frame for them so they appear | 1076 // that completed, which will add damage to the frame for them so they appear |
| 1057 // as part of the current frame being drawn. | 1077 // as part of the current frame being drawn. |
| 1058 if (settings().impl_side_painting) | 1078 if (tile_manager_) |
| 1059 tile_manager_->UpdateVisibleTiles(global_tile_state_); | 1079 tile_manager_->UpdateVisibleTiles(global_tile_state_); |
| 1060 | 1080 |
| 1061 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); | 1081 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); |
| 1062 frame->render_passes.clear(); | 1082 frame->render_passes.clear(); |
| 1063 frame->render_passes_by_id.clear(); | 1083 frame->render_passes_by_id.clear(); |
| 1064 frame->will_draw_layers.clear(); | 1084 frame->will_draw_layers.clear(); |
| 1065 frame->has_no_damage = false; | 1085 frame->has_no_damage = false; |
| 1066 | 1086 |
| 1067 if (active_tree_->root_layer()) { | 1087 if (active_tree_->root_layer()) { |
| 1068 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; | 1088 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1521 // contents of its texture are updated as the last thing before the frame is | 1541 // contents of its texture are updated as the last thing before the frame is |
| 1522 // drawn. | 1542 // drawn. |
| 1523 if (active_tree_->hud_layer()) { | 1543 if (active_tree_->hud_layer()) { |
| 1524 TRACE_EVENT0("cc", "DrawLayers.UpdateHudTexture"); | 1544 TRACE_EVENT0("cc", "DrawLayers.UpdateHudTexture"); |
| 1525 active_tree_->hud_layer()->UpdateHudTexture(draw_mode, | 1545 active_tree_->hud_layer()->UpdateHudTexture(draw_mode, |
| 1526 resource_provider_.get()); | 1546 resource_provider_.get()); |
| 1527 } | 1547 } |
| 1528 | 1548 |
| 1529 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) { | 1549 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) { |
| 1530 bool disable_picture_quad_image_filtering = | 1550 bool disable_picture_quad_image_filtering = |
| 1531 IsActivelyScrolling() || needs_animate_layers(); | 1551 IsActivelyScrolling() || animation_registrar_->needs_animate_layers(); |
| 1532 | 1552 |
| 1533 scoped_ptr<SoftwareRenderer> temp_software_renderer = | 1553 scoped_ptr<SoftwareRenderer> temp_software_renderer = |
| 1534 SoftwareRenderer::Create(this, &settings_.renderer_settings, | 1554 SoftwareRenderer::Create(this, &settings_.renderer_settings, |
| 1535 output_surface_.get(), NULL); | 1555 output_surface_.get(), NULL); |
| 1536 temp_software_renderer->DrawFrame(&frame->render_passes, | 1556 temp_software_renderer->DrawFrame(&frame->render_passes, |
| 1537 device_scale_factor_, | 1557 device_scale_factor_, |
| 1538 DeviceViewport(), | 1558 DeviceViewport(), |
| 1539 DeviceClip(), | 1559 DeviceClip(), |
| 1540 disable_picture_quad_image_filtering); | 1560 disable_picture_quad_image_filtering); |
| 1541 } else { | 1561 } else { |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1649 } | 1669 } |
| 1650 } | 1670 } |
| 1651 | 1671 |
| 1652 void LayerTreeHostImpl::UpdateViewportContainerSizes() { | 1672 void LayerTreeHostImpl::UpdateViewportContainerSizes() { |
| 1653 LayerImpl* inner_container = active_tree_->InnerViewportContainerLayer(); | 1673 LayerImpl* inner_container = active_tree_->InnerViewportContainerLayer(); |
| 1654 LayerImpl* outer_container = active_tree_->OuterViewportContainerLayer(); | 1674 LayerImpl* outer_container = active_tree_->OuterViewportContainerLayer(); |
| 1655 | 1675 |
| 1656 if (!inner_container) | 1676 if (!inner_container) |
| 1657 return; | 1677 return; |
| 1658 | 1678 |
| 1679 // TODO(bokan): This code is currently specific to top controls. It should be |
| 1680 // made general. crbug.com/464814. |
| 1681 if (!TopControlsHeight()) { |
| 1682 if (outer_container) |
| 1683 outer_container->SetBoundsDelta(gfx::Vector2dF()); |
| 1684 |
| 1685 inner_container->SetBoundsDelta(gfx::Vector2dF()); |
| 1686 active_tree_->InnerViewportScrollLayer()->SetBoundsDelta(gfx::Vector2dF()); |
| 1687 |
| 1688 return; |
| 1689 } |
| 1690 |
| 1659 ViewportAnchor anchor(InnerViewportScrollLayer(), | 1691 ViewportAnchor anchor(InnerViewportScrollLayer(), |
| 1660 OuterViewportScrollLayer()); | 1692 OuterViewportScrollLayer()); |
| 1661 | 1693 |
| 1662 // Adjust the inner viewport by shrinking/expanding the container to account | 1694 // Adjust the inner viewport by shrinking/expanding the container to account |
| 1663 // for the change in top controls height since the last Resize from Blink. | 1695 // for the change in top controls height since the last Resize from Blink. |
| 1664 float top_controls_layout_height = | 1696 float top_controls_layout_height = |
| 1665 active_tree_->top_controls_shrink_blink_size() | 1697 active_tree_->top_controls_shrink_blink_size() |
| 1666 ? active_tree_->top_controls_height() | 1698 ? active_tree_->top_controls_height() |
| 1667 : 0.f; | 1699 : 0.f; |
| 1668 inner_container->SetBoundsDelta(gfx::Vector2dF( | 1700 inner_container->SetBoundsDelta(gfx::Vector2dF( |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1686 | 1718 |
| 1687 outer_container->SetBoundsDelta(delta); | 1719 outer_container->SetBoundsDelta(delta); |
| 1688 active_tree_->InnerViewportScrollLayer()->SetBoundsDelta(delta); | 1720 active_tree_->InnerViewportScrollLayer()->SetBoundsDelta(delta); |
| 1689 | 1721 |
| 1690 anchor.ResetViewportToAnchoredPosition(); | 1722 anchor.ResetViewportToAnchoredPosition(); |
| 1691 } | 1723 } |
| 1692 | 1724 |
| 1693 void LayerTreeHostImpl::SynchronouslyInitializeAllTiles() { | 1725 void LayerTreeHostImpl::SynchronouslyInitializeAllTiles() { |
| 1694 // Only valid for the single-threaded non-scheduled/synchronous case | 1726 // Only valid for the single-threaded non-scheduled/synchronous case |
| 1695 // using the zero copy raster worker pool. | 1727 // using the zero copy raster worker pool. |
| 1696 single_thread_synchronous_task_graph_runner_->RunUntilIdle(); | 1728 if (tile_manager_) |
| 1729 single_thread_synchronous_task_graph_runner_->RunUntilIdle(); |
| 1697 } | 1730 } |
| 1698 | 1731 |
| 1699 void LayerTreeHostImpl::DidLoseOutputSurface() { | 1732 void LayerTreeHostImpl::DidLoseOutputSurface() { |
| 1700 if (resource_provider_) | 1733 if (resource_provider_) |
| 1701 resource_provider_->DidLoseOutputSurface(); | 1734 resource_provider_->DidLoseOutputSurface(); |
| 1702 client_->DidLoseOutputSurfaceOnImplThread(); | 1735 client_->DidLoseOutputSurfaceOnImplThread(); |
| 1703 } | 1736 } |
| 1704 | 1737 |
| 1705 bool LayerTreeHostImpl::HaveRootScrollLayer() const { | 1738 bool LayerTreeHostImpl::HaveRootScrollLayer() const { |
| 1706 return !!InnerViewportScrollLayer(); | 1739 return !!InnerViewportScrollLayer(); |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2050 ResourcePool::Create(resource_provider_.get(), GL_TEXTURE_2D); | 2083 ResourcePool::Create(resource_provider_.get(), GL_TEXTURE_2D); |
| 2051 | 2084 |
| 2052 *tile_task_worker_pool = OneCopyTileTaskWorkerPool::Create( | 2085 *tile_task_worker_pool = OneCopyTileTaskWorkerPool::Create( |
| 2053 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), | 2086 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), |
| 2054 context_provider, resource_provider_.get(), | 2087 context_provider, resource_provider_.get(), |
| 2055 staging_resource_pool_.get()); | 2088 staging_resource_pool_.get()); |
| 2056 return; | 2089 return; |
| 2057 } | 2090 } |
| 2058 } | 2091 } |
| 2059 | 2092 |
| 2093 // Synchronous single-threaded mode depends on tiles being ready to |
| 2094 // draw when raster is complete. Therefore, it must use one of zero |
| 2095 // copy, software raster, or GPU raster (in the branches above). |
| 2096 DCHECK(!IsSynchronousSingleThreaded()); |
| 2097 |
| 2060 *resource_pool = ResourcePool::Create( | 2098 *resource_pool = ResourcePool::Create( |
| 2061 resource_provider_.get(), GL_TEXTURE_2D); | 2099 resource_provider_.get(), GL_TEXTURE_2D); |
| 2062 | 2100 |
| 2063 *tile_task_worker_pool = PixelBufferTileTaskWorkerPool::Create( | 2101 *tile_task_worker_pool = PixelBufferTileTaskWorkerPool::Create( |
| 2064 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), context_provider, | 2102 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), context_provider, |
| 2065 resource_provider_.get(), | 2103 resource_provider_.get(), |
| 2066 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), | 2104 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), |
| 2067 settings_.renderer_settings.refresh_rate)); | 2105 settings_.renderer_settings.refresh_rate)); |
| 2068 } | 2106 } |
| 2069 | 2107 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2112 proxy_->blocking_main_thread_task_runner(), | 2150 proxy_->blocking_main_thread_task_runner(), |
| 2113 settings_.renderer_settings.highp_threshold_min, | 2151 settings_.renderer_settings.highp_threshold_min, |
| 2114 settings_.renderer_settings.use_rgba_4444_textures, | 2152 settings_.renderer_settings.use_rgba_4444_textures, |
| 2115 settings_.renderer_settings.texture_id_allocation_chunk_size); | 2153 settings_.renderer_settings.texture_id_allocation_chunk_size); |
| 2116 | 2154 |
| 2117 if (output_surface_->capabilities().deferred_gl_initialization) | 2155 if (output_surface_->capabilities().deferred_gl_initialization) |
| 2118 EnforceZeroBudget(true); | 2156 EnforceZeroBudget(true); |
| 2119 | 2157 |
| 2120 CreateAndSetRenderer(); | 2158 CreateAndSetRenderer(); |
| 2121 | 2159 |
| 2122 if (settings_.impl_side_painting) | 2160 if (settings_.impl_side_painting && settings_.raster_enabled) |
| 2123 CreateAndSetTileManager(); | 2161 CreateAndSetTileManager(); |
| 2124 RecreateTreeResources(); | 2162 RecreateTreeResources(); |
| 2125 | 2163 |
| 2126 // Initialize vsync parameters to sane values. | 2164 // Initialize vsync parameters to sane values. |
| 2127 const base::TimeDelta display_refresh_interval = | 2165 const base::TimeDelta display_refresh_interval = |
| 2128 base::TimeDelta::FromMicroseconds( | 2166 base::TimeDelta::FromMicroseconds( |
| 2129 base::Time::kMicrosecondsPerSecond / | 2167 base::Time::kMicrosecondsPerSecond / |
| 2130 settings_.renderer_settings.refresh_rate); | 2168 settings_.renderer_settings.refresh_rate); |
| 2131 CommitVSyncParameters(base::TimeTicks(), display_refresh_interval); | 2169 CommitVSyncParameters(base::TimeTicks(), display_refresh_interval); |
| 2132 | 2170 |
| (...skipping 972 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3105 TRACE_EVENT0("cc", "LayerTreeHostImpl::AnimateScrollbars"); | 3143 TRACE_EVENT0("cc", "LayerTreeHostImpl::AnimateScrollbars"); |
| 3106 std::set<ScrollbarAnimationController*> controllers_copy = | 3144 std::set<ScrollbarAnimationController*> controllers_copy = |
| 3107 scrollbar_animation_controllers_; | 3145 scrollbar_animation_controllers_; |
| 3108 for (auto& it : controllers_copy) | 3146 for (auto& it : controllers_copy) |
| 3109 it->Animate(monotonic_time); | 3147 it->Animate(monotonic_time); |
| 3110 | 3148 |
| 3111 SetNeedsAnimate(); | 3149 SetNeedsAnimate(); |
| 3112 } | 3150 } |
| 3113 | 3151 |
| 3114 void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time) { | 3152 void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time) { |
| 3115 if (!settings_.accelerated_animation_enabled || | 3153 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) |
| 3116 !needs_animate_layers() || | |
| 3117 !active_tree_->root_layer()) | |
| 3118 return; | 3154 return; |
| 3119 | 3155 |
| 3120 TRACE_EVENT0("cc", "LayerTreeHostImpl::AnimateLayers"); | 3156 if (animation_registrar_->AnimateLayers(monotonic_time)) |
| 3121 AnimationRegistrar::AnimationControllerMap controllers_copy = | 3157 SetNeedsAnimate(); |
| 3122 animation_registrar_->active_animation_controllers(); | |
| 3123 for (auto& it : controllers_copy) | |
| 3124 it.second->Animate(monotonic_time); | |
| 3125 | |
| 3126 SetNeedsAnimate(); | |
| 3127 } | 3158 } |
| 3128 | 3159 |
| 3129 void LayerTreeHostImpl::UpdateAnimationState(bool start_ready_animations) { | 3160 void LayerTreeHostImpl::UpdateAnimationState(bool start_ready_animations) { |
| 3130 if (!settings_.accelerated_animation_enabled || !needs_animate_layers() || | 3161 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) |
| 3131 !active_tree_->root_layer()) | |
| 3132 return; | 3162 return; |
| 3133 | 3163 |
| 3134 TRACE_EVENT0("cc", "LayerTreeHostImpl::UpdateAnimationState"); | |
| 3135 scoped_ptr<AnimationEventsVector> events = | 3164 scoped_ptr<AnimationEventsVector> events = |
| 3136 make_scoped_ptr(new AnimationEventsVector); | 3165 animation_registrar_->CreateEvents(); |
| 3137 AnimationRegistrar::AnimationControllerMap active_controllers_copy = | 3166 const bool has_active_animations = animation_registrar_->UpdateAnimationState( |
| 3138 animation_registrar_->active_animation_controllers(); | 3167 start_ready_animations, events.get()); |
| 3139 for (auto& it : active_controllers_copy) | |
| 3140 it.second->UpdateState(start_ready_animations, events.get()); | |
| 3141 | 3168 |
| 3142 if (!events->empty()) { | 3169 if (!events->empty()) |
| 3143 client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass()); | 3170 client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass()); |
| 3144 } | |
| 3145 | 3171 |
| 3146 SetNeedsAnimate(); | 3172 if (has_active_animations) |
| 3173 SetNeedsAnimate(); |
| 3147 } | 3174 } |
| 3148 | 3175 |
| 3149 void LayerTreeHostImpl::ActivateAnimations() { | 3176 void LayerTreeHostImpl::ActivateAnimations() { |
| 3150 if (!settings_.accelerated_animation_enabled || !needs_animate_layers() || | 3177 if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer()) |
| 3151 !active_tree_->root_layer()) | |
| 3152 return; | 3178 return; |
| 3153 | 3179 |
| 3154 TRACE_EVENT0("cc", "LayerTreeHostImpl::ActivateAnimations"); | 3180 if (animation_registrar_->ActivateAnimations()) |
| 3155 AnimationRegistrar::AnimationControllerMap active_controllers_copy = | 3181 SetNeedsAnimate(); |
| 3156 animation_registrar_->active_animation_controllers(); | |
| 3157 for (auto& it : active_controllers_copy) | |
| 3158 it.second->ActivateAnimations(); | |
| 3159 | |
| 3160 SetNeedsAnimate(); | |
| 3161 } | 3182 } |
| 3162 | 3183 |
| 3163 std::string LayerTreeHostImpl::LayerTreeAsJson() const { | 3184 std::string LayerTreeHostImpl::LayerTreeAsJson() const { |
| 3164 std::string str; | 3185 std::string str; |
| 3165 if (active_tree_->root_layer()) { | 3186 if (active_tree_->root_layer()) { |
| 3166 scoped_ptr<base::Value> json(active_tree_->root_layer()->LayerTreeAsJson()); | 3187 scoped_ptr<base::Value> json(active_tree_->root_layer()->LayerTreeAsJson()); |
| 3167 base::JSONWriter::WriteWithOptions( | 3188 base::JSONWriter::WriteWithOptions( |
| 3168 json.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &str); | 3189 json.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &str); |
| 3169 } | 3190 } |
| 3170 return str; | 3191 return str; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3227 // we're not in a frame (because this is during an input event or a delayed | 3248 // we're not in a frame (because this is during an input event or a delayed |
| 3228 // task), fall back to physical time. This should still be monotonic. | 3249 // task), fall back to physical time. This should still be monotonic. |
| 3229 if (current_begin_frame_args_.IsValid()) | 3250 if (current_begin_frame_args_.IsValid()) |
| 3230 return current_begin_frame_args_; | 3251 return current_begin_frame_args_; |
| 3231 return BeginFrameArgs::Create( | 3252 return BeginFrameArgs::Create( |
| 3232 BEGINFRAME_FROM_HERE, gfx::FrameTime::Now(), base::TimeTicks(), | 3253 BEGINFRAME_FROM_HERE, gfx::FrameTime::Now(), base::TimeTicks(), |
| 3233 BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL); | 3254 BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL); |
| 3234 } | 3255 } |
| 3235 | 3256 |
| 3236 scoped_refptr<base::trace_event::ConvertableToTraceFormat> | 3257 scoped_refptr<base::trace_event::ConvertableToTraceFormat> |
| 3237 LayerTreeHostImpl::AsValue() const { | |
| 3238 return AsValueWithFrame(NULL); | |
| 3239 } | |
| 3240 | |
| 3241 scoped_refptr<base::trace_event::ConvertableToTraceFormat> | |
| 3242 LayerTreeHostImpl::AsValueWithFrame(FrameData* frame) const { | 3258 LayerTreeHostImpl::AsValueWithFrame(FrameData* frame) const { |
| 3243 scoped_refptr<base::trace_event::TracedValue> state = | 3259 scoped_refptr<base::trace_event::TracedValue> state = |
| 3244 new base::trace_event::TracedValue(); | 3260 new base::trace_event::TracedValue(); |
| 3245 AsValueWithFrameInto(frame, state.get()); | 3261 AsValueWithFrameInto(frame, state.get()); |
| 3246 return state; | 3262 return state; |
| 3247 } | 3263 } |
| 3248 | 3264 |
| 3249 void LayerTreeHostImpl::AsValueInto( | |
| 3250 base::trace_event::TracedValue* value) const { | |
| 3251 return AsValueWithFrameInto(NULL, value); | |
| 3252 } | |
| 3253 | |
| 3254 void LayerTreeHostImpl::AsValueWithFrameInto( | 3265 void LayerTreeHostImpl::AsValueWithFrameInto( |
| 3255 FrameData* frame, | 3266 FrameData* frame, |
| 3256 base::trace_event::TracedValue* state) const { | 3267 base::trace_event::TracedValue* state) const { |
| 3257 if (this->pending_tree_) { | 3268 if (this->pending_tree_) { |
| 3258 state->BeginDictionary("activation_state"); | 3269 state->BeginDictionary("activation_state"); |
| 3259 ActivationStateAsValueInto(state); | 3270 ActivationStateAsValueInto(state); |
| 3260 state->EndDictionary(); | 3271 state->EndDictionary(); |
| 3261 } | 3272 } |
| 3262 MathUtil::AddToTracedValue("device_viewport_size", device_viewport_size_, | 3273 MathUtil::AddToTracedValue("device_viewport_size", device_viewport_size_, |
| 3263 state); | 3274 state); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 3292 pending_tree_->AsValueInto(state); | 3303 pending_tree_->AsValueInto(state); |
| 3293 state->EndDictionary(); | 3304 state->EndDictionary(); |
| 3294 } | 3305 } |
| 3295 if (frame) { | 3306 if (frame) { |
| 3296 state->BeginDictionary("frame"); | 3307 state->BeginDictionary("frame"); |
| 3297 frame->AsValueInto(state); | 3308 frame->AsValueInto(state); |
| 3298 state->EndDictionary(); | 3309 state->EndDictionary(); |
| 3299 } | 3310 } |
| 3300 } | 3311 } |
| 3301 | 3312 |
| 3302 scoped_refptr<base::trace_event::ConvertableToTraceFormat> | |
| 3303 LayerTreeHostImpl::ActivationStateAsValue() const { | |
| 3304 scoped_refptr<base::trace_event::TracedValue> state = | |
| 3305 new base::trace_event::TracedValue(); | |
| 3306 ActivationStateAsValueInto(state.get()); | |
| 3307 return state; | |
| 3308 } | |
| 3309 | |
| 3310 void LayerTreeHostImpl::ActivationStateAsValueInto( | 3313 void LayerTreeHostImpl::ActivationStateAsValueInto( |
| 3311 base::trace_event::TracedValue* state) const { | 3314 base::trace_event::TracedValue* state) const { |
| 3312 TracedValue::SetIDRef(this, state, "lthi"); | 3315 TracedValue::SetIDRef(this, state, "lthi"); |
| 3313 if (tile_manager_) { | 3316 if (tile_manager_) { |
| 3314 state->BeginDictionary("tile_manager"); | 3317 state->BeginDictionary("tile_manager"); |
| 3315 tile_manager_->BasicStateAsValueInto(state); | 3318 tile_manager_->BasicStateAsValueInto(state); |
| 3316 state->EndDictionary(); | 3319 state->EndDictionary(); |
| 3317 } | 3320 } |
| 3318 } | 3321 } |
| 3319 | 3322 |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3450 (*it)->OnSetNeedsRedrawOnImpl(); | 3453 (*it)->OnSetNeedsRedrawOnImpl(); |
| 3451 } | 3454 } |
| 3452 | 3455 |
| 3453 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfForwardingToMainThread() { | 3456 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfForwardingToMainThread() { |
| 3454 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); | 3457 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); |
| 3455 for (; it != swap_promise_monitor_.end(); it++) | 3458 for (; it != swap_promise_monitor_.end(); it++) |
| 3456 (*it)->OnForwardScrollUpdateToMainThreadOnImpl(); | 3459 (*it)->OnForwardScrollUpdateToMainThreadOnImpl(); |
| 3457 } | 3460 } |
| 3458 | 3461 |
| 3459 } // namespace cc | 3462 } // namespace cc |
| OLD | NEW |