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