| 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 |
| 386 void LayerTreeHostImpl::updateDrawProperties() | 393 void LayerTreeHostImpl::updateDrawProperties() |
| 387 { | 394 { |
| 388 if (!needsUpdateDrawProperties()) | 395 if (!needsUpdateDrawProperties()) |
| 389 return; | 396 return; |
| 390 | 397 |
| 391 m_renderSurfaceLayerList.clear(); | 398 m_renderSurfaceLayerList.clear(); |
| 392 m_needsUpdateDrawProperties = false; | 399 m_needsUpdateDrawProperties = false; |
| 393 | 400 |
| 394 if (!rootLayer()) | 401 if (!rootLayer()) |
| 395 return; | 402 return; |
| 396 | 403 |
| 397 if (!m_renderer) // For maxTextureSize. | 404 calculateRenderSurfaceLayerList(m_renderSurfaceLayerList); |
| 398 return; | 405 } |
| 399 | 406 |
| 400 if (rootScrollLayer()) | 407 void LayerTreeHostImpl::calculateRenderSurfaceLayerList(LayerList& renderSurface
LayerList) |
| 401 rootScrollLayer()->setImplTransform(implTransform()); | 408 { |
| 409 DCHECK(renderSurfaceLayerList.empty()); |
| 410 DCHECK(rootLayer()); |
| 411 DCHECK(m_renderer); // For maxTextureSize. |
| 412 { |
| 413 updateRootScrollLayerImplTransform(); |
| 402 | 414 |
| 403 { | |
| 404 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc"); | 415 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc"); |
| 405 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); | 416 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); |
| 406 LayerTreeHostCommon::calculateDrawProperties(rootLayer(), deviceViewport
Size(), m_deviceScaleFactor, pageScaleFactor, rendererCapabilities().maxTextureS
ize, m_settings.canUseLCDText, m_renderSurfaceLayerList); | 417 LayerTreeHostCommon::calculateDrawProperties(rootLayer(), deviceViewport
Size(), m_deviceScaleFactor, pageScaleFactor, rendererCapabilities().maxTextureS
ize, m_settings.canUseLCDText, renderSurfaceLayerList); |
| 407 } | 418 } |
| 408 } | 419 } |
| 409 | 420 |
| 410 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) | 421 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) |
| 411 { | 422 { |
| 412 RenderPass* pass = renderPass.get(); | 423 RenderPass* pass = renderPass.get(); |
| 413 renderPasses.push_back(pass); | 424 renderPasses.push_back(pass); |
| 414 renderPassesById.set(pass->id, renderPass.Pass()); | 425 renderPassesById.set(pass->id, renderPass.Pass()); |
| 415 } | 426 } |
| 416 | 427 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 quad->SetNew(sharedQuadState, layerRect, screenBackgroundColor); | 508 quad->SetNew(sharedQuadState, layerRect, screenBackgroundColor); |
| 498 quadCuller.append(quad.PassAs<DrawQuad>(), appendQuadsData); | 509 quadCuller.append(quad.PassAs<DrawQuad>(), appendQuadsData); |
| 499 } | 510 } |
| 500 } | 511 } |
| 501 | 512 |
| 502 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) | 513 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
| 503 { | 514 { |
| 504 DCHECK(frame.renderPasses.empty()); | 515 DCHECK(frame.renderPasses.empty()); |
| 505 | 516 |
| 506 updateDrawProperties(); | 517 updateDrawProperties(); |
| 507 if (!canDraw()) | |
| 508 return false; | |
| 509 | |
| 510 trackDamageForAllSurfaces(rootLayer(), *frame.renderSurfaceLayerList); | 518 trackDamageForAllSurfaces(rootLayer(), *frame.renderSurfaceLayerList); |
| 511 | 519 |
| 512 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac
eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList
->size())); | 520 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac
eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList
->size())); |
| 513 | 521 |
| 514 // Create the render passes in dependency order. | 522 // Create the render passes in dependency order. |
| 515 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd
ex >= 0 ; --surfaceIndex) { | 523 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd
ex >= 0 ; --surfaceIndex) { |
| 516 LayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfaceI
ndex]; | 524 LayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfaceI
ndex]; |
| 517 renderSurfaceLayer->renderSurface()->appendRenderPasses(frame); | 525 renderSurfaceLayer->renderSurface()->appendRenderPasses(frame); |
| 518 } | 526 } |
| 519 | 527 |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 762 removeRenderPassesRecursive(renderPassQuad->render_pass_id, frame); | 770 removeRenderPassesRecursive(renderPassQuad->render_pass_id, frame); |
| 763 it = frame.renderPasses.size() - positionFromEnd; | 771 it = frame.renderPasses.size() - positionFromEnd; |
| 764 DCHECK(it >= 0); | 772 DCHECK(it >= 0); |
| 765 } | 773 } |
| 766 } | 774 } |
| 767 } | 775 } |
| 768 | 776 |
| 769 bool LayerTreeHostImpl::prepareToDraw(FrameData& frame) | 777 bool LayerTreeHostImpl::prepareToDraw(FrameData& frame) |
| 770 { | 778 { |
| 771 TRACE_EVENT0("cc", "LayerTreeHostImpl::prepareToDraw"); | 779 TRACE_EVENT0("cc", "LayerTreeHostImpl::prepareToDraw"); |
| 780 DCHECK(canDraw()); |
| 772 | 781 |
| 773 if (m_tileManager) | 782 if (m_tileManager) |
| 774 m_tileManager->CheckForCompletedSetPixels(); | 783 m_tileManager->CheckForCompletedSetPixels(); |
| 775 | 784 |
| 776 frame.renderSurfaceLayerList = &m_renderSurfaceLayerList; | 785 frame.renderSurfaceLayerList = &m_renderSurfaceLayerList; |
| 777 frame.renderPasses.clear(); | 786 frame.renderPasses.clear(); |
| 778 frame.renderPassesById.clear(); | 787 frame.renderPassesById.clear(); |
| 779 frame.willDrawLayers.clear(); | 788 frame.willDrawLayers.clear(); |
| 780 | 789 |
| 781 if (!calculateRenderPasses(frame)) | 790 if (!calculateRenderPasses(frame)) |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1190 rootScrollLayer()->setMaxScrollOffset(gfx::ToFlooredVector2d(maxScroll)); | 1199 rootScrollLayer()->setMaxScrollOffset(gfx::ToFlooredVector2d(maxScroll)); |
| 1191 } | 1200 } |
| 1192 | 1201 |
| 1193 void LayerTreeHostImpl::setNeedsRedraw() | 1202 void LayerTreeHostImpl::setNeedsRedraw() |
| 1194 { | 1203 { |
| 1195 m_client->setNeedsRedrawOnImplThread(); | 1204 m_client->setNeedsRedrawOnImplThread(); |
| 1196 } | 1205 } |
| 1197 | 1206 |
| 1198 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() | 1207 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() |
| 1199 { | 1208 { |
| 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(); |
| 1200 updateDrawProperties(); | 1226 updateDrawProperties(); |
| 1227 |
| 1201 return m_renderSurfaceLayerList.size(); | 1228 return m_renderSurfaceLayerList.size(); |
| 1202 } | 1229 } |
| 1203 | 1230 |
| 1204 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) | 1231 InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp
ortPoint, InputHandlerClient::ScrollInputType type) |
| 1205 { | 1232 { |
| 1206 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); | 1233 TRACE_EVENT0("cc", "LayerTreeHostImpl::scrollBegin"); |
| 1207 | 1234 |
| 1208 DCHECK(!currentlyScrollingLayer()); | 1235 DCHECK(!currentlyScrollingLayer()); |
| 1209 clearCurrentlyScrollingLayer(); | 1236 clearCurrentlyScrollingLayer(); |
| 1210 | 1237 |
| (...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1709 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); | 1736 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); |
| 1710 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1737 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
| 1711 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1738 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
| 1712 m_client->setNeedsRedrawOnImplThread(); | 1739 m_client->setNeedsRedrawOnImplThread(); |
| 1713 | 1740 |
| 1714 for (size_t i = 0; i < layer->children().size(); ++i) | 1741 for (size_t i = 0; i < layer->children().size(); ++i) |
| 1715 animateScrollbarsRecursive(layer->children()[i], time); | 1742 animateScrollbarsRecursive(layer->children()[i], time); |
| 1716 } | 1743 } |
| 1717 | 1744 |
| 1718 } // namespace cc | 1745 } // namespace cc |
| OLD | NEW |