| 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 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 446 if (layerHasAnimatingTransform) | 446 if (layerHasAnimatingTransform) |
| 447 drawFrame = false; | 447 drawFrame = false; |
| 448 } | 448 } |
| 449 | 449 |
| 450 occlusionTracker.leaveLayer(it); | 450 occlusionTracker.leaveLayer(it); |
| 451 } | 451 } |
| 452 | 452 |
| 453 #ifndef NDEBUG | 453 #ifndef NDEBUG |
| 454 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { | 454 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { |
| 455 for (size_t j = 0; j < frame.renderPasses[i]->quadList().size(); ++j) { | 455 for (size_t j = 0; j < frame.renderPasses[i]->quadList().size(); ++j) { |
| 456 DCHECK(frame.renderPasses[i]->quadList()[j]->shared_quad_state()); | 456 DCHECK(frame.renderPasses[i]->quadList()[j]->shared_quad_state); |
| 457 DCHECK_GE(frame.renderPasses[i]->quadList()[j]->shared_quad_state()-
>id, 0); | 457 DCHECK_GE(frame.renderPasses[i]->quadList()[j]->shared_quad_state->i
d, 0); |
| 458 } | 458 } |
| 459 DCHECK(frame.renderPassesById.contains(frame.renderPasses[i]->id())); | 459 DCHECK(frame.renderPassesById.contains(frame.renderPasses[i]->id())); |
| 460 } | 460 } |
| 461 #endif | 461 #endif |
| 462 | 462 |
| 463 if (!m_hasTransparentBackground) { | 463 if (!m_hasTransparentBackground) { |
| 464 frame.renderPasses.back()->setHasTransparentBackground(false); | 464 frame.renderPasses.back()->setHasTransparentBackground(false); |
| 465 frame.renderPasses.back()->appendQuadsToFillScreen(m_rootLayerImpl.get()
, m_backgroundColor, occlusionTracker); | 465 frame.renderPasses.back()->appendQuadsToFillScreen(m_rootLayerImpl.get()
, m_backgroundColor, occlusionTracker); |
| 466 } | 466 } |
| 467 | 467 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 540 return; | 540 return; |
| 541 | 541 |
| 542 const RenderPass* removedPass = *toRemove; | 542 const RenderPass* removedPass = *toRemove; |
| 543 frame.renderPasses.erase(toRemove); | 543 frame.renderPasses.erase(toRemove); |
| 544 | 544 |
| 545 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. | 545 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. |
| 546 const QuadList& quadList = removedPass->quadList(); | 546 const QuadList& quadList = removedPass->quadList(); |
| 547 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBe
gin(); | 547 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBe
gin(); |
| 548 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { | 548 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
| 549 DrawQuad* currentQuad = (*quadListIterator); | 549 DrawQuad* currentQuad = (*quadListIterator); |
| 550 if (currentQuad->material() != DrawQuad::RENDER_PASS) | 550 if (currentQuad->material != DrawQuad::RENDER_PASS) |
| 551 continue; | 551 continue; |
| 552 | 552 |
| 553 RenderPass::Id nextRemoveRenderPassId = RenderPassDrawQuad::materialCast
(currentQuad)->renderPassId(); | 553 RenderPass::Id nextRemoveRenderPassId = RenderPassDrawQuad::materialCast
(currentQuad)->renderPassId(); |
| 554 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); | 554 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); |
| 555 } | 555 } |
| 556 } | 556 } |
| 557 | 557 |
| 558 bool LayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRenderPa
ss(const RenderPassDrawQuad& quad, const FrameData&) const | 558 bool LayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRenderPa
ss(const RenderPassDrawQuad& quad, const FrameData&) const |
| 559 { | 559 { |
| 560 return quad.contentsChangedSinceLastFrame().IsEmpty() && m_renderer.haveCach
edResourcesForRenderPassId(quad.renderPassId()); | 560 return quad.contentsChangedSinceLastFrame().IsEmpty() && m_renderer.haveCach
edResourcesForRenderPassId(quad.renderPassId()); |
| 561 } | 561 } |
| 562 | 562 |
| 563 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(cons
t RenderPassDrawQuad& quad, const FrameData& frame) const | 563 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(cons
t RenderPassDrawQuad& quad, const FrameData& frame) const |
| 564 { | 564 { |
| 565 const RenderPass* renderPass = findRenderPassById(quad.renderPassId(), frame
); | 565 const RenderPass* renderPass = findRenderPassById(quad.renderPassId(), frame
); |
| 566 const RenderPassList& renderPasses = frame.renderPasses; | 566 const RenderPassList& renderPasses = frame.renderPasses; |
| 567 RenderPassList::const_iterator foundPass = std::find(renderPasses.begin(), r
enderPasses.end(), renderPass); | 567 RenderPassList::const_iterator foundPass = std::find(renderPasses.begin(), r
enderPasses.end(), renderPass); |
| 568 | 568 |
| 569 bool renderPassAlreadyRemoved = foundPass == renderPasses.end(); | 569 bool renderPassAlreadyRemoved = foundPass == renderPasses.end(); |
| 570 if (renderPassAlreadyRemoved) | 570 if (renderPassAlreadyRemoved) |
| 571 return false; | 571 return false; |
| 572 | 572 |
| 573 // If any quad or RenderPass draws into this RenderPass, then keep it. | 573 // If any quad or RenderPass draws into this RenderPass, then keep it. |
| 574 const QuadList& quadList = (*foundPass)->quadList(); | 574 const QuadList& quadList = (*foundPass)->quadList(); |
| 575 for (QuadList::constBackToFrontIterator quadListIterator = quadList.backToFr
ontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { | 575 for (QuadList::constBackToFrontIterator quadListIterator = quadList.backToFr
ontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
| 576 DrawQuad* currentQuad = *quadListIterator; | 576 DrawQuad* currentQuad = *quadListIterator; |
| 577 | 577 |
| 578 if (currentQuad->material() != DrawQuad::RENDER_PASS) | 578 if (currentQuad->material != DrawQuad::RENDER_PASS) |
| 579 return false; | 579 return false; |
| 580 | 580 |
| 581 const RenderPass* contributingPass = findRenderPassById(RenderPassDrawQu
ad::materialCast(currentQuad)->renderPassId(), frame); | 581 const RenderPass* contributingPass = findRenderPassById(RenderPassDrawQu
ad::materialCast(currentQuad)->renderPassId(), frame); |
| 582 RenderPassList::const_iterator foundContributingPass = std::find(renderP
asses.begin(), renderPasses.end(), contributingPass); | 582 RenderPassList::const_iterator foundContributingPass = std::find(renderP
asses.begin(), renderPasses.end(), contributingPass); |
| 583 if (foundContributingPass != renderPasses.end()) | 583 if (foundContributingPass != renderPasses.end()) |
| 584 return false; | 584 return false; |
| 585 } | 585 } |
| 586 return true; | 586 return true; |
| 587 } | 587 } |
| 588 | 588 |
| 589 // Defined for linking tests. | 589 // Defined for linking tests. |
| 590 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameDa
ta&); | 590 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameDa
ta&); |
| 591 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); | 591 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); |
| 592 | 592 |
| 593 // static | 593 // static |
| 594 template<typename RenderPassCuller> | 594 template<typename RenderPassCuller> |
| 595 void LayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData& f
rame) | 595 void LayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData& f
rame) |
| 596 { | 596 { |
| 597 for (size_t it = culler.renderPassListBegin(frame.renderPasses); it != culle
r.renderPassListEnd(frame.renderPasses); it = culler.renderPassListNext(it)) { | 597 for (size_t it = culler.renderPassListBegin(frame.renderPasses); it != culle
r.renderPassListEnd(frame.renderPasses); it = culler.renderPassListNext(it)) { |
| 598 const RenderPass* currentPass = frame.renderPasses[it]; | 598 const RenderPass* currentPass = frame.renderPasses[it]; |
| 599 const QuadList& quadList = currentPass->quadList(); | 599 const QuadList& quadList = currentPass->quadList(); |
| 600 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFro
ntBegin(); | 600 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFro
ntBegin(); |
| 601 | 601 |
| 602 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator
) { | 602 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator
) { |
| 603 DrawQuad* currentQuad = *quadListIterator; | 603 DrawQuad* currentQuad = *quadListIterator; |
| 604 | 604 |
| 605 if (currentQuad->material() != DrawQuad::RENDER_PASS) | 605 if (currentQuad->material != DrawQuad::RENDER_PASS) |
| 606 continue; | 606 continue; |
| 607 | 607 |
| 608 RenderPassDrawQuad* renderPassQuad = static_cast<RenderPassDrawQuad*
>(currentQuad); | 608 RenderPassDrawQuad* renderPassQuad = static_cast<RenderPassDrawQuad*
>(currentQuad); |
| 609 if (!culler.shouldRemoveRenderPass(*renderPassQuad, frame)) | 609 if (!culler.shouldRemoveRenderPass(*renderPassQuad, frame)) |
| 610 continue; | 610 continue; |
| 611 | 611 |
| 612 // We are changing the vector in the middle of iteration. Because we | 612 // We are changing the vector in the middle of iteration. Because we |
| 613 // delete render passes that draw into the current pass, we are | 613 // delete render passes that draw into the current pass, we are |
| 614 // guaranteed that any data from the iterator to the end will not | 614 // guaranteed that any data from the iterator to the end will not |
| 615 // change. So, capture the iterator position from the end of the | 615 // change. So, capture the iterator position from the end of the |
| (...skipping 878 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1494 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); | 1494 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); |
| 1495 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1495 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
| 1496 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1496 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
| 1497 m_client->setNeedsRedrawOnImplThread(); | 1497 m_client->setNeedsRedrawOnImplThread(); |
| 1498 | 1498 |
| 1499 for (size_t i = 0; i < layer->children().size(); ++i) | 1499 for (size_t i = 0; i < layer->children().size(); ++i) |
| 1500 animateScrollbarsRecursive(layer->children()[i], time); | 1500 animateScrollbarsRecursive(layer->children()[i], time); |
| 1501 } | 1501 } |
| 1502 | 1502 |
| 1503 } // namespace cc | 1503 } // namespace cc |
| OLD | NEW |