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 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 LayerTreeHostImplClient* client, | 165 LayerTreeHostImplClient* client, |
166 Proxy* proxy, | 166 Proxy* proxy, |
167 RenderingStatsInstrumentation* rendering_stats_instrumentation, | 167 RenderingStatsInstrumentation* rendering_stats_instrumentation, |
168 SharedBitmapManager* shared_bitmap_manager, | 168 SharedBitmapManager* shared_bitmap_manager, |
169 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 169 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
170 TaskGraphRunner* task_graph_runner, | 170 TaskGraphRunner* task_graph_runner, |
171 int id) | 171 int id) |
172 : client_(client), | 172 : client_(client), |
173 proxy_(proxy), | 173 proxy_(proxy), |
174 current_begin_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), | 174 current_begin_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), |
| 175 output_surface_(nullptr), |
175 content_is_suitable_for_gpu_rasterization_(true), | 176 content_is_suitable_for_gpu_rasterization_(true), |
176 has_gpu_rasterization_trigger_(false), | 177 has_gpu_rasterization_trigger_(false), |
177 use_gpu_rasterization_(false), | 178 use_gpu_rasterization_(false), |
178 use_msaa_(false), | 179 use_msaa_(false), |
179 gpu_rasterization_status_(GpuRasterizationStatus::OFF_DEVICE), | 180 gpu_rasterization_status_(GpuRasterizationStatus::OFF_DEVICE), |
180 tree_resources_for_gpu_rasterization_dirty_(false), | 181 tree_resources_for_gpu_rasterization_dirty_(false), |
181 input_handler_client_(NULL), | 182 input_handler_client_(NULL), |
182 did_lock_scrolling_layer_(false), | 183 did_lock_scrolling_layer_(false), |
183 should_bubble_scrolls_(false), | 184 should_bubble_scrolls_(false), |
184 wheel_scrolling_(false), | 185 wheel_scrolling_(false), |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 recycle_tree_ = nullptr; | 278 recycle_tree_ = nullptr; |
278 pending_tree_ = nullptr; | 279 pending_tree_ = nullptr; |
279 active_tree_ = nullptr; | 280 active_tree_ = nullptr; |
280 | 281 |
281 if (animation_host_) { | 282 if (animation_host_) { |
282 animation_host_->ClearTimelines(); | 283 animation_host_->ClearTimelines(); |
283 animation_host_->SetMutatorHostClient(nullptr); | 284 animation_host_->SetMutatorHostClient(nullptr); |
284 } | 285 } |
285 | 286 |
286 CleanUpTileManager(); | 287 CleanUpTileManager(); |
| 288 renderer_ = nullptr; |
| 289 resource_provider_ = nullptr; |
| 290 |
| 291 if (output_surface_) { |
| 292 output_surface_->DetachFromClient(); |
| 293 output_surface_ = nullptr; |
| 294 } |
287 } | 295 } |
288 | 296 |
289 void LayerTreeHostImpl::BeginMainFrameAborted(CommitEarlyOutReason reason) { | 297 void LayerTreeHostImpl::BeginMainFrameAborted(CommitEarlyOutReason reason) { |
290 // If the begin frame data was handled, then scroll and scale set was applied | 298 // If the begin frame data was handled, then scroll and scale set was applied |
291 // by the main thread, so the active tree needs to be updated as if these sent | 299 // by the main thread, so the active tree needs to be updated as if these sent |
292 // values were applied and committed. | 300 // values were applied and committed. |
293 if (CommitEarlyOutHandledCommit(reason)) | 301 if (CommitEarlyOutHandledCommit(reason)) |
294 active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit(); | 302 active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit(); |
295 } | 303 } |
296 | 304 |
(...skipping 1261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1558 } | 1566 } |
1559 | 1567 |
1560 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) { | 1568 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) { |
1561 bool disable_picture_quad_image_filtering = | 1569 bool disable_picture_quad_image_filtering = |
1562 IsActivelyScrolling() || | 1570 IsActivelyScrolling() || |
1563 (animation_host_ ? animation_host_->NeedsAnimateLayers() | 1571 (animation_host_ ? animation_host_->NeedsAnimateLayers() |
1564 : animation_registrar_->needs_animate_layers()); | 1572 : animation_registrar_->needs_animate_layers()); |
1565 | 1573 |
1566 scoped_ptr<SoftwareRenderer> temp_software_renderer = | 1574 scoped_ptr<SoftwareRenderer> temp_software_renderer = |
1567 SoftwareRenderer::Create(this, &settings_.renderer_settings, | 1575 SoftwareRenderer::Create(this, &settings_.renderer_settings, |
1568 output_surface_.get(), NULL); | 1576 output_surface_, NULL); |
1569 temp_software_renderer->DrawFrame(&frame->render_passes, | 1577 temp_software_renderer->DrawFrame(&frame->render_passes, |
1570 device_scale_factor_, | 1578 device_scale_factor_, |
1571 DeviceViewport(), | 1579 DeviceViewport(), |
1572 DeviceClip(), | 1580 DeviceClip(), |
1573 disable_picture_quad_image_filtering); | 1581 disable_picture_quad_image_filtering); |
1574 } else { | 1582 } else { |
1575 renderer_->DrawFrame(&frame->render_passes, | 1583 renderer_->DrawFrame(&frame->render_passes, |
1576 device_scale_factor_, | 1584 device_scale_factor_, |
1577 DeviceViewport(), | 1585 DeviceViewport(), |
1578 DeviceClip(), | 1586 DeviceClip(), |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1620 return settings_.gpu_rasterization_msaa_sample_count; | 1628 return settings_.gpu_rasterization_msaa_sample_count; |
1621 } | 1629 } |
1622 | 1630 |
1623 bool LayerTreeHostImpl::CanUseGpuRasterization() { | 1631 bool LayerTreeHostImpl::CanUseGpuRasterization() { |
1624 if (!(output_surface_ && output_surface_->context_provider() && | 1632 if (!(output_surface_ && output_surface_->context_provider() && |
1625 output_surface_->worker_context_provider())) | 1633 output_surface_->worker_context_provider())) |
1626 return false; | 1634 return false; |
1627 | 1635 |
1628 ContextProvider* context_provider = | 1636 ContextProvider* context_provider = |
1629 output_surface_->worker_context_provider(); | 1637 output_surface_->worker_context_provider(); |
1630 base::AutoLock context_lock(*context_provider->GetLock()); | 1638 ContextProvider::ScopedContextLock scoped_context(context_provider); |
1631 if (!context_provider->GrContext()) | 1639 if (!context_provider->GrContext()) |
1632 return false; | 1640 return false; |
1633 | 1641 |
1634 return true; | 1642 return true; |
1635 } | 1643 } |
1636 | 1644 |
1637 void LayerTreeHostImpl::UpdateGpuRasterizationStatus() { | 1645 void LayerTreeHostImpl::UpdateGpuRasterizationStatus() { |
1638 bool use_gpu = false; | 1646 bool use_gpu = false; |
1639 bool use_msaa = false; | 1647 bool use_msaa = false; |
1640 bool using_msaa_for_complex_content = | 1648 bool using_msaa_for_complex_content = |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2003 if (recycle_tree_) | 2011 if (recycle_tree_) |
2004 recycle_tree_->RecreateResources(); | 2012 recycle_tree_->RecreateResources(); |
2005 } | 2013 } |
2006 | 2014 |
2007 void LayerTreeHostImpl::CreateAndSetRenderer() { | 2015 void LayerTreeHostImpl::CreateAndSetRenderer() { |
2008 DCHECK(!renderer_); | 2016 DCHECK(!renderer_); |
2009 DCHECK(output_surface_); | 2017 DCHECK(output_surface_); |
2010 DCHECK(resource_provider_); | 2018 DCHECK(resource_provider_); |
2011 | 2019 |
2012 if (output_surface_->capabilities().delegated_rendering) { | 2020 if (output_surface_->capabilities().delegated_rendering) { |
2013 renderer_ = DelegatingRenderer::Create(this, &settings_.renderer_settings, | 2021 renderer_ = |
2014 output_surface_.get(), | 2022 DelegatingRenderer::Create(this, &settings_.renderer_settings, |
2015 resource_provider_.get()); | 2023 output_surface_, resource_provider_.get()); |
2016 } else if (output_surface_->context_provider()) { | 2024 } else if (output_surface_->context_provider()) { |
2017 renderer_ = GLRenderer::Create( | 2025 renderer_ = GLRenderer::Create( |
2018 this, &settings_.renderer_settings, output_surface_.get(), | 2026 this, &settings_.renderer_settings, output_surface_, |
2019 resource_provider_.get(), texture_mailbox_deleter_.get(), | 2027 resource_provider_.get(), texture_mailbox_deleter_.get(), |
2020 settings_.renderer_settings.highp_threshold_min); | 2028 settings_.renderer_settings.highp_threshold_min); |
2021 } else if (output_surface_->software_device()) { | 2029 } else if (output_surface_->software_device()) { |
2022 renderer_ = SoftwareRenderer::Create(this, &settings_.renderer_settings, | 2030 renderer_ = |
2023 output_surface_.get(), | 2031 SoftwareRenderer::Create(this, &settings_.renderer_settings, |
2024 resource_provider_.get()); | 2032 output_surface_, resource_provider_.get()); |
2025 } | 2033 } |
2026 DCHECK(renderer_); | 2034 DCHECK(renderer_); |
2027 | 2035 |
2028 renderer_->SetVisible(visible_); | 2036 renderer_->SetVisible(visible_); |
2029 SetFullRootLayerDamage(); | 2037 SetFullRootLayerDamage(); |
2030 | 2038 |
2031 // See note in LayerTreeImpl::UpdateDrawProperties. Renderer needs to be | 2039 // See note in LayerTreeImpl::UpdateDrawProperties. Renderer needs to be |
2032 // initialized to get max texture size. Also, after releasing resources, | 2040 // initialized to get max texture size. Also, after releasing resources, |
2033 // trees need another update to generate new ones. | 2041 // trees need another update to generate new ones. |
2034 active_tree_->set_needs_update_draw_properties(); | 2042 active_tree_->set_needs_update_draw_properties(); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2143 main_frame_events.Pass()); | 2151 main_frame_events.Pass()); |
2144 } | 2152 } |
2145 | 2153 |
2146 void LayerTreeHostImpl::CleanUpTileManager() { | 2154 void LayerTreeHostImpl::CleanUpTileManager() { |
2147 tile_manager_->FinishTasksAndCleanUp(); | 2155 tile_manager_->FinishTasksAndCleanUp(); |
2148 resource_pool_ = nullptr; | 2156 resource_pool_ = nullptr; |
2149 tile_task_worker_pool_ = nullptr; | 2157 tile_task_worker_pool_ = nullptr; |
2150 single_thread_synchronous_task_graph_runner_ = nullptr; | 2158 single_thread_synchronous_task_graph_runner_ = nullptr; |
2151 } | 2159 } |
2152 | 2160 |
2153 scoped_ptr<OutputSurface> LayerTreeHostImpl::ReleaseOutputSurface() { | 2161 void LayerTreeHostImpl::ReleaseOutputSurface() { |
2154 TRACE_EVENT0("cc", "LayerTreeHostImpl::ReleaseOutputSurface"); | 2162 TRACE_EVENT0("cc", "LayerTreeHostImpl::ReleaseOutputSurface"); |
2155 | 2163 |
2156 // Since we will create a new resource provider, we cannot continue to use | 2164 // Since we will create a new resource provider, we cannot continue to use |
2157 // the old resources (i.e. render_surfaces and texture IDs). Clear them | 2165 // the old resources (i.e. render_surfaces and texture IDs). Clear them |
2158 // before we destroy the old resource provider. | 2166 // before we destroy the old resource provider. |
2159 ReleaseTreeResources(); | 2167 ReleaseTreeResources(); |
2160 | 2168 |
2161 // Note: order is important here. | 2169 // Note: order is important here. |
2162 renderer_ = nullptr; | 2170 renderer_ = nullptr; |
2163 CleanUpTileManager(); | 2171 CleanUpTileManager(); |
2164 resource_provider_ = nullptr; | 2172 resource_provider_ = nullptr; |
2165 | 2173 |
2166 return output_surface_.Pass(); | 2174 // Detach from the old output surface and reset |output_surface_| pointer |
| 2175 // as this surface is going to be destroyed independent of if binding the |
| 2176 // new output surface succeeds or not. |
| 2177 if (output_surface_) { |
| 2178 output_surface_->DetachFromClient(); |
| 2179 output_surface_ = nullptr; |
| 2180 } |
2167 } | 2181 } |
2168 | 2182 |
2169 bool LayerTreeHostImpl::InitializeRenderer( | 2183 bool LayerTreeHostImpl::InitializeRenderer(OutputSurface* output_surface) { |
2170 scoped_ptr<OutputSurface> output_surface) { | |
2171 TRACE_EVENT0("cc", "LayerTreeHostImpl::InitializeRenderer"); | 2184 TRACE_EVENT0("cc", "LayerTreeHostImpl::InitializeRenderer"); |
2172 | 2185 |
2173 ReleaseOutputSurface(); | 2186 ReleaseOutputSurface(); |
2174 if (!output_surface->BindToClient(this)) { | 2187 if (!output_surface->BindToClient(this)) { |
2175 // Avoid recreating tree resources because we might not have enough | 2188 // Avoid recreating tree resources because we might not have enough |
2176 // information to do this yet (eg. we don't have a TileManager at this | 2189 // information to do this yet (eg. we don't have a TileManager at this |
2177 // point). | 2190 // point). |
2178 return false; | 2191 return false; |
2179 } | 2192 } |
2180 | 2193 |
2181 output_surface_ = output_surface.Pass(); | 2194 output_surface_ = output_surface; |
2182 resource_provider_ = ResourceProvider::Create( | 2195 resource_provider_ = ResourceProvider::Create( |
2183 output_surface_.get(), shared_bitmap_manager_, gpu_memory_buffer_manager_, | 2196 output_surface_, shared_bitmap_manager_, gpu_memory_buffer_manager_, |
2184 proxy_->blocking_main_thread_task_runner(), | 2197 proxy_->blocking_main_thread_task_runner(), |
2185 settings_.renderer_settings.highp_threshold_min, | 2198 settings_.renderer_settings.highp_threshold_min, |
2186 settings_.renderer_settings.use_rgba_4444_textures, | 2199 settings_.renderer_settings.use_rgba_4444_textures, |
2187 settings_.renderer_settings.texture_id_allocation_chunk_size, | 2200 settings_.renderer_settings.texture_id_allocation_chunk_size, |
2188 settings_.use_image_texture_targets); | 2201 settings_.use_image_texture_targets); |
2189 | 2202 |
2190 CreateAndSetRenderer(); | 2203 CreateAndSetRenderer(); |
2191 | 2204 |
2192 // Since the new renderer may be capable of MSAA, update status here. | 2205 // Since the new renderer may be capable of MSAA, update status here. |
2193 UpdateGpuRasterizationStatus(); | 2206 UpdateGpuRasterizationStatus(); |
(...skipping 1406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3600 if (active_tree()) { | 3613 if (active_tree()) { |
3601 LayerAnimationValueProvider* layer = active_tree()->LayerById(layer_id); | 3614 LayerAnimationValueProvider* layer = active_tree()->LayerById(layer_id); |
3602 if (layer) | 3615 if (layer) |
3603 return layer->ScrollOffsetForAnimation(); | 3616 return layer->ScrollOffsetForAnimation(); |
3604 } | 3617 } |
3605 | 3618 |
3606 return gfx::ScrollOffset(); | 3619 return gfx::ScrollOffset(); |
3607 } | 3620 } |
3608 | 3621 |
3609 } // namespace cc | 3622 } // namespace cc |
OLD | NEW |