Chromium Code Reviews| 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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 896 rootLayer()->resetAllChangeTrackingForSubtree(); | 887 rootLayer()->resetAllChangeTrackingForSubtree(); |
| 897 } | 888 } |
| 898 | 889 |
| 899 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame) | 890 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame) |
| 900 { | 891 { |
| 901 for (size_t i = 0; i < frame.willDrawLayers.size(); ++i) | 892 for (size_t i = 0; i < frame.willDrawLayers.size(); ++i) |
| 902 frame.willDrawLayers[i]->didDraw(m_resourceProvider.get()); | 893 frame.willDrawLayers[i]->didDraw(m_resourceProvider.get()); |
| 903 | 894 |
| 904 // Once all layers have been drawn, pending texture uploads should no | 895 // Once all layers have been drawn, pending texture uploads should no |
| 905 // longer block future uploads. | 896 // longer block future uploads. |
| 906 m_resourceProvider->markPendingUploadsAsNonBlocking(); | 897 if (m_resourceProvider) |
| 898 m_resourceProvider->markPendingUploadsAsNonBlocking(); | |
| 907 } | 899 } |
| 908 | 900 |
| 909 void LayerTreeHostImpl::finishAllRendering() | 901 void LayerTreeHostImpl::finishAllRendering() |
| 910 { | 902 { |
| 911 if (m_renderer) | 903 if (m_renderer) |
| 912 m_renderer->finish(); | 904 m_renderer->finish(); |
| 913 } | 905 } |
| 914 | 906 |
| 915 bool LayerTreeHostImpl::isContextLost() | 907 bool LayerTreeHostImpl::isContextLost() |
| 916 { | 908 { |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1186 void LayerTreeHostImpl::setNeedsRedraw() | 1178 void LayerTreeHostImpl::setNeedsRedraw() |
| 1187 { | 1179 { |
| 1188 m_client->setNeedsRedrawOnImplThread(); | 1180 m_client->setNeedsRedrawOnImplThread(); |
| 1189 } | 1181 } |
| 1190 | 1182 |
| 1191 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() | 1183 bool LayerTreeHostImpl::ensureRenderSurfaceLayerList() |
| 1192 { | 1184 { |
| 1193 // TODO(enne): See http://crbug.com/164949. This function should really | 1185 // TODO(enne): See http://crbug.com/164949. This function should really |
| 1194 // just call updateDrawProperties(), but that breaks a number of | 1186 // just call updateDrawProperties(), but that breaks a number of |
| 1195 // impl transform tests that don't expect the tree to be updated. | 1187 // impl transform tests that don't expect the tree to be updated. |
| 1196 if (!rootLayer()) | 1188 |
| 1197 return false; | 1189 // TODO(nduca): Try to delete this before landing. |
|
enne (OOO)
2012/12/12 18:44:24
I just checked. This function can just call updat
| |
| 1198 if (!m_renderer) | |
| 1199 return false; | |
| 1200 | 1190 |
| 1201 // We need both a non-empty render surface layer list and a root render | 1191 // 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. | 1192 // surface to be able to iterate over the visible layers. |
| 1203 if (m_renderSurfaceLayerList.size() && rootLayer()->renderSurface()) | 1193 if (m_renderSurfaceLayerList.size() && rootLayer()->renderSurface()) |
| 1204 return true; | 1194 return true; |
| 1205 | 1195 |
| 1206 // If we are called after setRootLayer() but before prepareToDraw(), we need | 1196 // If we are called after setRootLayer() but before prepareToDraw(), we need |
| 1207 // to recalculate the visible layers. This prevents being unable to scroll | 1197 // to recalculate the visible layers. This prevents being unable to scroll |
| 1208 // during part of a commit. | 1198 // during part of a commit. |
| 1209 setNeedsUpdateDrawProperties(); | 1199 setNeedsUpdateDrawProperties(); |
| (...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1720 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio nController(); | 1710 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio nController(); |
| 1721 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1711 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
| 1722 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1712 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
| 1723 m_client->setNeedsRedrawOnImplThread(); | 1713 m_client->setNeedsRedrawOnImplThread(); |
| 1724 | 1714 |
| 1725 for (size_t i = 0; i < layer->children().size(); ++i) | 1715 for (size_t i = 0; i < layer->children().size(); ++i) |
| 1726 animateScrollbarsRecursive(layer->children()[i], time); | 1716 animateScrollbarsRecursive(layer->children()[i], time); |
| 1727 } | 1717 } |
| 1728 | 1718 |
| 1729 } // namespace cc | 1719 } // namespace cc |
| OLD | NEW |