Chromium Code Reviews| 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 "config.h" | 5 #include "config.h" |
| 6 | 6 |
| 7 #include "CCLayerTreeHostImpl.h" | 7 #include "CCLayerTreeHostImpl.h" |
| 8 | 8 |
| 9 #include "CCAppendQuadsData.h" | 9 #include "CCAppendQuadsData.h" |
| 10 #include "CCDamageTracker.h" | 10 #include "CCDamageTracker.h" |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 #include "CCRenderPassDrawQuad.h" | 23 #include "CCRenderPassDrawQuad.h" |
| 24 #include "CCRendererGL.h" | 24 #include "CCRendererGL.h" |
| 25 #include "CCRendererSoftware.h" | 25 #include "CCRendererSoftware.h" |
| 26 #include "CCRenderingStats.h" | 26 #include "CCRenderingStats.h" |
| 27 #include "CCScrollbarAnimationController.h" | 27 #include "CCScrollbarAnimationController.h" |
| 28 #include "CCScrollbarLayerImpl.h" | 28 #include "CCScrollbarLayerImpl.h" |
| 29 #include "CCSettings.h" | 29 #include "CCSettings.h" |
| 30 #include "CCSingleThreadProxy.h" | 30 #include "CCSingleThreadProxy.h" |
| 31 #include "TraceEvent.h" | 31 #include "TraceEvent.h" |
| 32 #include <wtf/CurrentTime.h> | 32 #include <wtf/CurrentTime.h> |
| 33 #include <algorithm> | |
| 33 | 34 |
| 34 using WebKit::WebTransformationMatrix; | 35 using WebKit::WebTransformationMatrix; |
| 35 | 36 |
| 36 namespace { | 37 namespace { |
| 37 | 38 |
| 38 void didVisibilityChange(cc::CCLayerTreeHostImpl* id, bool visible) | 39 void didVisibilityChange(cc::CCLayerTreeHostImpl* id, bool visible) |
| 39 { | 40 { |
| 40 if (visible) { | 41 if (visible) { |
| 41 TRACE_EVENT_ASYNC_BEGIN1("webkit", "CCLayerTreeHostImpl::setVisible", id , "CCLayerTreeHostImpl", id); | 42 TRACE_EVENT_ASYNC_BEGIN1("webkit", "CCLayerTreeHostImpl::setVisible", id , "CCLayerTreeHostImpl", id); |
| 42 return; | 43 return; |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 245 CCLayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), de viceViewportSize(), m_deviceScaleFactor, &m_layerSorter, rendererCapabilities(). maxTextureSize, renderSurfaceLayerList); | 246 CCLayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), de viceViewportSize(), m_deviceScaleFactor, &m_layerSorter, rendererCapabilities(). maxTextureSize, renderSurfaceLayerList); |
| 246 CCLayerTreeHostCommon::calculateVisibleRects(renderSurfaceLayerList); | 247 CCLayerTreeHostCommon::calculateVisibleRects(renderSurfaceLayerList); |
| 247 | 248 |
| 248 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList) ; | 249 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList) ; |
| 249 } | 250 } |
| 250 } | 251 } |
| 251 | 252 |
| 252 void CCLayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<CCRenderPass> r enderPass) | 253 void CCLayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<CCRenderPass> r enderPass) |
| 253 { | 254 { |
| 254 CCRenderPass* pass = renderPass.get(); | 255 CCRenderPass* pass = renderPass.get(); |
| 255 renderPasses.append(pass); | 256 renderPasses.push_back(pass); |
| 256 renderPassesById.set(pass->id(), renderPass.Pass()); | 257 renderPassesById.set(pass->id(), renderPass.Pass()); |
| 257 } | 258 } |
| 258 | 259 |
| 259 bool CCLayerTreeHostImpl::calculateRenderPasses(FrameData& frame) | 260 bool CCLayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
| 260 { | 261 { |
| 261 ASSERT(frame.renderPasses.isEmpty()); | 262 ASSERT(!frame.renderPasses.size()); |
|
tfarina
2012/10/05 02:02:12
this should have been empty().
danakj
2012/10/05 14:32:13
yes, thanks!
| |
| 262 | 263 |
| 263 calculateRenderSurfaceLayerList(*frame.renderSurfaceLayerList); | 264 calculateRenderSurfaceLayerList(*frame.renderSurfaceLayerList); |
| 264 | 265 |
| 265 TRACE_EVENT1("cc", "CCLayerTreeHostImpl::calculateRenderPasses", "renderSurf aceLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerLi st->size())); | 266 TRACE_EVENT1("cc", "CCLayerTreeHostImpl::calculateRenderPasses", "renderSurf aceLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerLi st->size())); |
| 266 | 267 |
| 267 // Create the render passes in dependency order. | 268 // Create the render passes in dependency order. |
| 268 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd ex >= 0 ; --surfaceIndex) { | 269 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd ex >= 0 ; --surfaceIndex) { |
| 269 CCLayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfac eIndex]; | 270 CCLayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfac eIndex]; |
| 270 renderSurfaceLayer->renderSurface()->appendRenderPasses(frame); | 271 renderSurfaceLayer->renderSurface()->appendRenderPasses(frame); |
| 271 } | 272 } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 336 | 337 |
| 337 #if !ASSERT_DISABLED | 338 #if !ASSERT_DISABLED |
| 338 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { | 339 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { |
| 339 for (size_t j = 0; j < frame.renderPasses[i]->quadList().size(); ++j) | 340 for (size_t j = 0; j < frame.renderPasses[i]->quadList().size(); ++j) |
| 340 ASSERT(frame.renderPasses[i]->quadList()[j]->sharedQuadStateId() >= 0); | 341 ASSERT(frame.renderPasses[i]->quadList()[j]->sharedQuadStateId() >= 0); |
| 341 ASSERT(frame.renderPassesById.contains(frame.renderPasses[i]->id())); | 342 ASSERT(frame.renderPassesById.contains(frame.renderPasses[i]->id())); |
| 342 } | 343 } |
| 343 #endif | 344 #endif |
| 344 | 345 |
| 345 if (!m_hasTransparentBackground) { | 346 if (!m_hasTransparentBackground) { |
| 346 frame.renderPasses.last()->setHasTransparentBackground(false); | 347 frame.renderPasses.back()->setHasTransparentBackground(false); |
| 347 frame.renderPasses.last()->appendQuadsToFillScreen(m_rootLayerImpl.get() , m_backgroundColor, occlusionTracker); | 348 frame.renderPasses.back()->appendQuadsToFillScreen(m_rootLayerImpl.get() , m_backgroundColor, occlusionTracker); |
| 348 } | 349 } |
| 349 | 350 |
| 350 if (drawFrame) | 351 if (drawFrame) |
| 351 occlusionTracker.overdrawMetrics().recordMetrics(this); | 352 occlusionTracker.overdrawMetrics().recordMetrics(this); |
| 352 | 353 |
| 353 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); | 354 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); |
| 354 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); | 355 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); |
| 355 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); | 356 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); |
| 356 | 357 |
| 357 return drawFrame; | 358 return drawFrame; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 406 static inline CCRenderPass* findRenderPassById(CCRenderPass::Id renderPassId, co nst CCLayerTreeHostImpl::FrameData& frame) | 407 static inline CCRenderPass* findRenderPassById(CCRenderPass::Id renderPassId, co nst CCLayerTreeHostImpl::FrameData& frame) |
| 407 { | 408 { |
| 408 CCRenderPassIdHashMap::const_iterator it = frame.renderPassesById.find(rende rPassId); | 409 CCRenderPassIdHashMap::const_iterator it = frame.renderPassesById.find(rende rPassId); |
| 409 ASSERT(it != frame.renderPassesById.end()); | 410 ASSERT(it != frame.renderPassesById.end()); |
| 410 return it->second; | 411 return it->second; |
| 411 } | 412 } |
| 412 | 413 |
| 413 static void removeRenderPassesRecursive(CCRenderPass::Id removeRenderPassId, CCL ayerTreeHostImpl::FrameData& frame) | 414 static void removeRenderPassesRecursive(CCRenderPass::Id removeRenderPassId, CCL ayerTreeHostImpl::FrameData& frame) |
| 414 { | 415 { |
| 415 CCRenderPass* removeRenderPass = findRenderPassById(removeRenderPassId, fram e); | 416 CCRenderPass* removeRenderPass = findRenderPassById(removeRenderPassId, fram e); |
| 416 size_t removeIndex = frame.renderPasses.find(removeRenderPass); | 417 CCRenderPassList& renderPasses = frame.renderPasses; |
| 418 CCRenderPassList::iterator toRemove = std::find(renderPasses.begin(), render Passes.end(), removeRenderPass); | |
| 417 | 419 |
| 418 // The pass was already removed by another quad - probably the original, and we are the replica. | 420 // The pass was already removed by another quad - probably the original, and we are the replica. |
| 419 if (removeIndex == notFound) | 421 if (toRemove == renderPasses.end()) |
| 420 return; | 422 return; |
| 421 | 423 |
| 422 const CCRenderPass* removedPass = frame.renderPasses[removeIndex]; | 424 const CCRenderPass* removedPass = *toRemove; |
| 423 frame.renderPasses.remove(removeIndex); | 425 frame.renderPasses.erase(toRemove); |
| 424 | 426 |
| 425 // Now follow up for all RenderPass quads and remove their RenderPasses recu rsively. | 427 // Now follow up for all RenderPass quads and remove their RenderPasses recu rsively. |
| 426 const CCQuadList& quadList = removedPass->quadList(); | 428 const CCQuadList& quadList = removedPass->quadList(); |
| 427 CCQuadList::constBackToFrontIterator quadListIterator = quadList.backToFront Begin(); | 429 CCQuadList::constBackToFrontIterator quadListIterator = quadList.backToFront Begin(); |
| 428 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { | 430 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
| 429 CCDrawQuad* currentQuad = (*quadListIterator); | 431 CCDrawQuad* currentQuad = (*quadListIterator); |
| 430 if (currentQuad->material() != CCDrawQuad::RenderPass) | 432 if (currentQuad->material() != CCDrawQuad::RenderPass) |
| 431 continue; | 433 continue; |
| 432 | 434 |
| 433 CCRenderPass::Id nextRemoveRenderPassId = CCRenderPassDrawQuad::material Cast(currentQuad)->renderPassId(); | 435 CCRenderPass::Id nextRemoveRenderPassId = CCRenderPassDrawQuad::material Cast(currentQuad)->renderPassId(); |
| 434 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); | 436 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); |
| 435 } | 437 } |
| 436 } | 438 } |
| 437 | 439 |
| 438 bool CCLayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRender Pass(const CCRenderPassDrawQuad& quad, const FrameData&) const | 440 bool CCLayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRender Pass(const CCRenderPassDrawQuad& quad, const FrameData&) const |
| 439 { | 441 { |
| 440 return quad.contentsChangedSinceLastFrame().isEmpty() && m_renderer.haveCach edResourcesForRenderPassId(quad.renderPassId()); | 442 return quad.contentsChangedSinceLastFrame().isEmpty() && m_renderer.haveCach edResourcesForRenderPassId(quad.renderPassId()); |
| 441 } | 443 } |
| 442 | 444 |
| 443 bool CCLayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(co nst CCRenderPassDrawQuad& quad, const FrameData& frame) const | 445 bool CCLayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(co nst CCRenderPassDrawQuad& quad, const FrameData& frame) const |
| 444 { | 446 { |
| 445 const CCRenderPass* renderPass = findRenderPassById(quad.renderPassId(), fra me); | 447 const CCRenderPass* renderPass = findRenderPassById(quad.renderPassId(), fra me); |
| 446 size_t passIndex = frame.renderPasses.find(renderPass); | 448 const CCRenderPassList& renderPasses = frame.renderPasses; |
| 449 CCRenderPassList::const_iterator foundPass = std::find(renderPasses.begin(), renderPasses.end(), renderPass); | |
| 447 | 450 |
| 448 bool renderPassAlreadyRemoved = passIndex == notFound; | 451 bool renderPassAlreadyRemoved = foundPass == renderPasses.end(); |
| 449 if (renderPassAlreadyRemoved) | 452 if (renderPassAlreadyRemoved) |
| 450 return false; | 453 return false; |
| 451 | 454 |
| 452 // If any quad or RenderPass draws into this RenderPass, then keep it. | 455 // If any quad or RenderPass draws into this RenderPass, then keep it. |
| 453 const CCQuadList& quadList = frame.renderPasses[passIndex]->quadList(); | 456 const CCQuadList& quadList = (*foundPass)->quadList(); |
| 454 for (CCQuadList::constBackToFrontIterator quadListIterator = quadList.backTo FrontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { | 457 for (CCQuadList::constBackToFrontIterator quadListIterator = quadList.backTo FrontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
| 455 CCDrawQuad* currentQuad = *quadListIterator; | 458 CCDrawQuad* currentQuad = *quadListIterator; |
| 456 | 459 |
| 457 if (currentQuad->material() != CCDrawQuad::RenderPass) | 460 if (currentQuad->material() != CCDrawQuad::RenderPass) |
| 458 return false; | 461 return false; |
| 459 | 462 |
| 460 const CCRenderPass* contributingPass = findRenderPassById(CCRenderPassDr awQuad::materialCast(currentQuad)->renderPassId(), frame); | 463 const CCRenderPass* contributingPass = findRenderPassById(CCRenderPassDr awQuad::materialCast(currentQuad)->renderPassId(), frame); |
| 461 if (frame.renderPasses.contains(contributingPass)) | 464 CCRenderPassList::const_iterator foundContributingPass = std::find(rende rPasses.begin(), renderPasses.end(), contributingPass); |
| 465 if (foundContributingPass != renderPasses.end()) | |
| 462 return false; | 466 return false; |
| 463 } | 467 } |
| 464 return true; | 468 return true; |
| 465 } | 469 } |
| 466 | 470 |
| 467 // Defined for linking tests. | 471 // Defined for linking tests. |
| 468 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR enderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameData&); | 472 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR enderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameData&); |
| 469 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR enderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); | 473 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR enderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); |
| 470 | 474 |
| 471 // static | 475 // static |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 540 | 544 |
| 541 void CCLayerTreeHostImpl::onVSyncParametersChanged(double monotonicTimebase, dou ble intervalInSeconds) | 545 void CCLayerTreeHostImpl::onVSyncParametersChanged(double monotonicTimebase, dou ble intervalInSeconds) |
| 542 { | 546 { |
| 543 m_client->onVSyncParametersChanged(monotonicTimebase, intervalInSeconds); | 547 m_client->onVSyncParametersChanged(monotonicTimebase, intervalInSeconds); |
| 544 } | 548 } |
| 545 | 549 |
| 546 void CCLayerTreeHostImpl::drawLayers(const FrameData& frame) | 550 void CCLayerTreeHostImpl::drawLayers(const FrameData& frame) |
| 547 { | 551 { |
| 548 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::drawLayers"); | 552 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::drawLayers"); |
| 549 ASSERT(canDraw()); | 553 ASSERT(canDraw()); |
| 550 ASSERT(!frame.renderPasses.isEmpty()); | 554 ASSERT(frame.renderPasses.size()); |
| 551 | 555 |
| 552 // FIXME: use the frame begin time from the overall compositor scheduler. | 556 // FIXME: use the frame begin time from the overall compositor scheduler. |
| 553 // This value is currently inaccessible because it is up in Chromium's | 557 // This value is currently inaccessible because it is up in Chromium's |
| 554 // RenderWidget. | 558 // RenderWidget. |
| 555 m_fpsCounter->markBeginningOfFrame(currentTime()); | 559 m_fpsCounter->markBeginningOfFrame(currentTime()); |
| 556 | 560 |
| 557 if (m_settings.showDebugRects()) | 561 if (m_settings.showDebugRects()) |
| 558 m_debugRectHistory->saveDebugRectsForCurrentFrame(m_rootLayerImpl.get(), *frame.renderSurfaceLayerList, frame.occludingScreenSpaceRects, settings()); | 562 m_debugRectHistory->saveDebugRectsForCurrentFrame(m_rootLayerImpl.get(), *frame.renderSurfaceLayerList, frame.occludingScreenSpaceRects, settings()); |
| 559 | 563 |
| 560 // Because the contents of the HUD depend on everything else in the frame, t he contents | 564 // Because the contents of the HUD depend on everything else in the frame, t he contents |
| (...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1302 | 1306 |
| 1303 CCScrollbarAnimationController* scrollbarController = layer->scrollbarAnimat ionController(); | 1307 CCScrollbarAnimationController* scrollbarController = layer->scrollbarAnimat ionController(); |
| 1304 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1308 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
| 1305 m_client->setNeedsRedrawOnImplThread(); | 1309 m_client->setNeedsRedrawOnImplThread(); |
| 1306 | 1310 |
| 1307 for (size_t i = 0; i < layer->children().size(); ++i) | 1311 for (size_t i = 0; i < layer->children().size(); ++i) |
| 1308 animateScrollbarsRecursive(layer->children()[i], monotonicTime); | 1312 animateScrollbarsRecursive(layer->children()[i], monotonicTime); |
| 1309 } | 1313 } |
| 1310 | 1314 |
| 1311 } // namespace cc | 1315 } // namespace cc |
| OLD | NEW |