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

Unified Diff: Source/platform/graphics/Canvas2DLayerBridgeTest.cpp

Issue 1307143005: Make 2D canvas smarter about chosing whether or not to use GPU acceleration (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: added unit test for sw fallback Created 5 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
« no previous file with comments | « Source/platform/graphics/Canvas2DLayerBridge.cpp ('k') | Source/platform/graphics/GraphicsTypes.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « Source/platform/graphics/Canvas2DLayerBridge.cpp ('k') | Source/platform/graphics/GraphicsTypes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698