| 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.isEmpty()); |
| 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())); |
| (...skipping 70 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 |
| 424 size_t removeIndex = std::distance(renderPasses.begin(), toRemove); |
| 422 const CCRenderPass* removedPass = frame.renderPasses[removeIndex]; | 425 const CCRenderPass* removedPass = frame.renderPasses[removeIndex]; |
| 423 frame.renderPasses.remove(removeIndex); | 426 frame.renderPasses.erase(toRemove); |
| 424 | 427 |
| 425 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. | 428 // Now follow up for all RenderPass quads and remove their RenderPasses recu
rsively. |
| 426 const CCQuadList& quadList = removedPass->quadList(); | 429 const CCQuadList& quadList = removedPass->quadList(); |
| 427 CCQuadList::constBackToFrontIterator quadListIterator = quadList.backToFront
Begin(); | 430 CCQuadList::constBackToFrontIterator quadListIterator = quadList.backToFront
Begin(); |
| 428 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { | 431 for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
| 429 CCDrawQuad* currentQuad = (*quadListIterator); | 432 CCDrawQuad* currentQuad = (*quadListIterator); |
| 430 if (currentQuad->material() != CCDrawQuad::RenderPass) | 433 if (currentQuad->material() != CCDrawQuad::RenderPass) |
| 431 continue; | 434 continue; |
| 432 | 435 |
| 433 CCRenderPass::Id nextRemoveRenderPassId = CCRenderPassDrawQuad::material
Cast(currentQuad)->renderPassId(); | 436 CCRenderPass::Id nextRemoveRenderPassId = CCRenderPassDrawQuad::material
Cast(currentQuad)->renderPassId(); |
| 434 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); | 437 removeRenderPassesRecursive(nextRemoveRenderPassId, frame); |
| 435 } | 438 } |
| 436 } | 439 } |
| 437 | 440 |
| 438 bool CCLayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRender
Pass(const CCRenderPassDrawQuad& quad, const FrameData&) const | 441 bool CCLayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRender
Pass(const CCRenderPassDrawQuad& quad, const FrameData&) const |
| 439 { | 442 { |
| 440 return quad.contentsChangedSinceLastFrame().isEmpty() && m_renderer.haveCach
edResourcesForRenderPassId(quad.renderPassId()); | 443 return quad.contentsChangedSinceLastFrame().isEmpty() && m_renderer.haveCach
edResourcesForRenderPassId(quad.renderPassId()); |
| 441 } | 444 } |
| 442 | 445 |
| 443 bool CCLayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(co
nst CCRenderPassDrawQuad& quad, const FrameData& frame) const | 446 bool CCLayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(co
nst CCRenderPassDrawQuad& quad, const FrameData& frame) const |
| 444 { | 447 { |
| 445 const CCRenderPass* renderPass = findRenderPassById(quad.renderPassId(), fra
me); | 448 const CCRenderPass* renderPass = findRenderPassById(quad.renderPassId(), fra
me); |
| 446 size_t passIndex = frame.renderPasses.find(renderPass); | 449 const CCRenderPassList& renderPasses = frame.renderPasses; |
| 450 CCRenderPassList::const_iterator foundPass = std::find(renderPasses.begin(),
renderPasses.end(), renderPass); |
| 447 | 451 |
| 448 bool renderPassAlreadyRemoved = passIndex == notFound; | 452 size_t passIndex = std::distance(renderPasses.begin(), foundPass); |
| 453 bool renderPassAlreadyRemoved = foundPass == renderPasses.end(); |
| 449 if (renderPassAlreadyRemoved) | 454 if (renderPassAlreadyRemoved) |
| 450 return false; | 455 return false; |
| 451 | 456 |
| 452 // If any quad or RenderPass draws into this RenderPass, then keep it. | 457 // If any quad or RenderPass draws into this RenderPass, then keep it. |
| 453 const CCQuadList& quadList = frame.renderPasses[passIndex]->quadList(); | 458 const CCQuadList& quadList = frame.renderPasses[passIndex]->quadList(); |
| 454 for (CCQuadList::constBackToFrontIterator quadListIterator = quadList.backTo
FrontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator)
{ | 459 for (CCQuadList::constBackToFrontIterator quadListIterator = quadList.backTo
FrontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator)
{ |
| 455 CCDrawQuad* currentQuad = *quadListIterator; | 460 CCDrawQuad* currentQuad = *quadListIterator; |
| 456 | 461 |
| 457 if (currentQuad->material() != CCDrawQuad::RenderPass) | 462 if (currentQuad->material() != CCDrawQuad::RenderPass) |
| 458 return false; | 463 return false; |
| 459 | 464 |
| 460 const CCRenderPass* contributingPass = findRenderPassById(CCRenderPassDr
awQuad::materialCast(currentQuad)->renderPassId(), frame); | 465 const CCRenderPass* contributingPass = findRenderPassById(CCRenderPassDr
awQuad::materialCast(currentQuad)->renderPassId(), frame); |
| 461 if (frame.renderPasses.contains(contributingPass)) | 466 CCRenderPassList::const_iterator foundContributingPass = std::find(rende
rPasses.begin(), renderPasses.end(), contributingPass); |
| 467 if (foundContributingPass != renderPasses.end()) |
| 462 return false; | 468 return false; |
| 463 } | 469 } |
| 464 return true; | 470 return true; |
| 465 } | 471 } |
| 466 | 472 |
| 467 // Defined for linking tests. | 473 // Defined for linking tests. |
| 468 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR
enderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameData&); | 474 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR
enderPassesWithCachedTextures>(CullRenderPassesWithCachedTextures, FrameData&); |
| 469 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR
enderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); | 475 template void CCLayerTreeHostImpl::removeRenderPasses<CCLayerTreeHostImpl::CullR
enderPassesWithNoQuads>(CullRenderPassesWithNoQuads, FrameData&); |
| 470 | 476 |
| 471 // static | 477 // static |
| (...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1302 | 1308 |
| 1303 CCScrollbarAnimationController* scrollbarController = layer->scrollbarAnimat
ionController(); | 1309 CCScrollbarAnimationController* scrollbarController = layer->scrollbarAnimat
ionController(); |
| 1304 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1310 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
| 1305 m_client->setNeedsRedrawOnImplThread(); | 1311 m_client->setNeedsRedrawOnImplThread(); |
| 1306 | 1312 |
| 1307 for (size_t i = 0; i < layer->children().size(); ++i) | 1313 for (size_t i = 0; i < layer->children().size(); ++i) |
| 1308 animateScrollbarsRecursive(layer->children()[i], monotonicTime); | 1314 animateScrollbarsRecursive(layer->children()[i], monotonicTime); |
| 1309 } | 1315 } |
| 1310 | 1316 |
| 1311 } // namespace cc | 1317 } // namespace cc |
| OLD | NEW |