| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 #include "cc/output/compositor_frame_metadata.h" | 56 #include "cc/output/compositor_frame_metadata.h" |
| 57 #include "cc/output/copy_output_request.h" | 57 #include "cc/output/copy_output_request.h" |
| 58 #include "cc/output/delegating_renderer.h" | 58 #include "cc/output/delegating_renderer.h" |
| 59 #include "cc/output/gl_renderer.h" | 59 #include "cc/output/gl_renderer.h" |
| 60 #include "cc/output/software_renderer.h" | 60 #include "cc/output/software_renderer.h" |
| 61 #include "cc/output/texture_mailbox_deleter.h" | 61 #include "cc/output/texture_mailbox_deleter.h" |
| 62 #include "cc/quads/render_pass_draw_quad.h" | 62 #include "cc/quads/render_pass_draw_quad.h" |
| 63 #include "cc/quads/shared_quad_state.h" | 63 #include "cc/quads/shared_quad_state.h" |
| 64 #include "cc/quads/solid_color_draw_quad.h" | 64 #include "cc/quads/solid_color_draw_quad.h" |
| 65 #include "cc/quads/texture_draw_quad.h" | 65 #include "cc/quads/texture_draw_quad.h" |
| 66 #include "cc/raster/bitmap_tile_task_worker_pool.h" | 66 #include "cc/raster/bitmap_raster_buffer_provider.h" |
| 67 #include "cc/raster/gpu_raster_buffer_provider.h" |
| 67 #include "cc/raster/gpu_rasterizer.h" | 68 #include "cc/raster/gpu_rasterizer.h" |
| 68 #include "cc/raster/gpu_tile_task_worker_pool.h" | 69 #include "cc/raster/one_copy_raster_buffer_provider.h" |
| 69 #include "cc/raster/one_copy_tile_task_worker_pool.h" | 70 #include "cc/raster/raster_buffer_provider.h" |
| 70 #include "cc/raster/synchronous_task_graph_runner.h" | 71 #include "cc/raster/synchronous_task_graph_runner.h" |
| 71 #include "cc/raster/tile_task_worker_pool.h" | 72 #include "cc/raster/zero_copy_raster_buffer_provider.h" |
| 72 #include "cc/raster/zero_copy_tile_task_worker_pool.h" | |
| 73 #include "cc/resources/memory_history.h" | 73 #include "cc/resources/memory_history.h" |
| 74 #include "cc/resources/resource_pool.h" | 74 #include "cc/resources/resource_pool.h" |
| 75 #include "cc/resources/ui_resource_bitmap.h" | 75 #include "cc/resources/ui_resource_bitmap.h" |
| 76 #include "cc/scheduler/delay_based_time_source.h" | 76 #include "cc/scheduler/delay_based_time_source.h" |
| 77 #include "cc/tiles/eviction_tile_priority_queue.h" | 77 #include "cc/tiles/eviction_tile_priority_queue.h" |
| 78 #include "cc/tiles/gpu_image_decode_controller.h" | 78 #include "cc/tiles/gpu_image_decode_controller.h" |
| 79 #include "cc/tiles/picture_layer_tiling.h" | 79 #include "cc/tiles/picture_layer_tiling.h" |
| 80 #include "cc/tiles/raster_tile_priority_queue.h" | 80 #include "cc/tiles/raster_tile_priority_queue.h" |
| 81 #include "cc/tiles/software_image_decode_controller.h" | 81 #include "cc/tiles/software_image_decode_controller.h" |
| 82 #include "cc/tiles/tile_task_manager.h" |
| 82 #include "cc/trees/damage_tracker.h" | 83 #include "cc/trees/damage_tracker.h" |
| 83 #include "cc/trees/draw_property_utils.h" | 84 #include "cc/trees/draw_property_utils.h" |
| 84 #include "cc/trees/latency_info_swap_promise_monitor.h" | 85 #include "cc/trees/latency_info_swap_promise_monitor.h" |
| 85 #include "cc/trees/layer_tree_host.h" | 86 #include "cc/trees/layer_tree_host.h" |
| 86 #include "cc/trees/layer_tree_host_common.h" | 87 #include "cc/trees/layer_tree_host_common.h" |
| 87 #include "cc/trees/layer_tree_impl.h" | 88 #include "cc/trees/layer_tree_impl.h" |
| 88 #include "cc/trees/single_thread_proxy.h" | 89 #include "cc/trees/single_thread_proxy.h" |
| 89 #include "cc/trees/tree_synchronizer.h" | 90 #include "cc/trees/tree_synchronizer.h" |
| 90 #include "gpu/GLES2/gl2extchromium.h" | 91 #include "gpu/GLES2/gl2extchromium.h" |
| 91 #include "gpu/command_buffer/client/gles2_interface.h" | 92 #include "gpu/command_buffer/client/gles2_interface.h" |
| (...skipping 2052 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2144 // See note in LayerTreeImpl::UpdateDrawProperties. Renderer needs to be | 2145 // See note in LayerTreeImpl::UpdateDrawProperties. Renderer needs to be |
| 2145 // initialized to get max texture size. Also, after releasing resources, | 2146 // initialized to get max texture size. Also, after releasing resources, |
| 2146 // trees need another update to generate new ones. | 2147 // trees need another update to generate new ones. |
| 2147 active_tree_->set_needs_update_draw_properties(); | 2148 active_tree_->set_needs_update_draw_properties(); |
| 2148 if (pending_tree_) | 2149 if (pending_tree_) |
| 2149 pending_tree_->set_needs_update_draw_properties(); | 2150 pending_tree_->set_needs_update_draw_properties(); |
| 2150 client_->UpdateRendererCapabilitiesOnImplThread(); | 2151 client_->UpdateRendererCapabilitiesOnImplThread(); |
| 2151 } | 2152 } |
| 2152 | 2153 |
| 2153 void LayerTreeHostImpl::CreateTileManagerResources() { | 2154 void LayerTreeHostImpl::CreateTileManagerResources() { |
| 2154 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_); | 2155 std::unique_ptr<RasterBufferProvider> raster_buffer_provider; |
| 2156 CreateResourceAndRasterBufferProvider(&raster_buffer_provider, |
| 2157 &resource_pool_); |
| 2155 | 2158 |
| 2156 if (use_gpu_rasterization_) { | 2159 if (use_gpu_rasterization_) { |
| 2157 image_decode_controller_ = base::WrapUnique(new GpuImageDecodeController( | 2160 image_decode_controller_ = base::WrapUnique(new GpuImageDecodeController( |
| 2158 output_surface_->worker_context_provider(), | 2161 output_surface_->worker_context_provider(), |
| 2159 settings_.renderer_settings.preferred_tile_format)); | 2162 settings_.renderer_settings.preferred_tile_format)); |
| 2160 } else { | 2163 } else { |
| 2161 image_decode_controller_ = | 2164 image_decode_controller_ = |
| 2162 base::WrapUnique(new SoftwareImageDecodeController( | 2165 base::WrapUnique(new SoftwareImageDecodeController( |
| 2163 settings_.renderer_settings.preferred_tile_format)); | 2166 settings_.renderer_settings.preferred_tile_format)); |
| 2164 } | 2167 } |
| 2165 | 2168 |
| 2166 // TODO(vmpstr): Initialize tile task limit at ctor time. | |
| 2167 tile_manager_->SetResources( | |
| 2168 resource_pool_.get(), tile_task_worker_pool_.get(), | |
| 2169 image_decode_controller_.get(), | |
| 2170 is_synchronous_single_threaded_ ? std::numeric_limits<size_t>::max() | |
| 2171 : settings_.scheduled_raster_task_limit, | |
| 2172 use_gpu_rasterization_); | |
| 2173 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); | |
| 2174 } | |
| 2175 | |
| 2176 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( | |
| 2177 std::unique_ptr<TileTaskWorkerPool>* tile_task_worker_pool, | |
| 2178 std::unique_ptr<ResourcePool>* resource_pool) { | |
| 2179 DCHECK(GetTaskRunner()); | |
| 2180 // TODO(vmpstr): Make this a DCHECK (or remove) when crbug.com/419086 is | |
| 2181 // resolved. | |
| 2182 CHECK(resource_provider_); | |
| 2183 | |
| 2184 // Pass the single-threaded synchronous task graph runner to the worker pool | 2169 // Pass the single-threaded synchronous task graph runner to the worker pool |
| 2185 // if we're in synchronous single-threaded mode. | 2170 // if we're in synchronous single-threaded mode. |
| 2186 TaskGraphRunner* task_graph_runner = task_graph_runner_; | 2171 TaskGraphRunner* task_graph_runner = task_graph_runner_; |
| 2187 if (is_synchronous_single_threaded_) { | 2172 if (is_synchronous_single_threaded_) { |
| 2188 DCHECK(!single_thread_synchronous_task_graph_runner_); | 2173 DCHECK(!single_thread_synchronous_task_graph_runner_); |
| 2189 single_thread_synchronous_task_graph_runner_.reset( | 2174 single_thread_synchronous_task_graph_runner_.reset( |
| 2190 new SynchronousTaskGraphRunner); | 2175 new SynchronousTaskGraphRunner); |
| 2191 task_graph_runner = single_thread_synchronous_task_graph_runner_.get(); | 2176 task_graph_runner = single_thread_synchronous_task_graph_runner_.get(); |
| 2192 } | 2177 } |
| 2193 | 2178 |
| 2179 tile_task_manager_ = TileTaskManagerImpl::Create( |
| 2180 std::move(raster_buffer_provider), task_graph_runner); |
| 2181 |
| 2182 // TODO(vmpstr): Initialize tile task limit at ctor time. |
| 2183 tile_manager_->SetResources( |
| 2184 resource_pool_.get(), image_decode_controller_.get(), |
| 2185 tile_task_manager_.get(), |
| 2186 is_synchronous_single_threaded_ ? std::numeric_limits<size_t>::max() |
| 2187 : settings_.scheduled_raster_task_limit, |
| 2188 use_gpu_rasterization_); |
| 2189 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
| 2190 } |
| 2191 |
| 2192 void LayerTreeHostImpl::CreateResourceAndRasterBufferProvider( |
| 2193 std::unique_ptr<RasterBufferProvider>* raster_buffer_provider, |
| 2194 std::unique_ptr<ResourcePool>* resource_pool) { |
| 2195 DCHECK(GetTaskRunner()); |
| 2196 // TODO(vmpstr): Make this a DCHECK (or remove) when crbug.com/419086 is |
| 2197 // resolved. |
| 2198 CHECK(resource_provider_); |
| 2199 |
| 2194 ContextProvider* context_provider = output_surface_->context_provider(); | 2200 ContextProvider* context_provider = output_surface_->context_provider(); |
| 2195 if (!context_provider) { | 2201 if (!context_provider) { |
| 2196 *resource_pool = | 2202 *resource_pool = |
| 2197 ResourcePool::Create(resource_provider_.get(), GetTaskRunner()); | 2203 ResourcePool::Create(resource_provider_.get(), GetTaskRunner()); |
| 2198 | 2204 |
| 2199 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( | 2205 *raster_buffer_provider = |
| 2200 GetTaskRunner(), task_graph_runner, resource_provider_.get()); | 2206 BitmapRasterBufferProvider::Create(resource_provider_.get()); |
| 2201 return; | 2207 return; |
| 2202 } | 2208 } |
| 2203 | 2209 |
| 2204 if (use_gpu_rasterization_) { | 2210 if (use_gpu_rasterization_) { |
| 2205 DCHECK(resource_provider_->output_surface()->worker_context_provider()); | 2211 DCHECK(resource_provider_->output_surface()->worker_context_provider()); |
| 2206 | 2212 |
| 2207 *resource_pool = | 2213 *resource_pool = |
| 2208 ResourcePool::Create(resource_provider_.get(), GetTaskRunner()); | 2214 ResourcePool::Create(resource_provider_.get(), GetTaskRunner()); |
| 2209 | 2215 |
| 2210 int msaa_sample_count = use_msaa_ ? RequestedMSAASampleCount() : 0; | 2216 int msaa_sample_count = use_msaa_ ? RequestedMSAASampleCount() : 0; |
| 2211 | 2217 |
| 2212 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( | 2218 *raster_buffer_provider = GpuRasterBufferProvider::Create( |
| 2213 GetTaskRunner(), task_graph_runner, context_provider, | 2219 context_provider, resource_provider_.get(), |
| 2214 resource_provider_.get(), settings_.use_distance_field_text, | 2220 settings_.use_distance_field_text, msaa_sample_count); |
| 2215 msaa_sample_count); | |
| 2216 return; | 2221 return; |
| 2217 } | 2222 } |
| 2218 | 2223 |
| 2219 DCHECK(GetRendererCapabilities().using_image); | 2224 DCHECK(GetRendererCapabilities().using_image); |
| 2220 | 2225 |
| 2221 bool use_zero_copy = settings_.use_zero_copy; | 2226 bool use_zero_copy = settings_.use_zero_copy; |
| 2222 // TODO(reveman): Remove this when mojo supports worker contexts. | 2227 // TODO(reveman): Remove this when mojo supports worker contexts. |
| 2223 // crbug.com/522440 | 2228 // crbug.com/522440 |
| 2224 if (!resource_provider_->output_surface()->worker_context_provider()) { | 2229 if (!resource_provider_->output_surface()->worker_context_provider()) { |
| 2225 LOG(ERROR) | 2230 LOG(ERROR) |
| 2226 << "Forcing zero-copy tile initialization as worker context is missing"; | 2231 << "Forcing zero-copy tile initialization as worker context is missing"; |
| 2227 use_zero_copy = true; | 2232 use_zero_copy = true; |
| 2228 } | 2233 } |
| 2229 | 2234 |
| 2230 if (use_zero_copy) { | 2235 if (use_zero_copy) { |
| 2231 *resource_pool = ResourcePool::CreateForGpuMemoryBufferResources( | 2236 *resource_pool = ResourcePool::CreateForGpuMemoryBufferResources( |
| 2232 resource_provider_.get(), GetTaskRunner()); | 2237 resource_provider_.get(), GetTaskRunner()); |
| 2233 | 2238 |
| 2234 *tile_task_worker_pool = ZeroCopyTileTaskWorkerPool::Create( | 2239 *raster_buffer_provider = ZeroCopyRasterBufferProvider::Create( |
| 2235 GetTaskRunner(), task_graph_runner, resource_provider_.get(), | 2240 resource_provider_.get(), |
| 2236 settings_.renderer_settings.preferred_tile_format); | 2241 settings_.renderer_settings.preferred_tile_format); |
| 2237 return; | 2242 return; |
| 2238 } | 2243 } |
| 2239 | 2244 |
| 2240 *resource_pool = | 2245 *resource_pool = |
| 2241 ResourcePool::Create(resource_provider_.get(), GetTaskRunner()); | 2246 ResourcePool::Create(resource_provider_.get(), GetTaskRunner()); |
| 2242 | 2247 |
| 2243 int max_copy_texture_chromium_size = context_provider->ContextCapabilities() | 2248 int max_copy_texture_chromium_size = context_provider->ContextCapabilities() |
| 2244 .gpu.max_copy_texture_chromium_size; | 2249 .gpu.max_copy_texture_chromium_size; |
| 2245 | 2250 |
| 2246 *tile_task_worker_pool = OneCopyTileTaskWorkerPool::Create( | 2251 *raster_buffer_provider = OneCopyRasterBufferProvider::Create( |
| 2247 GetTaskRunner(), task_graph_runner, context_provider, | 2252 GetTaskRunner(), context_provider, resource_provider_.get(), |
| 2248 resource_provider_.get(), max_copy_texture_chromium_size, | 2253 max_copy_texture_chromium_size, settings_.use_partial_raster, |
| 2249 settings_.use_partial_raster, settings_.max_staging_buffer_usage_in_bytes, | 2254 settings_.max_staging_buffer_usage_in_bytes, |
| 2250 settings_.renderer_settings.preferred_tile_format); | 2255 settings_.renderer_settings.preferred_tile_format); |
| 2251 } | 2256 } |
| 2252 | 2257 |
| 2253 void LayerTreeHostImpl::RecordMainFrameTiming( | 2258 void LayerTreeHostImpl::RecordMainFrameTiming( |
| 2254 const BeginFrameArgs& start_of_main_frame_args, | 2259 const BeginFrameArgs& start_of_main_frame_args, |
| 2255 const BeginFrameArgs& expected_next_main_frame_args) { | 2260 const BeginFrameArgs& expected_next_main_frame_args) { |
| 2256 std::vector<int64_t> request_ids; | 2261 std::vector<int64_t> request_ids; |
| 2257 active_tree_->GatherFrameTimingRequestIds(&request_ids); | 2262 active_tree_->GatherFrameTimingRequestIds(&request_ids); |
| 2258 if (request_ids.empty()) | 2263 if (request_ids.empty()) |
| 2259 return; | 2264 return; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2274 void LayerTreeHostImpl::SetLayerTreeMutator(LayerTreeMutator* mutator) { | 2279 void LayerTreeHostImpl::SetLayerTreeMutator(LayerTreeMutator* mutator) { |
| 2275 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), | 2280 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), |
| 2276 "LayerTreeHostImpl::SetLayerTreeMutator"); | 2281 "LayerTreeHostImpl::SetLayerTreeMutator"); |
| 2277 mutator_ = mutator; | 2282 mutator_ = mutator; |
| 2278 } | 2283 } |
| 2279 | 2284 |
| 2280 void LayerTreeHostImpl::CleanUpTileManagerAndUIResources() { | 2285 void LayerTreeHostImpl::CleanUpTileManagerAndUIResources() { |
| 2281 ClearUIResources(); | 2286 ClearUIResources(); |
| 2282 tile_manager_->FinishTasksAndCleanUp(); | 2287 tile_manager_->FinishTasksAndCleanUp(); |
| 2283 resource_pool_ = nullptr; | 2288 resource_pool_ = nullptr; |
| 2284 tile_task_worker_pool_ = nullptr; | 2289 tile_task_manager_ = nullptr; |
| 2285 single_thread_synchronous_task_graph_runner_ = nullptr; | 2290 single_thread_synchronous_task_graph_runner_ = nullptr; |
| 2286 image_decode_controller_ = nullptr; | 2291 image_decode_controller_ = nullptr; |
| 2287 } | 2292 } |
| 2288 | 2293 |
| 2289 void LayerTreeHostImpl::ReleaseOutputSurface() { | 2294 void LayerTreeHostImpl::ReleaseOutputSurface() { |
| 2290 TRACE_EVENT0("cc", "LayerTreeHostImpl::ReleaseOutputSurface"); | 2295 TRACE_EVENT0("cc", "LayerTreeHostImpl::ReleaseOutputSurface"); |
| 2291 | 2296 |
| 2292 // Since we will create a new resource provider, we cannot continue to use | 2297 // Since we will create a new resource provider, we cannot continue to use |
| 2293 // the old resources (i.e. render_surfaces and texture IDs). Clear them | 2298 // the old resources (i.e. render_surfaces and texture IDs). Clear them |
| 2294 // before we destroy the old resource provider. | 2299 // before we destroy the old resource provider. |
| (...skipping 1685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3980 return task_runner_provider_->HasImplThread(); | 3985 return task_runner_provider_->HasImplThread(); |
| 3981 } | 3986 } |
| 3982 | 3987 |
| 3983 bool LayerTreeHostImpl::CommitToActiveTree() const { | 3988 bool LayerTreeHostImpl::CommitToActiveTree() const { |
| 3984 // In single threaded mode we skip the pending tree and commit directly to the | 3989 // In single threaded mode we skip the pending tree and commit directly to the |
| 3985 // active tree. | 3990 // active tree. |
| 3986 return !task_runner_provider_->HasImplThread(); | 3991 return !task_runner_provider_->HasImplThread(); |
| 3987 } | 3992 } |
| 3988 | 3993 |
| 3989 } // namespace cc | 3994 } // namespace cc |
| OLD | NEW |