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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 #include "cc/output/software_renderer.h" | 51 #include "cc/output/software_renderer.h" |
52 #include "cc/output/texture_mailbox_deleter.h" | 52 #include "cc/output/texture_mailbox_deleter.h" |
53 #include "cc/quads/render_pass_draw_quad.h" | 53 #include "cc/quads/render_pass_draw_quad.h" |
54 #include "cc/quads/shared_quad_state.h" | 54 #include "cc/quads/shared_quad_state.h" |
55 #include "cc/quads/solid_color_draw_quad.h" | 55 #include "cc/quads/solid_color_draw_quad.h" |
56 #include "cc/quads/texture_draw_quad.h" | 56 #include "cc/quads/texture_draw_quad.h" |
57 #include "cc/raster/bitmap_tile_task_worker_pool.h" | 57 #include "cc/raster/bitmap_tile_task_worker_pool.h" |
58 #include "cc/raster/gpu_rasterizer.h" | 58 #include "cc/raster/gpu_rasterizer.h" |
59 #include "cc/raster/gpu_tile_task_worker_pool.h" | 59 #include "cc/raster/gpu_tile_task_worker_pool.h" |
60 #include "cc/raster/one_copy_tile_task_worker_pool.h" | 60 #include "cc/raster/one_copy_tile_task_worker_pool.h" |
61 #include "cc/raster/pixel_buffer_tile_task_worker_pool.h" | |
62 #include "cc/raster/tile_task_worker_pool.h" | 61 #include "cc/raster/tile_task_worker_pool.h" |
63 #include "cc/raster/zero_copy_tile_task_worker_pool.h" | 62 #include "cc/raster/zero_copy_tile_task_worker_pool.h" |
64 #include "cc/resources/memory_history.h" | 63 #include "cc/resources/memory_history.h" |
65 #include "cc/resources/resource_pool.h" | 64 #include "cc/resources/resource_pool.h" |
66 #include "cc/resources/ui_resource_bitmap.h" | 65 #include "cc/resources/ui_resource_bitmap.h" |
67 #include "cc/scheduler/delay_based_time_source.h" | 66 #include "cc/scheduler/delay_based_time_source.h" |
68 #include "cc/tiles/eviction_tile_priority_queue.h" | 67 #include "cc/tiles/eviction_tile_priority_queue.h" |
69 #include "cc/tiles/picture_layer_tiling.h" | 68 #include "cc/tiles/picture_layer_tiling.h" |
70 #include "cc/tiles/raster_tile_priority_queue.h" | 69 #include "cc/tiles/raster_tile_priority_queue.h" |
71 #include "cc/trees/damage_tracker.h" | 70 #include "cc/trees/damage_tracker.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 void DidVisibilityChange(LayerTreeHostImpl* id, bool visible) { | 122 void DidVisibilityChange(LayerTreeHostImpl* id, bool visible) { |
124 if (visible) { | 123 if (visible) { |
125 TRACE_EVENT_ASYNC_BEGIN1("cc", "LayerTreeHostImpl::SetVisible", id, | 124 TRACE_EVENT_ASYNC_BEGIN1("cc", "LayerTreeHostImpl::SetVisible", id, |
126 "LayerTreeHostImpl", id); | 125 "LayerTreeHostImpl", id); |
127 return; | 126 return; |
128 } | 127 } |
129 | 128 |
130 TRACE_EVENT_ASYNC_END0("cc", "LayerTreeHostImpl::SetVisible", id); | 129 TRACE_EVENT_ASYNC_END0("cc", "LayerTreeHostImpl::SetVisible", id); |
131 } | 130 } |
132 | 131 |
133 size_t GetMaxTransferBufferUsageBytes( | |
134 const ContextProvider::Capabilities& context_capabilities, | |
135 double refresh_rate) { | |
136 // We want to make sure the default transfer buffer size is equal to the | |
137 // amount of data that can be uploaded by the compositor to avoid stalling | |
138 // the pipeline. | |
139 // For reference Chromebook Pixel can upload 1MB in about 0.5ms. | |
140 const size_t kMaxBytesUploadedPerMs = 1024 * 1024 * 2; | |
141 | |
142 // We need to upload at least enough work to keep the GPU process busy until | |
143 // the next time it can handle a request to start more uploads from the | |
144 // compositor. We assume that it will pick up any sent upload requests within | |
145 // the time of a vsync, since the browser will want to swap a frame within | |
146 // that time interval, and then uploads should have a chance to be processed. | |
147 size_t ms_per_frame = std::floor(1000.0 / refresh_rate); | |
148 size_t max_transfer_buffer_usage_bytes = | |
149 ms_per_frame * kMaxBytesUploadedPerMs; | |
150 | |
151 // The context may request a lower limit based on the device capabilities. | |
152 return std::min(context_capabilities.max_transfer_buffer_usage_bytes, | |
153 max_transfer_buffer_usage_bytes); | |
154 } | |
155 | |
156 size_t GetDefaultMemoryAllocationLimit() { | 132 size_t GetDefaultMemoryAllocationLimit() { |
157 // TODO(ccameron): (http://crbug.com/137094) This 64MB default is a straggler | 133 // TODO(ccameron): (http://crbug.com/137094) This 64MB default is a straggler |
158 // from the old texture manager and is just to give us a default memory | 134 // from the old texture manager and is just to give us a default memory |
159 // allocation before we get a callback from the GPU memory manager. We | 135 // allocation before we get a callback from the GPU memory manager. We |
160 // should probaby either: | 136 // should probaby either: |
161 // - wait for the callback before rendering anything instead | 137 // - wait for the callback before rendering anything instead |
162 // - push this into the GPU memory manager somehow. | 138 // - push this into the GPU memory manager somehow. |
163 return 64 * 1024 * 1024; | 139 return 64 * 1024 * 1024; |
164 } | 140 } |
165 | 141 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 animation_host_->SetSupportsScrollAnimations( | 228 animation_host_->SetSupportsScrollAnimations( |
253 proxy_->SupportsImplScrolling()); | 229 proxy_->SupportsImplScrolling()); |
254 } | 230 } |
255 } else { | 231 } else { |
256 animation_registrar_ = AnimationRegistrar::Create(); | 232 animation_registrar_ = AnimationRegistrar::Create(); |
257 animation_registrar_->set_supports_scroll_animations( | 233 animation_registrar_->set_supports_scroll_animations( |
258 proxy_->SupportsImplScrolling()); | 234 proxy_->SupportsImplScrolling()); |
259 } | 235 } |
260 | 236 |
261 DCHECK(proxy_->IsImplThread()); | 237 DCHECK(proxy_->IsImplThread()); |
262 DCHECK_IMPLIES(settings.use_one_copy, !settings.use_zero_copy); | |
263 DCHECK_IMPLIES(settings.use_zero_copy, !settings.use_one_copy); | |
264 DidVisibilityChange(this, visible_); | 238 DidVisibilityChange(this, visible_); |
265 | 239 |
266 SetDebugState(settings.initial_debug_state); | 240 SetDebugState(settings.initial_debug_state); |
267 | 241 |
268 // LTHI always has an active tree. | 242 // LTHI always has an active tree. |
269 active_tree_ = | 243 active_tree_ = |
270 LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(), | 244 LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(), |
271 new SyncedTopControls, new SyncedElasticOverscroll); | 245 new SyncedTopControls, new SyncedElasticOverscroll); |
272 | 246 |
273 viewport_ = Viewport::Create(this); | 247 viewport_ = Viewport::Create(this); |
(...skipping 1853 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2127 | 2101 |
2128 if (use_zero_copy) { | 2102 if (use_zero_copy) { |
2129 *resource_pool = | 2103 *resource_pool = |
2130 ResourcePool::Create(resource_provider_.get(), GetTaskRunner()); | 2104 ResourcePool::Create(resource_provider_.get(), GetTaskRunner()); |
2131 | 2105 |
2132 *tile_task_worker_pool = ZeroCopyTileTaskWorkerPool::Create( | 2106 *tile_task_worker_pool = ZeroCopyTileTaskWorkerPool::Create( |
2133 GetTaskRunner(), task_graph_runner, resource_provider_.get()); | 2107 GetTaskRunner(), task_graph_runner, resource_provider_.get()); |
2134 return; | 2108 return; |
2135 } | 2109 } |
2136 | 2110 |
2137 if (settings_.use_one_copy) { | |
2138 *resource_pool = ResourcePool::Create(resource_provider_.get(), | |
2139 GetTaskRunner(), GL_TEXTURE_2D); | |
2140 | |
2141 int max_copy_texture_chromium_size = | |
2142 context_provider->ContextCapabilities() | |
2143 .gpu.max_copy_texture_chromium_size; | |
2144 | |
2145 *tile_task_worker_pool = OneCopyTileTaskWorkerPool::Create( | |
2146 GetTaskRunner(), task_graph_runner, context_provider, | |
2147 resource_provider_.get(), max_copy_texture_chromium_size, | |
2148 settings_.use_persistent_map_for_gpu_memory_buffers, | |
2149 settings_.max_staging_buffers); | |
2150 return; | |
2151 } | |
2152 | |
2153 // Synchronous single-threaded mode depends on tiles being ready to | |
2154 // draw when raster is complete. Therefore, it must use one of zero | |
2155 // copy, software raster, or GPU raster (in the branches above). | |
2156 DCHECK(!is_synchronous_single_threaded_); | |
2157 | |
2158 *resource_pool = ResourcePool::Create(resource_provider_.get(), | 2111 *resource_pool = ResourcePool::Create(resource_provider_.get(), |
2159 GetTaskRunner(), GL_TEXTURE_2D); | 2112 GetTaskRunner(), GL_TEXTURE_2D); |
2160 | 2113 |
2161 *tile_task_worker_pool = PixelBufferTileTaskWorkerPool::Create( | 2114 int max_copy_texture_chromium_size = context_provider->ContextCapabilities() |
2162 GetTaskRunner(), task_graph_runner_, context_provider, | 2115 .gpu.max_copy_texture_chromium_size; |
2163 resource_provider_.get(), | 2116 |
2164 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), | 2117 *tile_task_worker_pool = OneCopyTileTaskWorkerPool::Create( |
2165 settings_.renderer_settings.refresh_rate)); | 2118 GetTaskRunner(), task_graph_runner, context_provider, |
| 2119 resource_provider_.get(), max_copy_texture_chromium_size, |
| 2120 settings_.use_persistent_map_for_gpu_memory_buffers, |
| 2121 settings_.max_staging_buffers); |
2166 } | 2122 } |
2167 | 2123 |
2168 void LayerTreeHostImpl::RecordMainFrameTiming( | 2124 void LayerTreeHostImpl::RecordMainFrameTiming( |
2169 const BeginFrameArgs& start_of_main_frame_args, | 2125 const BeginFrameArgs& start_of_main_frame_args, |
2170 const BeginFrameArgs& expected_next_main_frame_args) { | 2126 const BeginFrameArgs& expected_next_main_frame_args) { |
2171 std::vector<int64_t> request_ids; | 2127 std::vector<int64_t> request_ids; |
2172 active_tree_->GatherFrameTimingRequestIds(&request_ids); | 2128 active_tree_->GatherFrameTimingRequestIds(&request_ids); |
2173 if (request_ids.empty()) | 2129 if (request_ids.empty()) |
2174 return; | 2130 return; |
2175 | 2131 |
(...skipping 1466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3642 if (active_tree()) { | 3598 if (active_tree()) { |
3643 LayerAnimationValueProvider* layer = active_tree()->LayerById(layer_id); | 3599 LayerAnimationValueProvider* layer = active_tree()->LayerById(layer_id); |
3644 if (layer) | 3600 if (layer) |
3645 return layer->ScrollOffsetForAnimation(); | 3601 return layer->ScrollOffsetForAnimation(); |
3646 } | 3602 } |
3647 | 3603 |
3648 return gfx::ScrollOffset(); | 3604 return gfx::ScrollOffset(); |
3649 } | 3605 } |
3650 | 3606 |
3651 } // namespace cc | 3607 } // namespace cc |
OLD | NEW |