| 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" |
| 11 #include "cc/append_quads_data.h" | 11 #include "cc/append_quads_data.h" |
| 12 #include "cc/damage_tracker.h" | 12 #include "cc/damage_tracker.h" |
| 13 #include "cc/debug_rect_history.h" | 13 #include "cc/debug_rect_history.h" |
| 14 #include "cc/delay_based_time_source.h" | 14 #include "cc/delay_based_time_source.h" |
| 15 #include "cc/font_atlas.h" | 15 #include "cc/font_atlas.h" |
| 16 #include "cc/frame_rate_counter.h" | 16 #include "cc/frame_rate_counter.h" |
| 17 #include "cc/gl_renderer.h" | 17 #include "cc/gl_renderer.h" |
| 18 #include "cc/heads_up_display_layer_impl.h" | 18 #include "cc/heads_up_display_layer_impl.h" |
| 19 #include "cc/layer_iterator.h" | 19 #include "cc/layer_iterator.h" |
| 20 #include "cc/layer_tree_host.h" | 20 #include "cc/layer_tree_host.h" |
| 21 #include "cc/layer_tree_host_common.h" | 21 #include "cc/layer_tree_host_common.h" |
| 22 #include "cc/math_util.h" | 22 #include "cc/math_util.h" |
| 23 #include "cc/overdraw_metrics.h" | 23 #include "cc/overdraw_metrics.h" |
| 24 #include "cc/page_scale_animation.h" | 24 #include "cc/page_scale_animation.h" |
| 25 #include "cc/prioritized_resource_manager.h" | 25 #include "cc/prioritized_resource_manager.h" |
| 26 #include "cc/quad_culler.h" |
| 26 #include "cc/render_pass_draw_quad.h" | 27 #include "cc/render_pass_draw_quad.h" |
| 27 #include "cc/rendering_stats.h" | 28 #include "cc/rendering_stats.h" |
| 28 #include "cc/scrollbar_animation_controller.h" | 29 #include "cc/scrollbar_animation_controller.h" |
| 29 #include "cc/scrollbar_layer_impl.h" | 30 #include "cc/scrollbar_layer_impl.h" |
| 31 #include "cc/shared_quad_state.h" |
| 30 #include "cc/single_thread_proxy.h" | 32 #include "cc/single_thread_proxy.h" |
| 31 #include "cc/software_renderer.h" | 33 #include "cc/software_renderer.h" |
| 34 #include "cc/solid_color_draw_quad.h" |
| 32 #include "cc/texture_uploader.h" | 35 #include "cc/texture_uploader.h" |
| 33 #include "ui/gfx/size_conversions.h" | 36 #include "ui/gfx/size_conversions.h" |
| 34 #include "ui/gfx/vector2d_conversions.h" | 37 #include "ui/gfx/vector2d_conversions.h" |
| 35 | 38 |
| 36 using WebKit::WebTransformationMatrix; | 39 using WebKit::WebTransformationMatrix; |
| 37 | 40 |
| 38 namespace { | 41 namespace { |
| 39 | 42 |
| 40 void didVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) | 43 void didVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) |
| 41 { | 44 { |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 LayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), devi
ceViewportSize(), m_deviceScaleFactor, pageScaleFactor, &m_layerSorter, renderer
Capabilities().maxTextureSize, renderSurfaceLayerList); | 376 LayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), devi
ceViewportSize(), m_deviceScaleFactor, pageScaleFactor, &m_layerSorter, renderer
Capabilities().maxTextureSize, renderSurfaceLayerList); |
| 374 | 377 |
| 375 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList)
; | 378 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList)
; |
| 376 } | 379 } |
| 377 } | 380 } |
| 378 | 381 |
| 379 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) | 382 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende
rPass) |
| 380 { | 383 { |
| 381 RenderPass* pass = renderPass.get(); | 384 RenderPass* pass = renderPass.get(); |
| 382 renderPasses.push_back(pass); | 385 renderPasses.push_back(pass); |
| 383 renderPassesById.set(pass->id(), renderPass.Pass()); | 386 renderPassesById.set(pass->id, renderPass.Pass()); |
| 387 } |
| 388 |
| 389 static void appendQuadsForLayer(RenderPass* targetRenderPass, LayerImpl* layer,
OcclusionTrackerImpl& occlusionTracker, AppendQuadsData& appendQuadsData) |
| 390 { |
| 391 bool forSurface = false; |
| 392 QuadCuller quadCuller(targetRenderPass->quad_list, |
| 393 targetRenderPass->shared_quad_state_list, |
| 394 layer, |
| 395 occlusionTracker, |
| 396 layer->showDebugBorders(), |
| 397 forSurface); |
| 398 layer->appendQuads(quadCuller, appendQuadsData); |
| 399 } |
| 400 |
| 401 static void appendQuadsForRenderSurfaceLayer(RenderPass* targetRenderPass, Layer
Impl* layer, const RenderPass* contributingRenderPass, OcclusionTrackerImpl& occ
lusionTracker, AppendQuadsData& appendQuadsData) |
| 402 { |
| 403 bool forSurface = true; |
| 404 QuadCuller quadCuller(targetRenderPass->quad_list, |
| 405 targetRenderPass->shared_quad_state_list, |
| 406 layer, |
| 407 occlusionTracker, |
| 408 layer->showDebugBorders(), |
| 409 forSurface); |
| 410 |
| 411 bool isReplica = false; |
| 412 layer->renderSurface()->appendQuads(quadCuller, |
| 413 appendQuadsData, |
| 414 isReplica, |
| 415 contributingRenderPass->id); |
| 416 |
| 417 // Add replica after the surface so that it appears below the surface. |
| 418 if (layer->hasReplica()) { |
| 419 isReplica = true; |
| 420 layer->renderSurface()->appendQuads(quadCuller, |
| 421 appendQuadsData, |
| 422 isReplica, |
| 423 contributingRenderPass->id); |
| 424 } |
| 425 } |
| 426 |
| 427 static void appendQuadsToFillScreen(RenderPass* targetRenderPass, LayerImpl* roo
tLayer, SkColor screenBackgroundColor, const OcclusionTrackerImpl& occlusionTrac
ker) |
| 428 { |
| 429 if (!rootLayer || !SkColorGetA(screenBackgroundColor)) |
| 430 return; |
| 431 |
| 432 Region fillRegion = occlusionTracker.computeVisibleRegionInScreen(); |
| 433 if (fillRegion.IsEmpty()) |
| 434 return; |
| 435 |
| 436 bool forSurface = false; |
| 437 QuadCuller quadCuller(targetRenderPass->quad_list, |
| 438 targetRenderPass->shared_quad_state_list, |
| 439 rootLayer, |
| 440 occlusionTracker, |
| 441 rootLayer->showDebugBorders(), |
| 442 forSurface); |
| 443 |
| 444 // Manually create the quad state for the gutter quads, as the root layer |
| 445 // doesn't have any bounds and so can't generate this itself. |
| 446 // FIXME: Make the gutter quads generated by the solid color layer (make it
smarter about generating quads to fill unoccluded areas). |
| 447 |
| 448 DCHECK(rootLayer->screenSpaceTransform().isInvertible()); |
| 449 |
| 450 gfx::Rect rootTargetRect = rootLayer->renderSurface()->contentRect(); |
| 451 float opacity = 1; |
| 452 SharedQuadState* sharedQuadState = quadCuller.useSharedQuadState(SharedQuadS
tate::Create()); |
| 453 sharedQuadState->SetAll(rootLayer->drawTransform(), |
| 454 rootTargetRect, |
| 455 rootTargetRect, |
| 456 opacity); |
| 457 |
| 458 AppendQuadsData appendQuadsData; |
| 459 WebTransformationMatrix transformToLayerSpace = rootLayer->screenSpaceTransf
orm().inverse(); |
| 460 for (Region::Iterator fillRects(fillRegion); fillRects.has_rect(); fillRects
.next()) { |
| 461 // The root layer transform is composed of translations and scales only, |
| 462 // no perspective, so mapping is sufficient. |
| 463 gfx::Rect layerRect = MathUtil::mapClippedRect(transformToLayerSpace, fi
llRects.rect()); |
| 464 // Skip the quad culler and just append the quads directly to avoid |
| 465 // occlusion checks. |
| 466 scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); |
| 467 quad->SetNew(sharedQuadState, layerRect, screenBackgroundColor); |
| 468 quadCuller.append(quad.PassAs<DrawQuad>(), appendQuadsData); |
| 469 } |
| 384 } | 470 } |
| 385 | 471 |
| 386 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) | 472 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
| 387 { | 473 { |
| 388 DCHECK(frame.renderPasses.empty()); | 474 DCHECK(frame.renderPasses.empty()); |
| 389 | 475 |
| 390 calculateRenderSurfaceLayerList(*frame.renderSurfaceLayerList); | 476 calculateRenderSurfaceLayerList(*frame.renderSurfaceLayerList); |
| 391 | 477 |
| 392 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac
eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList
->size())); | 478 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac
eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList
->size())); |
| 393 | 479 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 414 // in the future. | 500 // in the future. |
| 415 bool drawFrame = true; | 501 bool drawFrame = true; |
| 416 | 502 |
| 417 LayerIteratorType end = LayerIteratorType::end(frame.renderSurfaceLayerList)
; | 503 LayerIteratorType end = LayerIteratorType::end(frame.renderSurfaceLayerList)
; |
| 418 for (LayerIteratorType it = LayerIteratorType::begin(frame.renderSurfaceLaye
rList); it != end; ++it) { | 504 for (LayerIteratorType it = LayerIteratorType::begin(frame.renderSurfaceLaye
rList); it != end; ++it) { |
| 419 RenderPass::Id targetRenderPassId = it.targetRenderSurfaceLayer()->rende
rSurface()->renderPassId(); | 505 RenderPass::Id targetRenderPassId = it.targetRenderSurfaceLayer()->rende
rSurface()->renderPassId(); |
| 420 RenderPass* targetRenderPass = frame.renderPassesById.get(targetRenderPa
ssId); | 506 RenderPass* targetRenderPass = frame.renderPassesById.get(targetRenderPa
ssId); |
| 421 | 507 |
| 422 occlusionTracker.enterLayer(it); | 508 occlusionTracker.enterLayer(it); |
| 423 | 509 |
| 424 AppendQuadsData appendQuadsData(targetRenderPass->id()); | 510 AppendQuadsData appendQuadsData(targetRenderPass->id); |
| 425 | 511 |
| 426 if (it.representsContributingRenderSurface()) { | 512 if (it.representsContributingRenderSurface()) { |
| 427 RenderPass::Id contributingRenderPassId = it->renderSurface()->rende
rPassId(); | 513 RenderPass::Id contributingRenderPassId = it->renderSurface()->rende
rPassId(); |
| 428 RenderPass* contributingRenderPass = frame.renderPassesById.get(cont
ributingRenderPassId); | 514 RenderPass* contributingRenderPass = frame.renderPassesById.get(cont
ributingRenderPassId); |
| 429 targetRenderPass->appendQuadsForRenderSurfaceLayer(*it, contributing
RenderPass, &occlusionTracker, appendQuadsData); | 515 appendQuadsForRenderSurfaceLayer(targetRenderPass, *it, contributing
RenderPass, occlusionTracker, appendQuadsData); |
| 430 } else if (it.representsItself() && !it->visibleContentRect().IsEmpty())
{ | 516 } else if (it.representsItself() && !it->visibleContentRect().IsEmpty())
{ |
| 431 bool hasOcclusionFromOutsideTargetSurface; | 517 bool hasOcclusionFromOutsideTargetSurface; |
| 432 bool implDrawTransformIsUnknown = false; | 518 bool implDrawTransformIsUnknown = false; |
| 433 if (occlusionTracker.occluded(it->renderTarget(), it->visibleContent
Rect(), it->drawTransform(), implDrawTransformIsUnknown, it->drawableContentRect
(), &hasOcclusionFromOutsideTargetSurface)) | 519 if (occlusionTracker.occluded(it->renderTarget(), it->visibleContent
Rect(), it->drawTransform(), implDrawTransformIsUnknown, it->drawableContentRect
(), &hasOcclusionFromOutsideTargetSurface)) |
| 434 appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclu
sionFromOutsideTargetSurface; | 520 appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclu
sionFromOutsideTargetSurface; |
| 435 else { | 521 else { |
| 436 it->willDraw(m_resourceProvider.get()); | 522 it->willDraw(m_resourceProvider.get()); |
| 437 frame.willDrawLayers.push_back(*it); | 523 frame.willDrawLayers.push_back(*it); |
| 438 | 524 |
| 439 if (it->hasContributingDelegatedRenderPasses()) { | 525 if (it->hasContributingDelegatedRenderPasses()) { |
| 440 RenderPass::Id contributingRenderPassId = it->firstContribut
ingRenderPassId(); | 526 RenderPass::Id contributingRenderPassId = it->firstContribut
ingRenderPassId(); |
| 441 while (frame.renderPassesById.contains(contributingRenderPas
sId)) { | 527 while (frame.renderPassesById.contains(contributingRenderPas
sId)) { |
| 442 RenderPass* renderPass = frame.renderPassesById.get(cont
ributingRenderPassId); | 528 RenderPass* renderPass = frame.renderPassesById.get(cont
ributingRenderPassId); |
| 443 | 529 |
| 444 AppendQuadsData appendQuadsData(renderPass->id()); | 530 AppendQuadsData appendQuadsData(renderPass->id); |
| 445 renderPass->appendQuadsForLayer(*it, &occlusionTracker,
appendQuadsData); | 531 appendQuadsForLayer(renderPass, *it, occlusionTracker, a
ppendQuadsData); |
| 446 | 532 |
| 447 contributingRenderPassId = it->nextContributingRenderPas
sId(contributingRenderPassId); | 533 contributingRenderPassId = it->nextContributingRenderPas
sId(contributingRenderPassId); |
| 448 } | 534 } |
| 449 } | 535 } |
| 450 | 536 |
| 451 targetRenderPass->appendQuadsForLayer(*it, &occlusionTracker, ap
pendQuadsData); | 537 appendQuadsForLayer(targetRenderPass, *it, occlusionTracker, app
endQuadsData); |
| 452 } | 538 } |
| 453 } | 539 } |
| 454 | 540 |
| 455 if (appendQuadsData.hadOcclusionFromOutsideTargetSurface) | 541 if (appendQuadsData.hadOcclusionFromOutsideTargetSurface) |
| 456 targetRenderPass->setHasOcclusionFromOutsideTargetSurface(true); | 542 targetRenderPass->has_occlusion_from_outside_target_surface = true; |
| 457 | 543 |
| 458 if (appendQuadsData.hadMissingTiles) { | 544 if (appendQuadsData.hadMissingTiles) { |
| 459 bool layerHasAnimatingTransform = it->screenSpaceTransformIsAnimatin
g() || it->drawTransformIsAnimating(); | 545 bool layerHasAnimatingTransform = it->screenSpaceTransformIsAnimatin
g() || it->drawTransformIsAnimating(); |
| 460 if (layerHasAnimatingTransform) | 546 if (layerHasAnimatingTransform) |
| 461 drawFrame = false; | 547 drawFrame = false; |
| 462 } | 548 } |
| 463 | 549 |
| 464 occlusionTracker.leaveLayer(it); | 550 occlusionTracker.leaveLayer(it); |
| 465 } | 551 } |
| 466 | 552 |
| 467 #ifndef NDEBUG | 553 #ifndef NDEBUG |
| 468 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { | 554 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { |
| 469 for (size_t j = 0; j < frame.renderPasses[i]->quadList().size(); ++j) | 555 for (size_t j = 0; j < frame.renderPasses[i]->quad_list.size(); ++j) |
| 470 DCHECK(frame.renderPasses[i]->quadList()[j]->shared_quad_state); | 556 DCHECK(frame.renderPasses[i]->quad_list[j]->shared_quad_state); |
| 471 DCHECK(frame.renderPassesById.contains(frame.renderPasses[i]->id())); | 557 DCHECK(frame.renderPassesById.contains(frame.renderPasses[i]->id)); |
| 472 } | 558 } |
| 473 #endif | 559 #endif |
| 474 | 560 |
| 475 if (!m_hasTransparentBackground) { | 561 if (!m_hasTransparentBackground) { |
| 476 frame.renderPasses.back()->setHasTransparentBackground(false); | 562 frame.renderPasses.back()->has_transparent_background = false; |
| 477 frame.renderPasses.back()->appendQuadsToFillScreen(m_rootLayerImpl.get()
, m_backgroundColor, occlusionTracker); | 563 appendQuadsToFillScreen(frame.renderPasses.back(), m_rootLayerImpl.get()
, m_backgroundColor, occlusionTracker); |
| 478 } | 564 } |
| 479 | 565 |
| 480 if (drawFrame) | 566 if (drawFrame) |
| 481 occlusionTracker.overdrawMetrics().recordMetrics(this); | 567 occlusionTracker.overdrawMetrics().recordMetrics(this); |
| 482 | 568 |
| 483 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); | 569 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); |
| 484 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); | 570 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); |
| 485 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); | 571 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); |
| 486 | 572 |
| 487 return drawFrame; | 573 return drawFrame; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 548 RenderPassList::iterator toRemove = std::find(renderPasses.begin(), renderPa
sses.end(), removeRenderPass); | 634 RenderPassList::iterator toRemove = std::find(renderPasses.begin(), renderPa
sses.end(), removeRenderPass); |
| 549 | 635 |
| 550 // The pass was already removed by another quad - probably the original, and
we are the replica. | 636 // The pass was already removed by another quad - probably the original, and
we are the replica. |
| 551 if (toRemove == renderPasses.end()) | 637 if (toRemove == renderPasses.end()) |
| 552 return; | 638 return; |
| 553 | 639 |
| 554 const RenderPass* removedPass = *toRemove; | 640 const RenderPass* removedPass = *toRemove; |
| 555 frame.renderPasses.erase(toRemove); | 641 frame.renderPasses.erase(toRemove); |
| 556 | 642 |
| 557 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. | 643 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. |
| 558 const QuadList& quadList = removedPass->quadList(); | 644 const QuadList& quadList = removedPass->quad_list; |
| 559 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBe
gin(); | 645 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBe
gin(); |
| 560 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { | 646 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
| 561 DrawQuad* currentQuad = (*quadListIterator); | 647 DrawQuad* currentQuad = (*quadListIterator); |
| 562 if (currentQuad->material != DrawQuad::RENDER_PASS) | 648 if (currentQuad->material != DrawQuad::RENDER_PASS) |
| 563 continue; | 649 continue; |
| 564 | 650 |
| 565 RenderPass::Id nextRemoveRenderPassId = RenderPassDrawQuad::MaterialCast
(currentQuad)->render_pass_id; | 651 RenderPass::Id nextRemoveRenderPassId = RenderPassDrawQuad::MaterialCast
(currentQuad)->render_pass_id; |
| 566 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); | 652 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); |
| 567 } | 653 } |
| 568 } | 654 } |
| 569 | 655 |
| 570 bool LayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRenderPa
ss(const RenderPassDrawQuad& quad, const FrameData&) const | 656 bool LayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRenderPa
ss(const RenderPassDrawQuad& quad, const FrameData&) const |
| 571 { | 657 { |
| 572 return quad.contents_changed_since_last_frame.IsEmpty() && m_renderer.haveCa
chedResourcesForRenderPassId(quad.render_pass_id); | 658 return quad.contents_changed_since_last_frame.IsEmpty() && m_renderer.haveCa
chedResourcesForRenderPassId(quad.render_pass_id); |
| 573 } | 659 } |
| 574 | 660 |
| 575 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(cons
t RenderPassDrawQuad& quad, const FrameData& frame) const | 661 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(cons
t RenderPassDrawQuad& quad, const FrameData& frame) const |
| 576 { | 662 { |
| 577 const RenderPass* renderPass = findRenderPassById(quad.render_pass_id, frame
); | 663 const RenderPass* renderPass = findRenderPassById(quad.render_pass_id, frame
); |
| 578 const RenderPassList& renderPasses = frame.renderPasses; | 664 const RenderPassList& renderPasses = frame.renderPasses; |
| 579 RenderPassList::const_iterator foundPass = std::find(renderPasses.begin(), r
enderPasses.end(), renderPass); | 665 RenderPassList::const_iterator foundPass = std::find(renderPasses.begin(), r
enderPasses.end(), renderPass); |
| 580 | 666 |
| 581 bool renderPassAlreadyRemoved = foundPass == renderPasses.end(); | 667 bool renderPassAlreadyRemoved = foundPass == renderPasses.end(); |
| 582 if (renderPassAlreadyRemoved) | 668 if (renderPassAlreadyRemoved) |
| 583 return false; | 669 return false; |
| 584 | 670 |
| 585 // If any quad or RenderPass draws into this RenderPass, then keep it. | 671 // If any quad or RenderPass draws into this RenderPass, then keep it. |
| 586 const QuadList& quadList = (*foundPass)->quadList(); | 672 const QuadList& quadList = (*foundPass)->quad_list; |
| 587 for (QuadList::constBackToFrontIterator quadListIterator = quadList.backToFr
ontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { | 673 for (QuadList::constBackToFrontIterator quadListIterator = quadList.backToFr
ontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
| 588 DrawQuad* currentQuad = *quadListIterator; | 674 DrawQuad* currentQuad = *quadListIterator; |
| 589 | 675 |
| 590 if (currentQuad->material != DrawQuad::RENDER_PASS) | 676 if (currentQuad->material != DrawQuad::RENDER_PASS) |
| 591 return false; | 677 return false; |
| 592 | 678 |
| 593 const RenderPass* contributingPass = findRenderPassById(RenderPassDrawQu
ad::MaterialCast(currentQuad)->render_pass_id, frame); | 679 const RenderPass* contributingPass = findRenderPassById(RenderPassDrawQu
ad::MaterialCast(currentQuad)->render_pass_id, frame); |
| 594 RenderPassList::const_iterator foundContributingPass = std::find(renderP
asses.begin(), renderPasses.end(), contributingPass); | 680 RenderPassList::const_iterator foundContributingPass = std::find(renderP
asses.begin(), renderPasses.end(), contributingPass); |
| 595 if (foundContributingPass != renderPasses.end()) | 681 if (foundContributingPass != renderPasses.end()) |
| 596 return false; | 682 return false; |
| 597 } | 683 } |
| 598 return true; | 684 return true; |
| 599 } | 685 } |
| 600 | 686 |
| 601 // Defined for linking tests. | 687 // Defined for linking tests. |
| 602 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameDa
ta&); | 688 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameDa
ta&); |
| 603 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); | 689 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl:
:CullRenderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); |
| 604 | 690 |
| 605 // static | 691 // static |
| 606 template<typename RenderPassCuller> | 692 template<typename RenderPassCuller> |
| 607 void LayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData& f
rame) | 693 void LayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData& f
rame) |
| 608 { | 694 { |
| 609 for (size_t it = culler.renderPassListBegin(frame.renderPasses); it != culle
r.renderPassListEnd(frame.renderPasses); it = culler.renderPassListNext(it)) { | 695 for (size_t it = culler.renderPassListBegin(frame.renderPasses); it != culle
r.renderPassListEnd(frame.renderPasses); it = culler.renderPassListNext(it)) { |
| 610 const RenderPass* currentPass = frame.renderPasses[it]; | 696 const RenderPass* currentPass = frame.renderPasses[it]; |
| 611 const QuadList& quadList = currentPass->quadList(); | 697 const QuadList& quadList = currentPass->quad_list; |
| 612 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFro
ntBegin(); | 698 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFro
ntBegin(); |
| 613 | 699 |
| 614 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator
) { | 700 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator
) { |
| 615 DrawQuad* currentQuad = *quadListIterator; | 701 DrawQuad* currentQuad = *quadListIterator; |
| 616 | 702 |
| 617 if (currentQuad->material != DrawQuad::RENDER_PASS) | 703 if (currentQuad->material != DrawQuad::RENDER_PASS) |
| 618 continue; | 704 continue; |
| 619 | 705 |
| 620 RenderPassDrawQuad* renderPassQuad = static_cast<RenderPassDrawQuad*
>(currentQuad); | 706 RenderPassDrawQuad* renderPassQuad = static_cast<RenderPassDrawQuad*
>(currentQuad); |
| 621 if (!culler.shouldRemoveRenderPass(*renderPassQuad, frame)) | 707 if (!culler.shouldRemoveRenderPass(*renderPassQuad, frame)) |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 714 // Because the contents of the HUD depend on everything else in the frame, t
he contents | 800 // Because the contents of the HUD depend on everything else in the frame, t
he contents |
| 715 // of its texture are updated as the last thing before the frame is drawn. | 801 // of its texture are updated as the last thing before the frame is drawn. |
| 716 if (m_hudLayerImpl) | 802 if (m_hudLayerImpl) |
| 717 m_hudLayerImpl->updateHudTexture(m_resourceProvider.get()); | 803 m_hudLayerImpl->updateHudTexture(m_resourceProvider.get()); |
| 718 | 804 |
| 719 m_renderer->drawFrame(frame.renderPasses, frame.renderPassesById); | 805 m_renderer->drawFrame(frame.renderPasses, frame.renderPassesById); |
| 720 | 806 |
| 721 // Once a RenderPass has been drawn, its damage should be cleared in | 807 // Once a RenderPass has been drawn, its damage should be cleared in |
| 722 // case the RenderPass will be reused next frame. | 808 // case the RenderPass will be reused next frame. |
| 723 for (unsigned int i = 0; i < frame.renderPasses.size(); i++) | 809 for (unsigned int i = 0; i < frame.renderPasses.size(); i++) |
| 724 frame.renderPasses[i]->setDamageRect(gfx::RectF()); | 810 frame.renderPasses[i]->damage_rect = gfx::RectF(); |
| 725 | 811 |
| 726 // The next frame should start by assuming nothing has changed, and changes
are noted as they occur. | 812 // The next frame should start by assuming nothing has changed, and changes
are noted as they occur. |
| 727 for (unsigned int i = 0; i < frame.renderSurfaceLayerList->size(); i++) | 813 for (unsigned int i = 0; i < frame.renderSurfaceLayerList->size(); i++) |
| 728 (*frame.renderSurfaceLayerList)[i]->renderSurface()->damageTracker()->di
dDrawDamagedArea(); | 814 (*frame.renderSurfaceLayerList)[i]->renderSurface()->damageTracker()->di
dDrawDamagedArea(); |
| 729 m_rootLayerImpl->resetAllChangeTrackingForSubtree(); | 815 m_rootLayerImpl->resetAllChangeTrackingForSubtree(); |
| 730 } | 816 } |
| 731 | 817 |
| 732 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame) | 818 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame) |
| 733 { | 819 { |
| 734 for (size_t i = 0; i < frame.willDrawLayers.size(); ++i) | 820 for (size_t i = 0; i < frame.willDrawLayers.size(); ++i) |
| (...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1503 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); | 1589 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); |
| 1504 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1590 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
| 1505 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1591 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
| 1506 m_client->setNeedsRedrawOnImplThread(); | 1592 m_client->setNeedsRedrawOnImplThread(); |
| 1507 | 1593 |
| 1508 for (size_t i = 0; i < layer->children().size(); ++i) | 1594 for (size_t i = 0; i < layer->children().size(); ++i) |
| 1509 animateScrollbarsRecursive(layer->children()[i], time); | 1595 animateScrollbarsRecursive(layer->children()[i], time); |
| 1510 } | 1596 } |
| 1511 | 1597 |
| 1512 } // namespace cc | 1598 } // namespace cc |
| OLD | NEW |