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 |