| 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 #include <map> | 9 #include <map> |
| 10 #include <set> | 10 #include <set> |
| (...skipping 1203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1214 if (output_surface_ && global_tile_state_.hard_memory_limit_in_bytes > 0) { | 1214 if (output_surface_ && global_tile_state_.hard_memory_limit_in_bytes > 0) { |
| 1215 // If |global_tile_state_.hard_memory_limit_in_bytes| is greater than 0, we | 1215 // If |global_tile_state_.hard_memory_limit_in_bytes| is greater than 0, we |
| 1216 // allow the worker context to retain allocated resources. Notify the worker | 1216 // allow the worker context to retain allocated resources. Notify the worker |
| 1217 // context. If the memory policy has become zero, we'll handle the | 1217 // context. If the memory policy has become zero, we'll handle the |
| 1218 // notification in NotifyAllTileTasksCompleted, after in-progress work | 1218 // notification in NotifyAllTileTasksCompleted, after in-progress work |
| 1219 // finishes. | 1219 // finishes. |
| 1220 output_surface_->SetWorkerContextShouldAggressivelyFreeResources( | 1220 output_surface_->SetWorkerContextShouldAggressivelyFreeResources( |
| 1221 false /* aggressively_free_resources */); | 1221 false /* aggressively_free_resources */); |
| 1222 } | 1222 } |
| 1223 | 1223 |
| 1224 // TODO(reveman): We should avoid keeping around unused resources if | |
| 1225 // possible. crbug.com/224475 | |
| 1226 // Unused limit is calculated from soft-limit, as hard-limit may | |
| 1227 // be very high and shouldn't typically be exceeded. | |
| 1228 size_t unused_memory_limit_in_bytes = static_cast<size_t>( | |
| 1229 (static_cast<int64>(global_tile_state_.soft_memory_limit_in_bytes) * | |
| 1230 settings_.max_unused_resource_memory_percentage) / | |
| 1231 100); | |
| 1232 | |
| 1233 DCHECK(resource_pool_); | 1224 DCHECK(resource_pool_); |
| 1234 resource_pool_->CheckBusyResources(); | 1225 resource_pool_->CheckBusyResources(); |
| 1235 // Soft limit is used for resource pool such that memory returns to soft | 1226 // Soft limit is used for resource pool such that memory returns to soft |
| 1236 // limit after going over. | 1227 // limit after going over. |
| 1237 resource_pool_->SetResourceUsageLimits( | 1228 resource_pool_->SetResourceUsageLimits( |
| 1238 global_tile_state_.soft_memory_limit_in_bytes, | 1229 global_tile_state_.soft_memory_limit_in_bytes, |
| 1239 unused_memory_limit_in_bytes, | |
| 1240 global_tile_state_.num_resources_limit); | 1230 global_tile_state_.num_resources_limit); |
| 1241 | 1231 |
| 1242 DidModifyTilePriorities(); | 1232 DidModifyTilePriorities(); |
| 1243 } | 1233 } |
| 1244 | 1234 |
| 1245 void LayerTreeHostImpl::DidModifyTilePriorities() { | 1235 void LayerTreeHostImpl::DidModifyTilePriorities() { |
| 1246 // Mark priorities as dirty and schedule a PrepareTiles(). | 1236 // Mark priorities as dirty and schedule a PrepareTiles(). |
| 1247 tile_priorities_dirty_ = true; | 1237 tile_priorities_dirty_ = true; |
| 1248 client_->SetNeedsPrepareTilesOnImplThread(); | 1238 client_->SetNeedsPrepareTilesOnImplThread(); |
| 1249 } | 1239 } |
| (...skipping 834 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2084 // if we're in synchronous single-threaded mode. | 2074 // if we're in synchronous single-threaded mode. |
| 2085 TaskGraphRunner* task_graph_runner = task_graph_runner_; | 2075 TaskGraphRunner* task_graph_runner = task_graph_runner_; |
| 2086 if (is_synchronous_single_threaded_) { | 2076 if (is_synchronous_single_threaded_) { |
| 2087 DCHECK(!single_thread_synchronous_task_graph_runner_); | 2077 DCHECK(!single_thread_synchronous_task_graph_runner_); |
| 2088 single_thread_synchronous_task_graph_runner_.reset(new TaskGraphRunner); | 2078 single_thread_synchronous_task_graph_runner_.reset(new TaskGraphRunner); |
| 2089 task_graph_runner = single_thread_synchronous_task_graph_runner_.get(); | 2079 task_graph_runner = single_thread_synchronous_task_graph_runner_.get(); |
| 2090 } | 2080 } |
| 2091 | 2081 |
| 2092 ContextProvider* context_provider = output_surface_->context_provider(); | 2082 ContextProvider* context_provider = output_surface_->context_provider(); |
| 2093 if (!context_provider) { | 2083 if (!context_provider) { |
| 2094 *resource_pool = | 2084 *resource_pool = ResourcePool::Create(resource_provider_.get(), |
| 2095 ResourcePool::Create(resource_provider_.get(), GL_TEXTURE_2D); | 2085 GetTaskRunner(), GL_TEXTURE_2D); |
| 2096 | 2086 |
| 2097 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( | 2087 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( |
| 2098 GetTaskRunner(), task_graph_runner, resource_provider_.get()); | 2088 GetTaskRunner(), task_graph_runner, resource_provider_.get()); |
| 2099 return; | 2089 return; |
| 2100 } | 2090 } |
| 2101 | 2091 |
| 2102 if (use_gpu_rasterization_) { | 2092 if (use_gpu_rasterization_) { |
| 2103 DCHECK(resource_provider_->output_surface()->worker_context_provider()); | 2093 DCHECK(resource_provider_->output_surface()->worker_context_provider()); |
| 2104 | 2094 |
| 2105 *resource_pool = | 2095 *resource_pool = ResourcePool::Create(resource_provider_.get(), |
| 2106 ResourcePool::Create(resource_provider_.get(), GL_TEXTURE_2D); | 2096 GetTaskRunner(), GL_TEXTURE_2D); |
| 2107 | 2097 |
| 2108 int msaa_sample_count = use_msaa_ ? RequestedMSAASampleCount() : 0; | 2098 int msaa_sample_count = use_msaa_ ? RequestedMSAASampleCount() : 0; |
| 2109 | 2099 |
| 2110 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( | 2100 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( |
| 2111 GetTaskRunner(), task_graph_runner, context_provider, | 2101 GetTaskRunner(), task_graph_runner, context_provider, |
| 2112 resource_provider_.get(), settings_.use_distance_field_text, | 2102 resource_provider_.get(), settings_.use_distance_field_text, |
| 2113 msaa_sample_count); | 2103 msaa_sample_count); |
| 2114 return; | 2104 return; |
| 2115 } | 2105 } |
| 2116 | 2106 |
| 2117 DCHECK(GetRendererCapabilities().using_image); | 2107 DCHECK(GetRendererCapabilities().using_image); |
| 2118 | 2108 |
| 2119 bool use_zero_copy = settings_.use_zero_copy; | 2109 bool use_zero_copy = settings_.use_zero_copy; |
| 2120 // TODO(reveman): Remove this when mojo supports worker contexts. | 2110 // TODO(reveman): Remove this when mojo supports worker contexts. |
| 2121 // crbug.com/522440 | 2111 // crbug.com/522440 |
| 2122 if (!resource_provider_->output_surface()->worker_context_provider()) { | 2112 if (!resource_provider_->output_surface()->worker_context_provider()) { |
| 2123 LOG(ERROR) | 2113 LOG(ERROR) |
| 2124 << "Forcing zero-copy tile initialization as worker context is missing"; | 2114 << "Forcing zero-copy tile initialization as worker context is missing"; |
| 2125 use_zero_copy = true; | 2115 use_zero_copy = true; |
| 2126 } | 2116 } |
| 2127 | 2117 |
| 2128 if (use_zero_copy) { | 2118 if (use_zero_copy) { |
| 2129 *resource_pool = ResourcePool::Create(resource_provider_.get()); | 2119 *resource_pool = |
| 2120 ResourcePool::Create(resource_provider_.get(), GetTaskRunner()); |
| 2130 | 2121 |
| 2131 *tile_task_worker_pool = ZeroCopyTileTaskWorkerPool::Create( | 2122 *tile_task_worker_pool = ZeroCopyTileTaskWorkerPool::Create( |
| 2132 GetTaskRunner(), task_graph_runner, resource_provider_.get()); | 2123 GetTaskRunner(), task_graph_runner, resource_provider_.get()); |
| 2133 return; | 2124 return; |
| 2134 } | 2125 } |
| 2135 | 2126 |
| 2136 if (settings_.use_one_copy) { | 2127 if (settings_.use_one_copy) { |
| 2137 *resource_pool = | 2128 *resource_pool = ResourcePool::Create(resource_provider_.get(), |
| 2138 ResourcePool::Create(resource_provider_.get(), GL_TEXTURE_2D); | 2129 GetTaskRunner(), GL_TEXTURE_2D); |
| 2139 | 2130 |
| 2140 int max_copy_texture_chromium_size = | 2131 int max_copy_texture_chromium_size = |
| 2141 context_provider->ContextCapabilities() | 2132 context_provider->ContextCapabilities() |
| 2142 .gpu.max_copy_texture_chromium_size; | 2133 .gpu.max_copy_texture_chromium_size; |
| 2143 | 2134 |
| 2144 *tile_task_worker_pool = OneCopyTileTaskWorkerPool::Create( | 2135 *tile_task_worker_pool = OneCopyTileTaskWorkerPool::Create( |
| 2145 GetTaskRunner(), task_graph_runner, context_provider, | 2136 GetTaskRunner(), task_graph_runner, context_provider, |
| 2146 resource_provider_.get(), max_copy_texture_chromium_size, | 2137 resource_provider_.get(), max_copy_texture_chromium_size, |
| 2147 settings_.use_persistent_map_for_gpu_memory_buffers, | 2138 settings_.use_persistent_map_for_gpu_memory_buffers, |
| 2148 settings_.max_staging_buffers); | 2139 settings_.max_staging_buffers); |
| 2149 return; | 2140 return; |
| 2150 } | 2141 } |
| 2151 | 2142 |
| 2152 // Synchronous single-threaded mode depends on tiles being ready to | 2143 // Synchronous single-threaded mode depends on tiles being ready to |
| 2153 // draw when raster is complete. Therefore, it must use one of zero | 2144 // draw when raster is complete. Therefore, it must use one of zero |
| 2154 // copy, software raster, or GPU raster (in the branches above). | 2145 // copy, software raster, or GPU raster (in the branches above). |
| 2155 DCHECK(!is_synchronous_single_threaded_); | 2146 DCHECK(!is_synchronous_single_threaded_); |
| 2156 | 2147 |
| 2157 *resource_pool = ResourcePool::Create( | 2148 *resource_pool = ResourcePool::Create(resource_provider_.get(), |
| 2158 resource_provider_.get(), GL_TEXTURE_2D); | 2149 GetTaskRunner(), GL_TEXTURE_2D); |
| 2159 | 2150 |
| 2160 *tile_task_worker_pool = PixelBufferTileTaskWorkerPool::Create( | 2151 *tile_task_worker_pool = PixelBufferTileTaskWorkerPool::Create( |
| 2161 GetTaskRunner(), task_graph_runner_, context_provider, | 2152 GetTaskRunner(), task_graph_runner_, context_provider, |
| 2162 resource_provider_.get(), | 2153 resource_provider_.get(), |
| 2163 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), | 2154 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), |
| 2164 settings_.renderer_settings.refresh_rate)); | 2155 settings_.renderer_settings.refresh_rate)); |
| 2165 } | 2156 } |
| 2166 | 2157 |
| 2167 void LayerTreeHostImpl::RecordMainFrameTiming( | 2158 void LayerTreeHostImpl::RecordMainFrameTiming( |
| 2168 const BeginFrameArgs& start_of_main_frame_args, | 2159 const BeginFrameArgs& start_of_main_frame_args, |
| (...skipping 1462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3631 if (active_tree()) { | 3622 if (active_tree()) { |
| 3632 LayerAnimationValueProvider* layer = active_tree()->LayerById(layer_id); | 3623 LayerAnimationValueProvider* layer = active_tree()->LayerById(layer_id); |
| 3633 if (layer) | 3624 if (layer) |
| 3634 return layer->ScrollOffsetForAnimation(); | 3625 return layer->ScrollOffsetForAnimation(); |
| 3635 } | 3626 } |
| 3636 | 3627 |
| 3637 return gfx::ScrollOffset(); | 3628 return gfx::ScrollOffset(); |
| 3638 } | 3629 } |
| 3639 | 3630 |
| 3640 } // namespace cc | 3631 } // namespace cc |
| OLD | NEW |