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 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
(...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1105 new_state.memory_limit_policy = | 1105 new_state.memory_limit_policy = |
1106 ManagedMemoryPolicy::PriorityCutoffToTileMemoryLimitPolicy( | 1106 ManagedMemoryPolicy::PriorityCutoffToTileMemoryLimitPolicy( |
1107 visible_ ? | 1107 visible_ ? |
1108 policy.priority_cutoff_when_visible : | 1108 policy.priority_cutoff_when_visible : |
1109 policy.priority_cutoff_when_not_visible); | 1109 policy.priority_cutoff_when_not_visible); |
1110 new_state.num_resources_limit = policy.num_resources_limit; | 1110 new_state.num_resources_limit = policy.num_resources_limit; |
1111 tile_manager_->SetGlobalState(new_state); | 1111 tile_manager_->SetGlobalState(new_state); |
1112 manage_tiles_needed_ = true; | 1112 manage_tiles_needed_ = true; |
1113 } | 1113 } |
1114 | 1114 |
1115 bool LayerTreeHostImpl::HasImplThread() const { | |
1116 return proxy_->HasImplThread(); | |
1117 } | |
1118 | |
1119 void LayerTreeHostImpl::DidInitializeVisibleTile() { | 1115 void LayerTreeHostImpl::DidInitializeVisibleTile() { |
1120 // TODO(reveman): Determine tiles that changed and only damage | 1116 // TODO(reveman): Determine tiles that changed and only damage |
1121 // what's necessary. | 1117 // what's necessary. |
1122 SetFullRootLayerDamage(); | 1118 SetFullRootLayerDamage(); |
1123 if (client_) | 1119 if (client_) |
1124 client_->DidInitializeVisibleTileOnImplThread(); | 1120 client_->DidInitializeVisibleTileOnImplThread(); |
1125 } | 1121 } |
1126 | 1122 |
1127 void LayerTreeHostImpl::NotifyReadyToActivate() { | 1123 void LayerTreeHostImpl::NotifyReadyToActivate() { |
1128 client_->NotifyReadyToActivate(); | 1124 client_->NotifyReadyToActivate(); |
1129 } | 1125 } |
1130 | 1126 |
1131 bool LayerTreeHostImpl::ShouldClearRootRenderPass() const { | |
1132 return settings_.should_clear_root_render_pass; | |
1133 } | |
1134 | |
1135 void LayerTreeHostImpl::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { | 1127 void LayerTreeHostImpl::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { |
1136 SetManagedMemoryPolicy(policy, zero_budget_); | 1128 SetManagedMemoryPolicy(policy, zero_budget_); |
1137 } | 1129 } |
1138 | 1130 |
1139 void LayerTreeHostImpl::SetDiscardBackBufferWhenNotVisible(bool discard) { | 1131 void LayerTreeHostImpl::SetDiscardBackBufferWhenNotVisible(bool discard) { |
1140 DCHECK(renderer_); | 1132 DCHECK(renderer_); |
1141 renderer_->SetDiscardBackBufferWhenNotVisible(discard); | 1133 renderer_->SetDiscardBackBufferWhenNotVisible(discard); |
1142 } | 1134 } |
1143 | 1135 |
1144 void LayerTreeHostImpl::SetTreeActivationCallback( | 1136 void LayerTreeHostImpl::SetTreeActivationCallback( |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1193 const gfx::Transform& transform, | 1185 const gfx::Transform& transform, |
1194 gfx::Rect viewport, | 1186 gfx::Rect viewport, |
1195 gfx::Rect clip, | 1187 gfx::Rect clip, |
1196 bool valid_for_tile_management) { | 1188 bool valid_for_tile_management) { |
1197 external_transform_ = transform; | 1189 external_transform_ = transform; |
1198 external_viewport_ = viewport; | 1190 external_viewport_ = viewport; |
1199 external_clip_ = clip; | 1191 external_clip_ = clip; |
1200 device_viewport_valid_for_tile_management_ = valid_for_tile_management; | 1192 device_viewport_valid_for_tile_management_ = valid_for_tile_management; |
1201 } | 1193 } |
1202 | 1194 |
1203 void LayerTreeHostImpl::SetExternalStencilTest(bool enabled) { | |
1204 external_stencil_test_enabled_ = enabled; | |
1205 } | |
1206 | |
1207 void LayerTreeHostImpl::SetNeedsRedrawRect(gfx::Rect damage_rect) { | 1195 void LayerTreeHostImpl::SetNeedsRedrawRect(gfx::Rect damage_rect) { |
1208 client_->SetNeedsRedrawRectOnImplThread(damage_rect); | 1196 client_->SetNeedsRedrawRectOnImplThread(damage_rect); |
1209 } | 1197 } |
1210 | 1198 |
1211 void LayerTreeHostImpl::BeginFrame(const BeginFrameArgs& args) { | 1199 void LayerTreeHostImpl::BeginFrame(const BeginFrameArgs& args) { |
1212 client_->BeginFrameOnImplThread(args); | 1200 client_->BeginFrameOnImplThread(args); |
1213 } | 1201 } |
1214 | 1202 |
1215 void LayerTreeHostImpl::OnSwapBuffersComplete( | 1203 void LayerTreeHostImpl::OnSwapBuffersComplete( |
1216 const CompositorFrameAck* ack) { | 1204 const CompositorFrameAck* ack) { |
(...skipping 27 matching lines...) Expand all Loading... |
1244 } | 1232 } |
1245 | 1233 |
1246 if (!RootScrollLayer()) | 1234 if (!RootScrollLayer()) |
1247 return metadata; | 1235 return metadata; |
1248 | 1236 |
1249 metadata.root_scroll_offset = RootScrollLayer()->TotalScrollOffset(); | 1237 metadata.root_scroll_offset = RootScrollLayer()->TotalScrollOffset(); |
1250 | 1238 |
1251 return metadata; | 1239 return metadata; |
1252 } | 1240 } |
1253 | 1241 |
1254 bool LayerTreeHostImpl::AllowPartialSwap() const { | |
1255 // We don't track damage on the HUD layer (it interacts with damage tracking | |
1256 // visualizations), so disable partial swaps to make the HUD layer display | |
1257 // properly. | |
1258 return !debug_state_.ShowHudRects(); | |
1259 } | |
1260 | |
1261 bool LayerTreeHostImpl::ExternalStencilTestEnabled() const { | |
1262 return external_stencil_test_enabled_; | |
1263 } | |
1264 | |
1265 static void LayerTreeHostImplDidBeginTracingCallback(LayerImpl* layer) { | 1242 static void LayerTreeHostImplDidBeginTracingCallback(LayerImpl* layer) { |
1266 layer->DidBeginTracing(); | 1243 layer->DidBeginTracing(); |
1267 } | 1244 } |
1268 | 1245 |
1269 void LayerTreeHostImpl::DrawLayers(FrameData* frame, | 1246 void LayerTreeHostImpl::DrawLayers(FrameData* frame, |
1270 base::TimeTicks frame_begin_time) { | 1247 base::TimeTicks frame_begin_time) { |
1271 TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers"); | 1248 TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers"); |
1272 DCHECK(CanDraw()); | 1249 DCHECK(CanDraw()); |
1273 | 1250 |
1274 if (frame->has_no_damage) { | 1251 if (frame->has_no_damage) { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1328 TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), "cc::LayerTreeHostImpl", | 1305 TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), "cc::LayerTreeHostImpl", |
1329 this, TracedValue::FromValue(AsValueWithFrame(frame).release())); | 1306 this, TracedValue::FromValue(AsValueWithFrame(frame).release())); |
1330 | 1307 |
1331 // Because the contents of the HUD depend on everything else in the frame, the | 1308 // Because the contents of the HUD depend on everything else in the frame, the |
1332 // contents of its texture are updated as the last thing before the frame is | 1309 // contents of its texture are updated as the last thing before the frame is |
1333 // drawn. | 1310 // drawn. |
1334 if (active_tree_->hud_layer()) | 1311 if (active_tree_->hud_layer()) |
1335 active_tree_->hud_layer()->UpdateHudTexture(resource_provider_.get()); | 1312 active_tree_->hud_layer()->UpdateHudTexture(resource_provider_.get()); |
1336 | 1313 |
1337 if (output_surface_->ForcedDrawToSoftwareDevice()) { | 1314 if (output_surface_->ForcedDrawToSoftwareDevice()) { |
| 1315 bool allow_partial_swap = false; |
| 1316 |
1338 scoped_ptr<SoftwareRenderer> temp_software_renderer = | 1317 scoped_ptr<SoftwareRenderer> temp_software_renderer = |
1339 SoftwareRenderer::Create(this, output_surface_.get(), NULL); | 1318 SoftwareRenderer::Create(this, &settings_, output_surface_.get(), NULL); |
1340 temp_software_renderer->DrawFrame(&frame->render_passes, NULL); | 1319 temp_software_renderer->DrawFrame( |
| 1320 &frame->render_passes, NULL, device_scale_factor_, allow_partial_swap); |
1341 } else { | 1321 } else { |
| 1322 // We don't track damage on the HUD layer (it interacts with damage tracking |
| 1323 // visualizations), so disable partial swaps to make the HUD layer display |
| 1324 // properly. |
| 1325 bool allow_partial_swap = !debug_state_.ShowHudRects(); |
| 1326 |
1342 renderer_->DrawFrame(&frame->render_passes, | 1327 renderer_->DrawFrame(&frame->render_passes, |
1343 offscreen_context_provider_.get()); | 1328 offscreen_context_provider_.get(), |
| 1329 device_scale_factor_, |
| 1330 allow_partial_swap); |
1344 } | 1331 } |
1345 // The render passes should be consumed by the renderer. | 1332 // The render passes should be consumed by the renderer. |
1346 DCHECK(frame->render_passes.empty()); | 1333 DCHECK(frame->render_passes.empty()); |
1347 frame->render_passes_by_id.clear(); | 1334 frame->render_passes_by_id.clear(); |
1348 | 1335 |
1349 // The next frame should start by assuming nothing has changed, and changes | 1336 // The next frame should start by assuming nothing has changed, and changes |
1350 // are noted as they occur. | 1337 // are noted as they occur. |
| 1338 // TODO(boliu): If we did a temporary software renderer frame, propogate the |
| 1339 // damage forward to the next frame. |
1351 for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) { | 1340 for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) { |
1352 (*frame->render_surface_layer_list)[i]->render_surface()->damage_tracker()-> | 1341 (*frame->render_surface_layer_list)[i]->render_surface()->damage_tracker()-> |
1353 DidDrawDamagedArea(); | 1342 DidDrawDamagedArea(); |
1354 } | 1343 } |
1355 active_tree_->root_layer()->ResetAllChangeTrackingForSubtree(); | 1344 active_tree_->root_layer()->ResetAllChangeTrackingForSubtree(); |
1356 | 1345 |
1357 rendering_stats_instrumentation_->IssueTraceEventForImplThreadStats(); | 1346 rendering_stats_instrumentation_->IssueTraceEventForImplThreadStats(); |
1358 rendering_stats_instrumentation_->AccumulateAndClearImplThreadStats(); | 1347 rendering_stats_instrumentation_->AccumulateAndClearImplThreadStats(); |
1359 } | 1348 } |
1360 | 1349 |
(...skipping 26 matching lines...) Expand all Loading... |
1387 renderer_->SwapBuffers(); | 1376 renderer_->SwapBuffers(); |
1388 active_tree_->ClearLatencyInfo(); | 1377 active_tree_->ClearLatencyInfo(); |
1389 return true; | 1378 return true; |
1390 } | 1379 } |
1391 | 1380 |
1392 void LayerTreeHostImpl::SetNeedsBeginFrame(bool enable) { | 1381 void LayerTreeHostImpl::SetNeedsBeginFrame(bool enable) { |
1393 if (output_surface_) | 1382 if (output_surface_) |
1394 output_surface_->SetNeedsBeginFrame(enable); | 1383 output_surface_->SetNeedsBeginFrame(enable); |
1395 } | 1384 } |
1396 | 1385 |
1397 float LayerTreeHostImpl::DeviceScaleFactor() const { | |
1398 return device_scale_factor_; | |
1399 } | |
1400 | |
1401 gfx::SizeF LayerTreeHostImpl::UnscaledScrollableViewportSize() const { | 1386 gfx::SizeF LayerTreeHostImpl::UnscaledScrollableViewportSize() const { |
1402 // The container layer bounds should be used if non-overlay scrollbars may | 1387 // The container layer bounds should be used if non-overlay scrollbars may |
1403 // exist since it adjusts for them. | 1388 // exist since it adjusts for them. |
1404 LayerImpl* container_layer = active_tree_->RootContainerLayer(); | 1389 LayerImpl* container_layer = active_tree_->RootContainerLayer(); |
1405 if (!Settings().solid_color_scrollbars && container_layer) { | 1390 if (!settings_.solid_color_scrollbars && container_layer) { |
1406 DCHECK(!top_controls_manager_); | 1391 DCHECK(!top_controls_manager_); |
1407 DCHECK_EQ(0, overdraw_bottom_height_); | 1392 DCHECK_EQ(0, overdraw_bottom_height_); |
1408 return container_layer->bounds(); | 1393 return container_layer->bounds(); |
1409 } | 1394 } |
1410 | 1395 |
1411 gfx::SizeF dip_size = | 1396 gfx::SizeF dip_size = |
1412 gfx::ScaleSize(device_viewport_size_, 1.f / device_scale_factor()); | 1397 gfx::ScaleSize(device_viewport_size_, 1.f / device_scale_factor()); |
1413 | 1398 |
1414 float top_offset = | 1399 float top_offset = |
1415 top_controls_manager_ ? top_controls_manager_->content_top_offset() : 0.f; | 1400 top_controls_manager_ ? top_controls_manager_->content_top_offset() : 0.f; |
1416 return gfx::SizeF(dip_size.width(), | 1401 return gfx::SizeF(dip_size.width(), |
1417 dip_size.height() - top_offset - overdraw_bottom_height_); | 1402 dip_size.height() - top_offset - overdraw_bottom_height_); |
1418 } | 1403 } |
1419 | 1404 |
1420 const LayerTreeSettings& LayerTreeHostImpl::Settings() const { | |
1421 return settings(); | |
1422 } | |
1423 | |
1424 void LayerTreeHostImpl::DidLoseOutputSurface() { | 1405 void LayerTreeHostImpl::DidLoseOutputSurface() { |
1425 // TODO(jamesr): The renderer_ check is needed to make some of the | 1406 // TODO(jamesr): The renderer_ check is needed to make some of the |
1426 // LayerTreeHostContextTest tests pass, but shouldn't be necessary (or | 1407 // LayerTreeHostContextTest tests pass, but shouldn't be necessary (or |
1427 // important) in production. We should adjust the test to not need this. | 1408 // important) in production. We should adjust the test to not need this. |
1428 if (renderer_) | 1409 if (renderer_) |
1429 client_->DidLoseOutputSurfaceOnImplThread(); | 1410 client_->DidLoseOutputSurfaceOnImplThread(); |
1430 } | 1411 } |
1431 | 1412 |
1432 void LayerTreeHostImpl::Readback(void* pixels, | 1413 void LayerTreeHostImpl::Readback(void* pixels, |
1433 gfx::Rect rect_in_device_viewport) { | 1414 gfx::Rect rect_in_device_viewport) { |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1600 | 1581 |
1601 DeleteAllUIResources(); | 1582 DeleteAllUIResources(); |
1602 } | 1583 } |
1603 | 1584 |
1604 void LayerTreeHostImpl::CreateAndSetRenderer( | 1585 void LayerTreeHostImpl::CreateAndSetRenderer( |
1605 OutputSurface* output_surface, | 1586 OutputSurface* output_surface, |
1606 ResourceProvider* resource_provider, | 1587 ResourceProvider* resource_provider, |
1607 bool skip_gl_renderer) { | 1588 bool skip_gl_renderer) { |
1608 DCHECK(!renderer_); | 1589 DCHECK(!renderer_); |
1609 if (output_surface->capabilities().delegated_rendering) { | 1590 if (output_surface->capabilities().delegated_rendering) { |
1610 renderer_ = | 1591 renderer_ = DelegatingRenderer::Create( |
1611 DelegatingRenderer::Create(this, output_surface, resource_provider); | 1592 this, &settings_, output_surface, resource_provider); |
1612 } else if (output_surface->context_provider() && !skip_gl_renderer) { | 1593 } else if (output_surface->context_provider() && !skip_gl_renderer) { |
1613 renderer_ = GLRenderer::Create(this, | 1594 renderer_ = GLRenderer::Create(this, |
| 1595 &settings_, |
1614 output_surface, | 1596 output_surface, |
1615 resource_provider, | 1597 resource_provider, |
1616 settings_.highp_threshold_min, | 1598 settings_.highp_threshold_min, |
1617 settings_.force_direct_layer_drawing); | 1599 settings_.force_direct_layer_drawing); |
1618 } else if (output_surface->software_device()) { | 1600 } else if (output_surface->software_device()) { |
1619 renderer_ = | 1601 renderer_ = SoftwareRenderer::Create( |
1620 SoftwareRenderer::Create(this, output_surface, resource_provider); | 1602 this, &settings_, output_surface, resource_provider); |
1621 } | 1603 } |
1622 | 1604 |
1623 if (renderer_) { | 1605 if (renderer_) { |
1624 renderer_->SetVisible(visible_); | 1606 renderer_->SetVisible(visible_); |
1625 SetFullRootLayerDamage(); | 1607 SetFullRootLayerDamage(); |
1626 } | 1608 } |
1627 } | 1609 } |
1628 | 1610 |
1629 void LayerTreeHostImpl::CreateAndSetTileManager( | 1611 void LayerTreeHostImpl::CreateAndSetTileManager( |
1630 ResourceProvider* resource_provider, | 1612 ResourceProvider* resource_provider, |
(...skipping 1018 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2649 | 2631 |
2650 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( | 2632 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( |
2651 UIResourceId uid) const { | 2633 UIResourceId uid) const { |
2652 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); | 2634 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); |
2653 if (iter != ui_resource_map_.end()) | 2635 if (iter != ui_resource_map_.end()) |
2654 return iter->second; | 2636 return iter->second; |
2655 return 0; | 2637 return 0; |
2656 } | 2638 } |
2657 | 2639 |
2658 } // namespace cc | 2640 } // namespace cc |
OLD | NEW |