Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: cc/layer_tree_host_impl.cc

Issue 11413106: cc: Make RenderPass into a struct-like class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 LayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), devi ceViewportSize(), m_deviceScaleFactor, pageScaleFactor, &m_layerSorter, renderer Capabilities().maxTextureSize, renderSurfaceLayerList); 373 LayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), devi ceViewportSize(), m_deviceScaleFactor, pageScaleFactor, &m_layerSorter, renderer Capabilities().maxTextureSize, renderSurfaceLayerList);
374 374
375 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList) ; 375 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList) ;
376 } 376 }
377 } 377 }
378 378
379 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende rPass) 379 void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende rPass)
380 { 380 {
381 RenderPass* pass = renderPass.get(); 381 RenderPass* pass = renderPass.get();
382 renderPasses.push_back(pass); 382 renderPasses.push_back(pass);
383 renderPassesById.set(pass->id(), renderPass.Pass()); 383 renderPassesById.set(pass->id, renderPass.Pass());
384 } 384 }
385 385
386 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) 386 bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame)
387 { 387 {
388 DCHECK(frame.renderPasses.empty()); 388 DCHECK(frame.renderPasses.empty());
389 389
390 calculateRenderSurfaceLayerList(*frame.renderSurfaceLayerList); 390 calculateRenderSurfaceLayerList(*frame.renderSurfaceLayerList);
391 391
392 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList ->size())); 392 TRACE_EVENT1("cc", "LayerTreeHostImpl::calculateRenderPasses", "renderSurfac eLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerList ->size()));
393 393
(...skipping 20 matching lines...) Expand all
414 // in the future. 414 // in the future.
415 bool drawFrame = true; 415 bool drawFrame = true;
416 416
417 LayerIteratorType end = LayerIteratorType::end(frame.renderSurfaceLayerList) ; 417 LayerIteratorType end = LayerIteratorType::end(frame.renderSurfaceLayerList) ;
418 for (LayerIteratorType it = LayerIteratorType::begin(frame.renderSurfaceLaye rList); it != end; ++it) { 418 for (LayerIteratorType it = LayerIteratorType::begin(frame.renderSurfaceLaye rList); it != end; ++it) {
419 RenderPass::Id targetRenderPassId = it.targetRenderSurfaceLayer()->rende rSurface()->renderPassId(); 419 RenderPass::Id targetRenderPassId = it.targetRenderSurfaceLayer()->rende rSurface()->renderPassId();
420 RenderPass* targetRenderPass = frame.renderPassesById.get(targetRenderPa ssId); 420 RenderPass* targetRenderPass = frame.renderPassesById.get(targetRenderPa ssId);
421 421
422 occlusionTracker.enterLayer(it); 422 occlusionTracker.enterLayer(it);
423 423
424 AppendQuadsData appendQuadsData(targetRenderPass->id()); 424 AppendQuadsData appendQuadsData(targetRenderPass->id);
425 425
426 if (it.representsContributingRenderSurface()) { 426 if (it.representsContributingRenderSurface()) {
427 RenderPass::Id contributingRenderPassId = it->renderSurface()->rende rPassId(); 427 RenderPass::Id contributingRenderPassId = it->renderSurface()->rende rPassId();
428 RenderPass* contributingRenderPass = frame.renderPassesById.get(cont ributingRenderPassId); 428 RenderPass* contributingRenderPass = frame.renderPassesById.get(cont ributingRenderPassId);
429 targetRenderPass->appendQuadsForRenderSurfaceLayer(*it, contributing RenderPass, &occlusionTracker, appendQuadsData); 429 targetRenderPass->AppendQuadsForRenderSurfaceLayer(*it, *contributin gRenderPass, occlusionTracker, appendQuadsData);
430 } else if (it.representsItself() && !it->visibleContentRect().IsEmpty()) { 430 } else if (it.representsItself() && !it->visibleContentRect().IsEmpty()) {
431 bool hasOcclusionFromOutsideTargetSurface; 431 bool hasOcclusionFromOutsideTargetSurface;
432 bool implDrawTransformIsUnknown = false; 432 bool implDrawTransformIsUnknown = false;
433 if (occlusionTracker.occluded(it->renderTarget(), it->visibleContent Rect(), it->drawTransform(), implDrawTransformIsUnknown, it->drawableContentRect (), &hasOcclusionFromOutsideTargetSurface)) 433 if (occlusionTracker.occluded(it->renderTarget(), it->visibleContent Rect(), it->drawTransform(), implDrawTransformIsUnknown, it->drawableContentRect (), &hasOcclusionFromOutsideTargetSurface))
434 appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclu sionFromOutsideTargetSurface; 434 appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclu sionFromOutsideTargetSurface;
435 else { 435 else {
436 it->willDraw(m_resourceProvider.get()); 436 it->willDraw(m_resourceProvider.get());
437 frame.willDrawLayers.push_back(*it); 437 frame.willDrawLayers.push_back(*it);
438 438
439 if (it->hasContributingDelegatedRenderPasses()) { 439 if (it->hasContributingDelegatedRenderPasses()) {
440 RenderPass::Id contributingRenderPassId = it->firstContribut ingRenderPassId(); 440 RenderPass::Id contributingRenderPassId = it->firstContribut ingRenderPassId();
441 while (frame.renderPassesById.contains(contributingRenderPas sId)) { 441 while (frame.renderPassesById.contains(contributingRenderPas sId)) {
442 RenderPass* renderPass = frame.renderPassesById.get(cont ributingRenderPassId); 442 RenderPass* renderPass = frame.renderPassesById.get(cont ributingRenderPassId);
443 443
444 AppendQuadsData appendQuadsData(renderPass->id()); 444 AppendQuadsData appendQuadsData(renderPass->id);
445 renderPass->appendQuadsForLayer(*it, &occlusionTracker, appendQuadsData); 445 renderPass->AppendQuadsForLayer(*it, occlusionTracker, a ppendQuadsData);
446 446
447 contributingRenderPassId = it->nextContributingRenderPas sId(contributingRenderPassId); 447 contributingRenderPassId = it->nextContributingRenderPas sId(contributingRenderPassId);
448 } 448 }
449 } 449 }
450 450
451 targetRenderPass->appendQuadsForLayer(*it, &occlusionTracker, ap pendQuadsData); 451 targetRenderPass->AppendQuadsForLayer(*it, occlusionTracker, app endQuadsData);
452 } 452 }
453 } 453 }
454 454
455 if (appendQuadsData.hadOcclusionFromOutsideTargetSurface) 455 if (appendQuadsData.hadOcclusionFromOutsideTargetSurface)
456 targetRenderPass->setHasOcclusionFromOutsideTargetSurface(true); 456 targetRenderPass->has_occlusion_from_outside_target_surface = true;
457 457
458 if (appendQuadsData.hadMissingTiles) { 458 if (appendQuadsData.hadMissingTiles) {
459 bool layerHasAnimatingTransform = it->screenSpaceTransformIsAnimatin g() || it->drawTransformIsAnimating(); 459 bool layerHasAnimatingTransform = it->screenSpaceTransformIsAnimatin g() || it->drawTransformIsAnimating();
460 if (layerHasAnimatingTransform) 460 if (layerHasAnimatingTransform)
461 drawFrame = false; 461 drawFrame = false;
462 } 462 }
463 463
464 occlusionTracker.leaveLayer(it); 464 occlusionTracker.leaveLayer(it);
465 } 465 }
466 466
467 #ifndef NDEBUG 467 #ifndef NDEBUG
468 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { 468 for (size_t i = 0; i < frame.renderPasses.size(); ++i) {
469 for (size_t j = 0; j < frame.renderPasses[i]->quadList().size(); ++j) 469 for (size_t j = 0; j < frame.renderPasses[i]->quad_list.size(); ++j)
470 DCHECK(frame.renderPasses[i]->quadList()[j]->shared_quad_state); 470 DCHECK(frame.renderPasses[i]->quad_list[j]->shared_quad_state);
471 DCHECK(frame.renderPassesById.contains(frame.renderPasses[i]->id())); 471 DCHECK(frame.renderPassesById.contains(frame.renderPasses[i]->id));
472 } 472 }
473 #endif 473 #endif
474 474
475 if (!m_hasTransparentBackground) { 475 if (!m_hasTransparentBackground) {
476 frame.renderPasses.back()->setHasTransparentBackground(false); 476 frame.renderPasses.back()->has_transparent_background = false;
477 frame.renderPasses.back()->appendQuadsToFillScreen(m_rootLayerImpl.get() , m_backgroundColor, occlusionTracker); 477 frame.renderPasses.back()->AppendQuadsToFillScreen(m_rootLayerImpl.get() , m_backgroundColor, occlusionTracker);
478 } 478 }
479 479
480 if (drawFrame) 480 if (drawFrame)
481 occlusionTracker.overdrawMetrics().recordMetrics(this); 481 occlusionTracker.overdrawMetrics().recordMetrics(this);
482 482
483 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); 483 removeRenderPasses(CullRenderPassesWithNoQuads(), frame);
484 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); 484 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses);
485 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); 485 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame);
486 486
487 return drawFrame; 487 return drawFrame;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 RenderPassList::iterator toRemove = std::find(renderPasses.begin(), renderPa sses.end(), removeRenderPass); 548 RenderPassList::iterator toRemove = std::find(renderPasses.begin(), renderPa sses.end(), removeRenderPass);
549 549
550 // The pass was already removed by another quad - probably the original, and we are the replica. 550 // The pass was already removed by another quad - probably the original, and we are the replica.
551 if (toRemove == renderPasses.end()) 551 if (toRemove == renderPasses.end())
552 return; 552 return;
553 553
554 const RenderPass* removedPass = *toRemove; 554 const RenderPass* removedPass = *toRemove;
555 frame.renderPasses.erase(toRemove); 555 frame.renderPasses.erase(toRemove);
556 556
557 // Now follow up for all RenderPass quads and remove their RenderPasses recu rsively. 557 // Now follow up for all RenderPass quads and remove their RenderPasses recu rsively.
558 const QuadList& quadList = removedPass->quadList(); 558 const QuadList& quadList = removedPass->quad_list;
559 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBe gin(); 559 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBe gin();
560 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { 560 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) {
561 DrawQuad* currentQuad = (*quadListIterator); 561 DrawQuad* currentQuad = (*quadListIterator);
562 if (currentQuad->material != DrawQuad::RENDER_PASS) 562 if (currentQuad->material != DrawQuad::RENDER_PASS)
563 continue; 563 continue;
564 564
565 RenderPass::Id nextRemoveRenderPassId = RenderPassDrawQuad::MaterialCast (currentQuad)->render_pass_id; 565 RenderPass::Id nextRemoveRenderPassId = RenderPassDrawQuad::MaterialCast (currentQuad)->render_pass_id;
566 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); 566 removeRenderPassesRecursive(nextRemoveRenderPassId, frame);
567 } 567 }
568 } 568 }
569 569
570 bool LayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRenderPa ss(const RenderPassDrawQuad& quad, const FrameData&) const 570 bool LayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRenderPa ss(const RenderPassDrawQuad& quad, const FrameData&) const
571 { 571 {
572 return quad.contents_changed_since_last_frame.IsEmpty() && m_renderer.haveCa chedResourcesForRenderPassId(quad.render_pass_id); 572 return quad.contents_changed_since_last_frame.IsEmpty() && m_renderer.haveCa chedResourcesForRenderPassId(quad.render_pass_id);
573 } 573 }
574 574
575 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(cons t RenderPassDrawQuad& quad, const FrameData& frame) const 575 bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(cons t RenderPassDrawQuad& quad, const FrameData& frame) const
576 { 576 {
577 const RenderPass* renderPass = findRenderPassById(quad.render_pass_id, frame ); 577 const RenderPass* renderPass = findRenderPassById(quad.render_pass_id, frame );
578 const RenderPassList& renderPasses = frame.renderPasses; 578 const RenderPassList& renderPasses = frame.renderPasses;
579 RenderPassList::const_iterator foundPass = std::find(renderPasses.begin(), r enderPasses.end(), renderPass); 579 RenderPassList::const_iterator foundPass = std::find(renderPasses.begin(), r enderPasses.end(), renderPass);
580 580
581 bool renderPassAlreadyRemoved = foundPass == renderPasses.end(); 581 bool renderPassAlreadyRemoved = foundPass == renderPasses.end();
582 if (renderPassAlreadyRemoved) 582 if (renderPassAlreadyRemoved)
583 return false; 583 return false;
584 584
585 // If any quad or RenderPass draws into this RenderPass, then keep it. 585 // If any quad or RenderPass draws into this RenderPass, then keep it.
586 const QuadList& quadList = (*foundPass)->quadList(); 586 const QuadList& quadList = (*foundPass)->quad_list;
587 for (QuadList::constBackToFrontIterator quadListIterator = quadList.backToFr ontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { 587 for (QuadList::constBackToFrontIterator quadListIterator = quadList.backToFr ontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) {
588 DrawQuad* currentQuad = *quadListIterator; 588 DrawQuad* currentQuad = *quadListIterator;
589 589
590 if (currentQuad->material != DrawQuad::RENDER_PASS) 590 if (currentQuad->material != DrawQuad::RENDER_PASS)
591 return false; 591 return false;
592 592
593 const RenderPass* contributingPass = findRenderPassById(RenderPassDrawQu ad::MaterialCast(currentQuad)->render_pass_id, frame); 593 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); 594 RenderPassList::const_iterator foundContributingPass = std::find(renderP asses.begin(), renderPasses.end(), contributingPass);
595 if (foundContributingPass != renderPasses.end()) 595 if (foundContributingPass != renderPasses.end())
596 return false; 596 return false;
597 } 597 }
598 return true; 598 return true;
599 } 599 }
600 600
601 // Defined for linking tests. 601 // Defined for linking tests.
602 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl: :CullRenderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameDa ta&); 602 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl: :CullRenderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameDa ta&);
603 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl: :CullRenderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); 603 template CC_EXPORT void LayerTreeHostImpl::removeRenderPasses<LayerTreeHostImpl: :CullRenderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&);
604 604
605 // static 605 // static
606 template<typename RenderPassCuller> 606 template<typename RenderPassCuller>
607 void LayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData& f rame) 607 void LayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData& f rame)
608 { 608 {
609 for (size_t it = culler.renderPassListBegin(frame.renderPasses); it != culle r.renderPassListEnd(frame.renderPasses); it = culler.renderPassListNext(it)) { 609 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]; 610 const RenderPass* currentPass = frame.renderPasses[it];
611 const QuadList& quadList = currentPass->quadList(); 611 const QuadList& quadList = currentPass->quad_list;
612 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFro ntBegin(); 612 QuadList::constBackToFrontIterator quadListIterator = quadList.backToFro ntBegin();
613 613
614 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator ) { 614 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator ) {
615 DrawQuad* currentQuad = *quadListIterator; 615 DrawQuad* currentQuad = *quadListIterator;
616 616
617 if (currentQuad->material != DrawQuad::RENDER_PASS) 617 if (currentQuad->material != DrawQuad::RENDER_PASS)
618 continue; 618 continue;
619 619
620 RenderPassDrawQuad* renderPassQuad = static_cast<RenderPassDrawQuad* >(currentQuad); 620 RenderPassDrawQuad* renderPassQuad = static_cast<RenderPassDrawQuad* >(currentQuad);
621 if (!culler.shouldRemoveRenderPass(*renderPassQuad, frame)) 621 if (!culler.shouldRemoveRenderPass(*renderPassQuad, frame))
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 // Because the contents of the HUD depend on everything else in the frame, t he contents 714 // 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. 715 // of its texture are updated as the last thing before the frame is drawn.
716 if (m_hudLayerImpl) 716 if (m_hudLayerImpl)
717 m_hudLayerImpl->updateHudTexture(m_resourceProvider.get()); 717 m_hudLayerImpl->updateHudTexture(m_resourceProvider.get());
718 718
719 m_renderer->drawFrame(frame.renderPasses, frame.renderPassesById); 719 m_renderer->drawFrame(frame.renderPasses, frame.renderPassesById);
720 720
721 // Once a RenderPass has been drawn, its damage should be cleared in 721 // Once a RenderPass has been drawn, its damage should be cleared in
722 // case the RenderPass will be reused next frame. 722 // case the RenderPass will be reused next frame.
723 for (unsigned int i = 0; i < frame.renderPasses.size(); i++) 723 for (unsigned int i = 0; i < frame.renderPasses.size(); i++)
724 frame.renderPasses[i]->setDamageRect(gfx::RectF()); 724 frame.renderPasses[i]->damage_rect = gfx::RectF();
725 725
726 // The next frame should start by assuming nothing has changed, and changes are noted as they occur. 726 // 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++) 727 for (unsigned int i = 0; i < frame.renderSurfaceLayerList->size(); i++)
728 (*frame.renderSurfaceLayerList)[i]->renderSurface()->damageTracker()->di dDrawDamagedArea(); 728 (*frame.renderSurfaceLayerList)[i]->renderSurface()->damageTracker()->di dDrawDamagedArea();
729 m_rootLayerImpl->resetAllChangeTrackingForSubtree(); 729 m_rootLayerImpl->resetAllChangeTrackingForSubtree();
730 } 730 }
731 731
732 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame) 732 void LayerTreeHostImpl::didDrawAllLayers(const FrameData& frame)
733 { 733 {
734 for (size_t i = 0; i < frame.willDrawLayers.size(); ++i) 734 for (size_t i = 0; i < frame.willDrawLayers.size(); ++i)
(...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after
1503 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio nController(); 1503 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio nController();
1504 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); 1504 double monotonicTime = (time - base::TimeTicks()).InSecondsF();
1505 if (scrollbarController && scrollbarController->animate(monotonicTime)) 1505 if (scrollbarController && scrollbarController->animate(monotonicTime))
1506 m_client->setNeedsRedrawOnImplThread(); 1506 m_client->setNeedsRedrawOnImplThread();
1507 1507
1508 for (size_t i = 0; i < layer->children().size(); ++i) 1508 for (size_t i = 0; i < layer->children().size(); ++i)
1509 animateScrollbarsRecursive(layer->children()[i], time); 1509 animateScrollbarsRecursive(layer->children()[i], time);
1510 } 1510 }
1511 1511
1512 } // namespace cc 1512 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698