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 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 // damage rect. The root damage rect is then used to scissor each surface. | 376 // damage rect. The root damage rect is then used to scissor each surface. |
377 | 377 |
378 for (int surfaceIndex = renderSurfaceLayerList.size() - 1; surfaceIndex >= 0
; --surfaceIndex) { | 378 for (int surfaceIndex = renderSurfaceLayerList.size() - 1; surfaceIndex >= 0
; --surfaceIndex) { |
379 LayerImpl* renderSurfaceLayer = renderSurfaceLayerList[surfaceIndex]; | 379 LayerImpl* renderSurfaceLayer = renderSurfaceLayerList[surfaceIndex]; |
380 RenderSurfaceImpl* renderSurface = renderSurfaceLayer->renderSurface(); | 380 RenderSurfaceImpl* renderSurface = renderSurfaceLayer->renderSurface(); |
381 DCHECK(renderSurface); | 381 DCHECK(renderSurface); |
382 renderSurface->damageTracker()->updateDamageTrackingState(renderSurface-
>layerList(), renderSurfaceLayer->id(), renderSurface->surfacePropertyChangedOnl
yFromDescendant(), renderSurface->contentRect(), renderSurfaceLayer->maskLayer()
, renderSurfaceLayer->filters(), renderSurfaceLayer->filter().get()); | 382 renderSurface->damageTracker()->updateDamageTrackingState(renderSurface-
>layerList(), renderSurfaceLayer->id(), renderSurface->surfacePropertyChangedOnl
yFromDescendant(), renderSurface->contentRect(), renderSurfaceLayer->maskLayer()
, renderSurfaceLayer->filters(), renderSurfaceLayer->filter().get()); |
383 } | 383 } |
384 } | 384 } |
385 | 385 |
386 void LayerTreeHostImpl::updateRootScrollLayerImplTransform() | |
387 { | |
388 if (rootScrollLayer()) { | |
389 rootScrollLayer()->setImplTransform(implTransform()); | |
390 } | |
391 } | |
392 | |
393 void LayerTreeHostImpl::updateDrawProperties() | 386 void LayerTreeHostImpl::updateDrawProperties() |
394 { | 387 { |
395 if (!needsUpdateDrawProperties()) | 388 if (!needsUpdateDrawProperties()) |
396 return; | 389 return; |
397 | 390 |
398 m_renderSurfaceLayerList.clear(); | 391 m_renderSurfaceLayerList.clear(); |
399 m_needsUpdateDrawProperties = false; | 392 m_needsUpdateDrawProperties = false; |
400 | 393 |
401 if (!rootLayer()) | 394 if (!rootLayer()) |
402 return; | 395 return; |
403 | 396 |
404 calculateRenderSurfaceLayerList(m_renderSurfaceLayerList); | 397 if (!m_renderer) // For maxTextureSize. |
405 } | 398 return; |
406 | 399 |
407 void LayerTreeHostImpl::calculateRenderSurfaceLayerList(LayerList& renderSurface
LayerList) | 400 if (rootScrollLayer()) |
408 { | 401 rootScrollLayer()->setImplTransform(implTransform()); |
409 DCHECK(renderSurfaceLayerList.empty()); | 402 |
410 DCHECK(rootLayer()); | |
411 DCHECK(m_renderer); // For maxTextureSize. | |
412 { | 403 { |
413 updateRootScrollLayerImplTransform(); | |
414 | |
415 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc"); | 404 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc"); |
416 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); | 405 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); |
417 LayerTreeHostCommon::calculateDrawProperties(rootLayer(), deviceViewport
Size(), m_deviceScaleFactor, pageScaleFactor, rendererCapabilities().maxTextureS
ize, m_settings.canUseLCDText, renderSurfaceLayerList); | 406 LayerTreeHostCommon::calculateDrawProperties(rootLayer(), deviceViewport
Size(), m_deviceScaleFactor, pageScaleFactor, rendererCapabilities().maxTextureS
ize, m_settings.canUseLCDText, m_renderSurfaceLayerList); |
418 } | 407 } |
419 } | 408 } |
420 | 409 |
421 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) | 410 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) |
422 { | 411 { |
423 RenderPass* pass = renderPass.get(); | 412 RenderPass* pass = renderPass.get(); |
424 renderPasses.push_back(pass); | 413 renderPasses.push_back(pass); |
425 renderPassesById.set(pass->id, renderPass.Pass()); | 414 renderPassesById.set(pass->id, renderPass.Pass()); |
426 } | 415 } |
427 | 416 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 quad->SetNew(sharedQuadState, layerRect, screenBackgroundColor); | 497 quad->SetNew(sharedQuadState, layerRect, screenBackgroundColor); |
509 quadCuller.append(quad.PassAs<DrawQuad>(), appendQuadsData); | 498 quadCuller.append(quad.PassAs<DrawQuad>(), appendQuadsData); |
510 } | 499 } |
511 } | 500 } |
512 | 501 |
513 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) | 502 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
514 { | 503 { |
515 DCHECK(frame.renderPasses.empty()); | 504 DCHECK(frame.renderPasses.empty()); |
516 | 505 |
517 updateDrawProperties(); | 506 updateDrawProperties(); |
| 507 if (!canDraw()) |
| 508 return false; |
| 509 |
518 trackDamageForAllSurfaces(rootLayer(), *frame.renderSurfaceLayerList); | 510 trackDamageForAllSurfaces(rootLayer(), *frame.renderSurfaceLayerList); |
519 | 511 |
520 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac
eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList
->size())); | 512 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac
eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList
->size())); |
521 | 513 |
522 // Create the render passes in dependency order. | 514 // Create the render passes in dependency order. |
523 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd
ex >= 0 ; --surfaceIndex) { | 515 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd
ex >= 0 ; --surfaceIndex) { |
524 LayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfaceI
ndex]; | 516 LayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfaceI
ndex]; |
525 renderSurfaceLayer->renderSurface()->appendRenderPasses(frame); | 517 renderSurfaceLayer->renderSurface()->appendRenderPasses(frame); |
526 } | 518 } |
527 | 519 |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
770 removeRenderPassesRecursive(renderPassQuad->render_pass_id, frame); | 762 removeRenderPassesRecursive(renderPassQuad->render_pass_id, frame); |
771 it = frame.renderPasses.size() - positionFromEnd; | 763 it = frame.renderPasses.size() - positionFromEnd; |
772 DCHECK(it >= 0); | 764 DCHECK(it >= 0); |
773 } | 765 } |
774 } | 766 } |
775 } | 767 } |
776 | 768 |
777 bool LayerTreeHostImpl::prepareToDraw(FrameData& frame) | 769 bool LayerTreeHostImpl::prepareToDraw(FrameData& frame) |
778 { | 770 { |
779 TRACE_EVENT0("cc", "LayerTreeHostImpl::prepareToDraw"); | 771 TRACE_EVENT0("cc", "LayerTreeHostImpl::prepareToDraw"); |
780 DCHECK(canDraw()); | |
781 | 772 |
782 if (m_tileManager) | 773 if (m_tileManager) |
783 m_tileManager->CheckForCompletedSetPixels(); | 774 m_tileManager->CheckForCompletedSetPixels(); |
784 | 775 |
785 frame.renderSurfaceLayerList = &m_renderSurfaceLayerList; | 776 frame.renderSurfaceLayerList = &m_renderSurfaceLayerList; |
786 frame.renderPasses.clear(); | 777 frame.renderPasses.clear(); |
787 frame.renderPassesById.clear(); | 778 frame.renderPassesById.clear(); |
788 frame.willDrawLayers.clear(); | 779 frame.willDrawLayers.clear(); |
789 | 780 |
790 if (!calculateRenderPasses(frame)) | 781 if (!calculateRenderPasses(frame)) |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1199 rootScrollLayer()->setMaxScrollOffset(gfx::ToFlooredVector2d(maxScroll)); | 1190 rootScrollLayer()->setMaxScrollOffset(gfx::ToFlooredVector2d(maxScroll)); |
1200 } | 1191 } |
1201 | 1192 |
1202 void LayerTreeHostImpl::setNeedsRedraw() | 1193 void LayerTreeHostImpl::setNeedsRedraw() |
1203 { | 1194 { |
1204 m_client->setNeedsRedrawOnImplThread(); | 1195 m_client->setNeedsRedrawOnImplThread(); |
1205 } | 1196 } |
1206 | 1197 |
1207 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() | 1198 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() |
1208 { | 1199 { |
1209 // TODO(enne): See http://crbug.com/164949. This function should really | |
1210 // just call updateDrawProperties(), but that breaks a number of | |
1211 // impl transform tests that don't expect the tree to be updated. | |
1212 if (!rootLayer()) | |
1213 return false; | |
1214 if (!m_renderer) | |
1215 return false; | |
1216 | |
1217 // We need both a non-empty render surface layer list and a root render | |
1218 // surface to be able to iterate over the visible layers. | |
1219 if (m_renderSurfaceLayerList.size() && rootLayer()->renderSurface()) | |
1220 return true; | |
1221 | |
1222 // If we are called after setRootLayer() but before prepareToDraw(), we need | |
1223 // to recalculate the visible layers. This prevents being unable to scroll | |
1224 // during part of a commit. | |
1225 setNeedsUpdateDrawProperties(); | |
1226 updateDrawProperties(); | 1200 updateDrawProperties(); |
1227 | |
1228 return m_renderSurfaceLayerList.size(); | 1201 return m_renderSurfaceLayerList.size(); |
1229 } | 1202 } |
1230 | 1203 |
1231 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) | 1204 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) |
1232 { | 1205 { |
1233 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); | 1206 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); |
1234 | 1207 |
1235 DCHECK(!currentlyScrollingLayer()); | 1208 DCHECK(!currentlyScrollingLayer()); |
1236 clearCurrentlyScrollingLayer(); | 1209 clearCurrentlyScrollingLayer(); |
1237 | 1210 |
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1736 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); | 1709 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); |
1737 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1710 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
1738 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1711 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
1739 m_client->setNeedsRedrawOnImplThread(); | 1712 m_client->setNeedsRedrawOnImplThread(); |
1740 | 1713 |
1741 for (size_t i = 0; i < layer->children().size(); ++i) | 1714 for (size_t i = 0; i < layer->children().size(); ++i) |
1742 animateScrollbarsRecursive(layer->children()[i], time); | 1715 animateScrollbarsRecursive(layer->children()[i], time); |
1743 } | 1716 } |
1744 | 1717 |
1745 } // namespace cc | 1718 } // namespace cc |
OLD | NEW |