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 891 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
902 } | 902 } |
903 | 903 |
904 occlusion_tracker.LeaveLayer(it); | 904 occlusion_tracker.LeaveLayer(it); |
905 } | 905 } |
906 | 906 |
907 if (have_copy_request || | 907 if (have_copy_request || |
908 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) | 908 output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) |
909 draw_result = DRAW_SUCCESS; | 909 draw_result = DRAW_SUCCESS; |
910 | 910 |
911 #if DCHECK_IS_ON | 911 #if DCHECK_IS_ON |
912 for (auto* render_pass : frame->render_passes) { | 912 for (const auto& render_pass : frame->render_passes) { |
913 for (auto& quad : render_pass->quad_list) | 913 for (const auto& quad : render_pass->quad_list) |
914 DCHECK(quad.shared_quad_state); | 914 DCHECK(quad->shared_quad_state); |
915 DCHECK(frame->render_passes_by_id.find(render_pass->id) != | 915 DCHECK(frame->render_passes_by_id.find(render_pass->id) != |
916 frame->render_passes_by_id.end()); | 916 frame->render_passes_by_id.end()); |
917 } | 917 } |
918 #endif | 918 #endif |
919 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); | 919 DCHECK(frame->render_passes.back()->output_rect.origin().IsOrigin()); |
920 | 920 |
921 if (!active_tree_->has_transparent_background()) { | 921 if (!active_tree_->has_transparent_background()) { |
922 frame->render_passes.back()->has_transparent_background = false; | 922 frame->render_passes.back()->has_transparent_background = false; |
923 AppendQuadsToFillScreen( | 923 AppendQuadsToFillScreen( |
924 ResourceIdForUIResource(overhang_ui_resource_id_), | 924 ResourceIdForUIResource(overhang_ui_resource_id_), |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1022 | 1022 |
1023 DCHECK(to_remove != render_passes.end()); | 1023 DCHECK(to_remove != render_passes.end()); |
1024 | 1024 |
1025 scoped_ptr<RenderPass> removed_pass = render_passes.take(to_remove); | 1025 scoped_ptr<RenderPass> removed_pass = render_passes.take(to_remove); |
1026 frame->render_passes.erase(to_remove); | 1026 frame->render_passes.erase(to_remove); |
1027 frame->render_passes_by_id.erase(remove_render_pass_id); | 1027 frame->render_passes_by_id.erase(remove_render_pass_id); |
1028 | 1028 |
1029 // Now follow up for all RenderPass quads and remove their RenderPasses | 1029 // Now follow up for all RenderPass quads and remove their RenderPasses |
1030 // recursively. | 1030 // recursively. |
1031 const QuadList& quad_list = removed_pass->quad_list; | 1031 const QuadList& quad_list = removed_pass->quad_list; |
1032 QuadList::ConstBackToFrontIterator quad_list_iterator = | 1032 for (auto quad_list_iterator = quad_list.BackToFrontBegin(); |
1033 quad_list.BackToFrontBegin(); | 1033 quad_list_iterator != quad_list.BackToFrontEnd(); |
1034 for (; quad_list_iterator != quad_list.BackToFrontEnd(); | |
1035 ++quad_list_iterator) { | 1034 ++quad_list_iterator) { |
1036 const DrawQuad* current_quad = &*quad_list_iterator; | 1035 const DrawQuad* current_quad = *quad_list_iterator; |
1037 if (current_quad->material != DrawQuad::RENDER_PASS) | 1036 if (current_quad->material != DrawQuad::RENDER_PASS) |
1038 continue; | 1037 continue; |
1039 | 1038 |
1040 RenderPassId next_remove_render_pass_id = | 1039 RenderPassId next_remove_render_pass_id = |
1041 RenderPassDrawQuad::MaterialCast(current_quad)->render_pass_id; | 1040 RenderPassDrawQuad::MaterialCast(current_quad)->render_pass_id; |
1042 RemoveRenderPassesRecursive(next_remove_render_pass_id, frame); | 1041 RemoveRenderPassesRecursive(next_remove_render_pass_id, frame); |
1043 } | 1042 } |
1044 } | 1043 } |
1045 | 1044 |
1046 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::ShouldRemoveRenderPass( | 1045 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::ShouldRemoveRenderPass( |
1047 const RenderPassDrawQuad& quad, const FrameData& frame) const { | 1046 const RenderPassDrawQuad& quad, const FrameData& frame) const { |
1048 const RenderPass* render_pass = | 1047 const RenderPass* render_pass = |
1049 FindRenderPassById(quad.render_pass_id, frame); | 1048 FindRenderPassById(quad.render_pass_id, frame); |
1050 if (!render_pass) | 1049 if (!render_pass) |
1051 return false; | 1050 return false; |
1052 | 1051 |
1053 // If any quad or RenderPass draws into this RenderPass, then keep it. | 1052 // If any quad or RenderPass draws into this RenderPass, then keep it. |
1054 const QuadList& quad_list = render_pass->quad_list; | 1053 const QuadList& quad_list = render_pass->quad_list; |
1055 for (QuadList::ConstBackToFrontIterator quad_list_iterator = | 1054 for (auto quad_list_iterator = quad_list.BackToFrontBegin(); |
1056 quad_list.BackToFrontBegin(); | |
1057 quad_list_iterator != quad_list.BackToFrontEnd(); | 1055 quad_list_iterator != quad_list.BackToFrontEnd(); |
1058 ++quad_list_iterator) { | 1056 ++quad_list_iterator) { |
1059 const DrawQuad* current_quad = &*quad_list_iterator; | 1057 const DrawQuad* current_quad = *quad_list_iterator; |
1060 | 1058 |
1061 if (current_quad->material != DrawQuad::RENDER_PASS) | 1059 if (current_quad->material != DrawQuad::RENDER_PASS) |
1062 return false; | 1060 return false; |
1063 | 1061 |
1064 const RenderPass* contributing_pass = FindRenderPassById( | 1062 const RenderPass* contributing_pass = FindRenderPassById( |
1065 RenderPassDrawQuad::MaterialCast(current_quad)->render_pass_id, frame); | 1063 RenderPassDrawQuad::MaterialCast(current_quad)->render_pass_id, frame); |
1066 if (contributing_pass) | 1064 if (contributing_pass) |
1067 return false; | 1065 return false; |
1068 } | 1066 } |
1069 return true; | 1067 return true; |
1070 } | 1068 } |
1071 | 1069 |
1072 // Defined for linking tests. | 1070 // Defined for linking tests. |
1073 template CC_EXPORT void LayerTreeHostImpl::RemoveRenderPasses< | 1071 template CC_EXPORT void LayerTreeHostImpl::RemoveRenderPasses< |
1074 LayerTreeHostImpl::CullRenderPassesWithNoQuads>( | 1072 LayerTreeHostImpl::CullRenderPassesWithNoQuads>( |
1075 CullRenderPassesWithNoQuads culler, FrameData*); | 1073 CullRenderPassesWithNoQuads culler, FrameData*); |
1076 | 1074 |
1077 // static | 1075 // static |
1078 template <typename RenderPassCuller> | 1076 template <typename RenderPassCuller> |
1079 void LayerTreeHostImpl::RemoveRenderPasses(RenderPassCuller culler, | 1077 void LayerTreeHostImpl::RemoveRenderPasses(RenderPassCuller culler, |
1080 FrameData* frame) { | 1078 FrameData* frame) { |
1081 for (size_t it = culler.RenderPassListBegin(frame->render_passes); | 1079 for (size_t it = culler.RenderPassListBegin(frame->render_passes); |
1082 it != culler.RenderPassListEnd(frame->render_passes); | 1080 it != culler.RenderPassListEnd(frame->render_passes); |
1083 it = culler.RenderPassListNext(it)) { | 1081 it = culler.RenderPassListNext(it)) { |
1084 const RenderPass* current_pass = frame->render_passes[it]; | 1082 const RenderPass* current_pass = frame->render_passes[it]; |
1085 const QuadList& quad_list = current_pass->quad_list; | 1083 const QuadList& quad_list = current_pass->quad_list; |
1086 QuadList::ConstBackToFrontIterator quad_list_iterator = | |
1087 quad_list.BackToFrontBegin(); | |
1088 | 1084 |
1089 for (; quad_list_iterator != quad_list.BackToFrontEnd(); | 1085 for (auto quad_list_iterator = quad_list.BackToFrontBegin(); |
| 1086 quad_list_iterator != quad_list.BackToFrontEnd(); |
1090 ++quad_list_iterator) { | 1087 ++quad_list_iterator) { |
1091 const DrawQuad* current_quad = &*quad_list_iterator; | 1088 const DrawQuad* current_quad = *quad_list_iterator; |
1092 | 1089 |
1093 if (current_quad->material != DrawQuad::RENDER_PASS) | 1090 if (current_quad->material != DrawQuad::RENDER_PASS) |
1094 continue; | 1091 continue; |
1095 | 1092 |
1096 const RenderPassDrawQuad* render_pass_quad = | 1093 const RenderPassDrawQuad* render_pass_quad = |
1097 RenderPassDrawQuad::MaterialCast(current_quad); | 1094 RenderPassDrawQuad::MaterialCast(current_quad); |
1098 if (!culler.ShouldRemoveRenderPass(*render_pass_quad, *frame)) | 1095 if (!culler.ShouldRemoveRenderPass(*render_pass_quad, *frame)) |
1099 continue; | 1096 continue; |
1100 | 1097 |
1101 // We are changing the vector in the middle of iteration. Because we | 1098 // We are changing the vector in the middle of iteration. Because we |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1228 // TODO(reveman): We should avoid keeping around unused resources if | 1225 // TODO(reveman): We should avoid keeping around unused resources if |
1229 // possible. crbug.com/224475 | 1226 // possible. crbug.com/224475 |
1230 // Unused limit is calculated from soft-limit, as hard-limit may | 1227 // Unused limit is calculated from soft-limit, as hard-limit may |
1231 // be very high and shouldn't typically be exceeded. | 1228 // be very high and shouldn't typically be exceeded. |
1232 size_t unused_memory_limit_in_bytes = static_cast<size_t>( | 1229 size_t unused_memory_limit_in_bytes = static_cast<size_t>( |
1233 (static_cast<int64>(global_tile_state_.soft_memory_limit_in_bytes) * | 1230 (static_cast<int64>(global_tile_state_.soft_memory_limit_in_bytes) * |
1234 settings_.max_unused_resource_memory_percentage) / | 1231 settings_.max_unused_resource_memory_percentage) / |
1235 100); | 1232 100); |
1236 | 1233 |
1237 DCHECK(resource_pool_); | 1234 DCHECK(resource_pool_); |
1238 resource_pool_->CheckBusyResources(); | 1235 resource_pool_->CheckBusyResources(false); |
1239 // Soft limit is used for resource pool such that memory returns to soft | 1236 // Soft limit is used for resource pool such that memory returns to soft |
1240 // limit after going over. | 1237 // limit after going over. |
1241 resource_pool_->SetResourceUsageLimits( | 1238 resource_pool_->SetResourceUsageLimits( |
1242 global_tile_state_.soft_memory_limit_in_bytes, | 1239 global_tile_state_.soft_memory_limit_in_bytes, |
1243 unused_memory_limit_in_bytes, | 1240 unused_memory_limit_in_bytes, |
1244 global_tile_state_.num_resources_limit); | 1241 global_tile_state_.num_resources_limit); |
1245 | 1242 |
1246 // Release all staging resources when invisible. | 1243 // Release all staging resources when invisible. |
1247 if (staging_resource_pool_) { | 1244 if (staging_resource_pool_) { |
1248 staging_resource_pool_->CheckBusyResources(); | 1245 staging_resource_pool_->CheckBusyResources(false); |
1249 staging_resource_pool_->SetResourceUsageLimits( | 1246 staging_resource_pool_->SetResourceUsageLimits( |
1250 std::numeric_limits<size_t>::max(), | 1247 std::numeric_limits<size_t>::max(), |
1251 std::numeric_limits<size_t>::max(), | 1248 std::numeric_limits<size_t>::max(), |
1252 visible_ ? GetMaxStagingResourceCount() : 0); | 1249 visible_ ? GetMaxStagingResourceCount() : 0); |
1253 } | 1250 } |
1254 | 1251 |
1255 DidModifyTilePriorities(); | 1252 DidModifyTilePriorities(); |
1256 } | 1253 } |
1257 | 1254 |
1258 void LayerTreeHostImpl::DidModifyTilePriorities() { | 1255 void LayerTreeHostImpl::DidModifyTilePriorities() { |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1450 // TODO(piman): We may need to do some validation on this ack before | 1447 // TODO(piman): We may need to do some validation on this ack before |
1451 // processing it. | 1448 // processing it. |
1452 if (renderer_) | 1449 if (renderer_) |
1453 renderer_->ReceiveSwapBuffersAck(*ack); | 1450 renderer_->ReceiveSwapBuffersAck(*ack); |
1454 | 1451 |
1455 // In OOM, we now might be able to release more resources that were held | 1452 // In OOM, we now might be able to release more resources that were held |
1456 // because they were exported. | 1453 // because they were exported. |
1457 if (tile_manager_) { | 1454 if (tile_manager_) { |
1458 DCHECK(resource_pool_); | 1455 DCHECK(resource_pool_); |
1459 | 1456 |
1460 resource_pool_->CheckBusyResources(); | 1457 resource_pool_->CheckBusyResources(false); |
1461 resource_pool_->ReduceResourceUsage(); | 1458 resource_pool_->ReduceResourceUsage(); |
1462 } | 1459 } |
1463 // If we're not visible, we likely released resources, so we want to | 1460 // If we're not visible, we likely released resources, so we want to |
1464 // aggressively flush here to make sure those DeleteTextures make it to the | 1461 // aggressively flush here to make sure those DeleteTextures make it to the |
1465 // GPU process to free up the memory. | 1462 // GPU process to free up the memory. |
1466 if (output_surface_->context_provider() && !visible_) { | 1463 if (output_surface_->context_provider() && !visible_) { |
1467 output_surface_->context_provider()->ContextGL()->ShallowFlushCHROMIUM(); | 1464 output_surface_->context_provider()->ContextGL()->ShallowFlushCHROMIUM(); |
1468 } | 1465 } |
1469 } | 1466 } |
1470 | 1467 |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1729 | 1726 |
1730 void LayerTreeHostImpl::SetTopControlsLayoutHeight(float height) { | 1727 void LayerTreeHostImpl::SetTopControlsLayoutHeight(float height) { |
1731 if (active_tree_->top_controls_layout_height() == height) | 1728 if (active_tree_->top_controls_layout_height() == height) |
1732 return; | 1729 return; |
1733 | 1730 |
1734 active_tree_->set_top_controls_layout_height(height); | 1731 active_tree_->set_top_controls_layout_height(height); |
1735 UpdateViewportContainerSizes(); | 1732 UpdateViewportContainerSizes(); |
1736 SetFullRootLayerDamage(); | 1733 SetFullRootLayerDamage(); |
1737 } | 1734 } |
1738 | 1735 |
| 1736 void LayerTreeHostImpl::SynchronouslyInitializeAllTiles() { |
| 1737 // Only valid for the single-threaded non-scheduled/synchronous case |
| 1738 // using the zero copy raster worker pool. |
| 1739 single_thread_synchronous_task_graph_runner_->RunUntilIdle(); |
| 1740 } |
| 1741 |
1739 void LayerTreeHostImpl::DidLoseOutputSurface() { | 1742 void LayerTreeHostImpl::DidLoseOutputSurface() { |
1740 if (resource_provider_) | 1743 if (resource_provider_) |
1741 resource_provider_->DidLoseOutputSurface(); | 1744 resource_provider_->DidLoseOutputSurface(); |
1742 client_->DidLoseOutputSurfaceOnImplThread(); | 1745 client_->DidLoseOutputSurfaceOnImplThread(); |
1743 } | 1746 } |
1744 | 1747 |
1745 bool LayerTreeHostImpl::HaveRootScrollLayer() const { | 1748 bool LayerTreeHostImpl::HaveRootScrollLayer() const { |
1746 return !!InnerViewportScrollLayer(); | 1749 return !!InnerViewportScrollLayer(); |
1747 } | 1750 } |
1748 | 1751 |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1993 if (pending_tree_) | 1996 if (pending_tree_) |
1994 pending_tree_->set_needs_update_draw_properties(); | 1997 pending_tree_->set_needs_update_draw_properties(); |
1995 client_->UpdateRendererCapabilitiesOnImplThread(); | 1998 client_->UpdateRendererCapabilitiesOnImplThread(); |
1996 } | 1999 } |
1997 | 2000 |
1998 void LayerTreeHostImpl::CreateAndSetTileManager() { | 2001 void LayerTreeHostImpl::CreateAndSetTileManager() { |
1999 DCHECK(!tile_manager_); | 2002 DCHECK(!tile_manager_); |
2000 DCHECK(settings_.impl_side_painting); | 2003 DCHECK(settings_.impl_side_painting); |
2001 DCHECK(output_surface_); | 2004 DCHECK(output_surface_); |
2002 DCHECK(resource_provider_); | 2005 DCHECK(resource_provider_); |
| 2006 |
| 2007 CreateResourceAndRasterWorkerPool( |
| 2008 &raster_worker_pool_, &resource_pool_, &staging_resource_pool_); |
| 2009 DCHECK(raster_worker_pool_); |
| 2010 DCHECK(resource_pool_); |
| 2011 |
| 2012 base::SingleThreadTaskRunner* task_runner = |
| 2013 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
| 2014 : proxy_->MainThreadTaskRunner(); |
| 2015 DCHECK(task_runner); |
| 2016 size_t scheduled_raster_task_limit = |
| 2017 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() |
| 2018 : settings_.scheduled_raster_task_limit; |
| 2019 tile_manager_ = TileManager::Create(this, |
| 2020 task_runner, |
| 2021 resource_pool_.get(), |
| 2022 raster_worker_pool_->AsRasterizer(), |
| 2023 rendering_stats_instrumentation_, |
| 2024 scheduled_raster_task_limit); |
| 2025 |
| 2026 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
| 2027 need_to_update_visible_tiles_before_draw_ = false; |
| 2028 } |
| 2029 |
| 2030 void LayerTreeHostImpl::CreateResourceAndRasterWorkerPool( |
| 2031 scoped_ptr<RasterWorkerPool>* raster_worker_pool, |
| 2032 scoped_ptr<ResourcePool>* resource_pool, |
| 2033 scoped_ptr<ResourcePool>* staging_resource_pool) { |
2003 base::SingleThreadTaskRunner* task_runner = | 2034 base::SingleThreadTaskRunner* task_runner = |
2004 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() | 2035 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
2005 : proxy_->MainThreadTaskRunner(); | 2036 : proxy_->MainThreadTaskRunner(); |
2006 DCHECK(task_runner); | 2037 DCHECK(task_runner); |
2007 | 2038 |
2008 ContextProvider* context_provider = output_surface_->context_provider(); | 2039 ContextProvider* context_provider = output_surface_->context_provider(); |
| 2040 bool should_use_zero_copy_rasterizer = |
| 2041 settings_.use_zero_copy || IsSynchronousSingleThreaded(); |
| 2042 |
2009 if (!context_provider) { | 2043 if (!context_provider) { |
2010 resource_pool_ = | 2044 *resource_pool = |
2011 ResourcePool::Create(resource_provider_.get(), | 2045 ResourcePool::Create(resource_provider_.get(), |
2012 GL_TEXTURE_2D, | 2046 GL_TEXTURE_2D, |
2013 resource_provider_->best_texture_format()); | 2047 resource_provider_->best_texture_format()); |
2014 | 2048 |
2015 raster_worker_pool_ = | 2049 *raster_worker_pool = |
2016 BitmapRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(), | 2050 BitmapRasterWorkerPool::Create(task_runner, |
2017 RasterWorkerPool::GetTaskGraphRunner(), | 2051 RasterWorkerPool::GetTaskGraphRunner(), |
2018 resource_provider_.get()); | 2052 resource_provider_.get()); |
2019 } else if (use_gpu_rasterization_) { | 2053 } else if (use_gpu_rasterization_) { |
2020 resource_pool_ = | 2054 *resource_pool = |
2021 ResourcePool::Create(resource_provider_.get(), | 2055 ResourcePool::Create(resource_provider_.get(), |
2022 GL_TEXTURE_2D, | 2056 GL_TEXTURE_2D, |
2023 resource_provider_->best_texture_format()); | 2057 resource_provider_->best_texture_format()); |
2024 | 2058 |
2025 raster_worker_pool_ = | 2059 *raster_worker_pool = |
2026 GpuRasterWorkerPool::Create(task_runner, | 2060 GpuRasterWorkerPool::Create(task_runner, |
2027 context_provider, | 2061 context_provider, |
2028 resource_provider_.get(), | 2062 resource_provider_.get(), |
2029 settings_.use_distance_field_text); | 2063 settings_.use_distance_field_text); |
2030 } else if (UseZeroCopyRasterizer()) { | 2064 } else if (should_use_zero_copy_rasterizer && CanUseZeroCopyRasterizer()) { |
2031 resource_pool_ = ResourcePool::Create( | 2065 *resource_pool = ResourcePool::Create( |
2032 resource_provider_.get(), | 2066 resource_provider_.get(), |
2033 GetMapImageTextureTarget(context_provider->ContextCapabilities()), | 2067 GetMapImageTextureTarget(context_provider->ContextCapabilities()), |
2034 resource_provider_->best_texture_format()); | 2068 resource_provider_->best_texture_format()); |
2035 | 2069 |
2036 raster_worker_pool_ = | 2070 TaskGraphRunner* task_graph_runner; |
2037 ZeroCopyRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(), | 2071 if (IsSynchronousSingleThreaded()) { |
2038 RasterWorkerPool::GetTaskGraphRunner(), | 2072 DCHECK(!single_thread_synchronous_task_graph_runner_); |
2039 resource_provider_.get()); | 2073 single_thread_synchronous_task_graph_runner_.reset(new TaskGraphRunner); |
2040 } else if (UseOneCopyRasterizer()) { | 2074 task_graph_runner = single_thread_synchronous_task_graph_runner_.get(); |
| 2075 } else { |
| 2076 task_graph_runner = RasterWorkerPool::GetTaskGraphRunner(); |
| 2077 } |
| 2078 |
| 2079 *raster_worker_pool = ZeroCopyRasterWorkerPool::Create( |
| 2080 task_runner, task_graph_runner, resource_provider_.get()); |
| 2081 } else if (settings_.use_one_copy && CanUseOneCopyRasterizer()) { |
2041 // We need to create a staging resource pool when using copy rasterizer. | 2082 // We need to create a staging resource pool when using copy rasterizer. |
2042 staging_resource_pool_ = ResourcePool::Create( | 2083 *staging_resource_pool = ResourcePool::Create( |
2043 resource_provider_.get(), | 2084 resource_provider_.get(), |
2044 GetMapImageTextureTarget(context_provider->ContextCapabilities()), | 2085 GetMapImageTextureTarget(context_provider->ContextCapabilities()), |
2045 resource_provider_->best_texture_format()); | 2086 resource_provider_->best_texture_format()); |
2046 resource_pool_ = | 2087 *resource_pool = |
2047 ResourcePool::Create(resource_provider_.get(), | 2088 ResourcePool::Create(resource_provider_.get(), |
2048 GL_TEXTURE_2D, | 2089 GL_TEXTURE_2D, |
2049 resource_provider_->best_texture_format()); | 2090 resource_provider_->best_texture_format()); |
2050 | 2091 |
2051 raster_worker_pool_ = | 2092 *raster_worker_pool = |
2052 OneCopyRasterWorkerPool::Create(task_runner, | 2093 OneCopyRasterWorkerPool::Create(task_runner, |
2053 RasterWorkerPool::GetTaskGraphRunner(), | 2094 RasterWorkerPool::GetTaskGraphRunner(), |
2054 context_provider, | 2095 context_provider, |
2055 resource_provider_.get(), | 2096 resource_provider_.get(), |
2056 staging_resource_pool_.get()); | 2097 staging_resource_pool_.get()); |
2057 } else { | 2098 } else { |
2058 resource_pool_ = ResourcePool::Create( | 2099 *resource_pool = ResourcePool::Create( |
2059 resource_provider_.get(), | 2100 resource_provider_.get(), |
2060 GL_TEXTURE_2D, | 2101 GL_TEXTURE_2D, |
2061 resource_provider_->memory_efficient_texture_format()); | 2102 resource_provider_->memory_efficient_texture_format()); |
2062 | 2103 |
2063 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( | 2104 *raster_worker_pool = PixelBufferRasterWorkerPool::Create( |
2064 task_runner, | 2105 task_runner, |
2065 RasterWorkerPool::GetTaskGraphRunner(), | 2106 RasterWorkerPool::GetTaskGraphRunner(), |
2066 context_provider, | 2107 context_provider, |
2067 resource_provider_.get(), | 2108 resource_provider_.get(), |
2068 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), | 2109 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), |
2069 settings_.refresh_rate)); | 2110 settings_.refresh_rate)); |
2070 } | 2111 } |
2071 | |
2072 tile_manager_ = TileManager::Create(this, | |
2073 task_runner, | |
2074 resource_pool_.get(), | |
2075 raster_worker_pool_->AsRasterizer(), | |
2076 rendering_stats_instrumentation_, | |
2077 settings().scheduled_raster_task_limit); | |
2078 | |
2079 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); | |
2080 need_to_update_visible_tiles_before_draw_ = false; | |
2081 } | 2112 } |
2082 | 2113 |
2083 void LayerTreeHostImpl::DestroyTileManager() { | 2114 void LayerTreeHostImpl::DestroyTileManager() { |
2084 tile_manager_ = nullptr; | 2115 tile_manager_ = nullptr; |
2085 resource_pool_ = nullptr; | 2116 resource_pool_ = nullptr; |
2086 staging_resource_pool_ = nullptr; | 2117 staging_resource_pool_ = nullptr; |
2087 raster_worker_pool_ = nullptr; | 2118 raster_worker_pool_ = nullptr; |
| 2119 single_thread_synchronous_task_graph_runner_ = nullptr; |
2088 } | 2120 } |
2089 | 2121 |
2090 bool LayerTreeHostImpl::UsePendingTreeForSync() const { | 2122 bool LayerTreeHostImpl::UsePendingTreeForSync() const { |
2091 // In impl-side painting, synchronize to the pending tree so that it has | 2123 // In impl-side painting, synchronize to the pending tree so that it has |
2092 // time to raster before being displayed. | 2124 // time to raster before being displayed. |
2093 return settings_.impl_side_painting; | 2125 return settings_.impl_side_painting; |
2094 } | 2126 } |
2095 | 2127 |
2096 bool LayerTreeHostImpl::UseZeroCopyRasterizer() const { | 2128 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { |
2097 return settings_.use_zero_copy && GetRendererCapabilities().using_image; | 2129 return !proxy_->HasImplThread() && !settings_.single_thread_proxy_scheduler; |
2098 } | 2130 } |
2099 | 2131 |
2100 bool LayerTreeHostImpl::UseOneCopyRasterizer() const { | 2132 bool LayerTreeHostImpl::CanUseZeroCopyRasterizer() const { |
| 2133 return GetRendererCapabilities().using_image; |
| 2134 } |
| 2135 |
| 2136 bool LayerTreeHostImpl::CanUseOneCopyRasterizer() const { |
2101 // Sync query support is required by one-copy rasterizer. | 2137 // Sync query support is required by one-copy rasterizer. |
2102 return settings_.use_one_copy && GetRendererCapabilities().using_image && | 2138 return GetRendererCapabilities().using_image && |
2103 resource_provider_->use_sync_query(); | 2139 resource_provider_->use_sync_query(); |
2104 } | 2140 } |
2105 | 2141 |
2106 void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) { | 2142 void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) { |
2107 SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget); | 2143 SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget); |
2108 } | 2144 } |
2109 | 2145 |
2110 bool LayerTreeHostImpl::InitializeRenderer( | 2146 bool LayerTreeHostImpl::InitializeRenderer( |
2111 scoped_ptr<OutputSurface> output_surface) { | 2147 scoped_ptr<OutputSurface> output_surface) { |
2112 TRACE_EVENT0("cc", "LayerTreeHostImpl::InitializeRenderer"); | 2148 TRACE_EVENT0("cc", "LayerTreeHostImpl::InitializeRenderer"); |
(...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2990 // scales that we want when we're not inside a pinch. | 3026 // scales that we want when we're not inside a pinch. |
2991 active_tree_->set_needs_update_draw_properties(); | 3027 active_tree_->set_needs_update_draw_properties(); |
2992 SetNeedsRedraw(); | 3028 SetNeedsRedraw(); |
2993 // TODO(danakj): Don't set root damage. Just updating draw properties and | 3029 // TODO(danakj): Don't set root damage. Just updating draw properties and |
2994 // getting new tiles rastered should be enough! crbug.com/427423 | 3030 // getting new tiles rastered should be enough! crbug.com/427423 |
2995 SetFullRootLayerDamage(); | 3031 SetFullRootLayerDamage(); |
2996 } | 3032 } |
2997 | 3033 |
2998 static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info, | 3034 static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info, |
2999 LayerImpl* layer_impl) { | 3035 LayerImpl* layer_impl) { |
3000 DCHECK(layer_impl); | 3036 if (!layer_impl) |
| 3037 return; |
3001 | 3038 |
3002 gfx::Vector2d scroll_delta = | 3039 gfx::Vector2d scroll_delta = |
3003 gfx::ToFlooredVector2d(layer_impl->ScrollDelta()); | 3040 gfx::ToFlooredVector2d(layer_impl->ScrollDelta()); |
3004 if (!scroll_delta.IsZero()) { | 3041 if (!scroll_delta.IsZero()) { |
3005 LayerTreeHostCommon::ScrollUpdateInfo scroll; | 3042 LayerTreeHostCommon::ScrollUpdateInfo scroll; |
3006 scroll.layer_id = layer_impl->id(); | 3043 scroll.layer_id = layer_impl->id(); |
3007 scroll.scroll_delta = scroll_delta; | 3044 scroll.scroll_delta = scroll_delta; |
3008 scroll_info->scrolls.push_back(scroll); | 3045 scroll_info->scrolls.push_back(scroll); |
3009 layer_impl->SetSentScrollDelta(scroll_delta); | 3046 layer_impl->SetSentScrollDelta(scroll_delta); |
3010 } | 3047 } |
3011 | 3048 |
3012 for (size_t i = 0; i < layer_impl->children().size(); ++i) | 3049 for (size_t i = 0; i < layer_impl->children().size(); ++i) |
3013 CollectScrollDeltas(scroll_info, layer_impl->children()[i]); | 3050 CollectScrollDeltas(scroll_info, layer_impl->children()[i]); |
3014 } | 3051 } |
3015 | 3052 |
3016 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() { | 3053 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() { |
3017 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); | 3054 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); |
3018 | 3055 |
3019 if (active_tree_->root_layer()) { | 3056 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); |
3020 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); | 3057 scroll_info->page_scale_delta = active_tree_->page_scale_delta(); |
3021 scroll_info->page_scale_delta = active_tree_->page_scale_delta(); | 3058 active_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta); |
3022 active_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta); | 3059 scroll_info->swap_promises.swap(swap_promises_for_main_thread_scroll_update_); |
3023 scroll_info->swap_promises.swap( | 3060 scroll_info->top_controls_delta = active_tree()->top_controls_delta(); |
3024 swap_promises_for_main_thread_scroll_update_); | 3061 active_tree_->set_sent_top_controls_delta(scroll_info->top_controls_delta); |
3025 scroll_info->top_controls_delta = active_tree()->top_controls_delta(); | |
3026 active_tree_->set_sent_top_controls_delta(scroll_info->top_controls_delta); | |
3027 } | |
3028 | 3062 |
3029 return scroll_info.Pass(); | 3063 return scroll_info.Pass(); |
3030 } | 3064 } |
3031 | 3065 |
3032 void LayerTreeHostImpl::SetFullRootLayerDamage() { | 3066 void LayerTreeHostImpl::SetFullRootLayerDamage() { |
3033 SetViewportDamage(gfx::Rect(DrawViewportSize())); | 3067 SetViewportDamage(gfx::Rect(DrawViewportSize())); |
3034 } | 3068 } |
3035 | 3069 |
3036 void LayerTreeHostImpl::ScrollViewportInnerFirst(gfx::Vector2dF scroll_delta) { | 3070 void LayerTreeHostImpl::ScrollViewportInnerFirst(gfx::Vector2dF scroll_delta) { |
3037 DCHECK(InnerViewportScrollLayer()); | 3071 DCHECK(InnerViewportScrollLayer()); |
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3480 } | 3514 } |
3481 | 3515 |
3482 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { | 3516 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { |
3483 std::vector<PictureLayerImpl*>::iterator it = | 3517 std::vector<PictureLayerImpl*>::iterator it = |
3484 std::find(picture_layers_.begin(), picture_layers_.end(), layer); | 3518 std::find(picture_layers_.begin(), picture_layers_.end(), layer); |
3485 DCHECK(it != picture_layers_.end()); | 3519 DCHECK(it != picture_layers_.end()); |
3486 picture_layers_.erase(it); | 3520 picture_layers_.erase(it); |
3487 } | 3521 } |
3488 | 3522 |
3489 } // namespace cc | 3523 } // namespace cc |
OLD | NEW |