| 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 "cc/layer_tree_host_impl.h" | 7 #include "cc/layer_tree_host_impl.h" |
| 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 13 matching lines...) Expand all Loading... |
| 24 #include "cc/page_scale_animation.h" | 24 #include "cc/page_scale_animation.h" |
| 25 #include "cc/prioritized_texture_manager.h" | 25 #include "cc/prioritized_texture_manager.h" |
| 26 #include "cc/render_pass_draw_quad.h" | 26 #include "cc/render_pass_draw_quad.h" |
| 27 #include "cc/rendering_stats.h" | 27 #include "cc/rendering_stats.h" |
| 28 #include "cc/scrollbar_animation_controller.h" | 28 #include "cc/scrollbar_animation_controller.h" |
| 29 #include "cc/scrollbar_layer_impl.h" | 29 #include "cc/scrollbar_layer_impl.h" |
| 30 #include "cc/settings.h" | 30 #include "cc/settings.h" |
| 31 #include "cc/single_thread_proxy.h" | 31 #include "cc/single_thread_proxy.h" |
| 32 #include "cc/software_renderer.h" | 32 #include "cc/software_renderer.h" |
| 33 #include "cc/texture_uploader.h" | 33 #include "cc/texture_uploader.h" |
| 34 #include <wtf/CurrentTime.h> | |
| 35 #include <algorithm> | 34 #include <algorithm> |
| 36 | 35 |
| 37 using WebKit::WebTransformationMatrix; | 36 using WebKit::WebTransformationMatrix; |
| 38 | 37 |
| 39 namespace { | 38 namespace { |
| 40 | 39 |
| 41 void didVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) | 40 void didVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) |
| 42 { | 41 { |
| 43 if (visible) { | 42 if (visible) { |
| 44 TRACE_EVENT_ASYNC_BEGIN1("webkit", "LayerTreeHostImpl::setVisible", id,
"LayerTreeHostImpl", id); | 43 TRACE_EVENT_ASYNC_BEGIN1("webkit", "LayerTreeHostImpl::setVisible", id,
"LayerTreeHostImpl", id); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 m_timeSource->setActive(false); | 167 m_timeSource->setActive(false); |
| 169 } | 168 } |
| 170 | 169 |
| 171 virtual void onTimerTick() OVERRIDE | 170 virtual void onTimerTick() OVERRIDE |
| 172 { | 171 { |
| 173 // FIXME: We require that animate be called on the impl thread. This | 172 // FIXME: We require that animate be called on the impl thread. This |
| 174 // avoids asserts in single threaded mode. Ideally background ticking | 173 // avoids asserts in single threaded mode. Ideally background ticking |
| 175 // would be handled by the proxy/scheduler and this could be removed. | 174 // would be handled by the proxy/scheduler and this could be removed. |
| 176 DebugScopedSetImplThread impl; | 175 DebugScopedSetImplThread impl; |
| 177 | 176 |
| 178 m_layerTreeHostImpl->animate(monotonicallyIncreasingTime(), currentTime(
)); | 177 m_layerTreeHostImpl->animate(base::TimeTicks::Now(), base::Time::Now()); |
| 179 } | 178 } |
| 180 | 179 |
| 181 void setActive(bool active) | 180 void setActive(bool active) |
| 182 { | 181 { |
| 183 if (active != m_timeSource->active()) | 182 if (active != m_timeSource->active()) |
| 184 m_timeSource->setActive(active); | 183 m_timeSource->setActive(active); |
| 185 } | 184 } |
| 186 | 185 |
| 187 private: | 186 private: |
| 188 LayerTreeHostImplTimeSourceAdapter(LayerTreeHostImpl* layerTreeHostImpl, sco
ped_refptr<DelayBasedTimeSource> timeSource) | 187 LayerTreeHostImplTimeSourceAdapter(LayerTreeHostImpl* layerTreeHostImpl, sco
ped_refptr<DelayBasedTimeSource> timeSource) |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 return false; | 284 return false; |
| 286 } | 285 } |
| 287 return true; | 286 return true; |
| 288 } | 287 } |
| 289 | 288 |
| 290 GraphicsContext* LayerTreeHostImpl::context() const | 289 GraphicsContext* LayerTreeHostImpl::context() const |
| 291 { | 290 { |
| 292 return m_context.get(); | 291 return m_context.get(); |
| 293 } | 292 } |
| 294 | 293 |
| 295 void LayerTreeHostImpl::animate(double monotonicTime, double wallClockTime) | 294 void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl
ockTime) |
| 296 { | 295 { |
| 297 animatePageScale(monotonicTime); | 296 animatePageScale(monotonicTime); |
| 298 animateLayers(monotonicTime, wallClockTime); | 297 animateLayers(monotonicTime, wallClockTime); |
| 299 animateScrollbars(monotonicTime); | 298 animateScrollbars(monotonicTime); |
| 300 } | 299 } |
| 301 | 300 |
| 302 void LayerTreeHostImpl::startPageScaleAnimation(const IntSize& targetPosition, b
ool anchorPoint, float pageScale, double startTime, double duration) | 301 void LayerTreeHostImpl::startPageScaleAnimation(const IntSize& targetPosition, b
ool anchorPoint, float pageScale, base::TimeTicks startTime, base::TimeDelta dur
ation) |
| 303 { | 302 { |
| 304 if (!m_rootScrollLayerImpl) | 303 if (!m_rootScrollLayerImpl) |
| 305 return; | 304 return; |
| 306 | 305 |
| 307 IntSize scrollTotal = flooredIntSize(m_rootScrollLayerImpl->scrollPosition()
+ m_rootScrollLayerImpl->scrollDelta()); | 306 IntSize scrollTotal = flooredIntSize(m_rootScrollLayerImpl->scrollPosition()
+ m_rootScrollLayerImpl->scrollDelta()); |
| 308 scrollTotal.scale(m_pinchZoomViewport.pageScaleDelta()); | 307 scrollTotal.scale(m_pinchZoomViewport.pageScaleDelta()); |
| 309 float scaleTotal = m_pinchZoomViewport.totalPageScaleFactor(); | 308 float scaleTotal = m_pinchZoomViewport.totalPageScaleFactor(); |
| 310 IntSize scaledContentSize = contentSize(); | 309 IntSize scaledContentSize = contentSize(); |
| 311 scaledContentSize.scale(m_pinchZoomViewport.pageScaleDelta()); | 310 scaledContentSize.scale(m_pinchZoomViewport.pageScaleDelta()); |
| 312 | 311 |
| 313 m_pageScaleAnimation = PageScaleAnimation::create(scrollTotal, scaleTotal, m
_deviceViewportSize, scaledContentSize, startTime); | 312 double startTimeSeconds = (startTime - base::TimeTicks()).InSecondsF(); |
| 313 m_pageScaleAnimation = PageScaleAnimation::create(scrollTotal, scaleTotal, m
_deviceViewportSize, scaledContentSize, startTimeSeconds); |
| 314 | 314 |
| 315 if (anchorPoint) { | 315 if (anchorPoint) { |
| 316 IntSize windowAnchor(targetPosition); | 316 IntSize windowAnchor(targetPosition); |
| 317 windowAnchor.scale(scaleTotal / pageScale); | 317 windowAnchor.scale(scaleTotal / pageScale); |
| 318 windowAnchor -= scrollTotal; | 318 windowAnchor -= scrollTotal; |
| 319 m_pageScaleAnimation->zoomWithAnchor(windowAnchor, pageScale, duration); | 319 m_pageScaleAnimation->zoomWithAnchor(windowAnchor, pageScale, duration.I
nSecondsF()); |
| 320 } else | 320 } else |
| 321 m_pageScaleAnimation->zoomTo(targetPosition, pageScale, duration); | 321 m_pageScaleAnimation->zoomTo(targetPosition, pageScale, duration.InSecon
dsF()); |
| 322 | 322 |
| 323 m_client->setNeedsRedrawOnImplThread(); | 323 m_client->setNeedsRedrawOnImplThread(); |
| 324 m_client->setNeedsCommitOnImplThread(); | 324 m_client->setNeedsCommitOnImplThread(); |
| 325 } | 325 } |
| 326 | 326 |
| 327 void LayerTreeHostImpl::scheduleAnimation() | 327 void LayerTreeHostImpl::scheduleAnimation() |
| 328 { | 328 { |
| 329 m_client->setNeedsRedrawOnImplThread(); | 329 m_client->setNeedsRedrawOnImplThread(); |
| 330 } | 330 } |
| 331 | 331 |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 if (drawFrame) | 468 if (drawFrame) |
| 469 occlusionTracker.overdrawMetrics().recordMetrics(this); | 469 occlusionTracker.overdrawMetrics().recordMetrics(this); |
| 470 | 470 |
| 471 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); | 471 removeRenderPasses(CullRenderPassesWithNoQuads(), frame); |
| 472 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); | 472 m_renderer->decideRenderPassAllocationsForFrame(frame.renderPasses); |
| 473 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); | 473 removeRenderPasses(CullRenderPassesWithCachedTextures(*m_renderer), frame); |
| 474 | 474 |
| 475 return drawFrame; | 475 return drawFrame; |
| 476 } | 476 } |
| 477 | 477 |
| 478 void LayerTreeHostImpl::animateLayersRecursive(LayerImpl* current, double monoto
nicTime, double wallClockTime, AnimationEventsVector* events, bool& didAnimate,
bool& needsAnimateLayers) | 478 void LayerTreeHostImpl::animateLayersRecursive(LayerImpl* current, base::TimeTic
ks monotonicTime, base::Time wallClockTime, AnimationEventsVector* events, bool&
didAnimate, bool& needsAnimateLayers) |
| 479 { | 479 { |
| 480 bool subtreeNeedsAnimateLayers = false; | 480 bool subtreeNeedsAnimateLayers = false; |
| 481 | 481 |
| 482 LayerAnimationController* currentController = current->layerAnimationControl
ler(); | 482 LayerAnimationController* currentController = current->layerAnimationControl
ler(); |
| 483 | 483 |
| 484 bool hadActiveAnimation = currentController->hasActiveAnimation(); | 484 bool hadActiveAnimation = currentController->hasActiveAnimation(); |
| 485 currentController->animate(monotonicTime, events); | 485 double monotonicTimeSeconds = (monotonicTime - base::TimeTicks()).InSecondsF
(); |
| 486 currentController->animate(monotonicTimeSeconds, events); |
| 486 bool startedAnimation = events->size() > 0; | 487 bool startedAnimation = events->size() > 0; |
| 487 | 488 |
| 488 // We animated if we either ticked a running animation, or started a new ani
mation. | 489 // We animated if we either ticked a running animation, or started a new ani
mation. |
| 489 if (hadActiveAnimation || startedAnimation) | 490 if (hadActiveAnimation || startedAnimation) |
| 490 didAnimate = true; | 491 didAnimate = true; |
| 491 | 492 |
| 492 // If the current controller still has an active animation, we must continue
animating layers. | 493 // If the current controller still has an active animation, we must continue
animating layers. |
| 493 if (currentController->hasActiveAnimation()) | 494 if (currentController->hasActiveAnimation()) |
| 494 subtreeNeedsAnimateLayers = true; | 495 subtreeNeedsAnimateLayers = true; |
| 495 | 496 |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 return; | 659 return; |
| 659 m_managedMemoryPolicy = policy; | 660 m_managedMemoryPolicy = policy; |
| 660 enforceManagedMemoryPolicy(m_managedMemoryPolicy); | 661 enforceManagedMemoryPolicy(m_managedMemoryPolicy); |
| 661 // We always need to commit after changing the memory policy because the new | 662 // We always need to commit after changing the memory policy because the new |
| 662 // limit can result in more or less content having texture allocated for it. | 663 // limit can result in more or less content having texture allocated for it. |
| 663 m_client->setNeedsCommitOnImplThread(); | 664 m_client->setNeedsCommitOnImplThread(); |
| 664 } | 665 } |
| 665 | 666 |
| 666 void LayerTreeHostImpl::onVSyncParametersChanged(double monotonicTimebase, doubl
e intervalInSeconds) | 667 void LayerTreeHostImpl::onVSyncParametersChanged(double monotonicTimebase, doubl
e intervalInSeconds) |
| 667 { | 668 { |
| 668 m_client->onVSyncParametersChanged(monotonicTimebase, intervalInSeconds); | 669 base::TimeTicks timebase = base::TimeTicks::FromInternalValue(monotonicTimeb
ase * base::Time::kMicrosecondsPerSecond); |
| 670 base::TimeDelta interval = base::TimeDelta::FromMicroseconds(intervalInSecon
ds * base::Time::kMicrosecondsPerSecond); |
| 671 m_client->onVSyncParametersChanged(timebase, interval); |
| 669 } | 672 } |
| 670 | 673 |
| 671 void LayerTreeHostImpl::drawLayers(const FrameData& frame) | 674 void LayerTreeHostImpl::drawLayers(const FrameData& frame) |
| 672 { | 675 { |
| 673 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); | 676 TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); |
| 674 DCHECK(canDraw()); | 677 DCHECK(canDraw()); |
| 675 DCHECK(!frame.renderPasses.empty()); | 678 DCHECK(!frame.renderPasses.empty()); |
| 676 | 679 |
| 677 // FIXME: use the frame begin time from the overall compositor scheduler. | 680 // FIXME: use the frame begin time from the overall compositor scheduler. |
| 678 // This value is currently inaccessible because it is up in Chromium's | 681 // This value is currently inaccessible because it is up in Chromium's |
| (...skipping 682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1361 | 1364 |
| 1362 void LayerTreeHostImpl::setFullRootLayerDamage() | 1365 void LayerTreeHostImpl::setFullRootLayerDamage() |
| 1363 { | 1366 { |
| 1364 if (m_rootLayerImpl) { | 1367 if (m_rootLayerImpl) { |
| 1365 RenderSurfaceImpl* renderSurface = m_rootLayerImpl->renderSurface(); | 1368 RenderSurfaceImpl* renderSurface = m_rootLayerImpl->renderSurface(); |
| 1366 if (renderSurface) | 1369 if (renderSurface) |
| 1367 renderSurface->damageTracker()->forceFullDamageNextUpdate(); | 1370 renderSurface->damageTracker()->forceFullDamageNextUpdate(); |
| 1368 } | 1371 } |
| 1369 } | 1372 } |
| 1370 | 1373 |
| 1371 void LayerTreeHostImpl::animatePageScale(double monotonicTime) | 1374 void LayerTreeHostImpl::animatePageScale(base::TimeTicks time) |
| 1372 { | 1375 { |
| 1373 if (!m_pageScaleAnimation || !m_rootScrollLayerImpl) | 1376 if (!m_pageScaleAnimation || !m_rootScrollLayerImpl) |
| 1374 return; | 1377 return; |
| 1375 | 1378 |
| 1379 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
| 1376 IntSize scrollTotal = flooredIntSize(m_rootScrollLayerImpl->scrollPosition()
+ m_rootScrollLayerImpl->scrollDelta()); | 1380 IntSize scrollTotal = flooredIntSize(m_rootScrollLayerImpl->scrollPosition()
+ m_rootScrollLayerImpl->scrollDelta()); |
| 1377 | 1381 |
| 1378 setPageScaleDelta(m_pageScaleAnimation->pageScaleAtTime(monotonicTime) / m_p
inchZoomViewport.pageScaleFactor()); | 1382 setPageScaleDelta(m_pageScaleAnimation->pageScaleAtTime(monotonicTime) / m_p
inchZoomViewport.pageScaleFactor()); |
| 1379 IntSize nextScroll = m_pageScaleAnimation->scrollOffsetAtTime(monotonicTime)
; | 1383 IntSize nextScroll = m_pageScaleAnimation->scrollOffsetAtTime(monotonicTime)
; |
| 1380 nextScroll.scale(1 / m_pinchZoomViewport.pageScaleDelta()); | 1384 nextScroll.scale(1 / m_pinchZoomViewport.pageScaleDelta()); |
| 1381 m_rootScrollLayerImpl->scrollBy(nextScroll - scrollTotal); | 1385 m_rootScrollLayerImpl->scrollBy(nextScroll - scrollTotal); |
| 1382 m_client->setNeedsRedrawOnImplThread(); | 1386 m_client->setNeedsRedrawOnImplThread(); |
| 1383 | 1387 |
| 1384 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) { | 1388 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) { |
| 1385 m_pageScaleAnimation.reset(); | 1389 m_pageScaleAnimation.reset(); |
| 1386 m_client->setNeedsCommitOnImplThread(); | 1390 m_client->setNeedsCommitOnImplThread(); |
| 1387 } | 1391 } |
| 1388 } | 1392 } |
| 1389 | 1393 |
| 1390 void LayerTreeHostImpl::animateLayers(double monotonicTime, double wallClockTime
) | 1394 void LayerTreeHostImpl::animateLayers(base::TimeTicks monotonicTime, base::Time
wallClockTime) |
| 1391 { | 1395 { |
| 1392 if (!Settings::acceleratedAnimationEnabled() || !m_needsAnimateLayers || !m_
rootLayerImpl) | 1396 if (!Settings::acceleratedAnimationEnabled() || !m_needsAnimateLayers || !m_
rootLayerImpl) |
| 1393 return; | 1397 return; |
| 1394 | 1398 |
| 1395 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); | 1399 TRACE_EVENT0("cc", "LayerTreeHostImpl::animateLayers"); |
| 1396 | 1400 |
| 1397 scoped_ptr<AnimationEventsVector> events(make_scoped_ptr(new AnimationEvents
Vector)); | 1401 scoped_ptr<AnimationEventsVector> events(make_scoped_ptr(new AnimationEvents
Vector)); |
| 1398 | 1402 |
| 1399 bool didAnimate = false; | 1403 bool didAnimate = false; |
| 1400 animateLayersRecursive(m_rootLayerImpl.get(), monotonicTime, wallClockTime,
events.get(), didAnimate, m_needsAnimateLayers); | 1404 animateLayersRecursive(m_rootLayerImpl.get(), monotonicTime, wallClockTime,
events.get(), didAnimate, m_needsAnimateLayers); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1465 } | 1469 } |
| 1466 | 1470 |
| 1467 void LayerTreeHostImpl::renderingStats(RenderingStats* stats) const | 1471 void LayerTreeHostImpl::renderingStats(RenderingStats* stats) const |
| 1468 { | 1472 { |
| 1469 stats->numFramesSentToScreen = fpsCounter()->currentFrameNumber(); | 1473 stats->numFramesSentToScreen = fpsCounter()->currentFrameNumber(); |
| 1470 stats->droppedFrameCount = fpsCounter()->droppedFrameCount(); | 1474 stats->droppedFrameCount = fpsCounter()->droppedFrameCount(); |
| 1471 stats->numImplThreadScrolls = m_numImplThreadScrolls; | 1475 stats->numImplThreadScrolls = m_numImplThreadScrolls; |
| 1472 stats->numMainThreadScrolls = m_numMainThreadScrolls; | 1476 stats->numMainThreadScrolls = m_numMainThreadScrolls; |
| 1473 } | 1477 } |
| 1474 | 1478 |
| 1475 void LayerTreeHostImpl::animateScrollbars(double monotonicTime) | 1479 void LayerTreeHostImpl::animateScrollbars(base::TimeTicks time) |
| 1476 { | 1480 { |
| 1477 animateScrollbarsRecursive(m_rootLayerImpl.get(), monotonicTime); | 1481 animateScrollbarsRecursive(m_rootLayerImpl.get(), time); |
| 1478 } | 1482 } |
| 1479 | 1483 |
| 1480 void LayerTreeHostImpl::animateScrollbarsRecursive(LayerImpl* layer, double mono
tonicTime) | 1484 void LayerTreeHostImpl::animateScrollbarsRecursive(LayerImpl* layer, base::TimeT
icks time) |
| 1481 { | 1485 { |
| 1482 if (!layer) | 1486 if (!layer) |
| 1483 return; | 1487 return; |
| 1484 | 1488 |
| 1485 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); | 1489 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); |
| 1490 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
| 1486 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1491 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
| 1487 m_client->setNeedsRedrawOnImplThread(); | 1492 m_client->setNeedsRedrawOnImplThread(); |
| 1488 | 1493 |
| 1489 for (size_t i = 0; i < layer->children().size(); ++i) | 1494 for (size_t i = 0; i < layer->children().size(); ++i) |
| 1490 animateScrollbarsRecursive(layer->children()[i], monotonicTime); | 1495 animateScrollbarsRecursive(layer->children()[i], time); |
| 1491 } | 1496 } |
| 1492 | 1497 |
| 1493 } // namespace cc | 1498 } // namespace cc |
| OLD | NEW |