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 11c981c40518a2852efc971c4d3a0360c4afb0c2..5a9c6d45b158e711dc068913e5cc705e7622ecb7 100644 |
--- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp |
+++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp |
@@ -79,6 +79,8 @@ protected: |
HTMLDocument& document() const { return *m_document; } |
HTMLCanvasElement& canvasElement() const { return *m_canvasElement; } |
CanvasRenderingContext2D* context2d() const { return static_cast<CanvasRenderingContext2D*>(canvasElement().renderingContext()); } |
+ intptr_t getGlobalGPUMemoryUsage() const { return ImageBuffer::getGlobalGPUMemoryUsage(); } |
+ intptr_t getCurrentGPUMemoryUsage() const { return canvasElement().buffer()->getGPUMemoryUsage(); } |
void createContext(OpacityMode); |
void TearDown(); |
@@ -174,6 +176,25 @@ void CanvasRenderingContext2DTest::TearDown() |
//============================================================================ |
+class FakeAcceleratedImageBufferSurfaceForTesting : public UnacceleratedImageBufferSurface { |
+public: |
+ FakeAcceleratedImageBufferSurfaceForTesting(const IntSize& size, OpacityMode mode) |
+ : UnacceleratedImageBufferSurface(size, mode) |
+ , m_isAccelerated(true) { } |
+ ~FakeAcceleratedImageBufferSurfaceForTesting() override { } |
+ bool isAccelerated() const override { return m_isAccelerated; } |
+ void setIsAccelerated(bool isAccelerated) |
+ { |
+ if (isAccelerated != m_isAccelerated) |
+ m_isAccelerated = isAccelerated; |
+ } |
+ |
+private: |
+ bool m_isAccelerated; |
+}; |
+ |
+//============================================================================ |
+ |
class MockImageBufferSurfaceForOverwriteTesting : public UnacceleratedImageBufferSurface { |
public: |
MockImageBufferSurfaceForOverwriteTesting(const IntSize& size, OpacityMode mode) : UnacceleratedImageBufferSurface(size, mode) { } |
@@ -629,4 +650,44 @@ TEST_F(CanvasRenderingContext2DTest, ImageResourceLifetime) |
context->drawImage(imageSource, 0, 0, exceptionState); |
} |
+TEST_F(CanvasRenderingContext2DTest, GPUMemoryUpdateForAcceleratedCanvas) |
+{ |
+ createContext(NonOpaque); |
+ |
+ OwnPtr<FakeAcceleratedImageBufferSurfaceForTesting> fakeAccelerateSurface = adoptPtr(new FakeAcceleratedImageBufferSurfaceForTesting(IntSize(10, 10), NonOpaque)); |
+ FakeAcceleratedImageBufferSurfaceForTesting* fakeAccelerateSurfacePtr = fakeAccelerateSurface.get(); |
+ canvasElement().createImageBufferUsingSurfaceForTesting(fakeAccelerateSurface.release()); |
+ // 800 = 10 * 10 * 4 * 2 where 10*10 is canvas size, 4 is num of bytes per pixel per buffer, |
+ // and 2 is an estimate of num of gpu buffers required |
+ EXPECT_EQ(800, getCurrentGPUMemoryUsage()); |
+ EXPECT_EQ(800, getGlobalGPUMemoryUsage()); |
+ |
+ // Switching accelerated mode to non-accelerated mode |
+ fakeAccelerateSurfacePtr->setIsAccelerated(false); |
+ canvasElement().buffer()->updateGPUMemoryUsage(); |
+ EXPECT_EQ(0, getCurrentGPUMemoryUsage()); |
+ EXPECT_EQ(0, getGlobalGPUMemoryUsage()); |
+ |
+ // Switching non-accelerated mode to accelerated mode |
+ fakeAccelerateSurfacePtr->setIsAccelerated(true); |
+ canvasElement().buffer()->updateGPUMemoryUsage(); |
+ EXPECT_EQ(800, getCurrentGPUMemoryUsage()); |
+ EXPECT_EQ(800, getGlobalGPUMemoryUsage()); |
+ |
+ // Creating a different accelerated image buffer |
+ OwnPtr<FakeAcceleratedImageBufferSurfaceForTesting> fakeAccelerateSurface2 = adoptPtr(new FakeAcceleratedImageBufferSurfaceForTesting(IntSize(10, 5), NonOpaque)); |
+ OwnPtr<ImageBuffer> imageBuffer2 = ImageBuffer::create(fakeAccelerateSurface2.release()); |
+ EXPECT_EQ(800, getCurrentGPUMemoryUsage()); |
+ EXPECT_EQ(1200, getGlobalGPUMemoryUsage()); |
+ |
+ // Tear down the first image buffer that resides in current canvas element |
+ canvasElement().setSize(IntSize(20, 20)); |
+ Mock::VerifyAndClearExpectations(fakeAccelerateSurfacePtr); |
+ EXPECT_EQ(400, getGlobalGPUMemoryUsage()); |
+ |
+ // Tear down the second image buffer |
+ imageBuffer2.clear(); |
+ EXPECT_EQ(0, getGlobalGPUMemoryUsage()); |
+} |
+ |
} // namespace blink |