Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(607)

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 683113005: Update from chromium https://crrev.com/302282 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698