| Index: third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
|
| diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
|
| index cbd9476bffa47fd08693026f2fe424ea4a0b61f2..de1aed216835939efea652e7ed3c658bb0c6bef4 100644
|
| --- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
|
| +++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
|
| @@ -141,8 +141,6 @@ Canvas2DLayerBridge::Canvas2DLayerBridge(
|
| m_filterQuality(kLow_SkFilterQuality),
|
| m_isHidden(false),
|
| m_isDeferralEnabled(true),
|
| - m_isRegisteredTaskObserver(false),
|
| - m_renderingTaskCompletedForCurrentFrame(false),
|
| m_softwareRenderingWhileHidden(false),
|
| m_lastImageId(0),
|
| m_lastFilter(GL_LINEAR),
|
| @@ -497,7 +495,7 @@ void Canvas2DLayerBridge::hibernate() {
|
| return;
|
| }
|
|
|
| - TRACE_EVENT0("cc", "Canvas2DLayerBridge::hibernate");
|
| + TRACE_EVENT0("blink", "Canvas2DLayerBridge::hibernate");
|
| sk_sp<PaintSurface> tempHibernationSurface =
|
| PaintSurface::MakeRasterN32Premul(m_size.width(), m_size.height());
|
| if (!tempHibernationSurface) {
|
| @@ -669,8 +667,6 @@ void Canvas2DLayerBridge::beginDestruction() {
|
| setIsHidden(true);
|
| m_surface.reset();
|
|
|
| - unregisterTaskObserver();
|
| -
|
| if (m_layer && m_accelerationMode != DisableAcceleration) {
|
| GraphicsLayer::unregisterContentsLayer(m_layer->layer());
|
| m_layer->clearTexture();
|
| @@ -683,13 +679,6 @@ void Canvas2DLayerBridge::beginDestruction() {
|
| DCHECK(!m_bytesAllocated);
|
| }
|
|
|
| -void Canvas2DLayerBridge::unregisterTaskObserver() {
|
| - if (m_isRegisteredTaskObserver) {
|
| - Platform::current()->currentThread()->removeTaskObserver(this);
|
| - m_isRegisteredTaskObserver = false;
|
| - }
|
| -}
|
| -
|
| void Canvas2DLayerBridge::setFilterQuality(SkFilterQuality filterQuality) {
|
| DCHECK(!m_destructionInProgress);
|
| m_filterQuality = filterQuality;
|
| @@ -772,7 +761,6 @@ void Canvas2DLayerBridge::skipQueuedDrawCommands() {
|
| }
|
|
|
| if (m_isDeferralEnabled) {
|
| - unregisterTaskObserver();
|
| if (m_rateLimiter)
|
| m_rateLimiter->reset();
|
| }
|
| @@ -900,6 +888,11 @@ bool Canvas2DLayerBridge::PrepareTextureMailbox(
|
| return false;
|
| }
|
|
|
| + m_framesSinceLastCommit = 0;
|
| + if (m_rateLimiter) {
|
| + m_rateLimiter->reset();
|
| + }
|
| +
|
| // If the context is lost, we don't know if we should be producing GPU or
|
| // software frames, until we get a new context, since the compositor will
|
| // be trying to get a new context and may change modes.
|
| @@ -1035,40 +1028,21 @@ void Canvas2DLayerBridge::didDraw(const FloatRect& rect) {
|
| disableDeferral(DisableDeferralReasonExpensiveOverdrawHeuristic);
|
| }
|
| }
|
| - if (!m_isRegisteredTaskObserver) {
|
| - Platform::current()->currentThread()->addTaskObserver(this);
|
| - m_isRegisteredTaskObserver = true;
|
| - }
|
| m_didDrawSinceLastFlush = true;
|
| m_didDrawSinceLastGpuFlush = true;
|
| }
|
|
|
| void Canvas2DLayerBridge::finalizeFrame() {
|
| + TRACE_EVENT0("blink", "Canvas2DLayerBridge::finalizeFrame");
|
| DCHECK(!m_destructionInProgress);
|
|
|
| // Make sure surface is ready for painting: fix the rendering mode now
|
| // because it will be too late during the paint invalidation phase.
|
| getOrCreateSurface(PreferAcceleration);
|
|
|
| - if (m_rateLimiter)
|
| - m_rateLimiter->reset();
|
| - m_renderingTaskCompletedForCurrentFrame = false;
|
| -}
|
| -
|
| -void Canvas2DLayerBridge::doPaintInvalidation(const FloatRect& dirtyRect) {
|
| - DCHECK(!m_destructionInProgress);
|
| - if (m_layer && m_accelerationMode != DisableAcceleration)
|
| - m_layer->layer()->invalidateRect(enclosingIntRect(dirtyRect));
|
| -}
|
| + ++m_framesSinceLastCommit;
|
|
|
| -void Canvas2DLayerBridge::didProcessTask() {
|
| - TRACE_EVENT0("cc", "Canvas2DLayerBridge::didProcessTask");
|
| - DCHECK(m_isRegisteredTaskObserver);
|
| - // If m_renderTaskProcessedForCurrentFrame is already set to true,
|
| - // it means that rendering tasks are not synchronized with the compositor
|
| - // (i.e. not using requestAnimationFrame), so we are at risk of posting
|
| - // a multi-frame backlog to the GPU
|
| - if (m_renderingTaskCompletedForCurrentFrame) {
|
| + if (m_framesSinceLastCommit >= 2) {
|
| if (isAccelerated()) {
|
| flushGpu();
|
| if (!m_rateLimiter) {
|
| @@ -1083,13 +1057,12 @@ void Canvas2DLayerBridge::didProcessTask() {
|
| if (m_rateLimiter) {
|
| m_rateLimiter->tick();
|
| }
|
| -
|
| - m_renderingTaskCompletedForCurrentFrame = true;
|
| - unregisterTaskObserver();
|
| }
|
|
|
| -void Canvas2DLayerBridge::willProcessTask() {
|
| - NOTREACHED();
|
| +void Canvas2DLayerBridge::doPaintInvalidation(const FloatRect& dirtyRect) {
|
| + DCHECK(!m_destructionInProgress);
|
| + if (m_layer && m_accelerationMode != DisableAcceleration)
|
| + m_layer->layer()->invalidateRect(enclosingIntRect(dirtyRect));
|
| }
|
|
|
| sk_sp<SkImage> Canvas2DLayerBridge::newImageSnapshot(AccelerationHint hint,
|
|
|