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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 if (removeIndex == notFound) | 401 if (removeIndex == notFound) |
402 return; | 402 return; |
403 | 403 |
404 const CCRenderPass* removedPass = frame.renderPasses[removeIndex]; | 404 const CCRenderPass* removedPass = frame.renderPasses[removeIndex]; |
405 frame.renderPasses.remove(removeIndex); | 405 frame.renderPasses.remove(removeIndex); |
406 | 406 |
407 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. | 407 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. |
408 const CCQuadList& quadList = removedPass->quadList(); | 408 const CCQuadList& quadList = removedPass->quadList(); |
409 CCQuadList::constBackToFrontIterator quadListIterator = quadList.backToFront
Begin(); | 409 CCQuadList::constBackToFrontIterator quadListIterator = quadList.backToFront
Begin(); |
410 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { | 410 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
411 CCDrawQuad* currentQuad = (*quadListIterator).get(); | 411 CCDrawQuad* currentQuad = (*quadListIterator); |
412 if (currentQuad->material() != CCDrawQuad::RenderPass) | 412 if (currentQuad->material() != CCDrawQuad::RenderPass) |
413 continue; | 413 continue; |
414 | 414 |
415 CCRenderPass::Id nextRemoveRenderPassId = CCRenderPassDrawQuad::material
Cast(currentQuad)->renderPassId(); | 415 CCRenderPass::Id nextRemoveRenderPassId = CCRenderPassDrawQuad::material
Cast(currentQuad)->renderPassId(); |
416 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); | 416 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); |
417 } | 417 } |
418 } | 418 } |
419 | 419 |
420 bool CCLayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRender
Pass(const CCRenderPassDrawQuad& quad, const FrameData&) const | 420 bool CCLayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRender
Pass(const CCRenderPassDrawQuad& quad, const FrameData&) const |
421 { | 421 { |
422 return quad.contentsChangedSinceLastFrame().isEmpty() && m_renderer.haveCach
edResourcesForRenderPassId(quad.renderPassId()); | 422 return quad.contentsChangedSinceLastFrame().isEmpty() && m_renderer.haveCach
edResourcesForRenderPassId(quad.renderPassId()); |
423 } | 423 } |
424 | 424 |
425 bool CCLayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(co
nst CCRenderPassDrawQuad& quad, const FrameData& frame) const | 425 bool CCLayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(co
nst CCRenderPassDrawQuad& quad, const FrameData& frame) const |
426 { | 426 { |
427 const CCRenderPass* renderPass = findRenderPassById(quad.renderPassId(), fra
me); | 427 const CCRenderPass* renderPass = findRenderPassById(quad.renderPassId(), fra
me); |
428 size_t passIndex = frame.renderPasses.find(renderPass); | 428 size_t passIndex = frame.renderPasses.find(renderPass); |
429 | 429 |
430 bool renderPassAlreadyRemoved = passIndex == notFound; | 430 bool renderPassAlreadyRemoved = passIndex == notFound; |
431 if (renderPassAlreadyRemoved) | 431 if (renderPassAlreadyRemoved) |
432 return false; | 432 return false; |
433 | 433 |
434 // If any quad or RenderPass draws into this RenderPass, then keep it. | 434 // If any quad or RenderPass draws into this RenderPass, then keep it. |
435 const CCQuadList& quadList = frame.renderPasses[passIndex]->quadList(); | 435 const CCQuadList& quadList = frame.renderPasses[passIndex]->quadList(); |
436 for (CCQuadList::constBackToFrontIterator quadListIterator = quadList.backTo
FrontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator)
{ | 436 for (CCQuadList::constBackToFrontIterator quadListIterator = quadList.backTo
FrontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator)
{ |
437 CCDrawQuad* currentQuad = quadListIterator->get(); | 437 CCDrawQuad* currentQuad = *quadListIterator; |
438 | 438 |
439 if (currentQuad->material() != CCDrawQuad::RenderPass) | 439 if (currentQuad->material() != CCDrawQuad::RenderPass) |
440 return false; | 440 return false; |
441 | 441 |
442 const CCRenderPass* contributingPass = findRenderPassById(CCRenderPassDr
awQuad::materialCast(currentQuad)->renderPassId(), frame); | 442 const CCRenderPass* contributingPass = findRenderPassById(CCRenderPassDr
awQuad::materialCast(currentQuad)->renderPassId(), frame); |
443 if (frame.renderPasses.contains(contributingPass)) | 443 if (frame.renderPasses.contains(contributingPass)) |
444 return false; | 444 return false; |
445 } | 445 } |
446 return true; | 446 return true; |
447 } | 447 } |
448 | 448 |
449 // Defined for linking tests. | 449 // Defined for linking tests. |
450 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR
enderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameData&); | 450 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR
enderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameData&); |
451 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR
enderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); | 451 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR
enderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); |
452 | 452 |
453 // static | 453 // static |
454 template<typename RenderPassCuller> | 454 template<typename RenderPassCuller> |
455 void CCLayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData&
frame) | 455 void CCLayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData&
frame) |
456 { | 456 { |
457 for (size_t it = culler.renderPassListBegin(frame.renderPasses); it != culle
r.renderPassListEnd(frame.renderPasses); it = culler.renderPassListNext(it)) { | 457 for (size_t it = culler.renderPassListBegin(frame.renderPasses); it != culle
r.renderPassListEnd(frame.renderPasses); it = culler.renderPassListNext(it)) { |
458 const CCRenderPass* currentPass = frame.renderPasses[it]; | 458 const CCRenderPass* currentPass = frame.renderPasses[it]; |
459 const CCQuadList& quadList = currentPass->quadList(); | 459 const CCQuadList& quadList = currentPass->quadList(); |
460 CCQuadList::constBackToFrontIterator quadListIterator = quadList.backToF
rontBegin(); | 460 CCQuadList::constBackToFrontIterator quadListIterator = quadList.backToF
rontBegin(); |
461 | 461 |
462 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator
) { | 462 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator
) { |
463 CCDrawQuad* currentQuad = quadListIterator->get(); | 463 CCDrawQuad* currentQuad = *quadListIterator; |
464 | 464 |
465 if (currentQuad->material() != CCDrawQuad::RenderPass) | 465 if (currentQuad->material() != CCDrawQuad::RenderPass) |
466 continue; | 466 continue; |
467 | 467 |
468 CCRenderPassDrawQuad* renderPassQuad = static_cast<CCRenderPassDrawQ
uad*>(currentQuad); | 468 CCRenderPassDrawQuad* renderPassQuad = static_cast<CCRenderPassDrawQ
uad*>(currentQuad); |
469 if (!culler.shouldRemoveRenderPass(*renderPassQuad, frame)) | 469 if (!culler.shouldRemoveRenderPass(*renderPassQuad, frame)) |
470 continue; | 470 continue; |
471 | 471 |
472 // We are changing the vector in the middle of iteration. Because we | 472 // We are changing the vector in the middle of iteration. Because we |
473 // delete render passes that draw into the current pass, we are | 473 // delete render passes that draw into the current pass, we are |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
605 | 605 |
606 static CCLayerImpl* findRootScrollLayer(CCLayerImpl* layer) | 606 static CCLayerImpl* findRootScrollLayer(CCLayerImpl* layer) |
607 { | 607 { |
608 if (!layer) | 608 if (!layer) |
609 return 0; | 609 return 0; |
610 | 610 |
611 if (layer->scrollable()) | 611 if (layer->scrollable()) |
612 return layer; | 612 return layer; |
613 | 613 |
614 for (size_t i = 0; i < layer->children().size(); ++i) { | 614 for (size_t i = 0; i < layer->children().size(); ++i) { |
615 CCLayerImpl* found = findRootScrollLayer(layer->children()[i].get()); | 615 CCLayerImpl* found = findRootScrollLayer(layer->children()[i]); |
616 if (found) | 616 if (found) |
617 return found; | 617 return found; |
618 } | 618 } |
619 | 619 |
620 return 0; | 620 return 0; |
621 } | 621 } |
622 | 622 |
623 // Content layers can be either directly scrollable or contained in an outer | 623 // Content layers can be either directly scrollable or contained in an outer |
624 // scrolling layer which applies the scroll transform. Given a content layer, | 624 // scrolling layer which applies the scroll transform. Given a content layer, |
625 // this function returns the associated scroll layer if any. | 625 // this function returns the associated scroll layer if any. |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 return; | 750 return; |
751 | 751 |
752 if (layerImpl->scrollable()) { | 752 if (layerImpl->scrollable()) { |
753 // We need to convert impl-side scroll deltas to pageScale space. | 753 // We need to convert impl-side scroll deltas to pageScale space. |
754 FloatSize scrollDelta = layerImpl->scrollDelta(); | 754 FloatSize scrollDelta = layerImpl->scrollDelta(); |
755 scrollDelta.scale(pageScaleChange); | 755 scrollDelta.scale(pageScaleChange); |
756 layerImpl->setScrollDelta(scrollDelta); | 756 layerImpl->setScrollDelta(scrollDelta); |
757 } | 757 } |
758 | 758 |
759 for (size_t i = 0; i < layerImpl->children().size(); ++i) | 759 for (size_t i = 0; i < layerImpl->children().size(); ++i) |
760 adjustScrollsForPageScaleChange(layerImpl->children()[i].get(), pageScal
eChange); | 760 adjustScrollsForPageScaleChange(layerImpl->children()[i], pageScaleChang
e); |
761 } | 761 } |
762 | 762 |
763 void CCLayerTreeHostImpl::setDeviceScaleFactor(float deviceScaleFactor) | 763 void CCLayerTreeHostImpl::setDeviceScaleFactor(float deviceScaleFactor) |
764 { | 764 { |
765 if (deviceScaleFactor == m_deviceScaleFactor) | 765 if (deviceScaleFactor == m_deviceScaleFactor) |
766 return; | 766 return; |
767 m_deviceScaleFactor = deviceScaleFactor; | 767 m_deviceScaleFactor = deviceScaleFactor; |
768 | 768 |
769 updateMaxScrollPosition(); | 769 updateMaxScrollPosition(); |
770 } | 770 } |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1121 if (!layerImpl->scrollDelta().isZero()) { | 1121 if (!layerImpl->scrollDelta().isZero()) { |
1122 IntSize scrollDelta = flooredIntSize(layerImpl->scrollDelta()); | 1122 IntSize scrollDelta = flooredIntSize(layerImpl->scrollDelta()); |
1123 CCLayerTreeHostCommon::ScrollUpdateInfo scroll; | 1123 CCLayerTreeHostCommon::ScrollUpdateInfo scroll; |
1124 scroll.layerId = layerImpl->id(); | 1124 scroll.layerId = layerImpl->id(); |
1125 scroll.scrollDelta = scrollDelta; | 1125 scroll.scrollDelta = scrollDelta; |
1126 scrollInfo->scrolls.append(scroll); | 1126 scrollInfo->scrolls.append(scroll); |
1127 layerImpl->setSentScrollDelta(scrollDelta); | 1127 layerImpl->setSentScrollDelta(scrollDelta); |
1128 } | 1128 } |
1129 | 1129 |
1130 for (size_t i = 0; i < layerImpl->children().size(); ++i) | 1130 for (size_t i = 0; i < layerImpl->children().size(); ++i) |
1131 collectScrollDeltas(scrollInfo, layerImpl->children()[i].get()); | 1131 collectScrollDeltas(scrollInfo, layerImpl->children()[i]); |
1132 } | 1132 } |
1133 | 1133 |
1134 PassOwnPtr<CCScrollAndScaleSet> CCLayerTreeHostImpl::processScrollDeltas() | 1134 PassOwnPtr<CCScrollAndScaleSet> CCLayerTreeHostImpl::processScrollDeltas() |
1135 { | 1135 { |
1136 OwnPtr<CCScrollAndScaleSet> scrollInfo = adoptPtr(new CCScrollAndScaleSet())
; | 1136 OwnPtr<CCScrollAndScaleSet> scrollInfo = adoptPtr(new CCScrollAndScaleSet())
; |
1137 | 1137 |
1138 if (m_pinchGestureActive || m_pageScaleAnimation) { | 1138 if (m_pinchGestureActive || m_pageScaleAnimation) { |
1139 m_sentPageScaleDelta = scrollInfo->pageScaleDelta = 1; | 1139 m_sentPageScaleDelta = scrollInfo->pageScaleDelta = 1; |
1140 if (m_pinchGestureActive) | 1140 if (m_pinchGestureActive) |
1141 computePinchZoomDeltas(scrollInfo.get()); | 1141 computePinchZoomDeltas(scrollInfo.get()); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1206 | 1206 |
1207 void CCLayerTreeHostImpl::sendDidLoseContextRecursive(CCLayerImpl* current) | 1207 void CCLayerTreeHostImpl::sendDidLoseContextRecursive(CCLayerImpl* current) |
1208 { | 1208 { |
1209 ASSERT(current); | 1209 ASSERT(current); |
1210 current->didLoseContext(); | 1210 current->didLoseContext(); |
1211 if (current->maskLayer()) | 1211 if (current->maskLayer()) |
1212 sendDidLoseContextRecursive(current->maskLayer()); | 1212 sendDidLoseContextRecursive(current->maskLayer()); |
1213 if (current->replicaLayer()) | 1213 if (current->replicaLayer()) |
1214 sendDidLoseContextRecursive(current->replicaLayer()); | 1214 sendDidLoseContextRecursive(current->replicaLayer()); |
1215 for (size_t i = 0; i < current->children().size(); ++i) | 1215 for (size_t i = 0; i < current->children().size(); ++i) |
1216 sendDidLoseContextRecursive(current->children()[i].get()); | 1216 sendDidLoseContextRecursive(current->children()[i]); |
1217 } | 1217 } |
1218 | 1218 |
1219 static void clearRenderSurfacesOnCCLayerImplRecursive(CCLayerImpl* current) | 1219 static void clearRenderSurfacesOnCCLayerImplRecursive(CCLayerImpl* current) |
1220 { | 1220 { |
1221 ASSERT(current); | 1221 ASSERT(current); |
1222 for (size_t i = 0; i < current->children().size(); ++i) | 1222 for (size_t i = 0; i < current->children().size(); ++i) |
1223 clearRenderSurfacesOnCCLayerImplRecursive(current->children()[i].get()); | 1223 clearRenderSurfacesOnCCLayerImplRecursive(current->children()[i]); |
1224 current->clearRenderSurface(); | 1224 current->clearRenderSurface(); |
1225 } | 1225 } |
1226 | 1226 |
1227 void CCLayerTreeHostImpl::clearRenderSurfaces() | 1227 void CCLayerTreeHostImpl::clearRenderSurfaces() |
1228 { | 1228 { |
1229 clearRenderSurfacesOnCCLayerImplRecursive(m_rootLayerImpl.get()); | 1229 clearRenderSurfacesOnCCLayerImplRecursive(m_rootLayerImpl.get()); |
1230 m_renderSurfaceLayerList.clear(); | 1230 m_renderSurfaceLayerList.clear(); |
1231 } | 1231 } |
1232 | 1232 |
1233 std::string CCLayerTreeHostImpl::layerTreeAsText() const | 1233 std::string CCLayerTreeHostImpl::layerTreeAsText() const |
1234 { | 1234 { |
1235 std::string str; | 1235 std::string str; |
1236 if (m_rootLayerImpl) { | 1236 if (m_rootLayerImpl) { |
1237 str = m_rootLayerImpl->layerTreeAsText(); | 1237 str = m_rootLayerImpl->layerTreeAsText(); |
1238 str += "RenderSurfaces:\n"; | 1238 str += "RenderSurfaces:\n"; |
1239 dumpRenderSurfaces(&str, 1, m_rootLayerImpl.get()); | 1239 dumpRenderSurfaces(&str, 1, m_rootLayerImpl.get()); |
1240 } | 1240 } |
1241 return str; | 1241 return str; |
1242 } | 1242 } |
1243 | 1243 |
1244 void CCLayerTreeHostImpl::dumpRenderSurfaces(std::string* str, int indent, const
CCLayerImpl* layer) const | 1244 void CCLayerTreeHostImpl::dumpRenderSurfaces(std::string* str, int indent, const
CCLayerImpl* layer) const |
1245 { | 1245 { |
1246 if (layer->renderSurface()) | 1246 if (layer->renderSurface()) |
1247 layer->renderSurface()->dumpSurface(str, indent); | 1247 layer->renderSurface()->dumpSurface(str, indent); |
1248 | 1248 |
1249 for (size_t i = 0; i < layer->children().size(); ++i) | 1249 for (size_t i = 0; i < layer->children().size(); ++i) |
1250 dumpRenderSurfaces(str, indent, layer->children()[i].get()); | 1250 dumpRenderSurfaces(str, indent, layer->children()[i]); |
1251 } | 1251 } |
1252 | 1252 |
1253 int CCLayerTreeHostImpl::sourceAnimationFrameNumber() const | 1253 int CCLayerTreeHostImpl::sourceAnimationFrameNumber() const |
1254 { | 1254 { |
1255 return fpsCounter()->currentFrameNumber(); | 1255 return fpsCounter()->currentFrameNumber(); |
1256 } | 1256 } |
1257 | 1257 |
1258 void CCLayerTreeHostImpl::renderingStats(CCRenderingStats& stats) const | 1258 void CCLayerTreeHostImpl::renderingStats(CCRenderingStats& stats) const |
1259 { | 1259 { |
1260 stats.numFramesSentToScreen = fpsCounter()->currentFrameNumber(); | 1260 stats.numFramesSentToScreen = fpsCounter()->currentFrameNumber(); |
1261 stats.droppedFrameCount = fpsCounter()->droppedFrameCount(); | 1261 stats.droppedFrameCount = fpsCounter()->droppedFrameCount(); |
1262 } | 1262 } |
1263 | 1263 |
1264 void CCLayerTreeHostImpl::animateScrollbars(double monotonicTime) | 1264 void CCLayerTreeHostImpl::animateScrollbars(double monotonicTime) |
1265 { | 1265 { |
1266 animateScrollbarsRecursive(m_rootLayerImpl.get(), monotonicTime); | 1266 animateScrollbarsRecursive(m_rootLayerImpl.get(), monotonicTime); |
1267 } | 1267 } |
1268 | 1268 |
1269 void CCLayerTreeHostImpl::animateScrollbarsRecursive(CCLayerImpl* layer, double
monotonicTime) | 1269 void CCLayerTreeHostImpl::animateScrollbarsRecursive(CCLayerImpl* layer, double
monotonicTime) |
1270 { | 1270 { |
1271 if (!layer) | 1271 if (!layer) |
1272 return; | 1272 return; |
1273 | 1273 |
1274 CCScrollbarAnimationController* scrollbarController = layer->scrollbarAnimat
ionController(); | 1274 CCScrollbarAnimationController* scrollbarController = layer->scrollbarAnimat
ionController(); |
1275 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1275 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
1276 m_client->setNeedsRedrawOnImplThread(); | 1276 m_client->setNeedsRedrawOnImplThread(); |
1277 | 1277 |
1278 for (size_t i = 0; i < layer->children().size(); ++i) | 1278 for (size_t i = 0; i < layer->children().size(); ++i) |
1279 animateScrollbarsRecursive(layer->children()[i].get(), monotonicTime); | 1279 animateScrollbarsRecursive(layer->children()[i], monotonicTime); |
1280 } | 1280 } |
1281 | 1281 |
1282 } // namespace cc | 1282 } // namespace cc |
OLD | NEW |