| 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..245429d97d49de106561a728aad66e876a0eaaff 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,56 @@ TEST_F(CanvasRenderingContext2DTest, GetImageDataDisablesAcceleration)
|
| RuntimeEnabledFeatures::setCanvas2dFixedRenderingModeEnabled(savedFixedRenderingMode);
|
| }
|
|
|
| +TEST_F(CanvasRenderingContext2DTest, TextureUploadHeuristics)
|
| +{
|
| + bool savedFixedRenderingMode = RuntimeEnabledFeatures::canvas2dFixedRenderingModeEnabled();
|
| + RuntimeEnabledFeatures::setCanvas2dFixedRenderingModeEnabled(false);
|
| +
|
| + enum TestVariants {
|
| + LargeTextureDisablesAcceleration = 0,
|
| + SmallTextureDoesNotDisableAcceleration = 1,
|
| +
|
| + TestVariantCount = 2,
|
| + };
|
| +
|
| + for (int testVariant = 0; testVariant < TestVariantCount; testVariant++) {
|
| + int delta = testVariant == LargeTextureDisablesAcceleration ? 1 : -1;
|
| + int srcSize = std::sqrt(static_cast<float>(ExpensiveCanvasHeuristicParameters::DrawImageTextureUploadSoftSizeLimit)) + delta;
|
| + int dstSize = srcSize / std::sqrt(static_cast<float>(ExpensiveCanvasHeuristicParameters::DrawImageTextureUploadSoftSizeLimitScaleThreshold)) - delta;
|
| +
|
| + createContext(NonOpaque);
|
| + FakeGLES2Interface gl;
|
| + std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider(new FakeWebGraphicsContext3DProvider(&gl));
|
| + IntSize size(dstSize, 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());
|
| + // 4 bytes per pixel * 2 buffers = 8
|
| + EXPECT_EQ(8*dstSize*dstSize, getGlobalGPUMemoryUsage());
|
| + sk_sp<SkSurface> skSurface = SkSurface::MakeRasterN32Premul(srcSize, srcSize);
|
| + RefPtr<StaticBitmapImage> bigBitmap = StaticBitmapImage::create(skSurface->makeImageSnapshot());
|
| + ImageBitmap* bigImage = ImageBitmap::create(std::move(bigBitmap));
|
| + NonThrowableExceptionState exceptionState;
|
| + context2d()->drawImage(nullptr, bigImage, 0, 0, srcSize, srcSize, 0, 0, dstSize, dstSize, exceptionState);
|
| + EXPECT_FALSE(exceptionState.hadException());
|
| +
|
| + if (testVariant == LargeTextureDisablesAcceleration) {
|
| + EXPECT_FALSE(canvasElement().buffer()->isAccelerated());
|
| + EXPECT_EQ(0u, getGlobalAcceleratedImageBufferCount());
|
| + EXPECT_EQ(0, getGlobalGPUMemoryUsage());
|
| + } else {
|
| + EXPECT_TRUE(canvasElement().buffer()->isAccelerated());
|
| + EXPECT_EQ(1u, getGlobalAcceleratedImageBufferCount());
|
| + EXPECT_EQ(8*dstSize*dstSize, getGlobalGPUMemoryUsage());
|
| + }
|
| + }
|
| + // Restore global state to prevent side-effects on other tests
|
| + RuntimeEnabledFeatures::setCanvas2dFixedRenderingModeEnabled(savedFixedRenderingMode);
|
| +}
|
| +
|
| TEST_F(CanvasRenderingContext2DTest, IsAccelerationOptimalForCanvasContentHeuristic)
|
| {
|
| createContext(NonOpaque);
|
|
|