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 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 activeTree()->UpdateDrawProperties(); | 420 activeTree()->UpdateDrawProperties(); |
421 if (pendingTree()) | 421 if (pendingTree()) |
422 pendingTree()->UpdateDrawProperties(); | 422 pendingTree()->UpdateDrawProperties(); |
423 | 423 |
424 m_needsUpdateDrawProperties = false; | 424 m_needsUpdateDrawProperties = false; |
425 } | 425 } |
426 | 426 |
427 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) | 427 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) |
428 { | 428 { |
429 renderPassesById[renderPass->id] = renderPass.get(); | 429 renderPassesById[renderPass->id] = renderPass.get(); |
430 renderPasses.append(renderPass.Pass()); | 430 renderPasses.push_back(renderPass.Pass()); |
431 } | 431 } |
432 | 432 |
433 static void appendQuadsForLayer(RenderPass* targetRenderPass, LayerImpl* layer,
OcclusionTrackerImpl& occlusionTracker, AppendQuadsData& appendQuadsData) | 433 static void appendQuadsForLayer(RenderPass* targetRenderPass, LayerImpl* layer,
OcclusionTrackerImpl& occlusionTracker, AppendQuadsData& appendQuadsData) |
434 { | 434 { |
435 bool forSurface = false; | 435 bool forSurface = false; |
436 QuadCuller quadCuller(targetRenderPass->quad_list, | 436 QuadCuller quadCuller(targetRenderPass->quad_list, |
437 targetRenderPass->shared_quad_state_list, | 437 targetRenderPass->shared_quad_state_list, |
438 layer, | 438 layer, |
439 occlusionTracker, | 439 occlusionTracker, |
440 layer->showDebugBorders(), | 440 layer->showDebugBorders(), |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 // Skip the quad culler and just append the quads directly to avoid | 511 // Skip the quad culler and just append the quads directly to avoid |
512 // occlusion checks. | 512 // occlusion checks. |
513 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); | 513 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); |
514 quad->SetNew(sharedQuadState, layerRect, screenBackgroundColor); | 514 quad->SetNew(sharedQuadState, layerRect, screenBackgroundColor); |
515 quadCuller.append(quad.PassAs<DrawQuad>(), appendQuadsData); | 515 quadCuller.append(quad.PassAs<DrawQuad>(), appendQuadsData); |
516 } | 516 } |
517 } | 517 } |
518 | 518 |
519 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) | 519 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
520 { | 520 { |
521 DCHECK(frame.renderPasses.isEmpty()); | 521 DCHECK(frame.renderPasses.empty()); |
522 | 522 |
523 if (!canDraw() || !rootLayer()) | 523 if (!canDraw() || !rootLayer()) |
524 return false; | 524 return false; |
525 | 525 |
526 trackDamageForAllSurfaces(rootLayer(), *frame.renderSurfaceLayerList); | 526 trackDamageForAllSurfaces(rootLayer(), *frame.renderSurfaceLayerList); |
527 | 527 |
528 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac
eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList
->size())); | 528 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac
eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList
->size())); |
529 | 529 |
530 // Create the render passes in dependency order. | 530 // Create the render passes in dependency order. |
531 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd
ex >= 0 ; --surfaceIndex) { | 531 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd
ex >= 0 ; --surfaceIndex) { |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 #ifndef NDEBUG | 607 #ifndef NDEBUG |
608 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { | 608 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { |
609 for (size_t j = 0; j < frame.renderPasses[i]->quad_list.size(); ++j) | 609 for (size_t j = 0; j < frame.renderPasses[i]->quad_list.size(); ++j) |
610 DCHECK(frame.renderPasses[i]->quad_list[j]->shared_quad_state); | 610 DCHECK(frame.renderPasses[i]->quad_list[j]->shared_quad_state); |
611 DCHECK(frame.renderPassesById.find(frame.renderPasses[i]->id) | 611 DCHECK(frame.renderPassesById.find(frame.renderPasses[i]->id) |
612 != frame.renderPassesById.end()); | 612 != frame.renderPassesById.end()); |
613 } | 613 } |
614 #endif | 614 #endif |
615 | 615 |
616 if (!activeTree()->has_transparent_background()) { | 616 if (!activeTree()->has_transparent_background()) { |
617 frame.renderPasses.last()->has_transparent_background = false; | 617 frame.renderPasses.back()->has_transparent_background = false; |
618 appendQuadsToFillScreen(frame.renderPasses.last(), rootLayer(), activeTr
ee()->background_color(), occlusionTracker); | 618 appendQuadsToFillScreen(frame.renderPasses.back(), rootLayer(), activeTr
ee()->background_color(), occlusionTracker); |
619 } | 619 } |
620 | 620 |
621 if (drawFrame) | 621 if (drawFrame) |
622 occlusionTracker.overdrawMetrics().recordMetrics(this); | 622 occlusionTracker.overdrawMetrics().recordMetrics(this); |
623 | 623 |
624 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); | 624 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); |
625 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); | 625 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); |
626 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); | 626 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); |
627 | 627 |
628 return drawFrame; | 628 return drawFrame; |
(...skipping 23 matching lines...) Expand all Loading... |
652 { | 652 { |
653 RenderPass* removeRenderPass = findRenderPassById(removeRenderPassId, frame)
; | 653 RenderPass* removeRenderPass = findRenderPassById(removeRenderPassId, frame)
; |
654 // The pass was already removed by another quad - probably the original, and
we are the replica. | 654 // The pass was already removed by another quad - probably the original, and
we are the replica. |
655 if (!removeRenderPass) | 655 if (!removeRenderPass) |
656 return; | 656 return; |
657 RenderPassList& renderPasses = frame.renderPasses; | 657 RenderPassList& renderPasses = frame.renderPasses; |
658 RenderPassList::iterator toRemove = std::find(renderPasses.begin(), renderPa
sses.end(), removeRenderPass); | 658 RenderPassList::iterator toRemove = std::find(renderPasses.begin(), renderPa
sses.end(), removeRenderPass); |
659 | 659 |
660 DCHECK(toRemove != renderPasses.end()); | 660 DCHECK(toRemove != renderPasses.end()); |
661 | 661 |
662 size_t index = toRemove - renderPasses.begin(); | 662 scoped_ptr<RenderPass> removedPass = renderPasses.take(toRemove); |
663 scoped_ptr<RenderPass> removedPass = renderPasses.take(index); | 663 frame.renderPasses.erase(toRemove); |
664 frame.renderPasses.remove(index); | |
665 frame.renderPassesById.erase(removeRenderPassId); | 664 frame.renderPassesById.erase(removeRenderPassId); |
666 | 665 |
667 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. | 666 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. |
668 const QuadList& quadList = removedPass->quad_list; | 667 const QuadList& quadList = removedPass->quad_list; |
669 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBe
gin(); | 668 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBe
gin(); |
670 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { | 669 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
671 DrawQuad* currentQuad = (*quadListIterator); | 670 DrawQuad* currentQuad = (*quadListIterator); |
672 if (currentQuad->material != DrawQuad::RENDER_PASS) | 671 if (currentQuad->material != DrawQuad::RENDER_PASS) |
673 continue; | 672 continue; |
674 | 673 |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
871 metadata.min_page_scale_factor = m_pinchZoomViewport.minPageScaleFactor(); | 870 metadata.min_page_scale_factor = m_pinchZoomViewport.minPageScaleFactor(); |
872 metadata.max_page_scale_factor = m_pinchZoomViewport.maxPageScaleFactor(); | 871 metadata.max_page_scale_factor = m_pinchZoomViewport.maxPageScaleFactor(); |
873 | 872 |
874 return metadata; | 873 return metadata; |
875 } | 874 } |
876 | 875 |
877 void LayerTreeHostImpl::drawLayers(FrameData& frame) | 876 void LayerTreeHostImpl::drawLayers(FrameData& frame) |
878 { | 877 { |
879 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); | 878 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); |
880 DCHECK(canDraw()); | 879 DCHECK(canDraw()); |
881 DCHECK(!frame.renderPasses.isEmpty()); | 880 DCHECK(!frame.renderPasses.empty()); |
882 | 881 |
883 // FIXME: use the frame begin time from the overall compositor scheduler. | 882 // FIXME: use the frame begin time from the overall compositor scheduler. |
884 // This value is currently inaccessible because it is up in Chromium's | 883 // This value is currently inaccessible because it is up in Chromium's |
885 // RenderWidget. | 884 // RenderWidget. |
886 m_fpsCounter->markBeginningOfFrame(base::TimeTicks::Now()); | 885 m_fpsCounter->markBeginningOfFrame(base::TimeTicks::Now()); |
887 | 886 |
888 if (m_debugState.showHudRects()) | 887 if (m_debugState.showHudRects()) |
889 m_debugRectHistory->saveDebugRectsForCurrentFrame(rootLayer(), *frame.re
nderSurfaceLayerList, frame.occludingScreenSpaceRects, frame.nonOccludingScreenS
paceRects, m_debugState); | 888 m_debugRectHistory->saveDebugRectsForCurrentFrame(rootLayer(), *frame.re
nderSurfaceLayerList, frame.occludingScreenSpaceRects, frame.nonOccludingScreenS
paceRects, m_debugState); |
890 | 889 |
891 // Because the contents of the HUD depend on everything else in the frame, t
he contents | 890 // Because the contents of the HUD depend on everything else in the frame, t
he contents |
892 // of its texture are updated as the last thing before the frame is drawn. | 891 // of its texture are updated as the last thing before the frame is drawn. |
893 if (m_activeTree->hud_layer()) | 892 if (m_activeTree->hud_layer()) |
894 m_activeTree->hud_layer()->updateHudTexture(m_resourceProvider.get()); | 893 m_activeTree->hud_layer()->updateHudTexture(m_resourceProvider.get()); |
895 | 894 |
896 m_renderer->drawFrame(frame.renderPasses); | 895 m_renderer->drawFrame(frame.renderPasses); |
897 // The render passes should be consumed by the renderer. | 896 // The render passes should be consumed by the renderer. |
898 DCHECK(frame.renderPasses.isEmpty()); | 897 DCHECK(frame.renderPasses.empty()); |
899 frame.renderPassesById.clear(); | 898 frame.renderPassesById.clear(); |
900 | 899 |
901 // The next frame should start by assuming nothing has changed, and changes
are noted as they occur. | 900 // The next frame should start by assuming nothing has changed, and changes
are noted as they occur. |
902 for (unsigned int i = 0; i < frame.renderSurfaceLayerList->size(); i++) | 901 for (unsigned int i = 0; i < frame.renderSurfaceLayerList->size(); i++) |
903 (*frame.renderSurfaceLayerList)[i]->renderSurface()->damageTracker()->di
dDrawDamagedArea(); | 902 (*frame.renderSurfaceLayerList)[i]->renderSurface()->damageTracker()->di
dDrawDamagedArea(); |
904 rootLayer()->resetAllChangeTrackingForSubtree(); | 903 rootLayer()->resetAllChangeTrackingForSubtree(); |
905 } | 904 } |
906 | 905 |
907 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame) | 906 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame) |
908 { | 907 { |
(...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1701 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); | 1700 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); |
1702 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1701 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
1703 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1702 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
1704 m_client->setNeedsRedrawOnImplThread(); | 1703 m_client->setNeedsRedrawOnImplThread(); |
1705 | 1704 |
1706 for (size_t i = 0; i < layer->children().size(); ++i) | 1705 for (size_t i = 0; i < layer->children().size(); ++i) |
1707 animateScrollbarsRecursive(layer->children()[i], time); | 1706 animateScrollbarsRecursive(layer->children()[i], time); |
1708 } | 1707 } |
1709 | 1708 |
1710 } // namespace cc | 1709 } // namespace cc |
OLD | NEW |