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/layer_tree_host_impl.h" | 5 #include "cc/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/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 // damage rect. The root damage rect is then used to scissor each surface. | 373 // damage rect. The root damage rect is then used to scissor each surface. |
374 | 374 |
375 for (int surfaceIndex = renderSurfaceLayerList.size() - 1; surfaceIndex >= 0
; --surfaceIndex) { | 375 for (int surfaceIndex = renderSurfaceLayerList.size() - 1; surfaceIndex >= 0
; --surfaceIndex) { |
376 LayerImpl* renderSurfaceLayer = renderSurfaceLayerList[surfaceIndex]; | 376 LayerImpl* renderSurfaceLayer = renderSurfaceLayerList[surfaceIndex]; |
377 RenderSurfaceImpl* renderSurface = renderSurfaceLayer->renderSurface(); | 377 RenderSurfaceImpl* renderSurface = renderSurfaceLayer->renderSurface(); |
378 DCHECK(renderSurface); | 378 DCHECK(renderSurface); |
379 renderSurface->damageTracker()->updateDamageTrackingState(renderSurface-
>layerList(), renderSurfaceLayer->id(), renderSurface->surfacePropertyChangedOnl
yFromDescendant(), renderSurface->contentRect(), renderSurfaceLayer->maskLayer()
, renderSurfaceLayer->filters(), renderSurfaceLayer->filter().get()); | 379 renderSurface->damageTracker()->updateDamageTrackingState(renderSurface-
>layerList(), renderSurfaceLayer->id(), renderSurface->surfacePropertyChangedOnl
yFromDescendant(), renderSurface->contentRect(), renderSurfaceLayer->maskLayer()
, renderSurfaceLayer->filters(), renderSurfaceLayer->filter().get()); |
380 } | 380 } |
381 } | 381 } |
382 | 382 |
383 void LayerTreeHostImpl::updateRootScrollLayerImplTransform() | |
384 { | |
385 if (rootScrollLayer()) { | |
386 rootScrollLayer()->setImplTransform(implTransform()); | |
387 } | |
388 } | |
389 | |
390 void LayerTreeHostImpl::updateDrawProperties() | 383 void LayerTreeHostImpl::updateDrawProperties() |
391 { | 384 { |
392 if (!needsUpdateDrawProperties()) | 385 if (!needsUpdateDrawProperties()) |
393 return; | 386 return; |
394 | 387 |
395 m_renderSurfaceLayerList.clear(); | 388 m_renderSurfaceLayerList.clear(); |
396 m_needsUpdateDrawProperties = false; | 389 m_needsUpdateDrawProperties = false; |
397 | 390 |
398 if (!rootLayer()) | 391 if (!rootLayer()) |
399 return; | 392 return; |
400 | 393 |
401 calculateRenderSurfaceLayerList(m_renderSurfaceLayerList); | 394 if (!m_renderer) // For maxTextureSize. |
402 } | 395 return; |
403 | 396 |
404 void LayerTreeHostImpl::calculateRenderSurfaceLayerList(LayerList& renderSurface
LayerList) | 397 if (rootScrollLayer()) |
405 { | 398 rootScrollLayer()->setImplTransform(implTransform()); |
406 DCHECK(renderSurfaceLayerList.empty()); | 399 |
407 DCHECK(rootLayer()); | |
408 DCHECK(m_renderer); // For maxTextureSize. | |
409 { | 400 { |
410 updateRootScrollLayerImplTransform(); | 401 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc"); |
411 | 402 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); |
412 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc"); | 403 LayerTreeHostCommon::calculateDrawProperties(rootLayer(), deviceViewportSi
ze(), m_deviceScaleFactor, pageScaleFactor, rendererCapabilities().maxTextureSiz
e, m_renderSurfaceLayerList); |
413 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); | |
414 LayerTreeHostCommon::calculateDrawProperties(rootLayer(), deviceViewport
Size(), m_deviceScaleFactor, pageScaleFactor, rendererCapabilities().maxTextureS
ize, renderSurfaceLayerList); | |
415 } | 404 } |
416 } | 405 } |
417 | 406 |
418 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) | 407 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) |
419 { | 408 { |
420 RenderPass* pass = renderPass.get(); | 409 RenderPass* pass = renderPass.get(); |
421 renderPasses.push_back(pass); | 410 renderPasses.push_back(pass); |
422 renderPassesById.set(pass->id, renderPass.Pass()); | 411 renderPassesById.set(pass->id, renderPass.Pass()); |
423 } | 412 } |
424 | 413 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 quad->SetNew(sharedQuadState, layerRect, screenBackgroundColor); | 494 quad->SetNew(sharedQuadState, layerRect, screenBackgroundColor); |
506 quadCuller.append(quad.PassAs<DrawQuad>(), appendQuadsData); | 495 quadCuller.append(quad.PassAs<DrawQuad>(), appendQuadsData); |
507 } | 496 } |
508 } | 497 } |
509 | 498 |
510 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) | 499 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
511 { | 500 { |
512 DCHECK(frame.renderPasses.empty()); | 501 DCHECK(frame.renderPasses.empty()); |
513 | 502 |
514 updateDrawProperties(); | 503 updateDrawProperties(); |
| 504 if (!canDraw()) |
| 505 return false; |
| 506 |
515 trackDamageForAllSurfaces(rootLayer(), *frame.renderSurfaceLayerList); | 507 trackDamageForAllSurfaces(rootLayer(), *frame.renderSurfaceLayerList); |
516 | 508 |
517 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac
eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList
->size())); | 509 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac
eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList
->size())); |
518 | 510 |
519 // Create the render passes in dependency order. | 511 // Create the render passes in dependency order. |
520 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd
ex >= 0 ; --surfaceIndex) { | 512 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd
ex >= 0 ; --surfaceIndex) { |
521 LayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfaceI
ndex]; | 513 LayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfaceI
ndex]; |
522 renderSurfaceLayer->renderSurface()->appendRenderPasses(frame); | 514 renderSurfaceLayer->renderSurface()->appendRenderPasses(frame); |
523 } | 515 } |
524 | 516 |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
759 removeRenderPassesRecursive(renderPassQuad->render_pass_id, frame); | 751 removeRenderPassesRecursive(renderPassQuad->render_pass_id, frame); |
760 it = frame.renderPasses.size() - positionFromEnd; | 752 it = frame.renderPasses.size() - positionFromEnd; |
761 DCHECK(it >= 0); | 753 DCHECK(it >= 0); |
762 } | 754 } |
763 } | 755 } |
764 } | 756 } |
765 | 757 |
766 bool LayerTreeHostImpl::prepareToDraw(FrameData& frame) | 758 bool LayerTreeHostImpl::prepareToDraw(FrameData& frame) |
767 { | 759 { |
768 TRACE_EVENT0("cc", "LayerTreeHostImpl::prepareToDraw"); | 760 TRACE_EVENT0("cc", "LayerTreeHostImpl::prepareToDraw"); |
769 DCHECK(canDraw()); | |
770 | 761 |
771 if (m_tileManager) | 762 if (m_tileManager) |
772 m_tileManager->CheckForCompletedSetPixels(); | 763 m_tileManager->CheckForCompletedSetPixels(); |
773 | 764 |
774 frame.renderSurfaceLayerList = &m_renderSurfaceLayerList; | 765 frame.renderSurfaceLayerList = &m_renderSurfaceLayerList; |
775 frame.renderPasses.clear(); | 766 frame.renderPasses.clear(); |
776 frame.renderPassesById.clear(); | 767 frame.renderPassesById.clear(); |
777 frame.willDrawLayers.clear(); | 768 frame.willDrawLayers.clear(); |
778 | 769 |
779 if (!calculateRenderPasses(frame)) | 770 if (!calculateRenderPasses(frame)) |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1183 rootScrollLayer()->setMaxScrollOffset(gfx::ToFlooredVector2d(maxScroll)); | 1174 rootScrollLayer()->setMaxScrollOffset(gfx::ToFlooredVector2d(maxScroll)); |
1184 } | 1175 } |
1185 | 1176 |
1186 void LayerTreeHostImpl::setNeedsRedraw() | 1177 void LayerTreeHostImpl::setNeedsRedraw() |
1187 { | 1178 { |
1188 m_client->setNeedsRedrawOnImplThread(); | 1179 m_client->setNeedsRedrawOnImplThread(); |
1189 } | 1180 } |
1190 | 1181 |
1191 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() | 1182 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() |
1192 { | 1183 { |
1193 // TODO(enne): See http://crbug.com/164949. This function should really | |
1194 // just call updateDrawProperties(), but that breaks a number of | |
1195 // impl transform tests that don't expect the tree to be updated. | |
1196 if (!rootLayer()) | |
1197 return false; | |
1198 if (!m_renderer) | |
1199 return false; | |
1200 | |
1201 // We need both a non-empty render surface layer list and a root render | |
1202 // surface to be able to iterate over the visible layers. | |
1203 if (m_renderSurfaceLayerList.size() && rootLayer()->renderSurface()) | |
1204 return true; | |
1205 | |
1206 // If we are called after setRootLayer() but before prepareToDraw(), we need | |
1207 // to recalculate the visible layers. This prevents being unable to scroll | |
1208 // during part of a commit. | |
1209 setNeedsUpdateDrawProperties(); | |
1210 updateDrawProperties(); | 1184 updateDrawProperties(); |
1211 | |
1212 return m_renderSurfaceLayerList.size(); | 1185 return m_renderSurfaceLayerList.size(); |
1213 } | 1186 } |
1214 | 1187 |
1215 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) | 1188 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) |
1216 { | 1189 { |
1217 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); | 1190 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); |
1218 | 1191 |
1219 DCHECK(!currentlyScrollingLayer()); | 1192 DCHECK(!currentlyScrollingLayer()); |
1220 clearCurrentlyScrollingLayer(); | 1193 clearCurrentlyScrollingLayer(); |
1221 | 1194 |
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1720 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); | 1693 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); |
1721 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1694 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
1722 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1695 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
1723 m_client->setNeedsRedrawOnImplThread(); | 1696 m_client->setNeedsRedrawOnImplThread(); |
1724 | 1697 |
1725 for (size_t i = 0; i < layer->children().size(); ++i) | 1698 for (size_t i = 0; i < layer->children().size(); ++i) |
1726 animateScrollbarsRecursive(layer->children()[i], time); | 1699 animateScrollbarsRecursive(layer->children()[i], time); |
1727 } | 1700 } |
1728 | 1701 |
1729 } // namespace cc | 1702 } // namespace cc |
OLD | NEW |