Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1097)

Unified Diff: third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp

Issue 2063473002: Make 2D canvas disable gpu acceleration when getImageData is called (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments and fix test failures Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 e2fb6df93a917264297cce6c1b1204cf811f47b3..7b137e74b09249b174512d4deba11b9ea0ccef8b 100644
--- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
+++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
@@ -464,22 +464,50 @@ void Canvas2DLayerBridge::reportSurfaceCreationFailure()
}
}
+void Canvas2DLayerBridge::disableAcceleration()
+{
+ DCHECK(m_layer);
+ bool surfaceIsAccelerated;
+ RefPtr<SkSurface> newSurface = createSkSurface(nullptr, m_size, m_msaaSampleCount, m_opacityMode, &surfaceIsAccelerated);
+ if (newSurface) {
+ DCHECK(!surfaceIsAccelerated);
+ flush();
+ SkPaint copyPaint;
+ copyPaint.setXfermodeMode(SkXfermode::kSrc_Mode);
+ m_surface->draw(newSurface->getCanvas(), 0, 0, &copyPaint); // GPU readback here
+ m_accelerationMode = DisableAcceleration; // Acceleration gets permanently disabled
+ GraphicsLayer::unregisterContentsLayer(m_layer->layer());
+ m_layer->clearTexture();
+ m_layer->layer()->removeFromParent();
+ m_layer.reset();
+ m_surface = newSurface;
+ if (m_imageBuffer)
+ m_imageBuffer->didDisableAcceleration();
+ }
+}
+
SkSurface* Canvas2DLayerBridge::getOrCreateSurface(AccelerationHint hint)
{
- if (m_surface)
+ if (m_surface) {
+ // Note: in layout tests, canvas2dFixedRenderingMode is set to true to inhibit
+ // mode switching so that we continue to get test coverage for GPU acceleration
+ // despite the use of getImageData in tests
+ if (hint == ForceNoAcceleration && m_layer && !RuntimeEnabledFeatures::canvas2dFixedRenderingModeEnabled())
+ disableAcceleration();
return m_surface.get();
+ }
if (m_layer && !isHibernating() && hint == PreferAcceleration) {
return nullptr; // re-creation will happen through restore()
}
bool wantAcceleration = shouldAccelerate(hint);
- bool surfaceIsAccelerated;
if (CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU && isHidden() && wantAcceleration) {
wantAcceleration = false;
m_softwareRenderingWhileHidden = true;
}
+ bool surfaceIsAccelerated;
m_surface = createSkSurface(wantAcceleration ? m_contextProvider->grContext() : nullptr, m_size, m_msaaSampleCount, m_opacityMode, &surfaceIsAccelerated);
if (!m_surface)

Powered by Google App Engine
This is Rietveld 408576698