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 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 | 403 |
404 { | 404 { |
405 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc"); | 405 TRACE_EVENT0("cc", "LayerTreeHostImpl::calcDrawEtc"); |
406 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); | 406 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); |
407 LayerTreeHostCommon::calculateDrawProperties(rootLayer(), deviceViewport
Size(), m_deviceScaleFactor, pageScaleFactor, rendererCapabilities().maxTextureS
ize, m_settings.canUseLCDText, m_renderSurfaceLayerList); | 407 LayerTreeHostCommon::calculateDrawProperties(rootLayer(), deviceViewport
Size(), m_deviceScaleFactor, pageScaleFactor, rendererCapabilities().maxTextureS
ize, m_settings.canUseLCDText, m_renderSurfaceLayerList); |
408 } | 408 } |
409 } | 409 } |
410 | 410 |
411 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) | 411 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) |
412 { | 412 { |
413 RenderPass* pass = renderPass.get(); | 413 renderPassesById[renderPass->id] = renderPass.get(); |
414 renderPasses.push_back(pass); | 414 renderPasses.append(renderPass.Pass()); |
415 renderPassesById.set(pass->id, renderPass.Pass()); | |
416 } | 415 } |
417 | 416 |
418 static void appendQuadsForLayer(RenderPass* targetRenderPass, LayerImpl* layer,
OcclusionTrackerImpl& occlusionTracker, AppendQuadsData& appendQuadsData) | 417 static void appendQuadsForLayer(RenderPass* targetRenderPass, LayerImpl* layer,
OcclusionTrackerImpl& occlusionTracker, AppendQuadsData& appendQuadsData) |
419 { | 418 { |
420 bool forSurface = false; | 419 bool forSurface = false; |
421 QuadCuller quadCuller(targetRenderPass->quad_list, | 420 QuadCuller quadCuller(targetRenderPass->quad_list, |
422 targetRenderPass->shared_quad_state_list, | 421 targetRenderPass->shared_quad_state_list, |
423 layer, | 422 layer, |
424 occlusionTracker, | 423 occlusionTracker, |
425 layer->showDebugBorders(), | 424 layer->showDebugBorders(), |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 // Skip the quad culler and just append the quads directly to avoid | 494 // Skip the quad culler and just append the quads directly to avoid |
496 // occlusion checks. | 495 // occlusion checks. |
497 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); | 496 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); |
498 quad->SetNew(sharedQuadState, layerRect, screenBackgroundColor); | 497 quad->SetNew(sharedQuadState, layerRect, screenBackgroundColor); |
499 quadCuller.append(quad.PassAs<DrawQuad>(), appendQuadsData); | 498 quadCuller.append(quad.PassAs<DrawQuad>(), appendQuadsData); |
500 } | 499 } |
501 } | 500 } |
502 | 501 |
503 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) | 502 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
504 { | 503 { |
505 DCHECK(frame.renderPasses.empty()); | 504 DCHECK(frame.renderPasses.isEmpty()); |
506 | 505 |
507 updateDrawProperties(); | 506 updateDrawProperties(); |
508 if (!canDraw()) | 507 if (!canDraw()) |
509 return false; | 508 return false; |
510 | 509 |
511 trackDamageForAllSurfaces(rootLayer(), *frame.renderSurfaceLayerList); | 510 trackDamageForAllSurfaces(rootLayer(), *frame.renderSurfaceLayerList); |
512 | 511 |
513 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac
eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList
->size())); | 512 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac
eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList
->size())); |
514 | 513 |
515 // Create the render passes in dependency order. | 514 // Create the render passes in dependency order. |
(...skipping 15 matching lines...) Expand all Loading... |
531 typedef LayerIterator<LayerImpl, std::vector<LayerImpl*>, RenderSurfaceImpl,
LayerIteratorActions::FrontToBack> LayerIteratorType; | 530 typedef LayerIterator<LayerImpl, std::vector<LayerImpl*>, RenderSurfaceImpl,
LayerIteratorActions::FrontToBack> LayerIteratorType; |
532 | 531 |
533 // Typically when we are missing a texture and use a checkerboard quad, we s
till draw the frame. However when the layer being | 532 // Typically when we are missing a texture and use a checkerboard quad, we s
till draw the frame. However when the layer being |
534 // checkerboarded is moving due to an impl-animation, we drop the frame to a
void flashing due to the texture suddenly appearing | 533 // checkerboarded is moving due to an impl-animation, we drop the frame to a
void flashing due to the texture suddenly appearing |
535 // in the future. | 534 // in the future. |
536 bool drawFrame = true; | 535 bool drawFrame = true; |
537 | 536 |
538 LayerIteratorType end = LayerIteratorType::end(frame.renderSurfaceLayerList)
; | 537 LayerIteratorType end = LayerIteratorType::end(frame.renderSurfaceLayerList)
; |
539 for (LayerIteratorType it = LayerIteratorType::begin(frame.renderSurfaceLaye
rList); it != end; ++it) { | 538 for (LayerIteratorType it = LayerIteratorType::begin(frame.renderSurfaceLaye
rList); it != end; ++it) { |
540 RenderPass::Id targetRenderPassId = it.targetRenderSurfaceLayer()->rende
rSurface()->renderPassId(); | 539 RenderPass::Id targetRenderPassId = it.targetRenderSurfaceLayer()->rende
rSurface()->renderPassId(); |
541 RenderPass* targetRenderPass = frame.renderPassesById.get(targetRenderPa
ssId); | 540 RenderPass* targetRenderPass = frame.renderPassesById[targetRenderPassId
]; |
542 | 541 |
543 occlusionTracker.enterLayer(it); | 542 occlusionTracker.enterLayer(it); |
544 | 543 |
545 AppendQuadsData appendQuadsData(targetRenderPass->id); | 544 AppendQuadsData appendQuadsData(targetRenderPass->id); |
546 | 545 |
547 if (it.representsContributingRenderSurface()) { | 546 if (it.representsContributingRenderSurface()) { |
548 RenderPass::Id contributingRenderPassId = it->renderSurface()->rende
rPassId(); | 547 RenderPass::Id contributingRenderPassId = it->renderSurface()->rende
rPassId(); |
549 RenderPass* contributingRenderPass = frame.renderPassesById.get(cont
ributingRenderPassId); | 548 RenderPass* contributingRenderPass = frame.renderPassesById[contribu
tingRenderPassId]; |
550 appendQuadsForRenderSurfaceLayer(targetRenderPass, *it, contributing
RenderPass, occlusionTracker, appendQuadsData); | 549 appendQuadsForRenderSurfaceLayer(targetRenderPass, *it, contributing
RenderPass, occlusionTracker, appendQuadsData); |
551 } else if (it.representsItself() && !it->visibleContentRect().IsEmpty())
{ | 550 } else if (it.representsItself() && !it->visibleContentRect().IsEmpty())
{ |
552 bool hasOcclusionFromOutsideTargetSurface; | 551 bool hasOcclusionFromOutsideTargetSurface; |
553 bool implDrawTransformIsUnknown = false; | 552 bool implDrawTransformIsUnknown = false; |
554 if (occlusionTracker.occluded(it->renderTarget(), it->visibleContent
Rect(), it->drawTransform(), implDrawTransformIsUnknown, it->drawableContentRect
(), &hasOcclusionFromOutsideTargetSurface)) | 553 if (occlusionTracker.occluded(it->renderTarget(), it->visibleContent
Rect(), it->drawTransform(), implDrawTransformIsUnknown, it->drawableContentRect
(), &hasOcclusionFromOutsideTargetSurface)) |
555 appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclu
sionFromOutsideTargetSurface; | 554 appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclu
sionFromOutsideTargetSurface; |
556 else { | 555 else { |
557 DCHECK_EQ(this->activeTree(), it->layerTreeImpl()); | 556 DCHECK_EQ(this->activeTree(), it->layerTreeImpl()); |
558 it->willDraw(m_resourceProvider.get()); | 557 it->willDraw(m_resourceProvider.get()); |
559 frame.willDrawLayers.push_back(*it); | 558 frame.willDrawLayers.push_back(*it); |
560 | 559 |
561 if (it->hasContributingDelegatedRenderPasses()) { | 560 if (it->hasContributingDelegatedRenderPasses()) { |
562 RenderPass::Id contributingRenderPassId = it->firstContribut
ingRenderPassId(); | 561 RenderPass::Id contributingRenderPassId = it->firstContribut
ingRenderPassId(); |
563 while (frame.renderPassesById.contains(contributingRenderPas
sId)) { | 562 while (frame.renderPassesById.find(contributingRenderPassId)
!= frame.renderPassesById.end()) { |
564 RenderPass* renderPass = frame.renderPassesById.get(cont
ributingRenderPassId); | 563 RenderPass* renderPass = frame.renderPassesById[contribu
tingRenderPassId]; |
565 | 564 |
566 AppendQuadsData appendQuadsData(renderPass->id); | 565 AppendQuadsData appendQuadsData(renderPass->id); |
567 appendQuadsForLayer(renderPass, *it, occlusionTracker, a
ppendQuadsData); | 566 appendQuadsForLayer(renderPass, *it, occlusionTracker, a
ppendQuadsData); |
568 | 567 |
569 contributingRenderPassId = it->nextContributingRenderPas
sId(contributingRenderPassId); | 568 contributingRenderPassId = it->nextContributingRenderPas
sId(contributingRenderPassId); |
570 } | 569 } |
571 } | 570 } |
572 | 571 |
573 appendQuadsForLayer(targetRenderPass, *it, occlusionTracker, app
endQuadsData); | 572 appendQuadsForLayer(targetRenderPass, *it, occlusionTracker, app
endQuadsData); |
574 } | 573 } |
(...skipping 11 matching lines...) Expand all Loading... |
586 drawFrame = false; | 585 drawFrame = false; |
587 } | 586 } |
588 | 587 |
589 occlusionTracker.leaveLayer(it); | 588 occlusionTracker.leaveLayer(it); |
590 } | 589 } |
591 | 590 |
592 #ifndef NDEBUG | 591 #ifndef NDEBUG |
593 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { | 592 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { |
594 for (size_t j = 0; j < frame.renderPasses[i]->quad_list.size(); ++j) | 593 for (size_t j = 0; j < frame.renderPasses[i]->quad_list.size(); ++j) |
595 DCHECK(frame.renderPasses[i]->quad_list[j]->shared_quad_state); | 594 DCHECK(frame.renderPasses[i]->quad_list[j]->shared_quad_state); |
596 DCHECK(frame.renderPassesById.contains(frame.renderPasses[i]->id)); | 595 DCHECK(frame.renderPassesById.find(frame.renderPasses[i]->id) |
| 596 != frame.renderPassesById.end()); |
597 } | 597 } |
598 #endif | 598 #endif |
599 | 599 |
600 if (!m_hasTransparentBackground) { | 600 if (!m_hasTransparentBackground) { |
601 frame.renderPasses.back()->has_transparent_background = false; | 601 frame.renderPasses.last()->has_transparent_background = false; |
602 appendQuadsToFillScreen(frame.renderPasses.back(), rootLayer(), m_backgr
oundColor, occlusionTracker); | 602 appendQuadsToFillScreen(frame.renderPasses.last(), rootLayer(), m_backgr
oundColor, occlusionTracker); |
603 } | 603 } |
604 | 604 |
605 if (drawFrame) | 605 if (drawFrame) |
606 occlusionTracker.overdrawMetrics().recordMetrics(this); | 606 occlusionTracker.overdrawMetrics().recordMetrics(this); |
607 | 607 |
608 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); | 608 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); |
609 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); | 609 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); |
610 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); | 610 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); |
611 | 611 |
612 return drawFrame; | 612 return drawFrame; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 // TODO(aelias): Hardcoding the first child here is weird. Think of | 655 // TODO(aelias): Hardcoding the first child here is weird. Think of |
656 // a cleaner way to get the contentBounds on the Impl side. | 656 // a cleaner way to get the contentBounds on the Impl side. |
657 if (!rootScrollLayer() || rootScrollLayer()->children().isEmpty()) | 657 if (!rootScrollLayer() || rootScrollLayer()->children().isEmpty()) |
658 return gfx::Size(); | 658 return gfx::Size(); |
659 return rootScrollLayer()->children()[0]->contentBounds(); | 659 return rootScrollLayer()->children()[0]->contentBounds(); |
660 } | 660 } |
661 | 661 |
662 static inline RenderPass* findRenderPassById(RenderPass::Id renderPassId, const
LayerTreeHostImpl::FrameData& frame) | 662 static inline RenderPass* findRenderPassById(RenderPass::Id renderPassId, const
LayerTreeHostImpl::FrameData& frame) |
663 { | 663 { |
664 RenderPassIdHashMap::const_iterator it = frame.renderPassesById.find(renderP
assId); | 664 RenderPassIdHashMap::const_iterator it = frame.renderPassesById.find(renderP
assId); |
665 DCHECK(it != frame.renderPassesById.end()); | 665 return it != frame.renderPassesById.end() ? it->second : NULL; |
666 return it->second; | |
667 } | 666 } |
668 | 667 |
669 static void removeRenderPassesRecursive(RenderPass::Id removeRenderPassId, Layer
TreeHostImpl::FrameData& frame) | 668 static void removeRenderPassesRecursive(RenderPass::Id removeRenderPassId, Layer
TreeHostImpl::FrameData& frame) |
670 { | 669 { |
671 RenderPass* removeRenderPass = findRenderPassById(removeRenderPassId, frame)
; | 670 RenderPass* removeRenderPass = findRenderPassById(removeRenderPassId, frame)
; |
| 671 // The pass was already removed by another quad - probably the original, and
we are the replica. |
| 672 if (!removeRenderPass) |
| 673 return; |
672 RenderPassList& renderPasses = frame.renderPasses; | 674 RenderPassList& renderPasses = frame.renderPasses; |
673 RenderPassList::iterator toRemove = std::find(renderPasses.begin(), renderPa
sses.end(), removeRenderPass); | 675 RenderPassList::iterator toRemove = std::find(renderPasses.begin(), renderPa
sses.end(), removeRenderPass); |
674 | 676 |
675 // The pass was already removed by another quad - probably the original, and
we are the replica. | 677 DCHECK(toRemove != renderPasses.end()); |
676 if (toRemove == renderPasses.end()) | |
677 return; | |
678 | 678 |
679 const RenderPass* removedPass = *toRemove; | 679 size_t index = toRemove - renderPasses.begin(); |
680 frame.renderPasses.erase(toRemove); | 680 scoped_ptr<RenderPass> removedPass = renderPasses.take(index); |
| 681 frame.renderPasses.remove(index); |
| 682 frame.renderPassesById.erase(removeRenderPassId); |
681 | 683 |
682 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. | 684 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. |
683 const QuadList& quadList = removedPass->quad_list; | 685 const QuadList& quadList = removedPass->quad_list; |
684 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBe
gin(); | 686 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBe
gin(); |
685 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { | 687 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
686 DrawQuad* currentQuad = (*quadListIterator); | 688 DrawQuad* currentQuad = (*quadListIterator); |
687 if (currentQuad->material != DrawQuad::RENDER_PASS) | 689 if (currentQuad->material != DrawQuad::RENDER_PASS) |
688 continue; | 690 continue; |
689 | 691 |
690 RenderPass::Id nextRemoveRenderPassId = RenderPassDrawQuad::MaterialCast
(currentQuad)->render_pass_id; | 692 RenderPass::Id nextRemoveRenderPassId = RenderPassDrawQuad::MaterialCast
(currentQuad)->render_pass_id; |
(...skipping 10 matching lines...) Expand all Loading... |
701 TRACE_EVENT0("cc", "CullRenderPassesWithCachedTextures have no texture")
; | 703 TRACE_EVENT0("cc", "CullRenderPassesWithCachedTextures have no texture")
; |
702 return false; | 704 return false; |
703 } | 705 } |
704 TRACE_EVENT0("cc", "CullRenderPassesWithCachedTextures dropped!"); | 706 TRACE_EVENT0("cc", "CullRenderPassesWithCachedTextures dropped!"); |
705 return true; | 707 return true; |
706 } | 708 } |
707 | 709 |
708 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(cons
t RenderPassDrawQuad& quad, const FrameData& frame) const | 710 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(cons
t RenderPassDrawQuad& quad, const FrameData& frame) const |
709 { | 711 { |
710 const RenderPass* renderPass = findRenderPassById(quad.render_pass_id, frame
); | 712 const RenderPass* renderPass = findRenderPassById(quad.render_pass_id, frame
); |
711 const RenderPassList& renderPasses = frame.renderPasses; | 713 if (!renderPass) |
712 RenderPassList::const_iterator foundPass = std::find(renderPasses.begin(), r
enderPasses.end(), renderPass); | |
713 | |
714 bool renderPassAlreadyRemoved = foundPass == renderPasses.end(); | |
715 if (renderPassAlreadyRemoved) | |
716 return false; | 714 return false; |
717 | 715 |
718 // If any quad or RenderPass draws into this RenderPass, then keep it. | 716 // If any quad or RenderPass draws into this RenderPass, then keep it. |
719 const QuadList& quadList = (*foundPass)->quad_list; | 717 const QuadList& quadList = renderPass->quad_list; |
720 for (QuadList::constBackToFrontIterator quadListIterator = quadList.backToFr
ontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { | 718 for (QuadList::constBackToFrontIterator quadListIterator = quadList.backToFr
ontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
721 DrawQuad* currentQuad = *quadListIterator; | 719 DrawQuad* currentQuad = *quadListIterator; |
722 | 720 |
723 if (currentQuad->material != DrawQuad::RENDER_PASS) | 721 if (currentQuad->material != DrawQuad::RENDER_PASS) |
724 return false; | 722 return false; |
725 | 723 |
726 const RenderPass* contributingPass = findRenderPassById(RenderPassDrawQu
ad::MaterialCast(currentQuad)->render_pass_id, frame); | 724 const RenderPass* contributingPass = findRenderPassById(RenderPassDrawQu
ad::MaterialCast(currentQuad)->render_pass_id, frame); |
727 RenderPassList::const_iterator foundContributingPass = std::find(renderP
asses.begin(), renderPasses.end(), contributingPass); | 725 if (contributingPass) |
728 if (foundContributingPass != renderPasses.end()) | |
729 return false; | 726 return false; |
730 } | 727 } |
731 return true; | 728 return true; |
732 } | 729 } |
733 | 730 |
734 // Defined for linking tests. | 731 // Defined for linking tests. |
735 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameDa
ta&); | 732 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameDa
ta&); |
736 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); | 733 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); |
737 | 734 |
738 // static | 735 // static |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
890 metadata.root_layer_size.Scale(1 / m_pinchZoomViewport.pageScaleFactor()
); | 887 metadata.root_layer_size.Scale(1 / m_pinchZoomViewport.pageScaleFactor()
); |
891 } | 888 } |
892 | 889 |
893 return metadata; | 890 return metadata; |
894 } | 891 } |
895 | 892 |
896 void LayerTreeHostImpl::drawLayers(FrameData& frame) | 893 void LayerTreeHostImpl::drawLayers(FrameData& frame) |
897 { | 894 { |
898 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); | 895 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); |
899 DCHECK(canDraw()); | 896 DCHECK(canDraw()); |
900 DCHECK(!frame.renderPasses.empty()); | 897 DCHECK(!frame.renderPasses.isEmpty()); |
901 | 898 |
902 // FIXME: use the frame begin time from the overall compositor scheduler. | 899 // FIXME: use the frame begin time from the overall compositor scheduler. |
903 // This value is currently inaccessible because it is up in Chromium's | 900 // This value is currently inaccessible because it is up in Chromium's |
904 // RenderWidget. | 901 // RenderWidget. |
905 m_fpsCounter->markBeginningOfFrame(base::TimeTicks::Now()); | 902 m_fpsCounter->markBeginningOfFrame(base::TimeTicks::Now()); |
906 | 903 |
907 if (m_debugState.showHudRects()) | 904 if (m_debugState.showHudRects()) |
908 m_debugRectHistory->saveDebugRectsForCurrentFrame(rootLayer(), *frame.re
nderSurfaceLayerList, frame.occludingScreenSpaceRects, frame.nonOccludingScreenS
paceRects, m_debugState); | 905 m_debugRectHistory->saveDebugRectsForCurrentFrame(rootLayer(), *frame.re
nderSurfaceLayerList, frame.occludingScreenSpaceRects, frame.nonOccludingScreenS
paceRects, m_debugState); |
909 | 906 |
910 // Because the contents of the HUD depend on everything else in the frame, t
he contents | 907 // Because the contents of the HUD depend on everything else in the frame, t
he contents |
911 // of its texture are updated as the last thing before the frame is drawn. | 908 // of its texture are updated as the last thing before the frame is drawn. |
912 if (m_activeTree->hud_layer()) | 909 if (m_activeTree->hud_layer()) |
913 m_activeTree->hud_layer()->updateHudTexture(m_resourceProvider.get()); | 910 m_activeTree->hud_layer()->updateHudTexture(m_resourceProvider.get()); |
914 | 911 |
915 m_renderer->drawFrame(frame.renderPasses, frame.renderPassesById); | 912 m_renderer->drawFrame(frame.renderPasses); |
916 | |
917 // The render passes should be consumed by the renderer. | 913 // The render passes should be consumed by the renderer. |
918 DCHECK(frame.renderPasses.empty()); | 914 DCHECK(frame.renderPasses.isEmpty()); |
919 DCHECK(frame.renderPassesById.empty()); | 915 frame.renderPassesById.clear(); |
920 | 916 |
921 // The next frame should start by assuming nothing has changed, and changes
are noted as they occur. | 917 // The next frame should start by assuming nothing has changed, and changes
are noted as they occur. |
922 for (unsigned int i = 0; i < frame.renderSurfaceLayerList->size(); i++) | 918 for (unsigned int i = 0; i < frame.renderSurfaceLayerList->size(); i++) |
923 (*frame.renderSurfaceLayerList)[i]->renderSurface()->damageTracker()->di
dDrawDamagedArea(); | 919 (*frame.renderSurfaceLayerList)[i]->renderSurface()->damageTracker()->di
dDrawDamagedArea(); |
924 rootLayer()->resetAllChangeTrackingForSubtree(); | 920 rootLayer()->resetAllChangeTrackingForSubtree(); |
925 } | 921 } |
926 | 922 |
927 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame) | 923 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame) |
928 { | 924 { |
929 for (size_t i = 0; i < frame.willDrawLayers.size(); ++i) | 925 for (size_t i = 0; i < frame.willDrawLayers.size(); ++i) |
(...skipping 800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1730 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); | 1726 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); |
1731 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1727 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
1732 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1728 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
1733 m_client->setNeedsRedrawOnImplThread(); | 1729 m_client->setNeedsRedrawOnImplThread(); |
1734 | 1730 |
1735 for (size_t i = 0; i < layer->children().size(); ++i) | 1731 for (size_t i = 0; i < layer->children().size(); ++i) |
1736 animateScrollbarsRecursive(layer->children()[i], time); | 1732 animateScrollbarsRecursive(layer->children()[i], time); |
1737 } | 1733 } |
1738 | 1734 |
1739 } // namespace cc | 1735 } // namespace cc |
OLD | NEW |