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