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 "config.h" | 5 #include "config.h" |
6 | 6 |
7 #include "CCLayerTreeHostImpl.h" | 7 #include "CCLayerTreeHostImpl.h" |
8 | 8 |
9 #include "CCAppendQuadsData.h" | 9 #include "CCAppendQuadsData.h" |
10 #include "CCDamageTracker.h" | 10 #include "CCDamageTracker.h" |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 // We animated if we either ticked a running animation, or started a new ani
mation. | 348 // We animated if we either ticked a running animation, or started a new ani
mation. |
349 if (hadActiveAnimation || startedAnimation) | 349 if (hadActiveAnimation || startedAnimation) |
350 didAnimate = true; | 350 didAnimate = true; |
351 | 351 |
352 // If the current controller still has an active animation, we must continue
animating layers. | 352 // If the current controller still has an active animation, we must continue
animating layers. |
353 if (currentController->hasActiveAnimation()) | 353 if (currentController->hasActiveAnimation()) |
354 subtreeNeedsAnimateLayers = true; | 354 subtreeNeedsAnimateLayers = true; |
355 | 355 |
356 for (size_t i = 0; i < current->children().size(); ++i) { | 356 for (size_t i = 0; i < current->children().size(); ++i) { |
357 bool childNeedsAnimateLayers = false; | 357 bool childNeedsAnimateLayers = false; |
358 animateLayersRecursive(current->children()[i].get(), monotonicTime, wall
ClockTime, events, didAnimate, childNeedsAnimateLayers); | 358 animateLayersRecursive(current->children()[i], monotonicTime, wallClockT
ime, events, didAnimate, childNeedsAnimateLayers); |
359 if (childNeedsAnimateLayers) | 359 if (childNeedsAnimateLayers) |
360 subtreeNeedsAnimateLayers = true; | 360 subtreeNeedsAnimateLayers = true; |
361 } | 361 } |
362 | 362 |
363 needsAnimateLayers = subtreeNeedsAnimateLayers; | 363 needsAnimateLayers = subtreeNeedsAnimateLayers; |
364 } | 364 } |
365 | 365 |
366 void CCLayerTreeHostImpl::setBackgroundTickingEnabled(bool enabled) | 366 void CCLayerTreeHostImpl::setBackgroundTickingEnabled(bool enabled) |
367 { | 367 { |
368 // Lazily create the timeSource adapter so that we can vary the interval for
testing. | 368 // Lazily create the timeSource adapter so that we can vary the interval for
testing. |
(...skipping 28 matching lines...) Expand all Loading... |
397 if (removeIndex == notFound) | 397 if (removeIndex == notFound) |
398 return; | 398 return; |
399 | 399 |
400 const CCRenderPass* removedPass = frame.renderPasses[removeIndex]; | 400 const CCRenderPass* removedPass = frame.renderPasses[removeIndex]; |
401 frame.renderPasses.remove(removeIndex); | 401 frame.renderPasses.remove(removeIndex); |
402 | 402 |
403 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. | 403 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. |
404 const CCQuadList& quadList = removedPass->quadList(); | 404 const CCQuadList& quadList = removedPass->quadList(); |
405 CCQuadList::constBackToFrontIterator quadListIterator = quadList.backToFront
Begin(); | 405 CCQuadList::constBackToFrontIterator quadListIterator = quadList.backToFront
Begin(); |
406 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { | 406 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
407 CCDrawQuad* currentQuad = (*quadListIterator).get(); | 407 CCDrawQuad* currentQuad = (*quadListIterator); |
408 if (currentQuad->material() != CCDrawQuad::RenderPass) | 408 if (currentQuad->material() != CCDrawQuad::RenderPass) |
409 continue; | 409 continue; |
410 | 410 |
411 CCRenderPass::Id nextRemoveRenderPassId = CCRenderPassDrawQuad::material
Cast(currentQuad)->renderPassId(); | 411 CCRenderPass::Id nextRemoveRenderPassId = CCRenderPassDrawQuad::material
Cast(currentQuad)->renderPassId(); |
412 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); | 412 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); |
413 } | 413 } |
414 } | 414 } |
415 | 415 |
416 bool CCLayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRender
Pass(const CCRenderPassDrawQuad& quad, const FrameData&) const | 416 bool CCLayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRender
Pass(const CCRenderPassDrawQuad& quad, const FrameData&) const |
417 { | 417 { |
418 return quad.contentsChangedSinceLastFrame().isEmpty() && m_renderer.haveCach
edResourcesForRenderPassId(quad.renderPassId()); | 418 return quad.contentsChangedSinceLastFrame().isEmpty() && m_renderer.haveCach
edResourcesForRenderPassId(quad.renderPassId()); |
419 } | 419 } |
420 | 420 |
421 bool CCLayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(co
nst CCRenderPassDrawQuad& quad, const FrameData& frame) const | 421 bool CCLayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(co
nst CCRenderPassDrawQuad& quad, const FrameData& frame) const |
422 { | 422 { |
423 const CCRenderPass* renderPass = findRenderPassById(quad.renderPassId(), fra
me); | 423 const CCRenderPass* renderPass = findRenderPassById(quad.renderPassId(), fra
me); |
424 size_t passIndex = frame.renderPasses.find(renderPass); | 424 size_t passIndex = frame.renderPasses.find(renderPass); |
425 | 425 |
426 bool renderPassAlreadyRemoved = passIndex == notFound; | 426 bool renderPassAlreadyRemoved = passIndex == notFound; |
427 if (renderPassAlreadyRemoved) | 427 if (renderPassAlreadyRemoved) |
428 return false; | 428 return false; |
429 | 429 |
430 // If any quad or RenderPass draws into this RenderPass, then keep it. | 430 // If any quad or RenderPass draws into this RenderPass, then keep it. |
431 const CCQuadList& quadList = frame.renderPasses[passIndex]->quadList(); | 431 const CCQuadList& quadList = frame.renderPasses[passIndex]->quadList(); |
432 for (CCQuadList::constBackToFrontIterator quadListIterator = quadList.backTo
FrontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator)
{ | 432 for (CCQuadList::constBackToFrontIterator quadListIterator = quadList.backTo
FrontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator)
{ |
433 CCDrawQuad* currentQuad = quadListIterator->get(); | 433 CCDrawQuad* currentQuad = *quadListIterator; |
434 | 434 |
435 if (currentQuad->material() != CCDrawQuad::RenderPass) | 435 if (currentQuad->material() != CCDrawQuad::RenderPass) |
436 return false; | 436 return false; |
437 | 437 |
438 const CCRenderPass* contributingPass = findRenderPassById(CCRenderPassDr
awQuad::materialCast(currentQuad)->renderPassId(), frame); | 438 const CCRenderPass* contributingPass = findRenderPassById(CCRenderPassDr
awQuad::materialCast(currentQuad)->renderPassId(), frame); |
439 if (frame.renderPasses.contains(contributingPass)) | 439 if (frame.renderPasses.contains(contributingPass)) |
440 return false; | 440 return false; |
441 } | 441 } |
442 return true; | 442 return true; |
443 } | 443 } |
444 | 444 |
445 // Defined for linking tests. | 445 // Defined for linking tests. |
446 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR
enderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameData&); | 446 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR
enderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameData&); |
447 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR
enderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); | 447 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR
enderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); |
448 | 448 |
449 // static | 449 // static |
450 template<typename RenderPassCuller> | 450 template<typename RenderPassCuller> |
451 void CCLayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData&
frame) | 451 void CCLayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData&
frame) |
452 { | 452 { |
453 for (size_t it = culler.renderPassListBegin(frame.renderPasses); it != culle
r.renderPassListEnd(frame.renderPasses); it = culler.renderPassListNext(it)) { | 453 for (size_t it = culler.renderPassListBegin(frame.renderPasses); it != culle
r.renderPassListEnd(frame.renderPasses); it = culler.renderPassListNext(it)) { |
454 const CCRenderPass* currentPass = frame.renderPasses[it]; | 454 const CCRenderPass* currentPass = frame.renderPasses[it]; |
455 const CCQuadList& quadList = currentPass->quadList(); | 455 const CCQuadList& quadList = currentPass->quadList(); |
456 CCQuadList::constBackToFrontIterator quadListIterator = quadList.backToF
rontBegin(); | 456 CCQuadList::constBackToFrontIterator quadListIterator = quadList.backToF
rontBegin(); |
457 | 457 |
458 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator
) { | 458 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator
) { |
459 CCDrawQuad* currentQuad = quadListIterator->get(); | 459 CCDrawQuad* currentQuad = *quadListIterator; |
460 | 460 |
461 if (currentQuad->material() != CCDrawQuad::RenderPass) | 461 if (currentQuad->material() != CCDrawQuad::RenderPass) |
462 continue; | 462 continue; |
463 | 463 |
464 CCRenderPassDrawQuad* renderPassQuad = static_cast<CCRenderPassDrawQ
uad*>(currentQuad); | 464 CCRenderPassDrawQuad* renderPassQuad = static_cast<CCRenderPassDrawQ
uad*>(currentQuad); |
465 if (!culler.shouldRemoveRenderPass(*renderPassQuad, frame)) | 465 if (!culler.shouldRemoveRenderPass(*renderPassQuad, frame)) |
466 continue; | 466 continue; |
467 | 467 |
468 // We are changing the vector in the middle of iteration. Because we | 468 // We are changing the vector in the middle of iteration. Because we |
469 // delete render passes that draw into the current pass, we are | 469 // delete render passes that draw into the current pass, we are |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 | 601 |
602 static CCLayerImpl* findRootScrollLayer(CCLayerImpl* layer) | 602 static CCLayerImpl* findRootScrollLayer(CCLayerImpl* layer) |
603 { | 603 { |
604 if (!layer) | 604 if (!layer) |
605 return 0; | 605 return 0; |
606 | 606 |
607 if (layer->scrollable()) | 607 if (layer->scrollable()) |
608 return layer; | 608 return layer; |
609 | 609 |
610 for (size_t i = 0; i < layer->children().size(); ++i) { | 610 for (size_t i = 0; i < layer->children().size(); ++i) { |
611 CCLayerImpl* found = findRootScrollLayer(layer->children()[i].get()); | 611 CCLayerImpl* found = findRootScrollLayer(layer->children()[i]); |
612 if (found) | 612 if (found) |
613 return found; | 613 return found; |
614 } | 614 } |
615 | 615 |
616 return 0; | 616 return 0; |
617 } | 617 } |
618 | 618 |
619 // Content layers can be either directly scrollable or contained in an outer | 619 // Content layers can be either directly scrollable or contained in an outer |
620 // scrolling layer which applies the scroll transform. Given a content layer, | 620 // scrolling layer which applies the scroll transform. Given a content layer, |
621 // this function returns the associated scroll layer if any. | 621 // this function returns the associated scroll layer if any. |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
740 return; | 740 return; |
741 | 741 |
742 if (layerImpl->scrollable()) { | 742 if (layerImpl->scrollable()) { |
743 // We need to convert impl-side scroll deltas to pageScale space. | 743 // We need to convert impl-side scroll deltas to pageScale space. |
744 FloatSize scrollDelta = layerImpl->scrollDelta(); | 744 FloatSize scrollDelta = layerImpl->scrollDelta(); |
745 scrollDelta.scale(pageScaleChange); | 745 scrollDelta.scale(pageScaleChange); |
746 layerImpl->setScrollDelta(scrollDelta); | 746 layerImpl->setScrollDelta(scrollDelta); |
747 } | 747 } |
748 | 748 |
749 for (size_t i = 0; i < layerImpl->children().size(); ++i) | 749 for (size_t i = 0; i < layerImpl->children().size(); ++i) |
750 adjustScrollsForPageScaleChange(layerImpl->children()[i].get(), pageScal
eChange); | 750 adjustScrollsForPageScaleChange(layerImpl->children()[i], pageScaleChang
e); |
751 } | 751 } |
752 | 752 |
753 void CCLayerTreeHostImpl::setDeviceScaleFactor(float deviceScaleFactor) | 753 void CCLayerTreeHostImpl::setDeviceScaleFactor(float deviceScaleFactor) |
754 { | 754 { |
755 if (deviceScaleFactor == m_deviceScaleFactor) | 755 if (deviceScaleFactor == m_deviceScaleFactor) |
756 return; | 756 return; |
757 m_deviceScaleFactor = deviceScaleFactor; | 757 m_deviceScaleFactor = deviceScaleFactor; |
758 | 758 |
759 updateMaxScrollPosition(); | 759 updateMaxScrollPosition(); |
760 } | 760 } |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1111 if (!layerImpl->scrollDelta().isZero()) { | 1111 if (!layerImpl->scrollDelta().isZero()) { |
1112 IntSize scrollDelta = flooredIntSize(layerImpl->scrollDelta()); | 1112 IntSize scrollDelta = flooredIntSize(layerImpl->scrollDelta()); |
1113 CCLayerTreeHostCommon::ScrollUpdateInfo scroll; | 1113 CCLayerTreeHostCommon::ScrollUpdateInfo scroll; |
1114 scroll.layerId = layerImpl->id(); | 1114 scroll.layerId = layerImpl->id(); |
1115 scroll.scrollDelta = scrollDelta; | 1115 scroll.scrollDelta = scrollDelta; |
1116 scrollInfo->scrolls.append(scroll); | 1116 scrollInfo->scrolls.append(scroll); |
1117 layerImpl->setSentScrollDelta(scrollDelta); | 1117 layerImpl->setSentScrollDelta(scrollDelta); |
1118 } | 1118 } |
1119 | 1119 |
1120 for (size_t i = 0; i < layerImpl->children().size(); ++i) | 1120 for (size_t i = 0; i < layerImpl->children().size(); ++i) |
1121 collectScrollDeltas(scrollInfo, layerImpl->children()[i].get()); | 1121 collectScrollDeltas(scrollInfo, layerImpl->children()[i]); |
1122 } | 1122 } |
1123 | 1123 |
1124 PassOwnPtr<CCScrollAndScaleSet> CCLayerTreeHostImpl::processScrollDeltas() | 1124 PassOwnPtr<CCScrollAndScaleSet> CCLayerTreeHostImpl::processScrollDeltas() |
1125 { | 1125 { |
1126 OwnPtr<CCScrollAndScaleSet> scrollInfo = adoptPtr(new CCScrollAndScaleSet())
; | 1126 OwnPtr<CCScrollAndScaleSet> scrollInfo = adoptPtr(new CCScrollAndScaleSet())
; |
1127 | 1127 |
1128 if (m_pinchGestureActive || m_pageScaleAnimation) { | 1128 if (m_pinchGestureActive || m_pageScaleAnimation) { |
1129 m_sentPageScaleDelta = scrollInfo->pageScaleDelta = 1; | 1129 m_sentPageScaleDelta = scrollInfo->pageScaleDelta = 1; |
1130 if (m_pinchGestureActive) | 1130 if (m_pinchGestureActive) |
1131 computePinchZoomDeltas(scrollInfo.get()); | 1131 computePinchZoomDeltas(scrollInfo.get()); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1196 | 1196 |
1197 void CCLayerTreeHostImpl::sendDidLoseContextRecursive(CCLayerImpl* current) | 1197 void CCLayerTreeHostImpl::sendDidLoseContextRecursive(CCLayerImpl* current) |
1198 { | 1198 { |
1199 ASSERT(current); | 1199 ASSERT(current); |
1200 current->didLoseContext(); | 1200 current->didLoseContext(); |
1201 if (current->maskLayer()) | 1201 if (current->maskLayer()) |
1202 sendDidLoseContextRecursive(current->maskLayer()); | 1202 sendDidLoseContextRecursive(current->maskLayer()); |
1203 if (current->replicaLayer()) | 1203 if (current->replicaLayer()) |
1204 sendDidLoseContextRecursive(current->replicaLayer()); | 1204 sendDidLoseContextRecursive(current->replicaLayer()); |
1205 for (size_t i = 0; i < current->children().size(); ++i) | 1205 for (size_t i = 0; i < current->children().size(); ++i) |
1206 sendDidLoseContextRecursive(current->children()[i].get()); | 1206 sendDidLoseContextRecursive(current->children()[i]); |
1207 } | 1207 } |
1208 | 1208 |
1209 static void clearRenderSurfacesOnCCLayerImplRecursive(CCLayerImpl* current) | 1209 static void clearRenderSurfacesOnCCLayerImplRecursive(CCLayerImpl* current) |
1210 { | 1210 { |
1211 ASSERT(current); | 1211 ASSERT(current); |
1212 for (size_t i = 0; i < current->children().size(); ++i) | 1212 for (size_t i = 0; i < current->children().size(); ++i) |
1213 clearRenderSurfacesOnCCLayerImplRecursive(current->children()[i].get()); | 1213 clearRenderSurfacesOnCCLayerImplRecursive(current->children()[i]); |
1214 current->clearRenderSurface(); | 1214 current->clearRenderSurface(); |
1215 } | 1215 } |
1216 | 1216 |
1217 void CCLayerTreeHostImpl::clearRenderSurfaces() | 1217 void CCLayerTreeHostImpl::clearRenderSurfaces() |
1218 { | 1218 { |
1219 clearRenderSurfacesOnCCLayerImplRecursive(m_rootLayerImpl.get()); | 1219 clearRenderSurfacesOnCCLayerImplRecursive(m_rootLayerImpl.get()); |
1220 m_renderSurfaceLayerList.clear(); | 1220 m_renderSurfaceLayerList.clear(); |
1221 } | 1221 } |
1222 | 1222 |
1223 std::string CCLayerTreeHostImpl::layerTreeAsText() const | 1223 std::string CCLayerTreeHostImpl::layerTreeAsText() const |
1224 { | 1224 { |
1225 std::string str; | 1225 std::string str; |
1226 if (m_rootLayerImpl) { | 1226 if (m_rootLayerImpl) { |
1227 str = m_rootLayerImpl->layerTreeAsText(); | 1227 str = m_rootLayerImpl->layerTreeAsText(); |
1228 str += "RenderSurfaces:\n"; | 1228 str += "RenderSurfaces:\n"; |
1229 dumpRenderSurfaces(&str, 1, m_rootLayerImpl.get()); | 1229 dumpRenderSurfaces(&str, 1, m_rootLayerImpl.get()); |
1230 } | 1230 } |
1231 return str; | 1231 return str; |
1232 } | 1232 } |
1233 | 1233 |
1234 void CCLayerTreeHostImpl::dumpRenderSurfaces(std::string* str, int indent, const
CCLayerImpl* layer) const | 1234 void CCLayerTreeHostImpl::dumpRenderSurfaces(std::string* str, int indent, const
CCLayerImpl* layer) const |
1235 { | 1235 { |
1236 if (layer->renderSurface()) | 1236 if (layer->renderSurface()) |
1237 layer->renderSurface()->dumpSurface(str, indent); | 1237 layer->renderSurface()->dumpSurface(str, indent); |
1238 | 1238 |
1239 for (size_t i = 0; i < layer->children().size(); ++i) | 1239 for (size_t i = 0; i < layer->children().size(); ++i) |
1240 dumpRenderSurfaces(str, indent, layer->children()[i].get()); | 1240 dumpRenderSurfaces(str, indent, layer->children()[i]); |
1241 } | 1241 } |
1242 | 1242 |
1243 int CCLayerTreeHostImpl::sourceAnimationFrameNumber() const | 1243 int CCLayerTreeHostImpl::sourceAnimationFrameNumber() const |
1244 { | 1244 { |
1245 return fpsCounter()->currentFrameNumber(); | 1245 return fpsCounter()->currentFrameNumber(); |
1246 } | 1246 } |
1247 | 1247 |
1248 void CCLayerTreeHostImpl::renderingStats(CCRenderingStats& stats) const | 1248 void CCLayerTreeHostImpl::renderingStats(CCRenderingStats& stats) const |
1249 { | 1249 { |
1250 stats.numFramesSentToScreen = fpsCounter()->currentFrameNumber(); | 1250 stats.numFramesSentToScreen = fpsCounter()->currentFrameNumber(); |
1251 stats.droppedFrameCount = fpsCounter()->droppedFrameCount(); | 1251 stats.droppedFrameCount = fpsCounter()->droppedFrameCount(); |
1252 } | 1252 } |
1253 | 1253 |
1254 void CCLayerTreeHostImpl::animateScrollbars(double monotonicTime) | 1254 void CCLayerTreeHostImpl::animateScrollbars(double monotonicTime) |
1255 { | 1255 { |
1256 animateScrollbarsRecursive(m_rootLayerImpl.get(), monotonicTime); | 1256 animateScrollbarsRecursive(m_rootLayerImpl.get(), monotonicTime); |
1257 } | 1257 } |
1258 | 1258 |
1259 void CCLayerTreeHostImpl::animateScrollbarsRecursive(CCLayerImpl* layer, double
monotonicTime) | 1259 void CCLayerTreeHostImpl::animateScrollbarsRecursive(CCLayerImpl* layer, double
monotonicTime) |
1260 { | 1260 { |
1261 if (!layer) | 1261 if (!layer) |
1262 return; | 1262 return; |
1263 | 1263 |
1264 CCScrollbarAnimationController* scrollbarController = layer->scrollbarAnimat
ionController(); | 1264 CCScrollbarAnimationController* scrollbarController = layer->scrollbarAnimat
ionController(); |
1265 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1265 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
1266 m_client->setNeedsRedrawOnImplThread(); | 1266 m_client->setNeedsRedrawOnImplThread(); |
1267 | 1267 |
1268 for (size_t i = 0; i < layer->children().size(); ++i) | 1268 for (size_t i = 0; i < layer->children().size(); ++i) |
1269 animateScrollbarsRecursive(layer->children()[i].get(), monotonicTime); | 1269 animateScrollbarsRecursive(layer->children()[i], monotonicTime); |
1270 } | 1270 } |
1271 | 1271 |
1272 } // namespace cc | 1272 } // namespace cc |
OLD | NEW |