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