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 "CCActiveGestureAnimation.h" | 9 #include "CCActiveGestureAnimation.h" |
10 #include "CCDamageTracker.h" | 10 #include "CCDamageTracker.h" |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
239 | 239 |
240 { | 240 { |
241 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::calcDrawEtc"); | 241 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::calcDrawEtc"); |
242 CCLayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), de
viceViewportSize(), m_deviceScaleFactor, &m_layerSorter, rendererCapabilities().
maxTextureSize, renderSurfaceLayerList); | 242 CCLayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), de
viceViewportSize(), m_deviceScaleFactor, &m_layerSorter, rendererCapabilities().
maxTextureSize, renderSurfaceLayerList); |
243 CCLayerTreeHostCommon::calculateVisibleRects(renderSurfaceLayerList); | 243 CCLayerTreeHostCommon::calculateVisibleRects(renderSurfaceLayerList); |
244 | 244 |
245 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList)
; | 245 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList)
; |
246 } | 246 } |
247 } | 247 } |
248 | 248 |
| 249 void CCLayerTreeHostImpl::FrameData::appendRenderPass(PassOwnPtr<CCRenderPass> r
enderPass) |
| 250 { |
| 251 CCRenderPass* pass = renderPass.get(); |
| 252 renderPasses.append(pass); |
| 253 renderPassesById.set(pass->id(), renderPass); |
| 254 } |
| 255 |
249 bool CCLayerTreeHostImpl::calculateRenderPasses(FrameData& frame) | 256 bool CCLayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
250 { | 257 { |
251 ASSERT(frame.renderPasses.isEmpty()); | 258 ASSERT(frame.renderPasses.isEmpty()); |
252 | 259 |
253 calculateRenderSurfaceLayerList(*frame.renderSurfaceLayerList); | 260 calculateRenderSurfaceLayerList(*frame.renderSurfaceLayerList); |
254 | 261 |
255 TRACE_EVENT1("cc", "CCLayerTreeHostImpl::calculateRenderPasses", "renderSurf
aceLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerLi
st->size())); | 262 TRACE_EVENT1("cc", "CCLayerTreeHostImpl::calculateRenderPasses", "renderSurf
aceLayerList.size()", static_cast<long long unsigned>(frame.renderSurfaceLayerLi
st->size())); |
256 | 263 |
257 // Create the render passes in dependency order. | 264 // Create the render passes in dependency order. |
258 HashMap<CCRenderSurface*, CCRenderPass*> surfacePassMap; | |
259 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd
ex >= 0 ; --surfaceIndex) { | 265 for (int surfaceIndex = frame.renderSurfaceLayerList->size() - 1; surfaceInd
ex >= 0 ; --surfaceIndex) { |
260 CCLayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfac
eIndex]; | 266 CCLayerImpl* renderSurfaceLayer = (*frame.renderSurfaceLayerList)[surfac
eIndex]; |
261 CCRenderSurface* renderSurface = renderSurfaceLayer->renderSurface(); | 267 renderSurfaceLayer->renderSurface()->appendRenderPasses(frame); |
262 | |
263 int renderPassId = renderSurfaceLayer->id(); | |
264 IntRect outputRect = renderSurface->contentRect(); | |
265 const WebTransformationMatrix& transformToRootTarget = renderSurface->sc
reenSpaceTransform(); | |
266 OwnPtr<CCRenderPass> pass = CCRenderPass::create(renderPassId, outputRec
t, transformToRootTarget); | |
267 pass->setDamageRect(renderSurface->damageTracker()->currentDamageRect())
; | |
268 pass->setFilters(renderSurfaceLayer->filters()); | |
269 pass->setBackgroundFilters(renderSurfaceLayer->backgroundFilters()); | |
270 | |
271 surfacePassMap.add(renderSurface, pass.get()); | |
272 frame.renderPasses.append(pass.get()); | |
273 frame.renderPassesById.add(renderPassId, pass.release()); | |
274 } | 268 } |
275 | 269 |
276 bool recordMetricsForFrame = true; // FIXME: In the future, disable this whe
n about:tracing is off. | 270 bool recordMetricsForFrame = true; // FIXME: In the future, disable this whe
n about:tracing is off. |
277 CCOcclusionTrackerImpl occlusionTracker(m_rootLayerImpl->renderSurface()->co
ntentRect(), recordMetricsForFrame); | 271 CCOcclusionTrackerImpl occlusionTracker(m_rootLayerImpl->renderSurface()->co
ntentRect(), recordMetricsForFrame); |
278 occlusionTracker.setMinimumTrackingSize(m_settings.minimumOcclusionTrackingS
ize); | 272 occlusionTracker.setMinimumTrackingSize(m_settings.minimumOcclusionTrackingS
ize); |
279 | 273 |
280 if (settings().showOccludingRects) | 274 if (settings().showOccludingRects) |
281 occlusionTracker.setOccludingScreenSpaceRectsContainer(&frame.occludingS
creenSpaceRects); | 275 occlusionTracker.setOccludingScreenSpaceRectsContainer(&frame.occludingS
creenSpaceRects); |
282 | 276 |
283 // Add quads to the Render passes in FrontToBack order to allow for testing
occlusion and performing culling during the tree walk. | 277 // Add quads to the Render passes in FrontToBack order to allow for testing
occlusion and performing culling during the tree walk. |
284 typedef CCLayerIterator<CCLayerImpl, Vector<CCLayerImpl*>, CCRenderSurface,
CCLayerIteratorActions::FrontToBack> CCLayerIteratorType; | 278 typedef CCLayerIterator<CCLayerImpl, Vector<CCLayerImpl*>, CCRenderSurface,
CCLayerIteratorActions::FrontToBack> CCLayerIteratorType; |
285 | 279 |
286 // Typically when we are missing a texture and use a checkerboard quad, we s
till draw the frame. However when the layer being | 280 // Typically when we are missing a texture and use a checkerboard quad, we s
till draw the frame. However when the layer being |
287 // checkerboarded is moving due to an impl-animation, we drop the frame to a
void flashing due to the texture suddenly appearing | 281 // checkerboarded is moving due to an impl-animation, we drop the frame to a
void flashing due to the texture suddenly appearing |
288 // in the future. | 282 // in the future. |
289 bool drawFrame = true; | 283 bool drawFrame = true; |
290 | 284 |
291 CCLayerIteratorType end = CCLayerIteratorType::end(frame.renderSurfaceLayerL
ist); | 285 CCLayerIteratorType end = CCLayerIteratorType::end(frame.renderSurfaceLayerL
ist); |
292 for (CCLayerIteratorType it = CCLayerIteratorType::begin(frame.renderSurface
LayerList); it != end; ++it) { | 286 for (CCLayerIteratorType it = CCLayerIteratorType::begin(frame.renderSurface
LayerList); it != end; ++it) { |
293 CCRenderSurface* renderSurface = it.targetRenderSurfaceLayer()->renderSu
rface(); | 287 int targetRenderPassId = it.targetRenderSurfaceLayer()->id(); |
294 CCRenderPass* pass = surfacePassMap.get(renderSurface); | 288 CCRenderPass* targetRenderPass = frame.renderPassesById.get(targetRender
PassId); |
295 bool hadMissingTiles = false; | 289 bool hadMissingTiles = false; |
296 | 290 |
297 occlusionTracker.enterLayer(it); | 291 occlusionTracker.enterLayer(it); |
298 | 292 |
299 if (it.representsContributingRenderSurface()) { | 293 if (it.representsContributingRenderSurface()) { |
300 CCRenderPass* contributingRenderPass = surfacePassMap.get(it->render
Surface()); | 294 int contributingRenderPassId = it->id(); |
301 pass->appendQuadsForRenderSurfaceLayer(*it, contributingRenderPass,
&occlusionTracker); | 295 CCRenderPass* contributingRenderPass = frame.renderPassesById.get(co
ntributingRenderPassId); |
| 296 targetRenderPass->appendQuadsForRenderSurfaceLayer(*it, contributing
RenderPass, &occlusionTracker); |
302 } else if (it.representsItself() && !it->visibleContentRect().isEmpty())
{ | 297 } else if (it.representsItself() && !it->visibleContentRect().isEmpty())
{ |
303 bool hasOcclusionFromOutsideTargetSurface; | 298 bool hasOcclusionFromOutsideTargetSurface; |
304 if (occlusionTracker.occluded(*it, it->visibleContentRect(), &hasOcc
lusionFromOutsideTargetSurface)) { | 299 if (occlusionTracker.occluded(*it, it->visibleContentRect(), &hasOcc
lusionFromOutsideTargetSurface)) { |
305 if (hasOcclusionFromOutsideTargetSurface) | 300 if (hasOcclusionFromOutsideTargetSurface) |
306 pass->setHasOcclusionFromOutsideTargetSurface(hasOcclusionFr
omOutsideTargetSurface); | 301 targetRenderPass->setHasOcclusionFromOutsideTargetSurface(ha
sOcclusionFromOutsideTargetSurface); |
307 } else { | 302 } else { |
308 it->willDraw(m_resourceProvider.get()); | 303 it->willDraw(m_resourceProvider.get()); |
309 frame.willDrawLayers.append(*it); | 304 frame.willDrawLayers.append(*it); |
310 pass->appendQuadsForLayer(*it, &occlusionTracker, hadMissingTile
s); | 305 targetRenderPass->appendQuadsForLayer(*it, &occlusionTracker, ha
dMissingTiles); |
311 } | 306 } |
312 } | 307 } |
313 | 308 |
314 if (hadMissingTiles) { | 309 if (hadMissingTiles) { |
315 bool layerHasAnimatingTransform = it->screenSpaceTransformIsAnimatin
g() || it->drawTransformIsAnimating(); | 310 bool layerHasAnimatingTransform = it->screenSpaceTransformIsAnimatin
g() || it->drawTransformIsAnimating(); |
316 if (layerHasAnimatingTransform) | 311 if (layerHasAnimatingTransform) |
317 drawFrame = false; | 312 drawFrame = false; |
318 } | 313 } |
319 | 314 |
320 occlusionTracker.leaveLayer(it); | 315 occlusionTracker.leaveLayer(it); |
321 } | 316 } |
322 | 317 |
323 #if !ASSERT_DISABLED | 318 #if !ASSERT_DISABLED |
324 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { | 319 for (size_t i = 0; i < frame.renderPasses.size(); ++i) { |
325 for (size_t j = 0; j < frame.renderPasses[i]->quadList().size(); ++j) | 320 for (size_t j = 0; j < frame.renderPasses[i]->quadList().size(); ++j) |
326 ASSERT(frame.renderPasses[i]->quadList()[j]->sharedQuadStateId() >=
0); | 321 ASSERT(frame.renderPasses[i]->quadList()[j]->sharedQuadStateId() >=
0); |
| 322 ASSERT(frame.renderPassesById.contains(frame.renderPasses[i]->id())); |
327 } | 323 } |
328 #endif | 324 #endif |
329 | 325 |
330 if (!m_hasTransparentBackground) { | 326 if (!m_hasTransparentBackground) { |
331 frame.renderPasses.last()->setHasTransparentBackground(false); | 327 frame.renderPasses.last()->setHasTransparentBackground(false); |
332 frame.renderPasses.last()->appendQuadsToFillScreen(m_rootLayerImpl.get()
, m_backgroundColor, occlusionTracker); | 328 frame.renderPasses.last()->appendQuadsToFillScreen(m_rootLayerImpl.get()
, m_backgroundColor, occlusionTracker); |
333 } | 329 } |
334 | 330 |
335 if (drawFrame) | 331 if (drawFrame) |
336 occlusionTracker.overdrawMetrics().recordMetrics(this); | 332 occlusionTracker.overdrawMetrics().recordMetrics(this); |
(...skipping 931 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1268 | 1264 |
1269 CCScrollbarAnimationController* scrollbarController = layer->scrollbarAnimat
ionController(); | 1265 CCScrollbarAnimationController* scrollbarController = layer->scrollbarAnimat
ionController(); |
1270 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1266 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
1271 m_client->setNeedsRedrawOnImplThread(); | 1267 m_client->setNeedsRedrawOnImplThread(); |
1272 | 1268 |
1273 for (size_t i = 0; i < layer->children().size(); ++i) | 1269 for (size_t i = 0; i < layer->children().size(); ++i) |
1274 animateScrollbarsRecursive(layer->children()[i].get(), monotonicTime); | 1270 animateScrollbarsRecursive(layer->children()[i].get(), monotonicTime); |
1275 } | 1271 } |
1276 | 1272 |
1277 } // namespace WebCore | 1273 } // namespace WebCore |
OLD | NEW |