| 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 |