Chromium Code Reviews| Index: Source/platform/graphics/Canvas2DLayerBridgeTest.cpp |
| diff --git a/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp b/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp |
| index d95e6631b706468e8b4a96dbd864687fe54c30ef..b0de245777279d85e92f27fcf15d174c8da5ea06 100644 |
| --- a/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp |
| +++ b/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp |
| @@ -113,16 +113,15 @@ protected: |
| { |
| MockCanvasContext mainMock; |
| OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new MockWebGraphicsContext3DProvider(&mainMock)); |
| - RefPtr<SkSurface> surface = adoptRef(SkSurface::NewRasterN32Premul(300, 150)); |
| ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| { |
| - Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockProvider.release(), surface, 0, NonOpaque))); |
| + Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::DisableAcceleration))); |
| ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| - unsigned textureId = bridge->newImageSnapshot()->getTextureHandle(true); |
| + unsigned textureId = bridge->newImageSnapshot(PreferAcceleration)->getTextureHandle(true); |
| EXPECT_EQ(textureId, 0u); |
| ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| @@ -131,32 +130,49 @@ protected: |
| ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| } |
| + void fallbackToSoftwareIfContextLost() |
| + { |
| + MockCanvasContext mainMock; |
| + OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new MockWebGraphicsContext3DProvider(&mainMock)); |
| + |
| + ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| + |
| + { |
| + mainMock.fakeContextLost(); |
|
Stephen White
2015/09/23 14:13:26
I was actually hoping that we could test the fallb
|
| + Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::EnableAcceleration))); |
| + ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| + EXPECT_TRUE(bridge->checkSurfaceValid()); |
| + EXPECT_FALSE(bridge->isAccelerated()); |
| + ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| + } |
| + |
| + ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| + } |
| + |
| void noDrawOnContextLostTest() |
| { |
| MockCanvasContext mainMock; |
| OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new MockWebGraphicsContext3DProvider(&mainMock)); |
| - RefPtr<SkSurface> surface = adoptRef(SkSurface::NewRasterN32Premul(300, 150)); |
| ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| { |
| - Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockProvider.release(), surface, 0, NonOpaque))); |
| + Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAccelerationForTesting))); |
| ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| EXPECT_TRUE(bridge->checkSurfaceValid()); |
| SkPaint paint; |
| - uint32_t genID = surface->generationID(); |
| + uint32_t genID = bridge->getOrCreateSurface()->generationID(); |
| bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| - EXPECT_EQ(genID, surface->generationID()); |
| + EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); |
| mainMock.fakeContextLost(); |
| - EXPECT_EQ(genID, surface->generationID()); |
| + EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); |
| bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| - EXPECT_EQ(genID, surface->generationID()); |
| - EXPECT_FALSE(bridge->checkSurfaceValid()); |
| - EXPECT_EQ(genID, surface->generationID()); |
| + EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); |
| + EXPECT_FALSE(bridge->checkSurfaceValid()); // This results in the internal surface being torn down in response to the context loss |
| + EXPECT_EQ(nullptr, bridge->getOrCreateSurface()); |
| + // The following passes by not crashing |
| bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| - EXPECT_EQ(genID, surface->generationID()); |
| bridge->flush(); |
| - EXPECT_EQ(genID, surface->generationID()); |
| ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| } |
| @@ -166,9 +182,8 @@ protected: |
| void prepareMailboxWithBitmapTest() |
| { |
| MockCanvasContext mainMock; |
| - RefPtr<SkSurface> surface = adoptRef(SkSurface::NewRasterN32Premul(300, 150)); |
| OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new MockWebGraphicsContext3DProvider(&mainMock)); |
| - Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockProvider.release(), surface, 0, NonOpaque))); |
| + Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAccelerationForTesting))); |
| bridge->m_lastImageId = 1; |
| NullWebExternalBitmap bitmap; |
| @@ -179,7 +194,6 @@ protected: |
| void prepareMailboxAndLoseResourceTest() |
| { |
| MockCanvasContext mainMock; |
| - RefPtr<SkSurface> surface = adoptRef(SkSurface::NewRasterN32Premul(300, 150)); |
| bool lostResource = true; |
| // Prepare a mailbox, then report the resource as lost. |
| @@ -187,7 +201,7 @@ protected: |
| { |
| WebExternalTextureMailbox mailbox; |
| OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new MockWebGraphicsContext3DProvider(&mainMock)); |
| - Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockProvider.release(), surface, 0, NonOpaque))); |
| + Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAccelerationForTesting))); |
| bridge->prepareMailbox(&mailbox, 0); |
| bridge->mailboxReleased(mailbox, lostResource); |
| } |
| @@ -198,7 +212,7 @@ protected: |
| WebExternalTextureMailbox mailbox; |
| Canvas2DLayerBridge* rawBridge; |
| { |
| - Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockProvider.release(), surface, 0, NonOpaque))); |
| + Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockProvider.release(), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAccelerationForTesting))); |
| bridge->prepareMailbox(&mailbox, 0); |
| rawBridge = bridge.get(); |
| } // bridge goes out of scope, but object is kept alive by self references |
| @@ -207,26 +221,69 @@ protected: |
| rawBridge->mailboxReleased(mailbox, lostResource); // This should self-destruct the bridge. |
| } |
| } |
| + |
| + void accelerationHintTest() |
| + { |
| + MockCanvasContext mainMock; |
| + { |
| + |
| + OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new MockWebGraphicsContext3DProvider(&mainMock)); |
| + ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| + Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockProvider.release(), IntSize(300, 300), 0, NonOpaque, Canvas2DLayerBridge::EnableAcceleration))); |
| + ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| + SkPaint paint; |
| + bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| + RefPtr<SkImage> image = bridge->newImageSnapshot(PreferAcceleration); |
| + ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| + EXPECT_TRUE(bridge->checkSurfaceValid()); |
| + EXPECT_TRUE(bridge->isAccelerated()); |
| + } |
| + ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| + |
| + { |
| + OwnPtr<MockWebGraphicsContext3DProvider> mainMockProvider = adoptPtr(new MockWebGraphicsContext3DProvider(&mainMock)); |
| + ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| + Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(mainMockProvider.release(), IntSize(300, 300), 0, NonOpaque, Canvas2DLayerBridge::EnableAcceleration))); |
| + ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| + SkPaint paint; |
| + bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); |
| + RefPtr<SkImage> image = bridge->newImageSnapshot(PreferNoAcceleration); |
| + ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| + EXPECT_TRUE(bridge->checkSurfaceValid()); |
| + EXPECT_FALSE(bridge->isAccelerated()); |
| + } |
| + ::testing::Mock::VerifyAndClearExpectations(&mainMock); |
| + } |
| }; |
| -TEST_F(Canvas2DLayerBridgeTest, testFullLifecycleSingleThreaded) |
| +TEST_F(Canvas2DLayerBridgeTest, FullLifecycleSingleThreaded) |
| { |
| fullLifecycleTest(); |
| } |
| -TEST_F(Canvas2DLayerBridgeTest, testNoDrawOnContextLost) |
| +TEST_F(Canvas2DLayerBridgeTest, NoDrawOnContextLost) |
| { |
| noDrawOnContextLostTest(); |
| } |
| -TEST_F(Canvas2DLayerBridgeTest, testPrepareMailboxWithBitmap) |
| +TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxWithBitmap) |
| { |
| prepareMailboxWithBitmapTest(); |
| } |
| -TEST_F(Canvas2DLayerBridgeTest, testPrepareMailboxAndLoseResource) |
| +TEST_F(Canvas2DLayerBridgeTest, PrepareMailboxAndLoseResource) |
| { |
| prepareMailboxAndLoseResourceTest(); |
| } |
| +TEST_F(Canvas2DLayerBridgeTest, AccelerationHint) |
| +{ |
| + accelerationHintTest(); |
| +} |
| + |
| +TEST_F(Canvas2DLayerBridgeTest, FallbackToSoftwareIfContextLost) |
| +{ |
| + fallbackToSoftwareIfContextLost(); |
| +} |
| + |
| } // namespace blink |