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

Unified Diff: third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp

Issue 2362363002: Cancel GPU acceleration for 2D canvas when drawing very large images (Closed)
Patch Set: Created 4 years, 3 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/modules/canvas2d/CanvasRenderingContext2DTest.cpp
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp
index 3d3f0736e97da17a970bbcde7ef9000ce9273ee2..5acf8ef0cb167c16fae6fab6dcbdf66e14d91baf 100644
--- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp
+++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp
@@ -47,6 +47,7 @@ public:
bool wouldTaintOrigin(SecurityOrigin* destinationSecurityOrigin) const override { return false; }
FloatSize elementSize(const FloatSize&) const override { return FloatSize(m_size); }
bool isOpaque() const override { return m_isOpaque; }
+ bool isAccelerated() const { return false; }
int sourceWidth() override { return m_size.width(); }
int sourceHeight() override { return m_size.height(); }
@@ -799,6 +800,74 @@ TEST_F(CanvasRenderingContext2DTest, GetImageDataDisablesAcceleration)
RuntimeEnabledFeatures::setCanvas2dFixedRenderingModeEnabled(savedFixedRenderingMode);
}
+TEST_F(CanvasRenderingContext2DTest, LargeTextureUploadDisablesAcceleration)
+{
xidachen 2016/09/24 01:36:34 I can see that these two tests are sharing a lot o
+ bool savedFixedRenderingMode = RuntimeEnabledFeatures::canvas2dFixedRenderingModeEnabled();
+ RuntimeEnabledFeatures::setCanvas2dFixedRenderingModeEnabled(false);
+
+ int srcDim = sqrt(ExpensiveCanvasHeuristicParameters::DrawImageTextureUploadSoftSizeLimit) + 1;
+ int dstDim = srcDim / sqrt(ExpensiveCanvasHeuristicParameters::DrawImageTextureUploadSoftSizeLimitScaleThreshold) - 1;
+
+ createContext(NonOpaque);
+ FakeGLES2Interface gl;
+ std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider(new FakeWebGraphicsContext3DProvider(&gl));
+ IntSize size(dstDim, dstDim);
xidachen 2016/09/24 01:36:34 Could we name this dstSize?
+ RefPtr<Canvas2DLayerBridge> bridge = makeBridge(std::move(contextProvider), size, Canvas2DLayerBridge::EnableAcceleration);
+ std::unique_ptr<Canvas2DImageBufferSurface> surface(new Canvas2DImageBufferSurface(bridge, size));
+ canvasElement().createImageBufferUsingSurfaceForTesting(std::move(surface));
+
+ EXPECT_TRUE(canvasElement().buffer()->isAccelerated());
+ EXPECT_EQ(1u, getGlobalAcceleratedImageBufferCount());
+ EXPECT_EQ(8*dstDim*dstDim, getGlobalGPUMemoryUsage());
xidachen 2016/09/24 01:36:34 I don't quite understand why is this *8? My impres
+ sk_sp<SkSurface> skSurface = SkSurface::MakeRasterN32Premul(srcDim, srcDim);
+ RefPtr<StaticBitmapImage> bigBitmap = StaticBitmapImage::create(skSurface->makeImageSnapshot());
+ ImageBitmap* bigImage = ImageBitmap::create(std::move(bigBitmap));
+ NonThrowableExceptionState exceptionState;
+ context2d()->drawImage(nullptr, bigImage, 0, 0, srcDim, srcDim, 0, 0, dstDim, dstDim, exceptionState);
+ EXPECT_FALSE(exceptionState.hadException());
+
+ EXPECT_TRUE(!canvasElement().buffer()->isAccelerated());
xidachen 2016/09/24 01:36:34 Maybe change to EXPECT_FALSE(canvasElement().buffe
+ EXPECT_EQ(0u, getGlobalAcceleratedImageBufferCount());
+ EXPECT_EQ(0, getGlobalGPUMemoryUsage());
+
+ // Restore global state to prevent side-effects on other tests
+ RuntimeEnabledFeatures::setCanvas2dFixedRenderingModeEnabled(savedFixedRenderingMode);
+}
+
+TEST_F(CanvasRenderingContext2DTest, SmallTextureUploadDoesNotDisableAcceleration)
+{
+ bool savedFixedRenderingMode = RuntimeEnabledFeatures::canvas2dFixedRenderingModeEnabled();
+ RuntimeEnabledFeatures::setCanvas2dFixedRenderingModeEnabled(false);
+
+ int srcDim = sqrt(ExpensiveCanvasHeuristicParameters::DrawImageTextureUploadSoftSizeLimit) - 1;
+ int dstDim = srcDim / sqrt(ExpensiveCanvasHeuristicParameters::DrawImageTextureUploadSoftSizeLimitScaleThreshold) + 1;
+
+ createContext(NonOpaque);
+ FakeGLES2Interface gl;
+ std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider(new FakeWebGraphicsContext3DProvider(&gl));
+ IntSize size(dstDim, dstDim);
xidachen 2016/09/24 01:36:34 dstSize?
+ RefPtr<Canvas2DLayerBridge> bridge = makeBridge(std::move(contextProvider), size, Canvas2DLayerBridge::EnableAcceleration);
+ std::unique_ptr<Canvas2DImageBufferSurface> surface(new Canvas2DImageBufferSurface(bridge, size));
+ canvasElement().createImageBufferUsingSurfaceForTesting(std::move(surface));
+
+ EXPECT_TRUE(canvasElement().buffer()->isAccelerated());
+ EXPECT_EQ(1u, getGlobalAcceleratedImageBufferCount());
+ EXPECT_EQ(8*dstDim*dstDim, getGlobalGPUMemoryUsage());
+ sk_sp<SkSurface> skSurface = SkSurface::MakeRasterN32Premul(srcDim, srcDim);
+ RefPtr<StaticBitmapImage> bigBitmap = StaticBitmapImage::create(skSurface->makeImageSnapshot());
+ ImageBitmap* bigImage = ImageBitmap::create(std::move(bigBitmap));
+ NonThrowableExceptionState exceptionState;
+ context2d()->drawImage(nullptr, bigImage, 0, 0, srcDim, srcDim, 0, 0, dstDim, dstDim, exceptionState);
+ EXPECT_FALSE(exceptionState.hadException());
+
+ EXPECT_TRUE(canvasElement().buffer()->isAccelerated());
+ EXPECT_EQ(1u, getGlobalAcceleratedImageBufferCount());
+ EXPECT_EQ(8*dstDim*dstDim, getGlobalGPUMemoryUsage());
+
+ // Restore global state to prevent side-effects on other tests
+ RuntimeEnabledFeatures::setCanvas2dFixedRenderingModeEnabled(savedFixedRenderingMode);
+}
+
TEST_F(CanvasRenderingContext2DTest, IsAccelerationOptimalForCanvasContentHeuristic)
{
createContext(NonOpaque);

Powered by Google App Engine
This is Rietveld 408576698