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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridgeTest.cpp

Issue 2212163002: Add some plumbing for the color management of canvases (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: minor corrections Created 4 years, 4 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 return nullptr; 108 return nullptr;
109 } 109 }
110 }; 110 };
111 111
112 } // anonymous namespace 112 } // anonymous namespace
113 113
114 class Canvas2DLayerBridgeTest : public Test { 114 class Canvas2DLayerBridgeTest : public Test {
115 public: 115 public:
116 PassRefPtr<Canvas2DLayerBridge> makeBridge(std::unique_ptr<FakeWebGraphicsCo ntext3DProvider> provider, const IntSize& size, Canvas2DLayerBridge::Acceleratio nMode accelerationMode) 116 PassRefPtr<Canvas2DLayerBridge> makeBridge(std::unique_ptr<FakeWebGraphicsCo ntext3DProvider> provider, const IntSize& size, Canvas2DLayerBridge::Acceleratio nMode accelerationMode)
117 { 117 {
118 return adoptRef(new Canvas2DLayerBridge(std::move(provider), size, 0, No nOpaque, accelerationMode)); 118 return adoptRef(new Canvas2DLayerBridge(std::move(provider), size, 0, No nOpaque, accelerationMode, nullptr));
119 } 119 }
120 120
121 protected: 121 protected:
122 void fullLifecycleTest() 122 void fullLifecycleTest()
123 { 123 {
124 FakeGLES2Interface gl; 124 FakeGLES2Interface gl;
125 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap Unique(new FakeWebGraphicsContext3DProvider(&gl)); 125 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap Unique(new FakeWebGraphicsContext3DProvider(&gl));
126 126
127 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move (contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Disable Acceleration))); 127 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move (contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Disable Acceleration, nullptr)));
128 128
129 const GrGLTextureInfo* textureInfo = skia::GrBackendObjectToGrGLTextureI nfo(bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnitTests)->getTe xtureHandle(true)); 129 const GrGLTextureInfo* textureInfo = skia::GrBackendObjectToGrGLTextureI nfo(bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnitTests)->getTe xtureHandle(true));
130 EXPECT_EQ(textureInfo, nullptr); 130 EXPECT_EQ(textureInfo, nullptr);
131 bridge.clear(); 131 bridge.clear();
132 } 132 }
133 133
134 void fallbackToSoftwareIfContextLost() 134 void fallbackToSoftwareIfContextLost()
135 { 135 {
136 FakeGLES2Interface gl; 136 FakeGLES2Interface gl;
137 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap Unique(new FakeWebGraphicsContext3DProvider(&gl)); 137 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap Unique(new FakeWebGraphicsContext3DProvider(&gl));
138 138
139 gl.setIsContextLost(true); 139 gl.setIsContextLost(true);
140 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move (contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::EnableA cceleration))); 140 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move (contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::EnableA cceleration, nullptr)));
141 EXPECT_TRUE(bridge->checkSurfaceValid()); 141 EXPECT_TRUE(bridge->checkSurfaceValid());
142 EXPECT_FALSE(bridge->isAccelerated()); 142 EXPECT_FALSE(bridge->isAccelerated());
143 } 143 }
144 144
145 void fallbackToSoftwareOnFailedTextureAlloc() 145 void fallbackToSoftwareOnFailedTextureAlloc()
146 { 146 {
147 { 147 {
148 // No fallback case. 148 // No fallback case.
149 FakeGLES2Interface gl; 149 FakeGLES2Interface gl;
150 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); 150 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrapUnique(new FakeWebGraphicsContext3DProvider(&gl));
151 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std:: move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Ena bleAcceleration))); 151 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std:: move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Ena bleAcceleration, nullptr)));
152 EXPECT_TRUE(bridge->checkSurfaceValid()); 152 EXPECT_TRUE(bridge->checkSurfaceValid());
153 EXPECT_TRUE(bridge->isAccelerated()); 153 EXPECT_TRUE(bridge->isAccelerated());
154 RefPtr<SkImage> snapshot = bridge->newImageSnapshot(PreferAccelerati on, SnapshotReasonUnitTests); 154 RefPtr<SkImage> snapshot = bridge->newImageSnapshot(PreferAccelerati on, SnapshotReasonUnitTests);
155 EXPECT_TRUE(bridge->isAccelerated()); 155 EXPECT_TRUE(bridge->isAccelerated());
156 EXPECT_TRUE(snapshot->isTextureBacked()); 156 EXPECT_TRUE(snapshot->isTextureBacked());
157 } 157 }
158 158
159 { 159 {
160 // Fallback case. 160 // Fallback case.
161 FakeGLES2Interface gl; 161 FakeGLES2Interface gl;
162 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); 162 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrapUnique(new FakeWebGraphicsContext3DProvider(&gl));
163 GrContext* gr = contextProvider->grContext(); 163 GrContext* gr = contextProvider->grContext();
164 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std:: move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Ena bleAcceleration))); 164 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std:: move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::Ena bleAcceleration, nullptr)));
165 EXPECT_TRUE(bridge->checkSurfaceValid()); 165 EXPECT_TRUE(bridge->checkSurfaceValid());
166 EXPECT_TRUE(bridge->isAccelerated()); // We don't yet know that allo cation will fail 166 EXPECT_TRUE(bridge->isAccelerated()); // We don't yet know that allo cation will fail
167 // This will cause SkSurface_Gpu creation to fail without 167 // This will cause SkSurface_Gpu creation to fail without
168 // Canvas2DLayerBridge otherwise detecting that anything was disable d. 168 // Canvas2DLayerBridge otherwise detecting that anything was disable d.
169 gr->abandonContext(); 169 gr->abandonContext();
170 RefPtr<SkImage> snapshot = bridge->newImageSnapshot(PreferAccelerati on, SnapshotReasonUnitTests); 170 RefPtr<SkImage> snapshot = bridge->newImageSnapshot(PreferAccelerati on, SnapshotReasonUnitTests);
171 EXPECT_FALSE(bridge->isAccelerated()); 171 EXPECT_FALSE(bridge->isAccelerated());
172 EXPECT_FALSE(snapshot->isTextureBacked()); 172 EXPECT_FALSE(snapshot->isTextureBacked());
173 } 173 }
174 } 174 }
175 175
176 void noDrawOnContextLostTest() 176 void noDrawOnContextLostTest()
177 { 177 {
178 FakeGLES2Interface gl; 178 FakeGLES2Interface gl;
179 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap Unique(new FakeWebGraphicsContext3DProvider(&gl)); 179 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap Unique(new FakeWebGraphicsContext3DProvider(&gl));
180 180
181 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move (contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAc celerationForTesting))); 181 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move (contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAc celerationForTesting, nullptr)));
182 EXPECT_TRUE(bridge->checkSurfaceValid()); 182 EXPECT_TRUE(bridge->checkSurfaceValid());
183 SkPaint paint; 183 SkPaint paint;
184 uint32_t genID = bridge->getOrCreateSurface()->generationID(); 184 uint32_t genID = bridge->getOrCreateSurface()->generationID();
185 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); 185 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint);
186 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); 186 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID());
187 gl.setIsContextLost(true); 187 gl.setIsContextLost(true);
188 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); 188 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID());
189 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); 189 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint);
190 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID()); 190 EXPECT_EQ(genID, bridge->getOrCreateSurface()->generationID());
191 // This results in the internal surface being torn down in response to t he context loss. 191 // This results in the internal surface being torn down in response to t he context loss.
192 EXPECT_FALSE(bridge->checkSurfaceValid()); 192 EXPECT_FALSE(bridge->checkSurfaceValid());
193 EXPECT_EQ(nullptr, bridge->getOrCreateSurface()); 193 EXPECT_EQ(nullptr, bridge->getOrCreateSurface());
194 // The following passes by not crashing 194 // The following passes by not crashing
195 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); 195 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint);
196 bridge->flush(); 196 bridge->flush();
197 } 197 }
198 198
199 void prepareMailboxWithBitmapTest() 199 void prepareMailboxWithBitmapTest()
200 { 200 {
201 FakeGLES2Interface gl; 201 FakeGLES2Interface gl;
202 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap Unique(new FakeWebGraphicsContext3DProvider(&gl)); 202 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrap Unique(new FakeWebGraphicsContext3DProvider(&gl));
203 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move (contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAc celerationForTesting))); 203 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std::move (contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::ForceAc celerationForTesting, nullptr)));
204 bridge->m_lastImageId = 1; 204 bridge->m_lastImageId = 1;
205 205
206 NullWebExternalBitmap bitmap; 206 NullWebExternalBitmap bitmap;
207 bridge->prepareMailbox(0, &bitmap); 207 bridge->prepareMailbox(0, &bitmap);
208 EXPECT_EQ(0u, bridge->m_lastImageId); 208 EXPECT_EQ(0u, bridge->m_lastImageId);
209 } 209 }
210 210
211 void prepareMailboxAndLoseResourceTest() 211 void prepareMailboxAndLoseResourceTest()
212 { 212 {
213 bool lostResource = true; 213 bool lostResource = true;
214 214
215 // Prepare a mailbox, then report the resource as lost. 215 // Prepare a mailbox, then report the resource as lost.
216 // This test passes by not crashing and not triggering assertions. 216 // This test passes by not crashing and not triggering assertions.
217 { 217 {
218 FakeGLES2Interface gl; 218 FakeGLES2Interface gl;
219 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); 219 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrapUnique(new FakeWebGraphicsContext3DProvider(&gl));
220 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std:: move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::For ceAccelerationForTesting))); 220 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std:: move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge::For ceAccelerationForTesting, nullptr)));
221 WebExternalTextureMailbox mailbox; 221 WebExternalTextureMailbox mailbox;
222 bridge->prepareMailbox(&mailbox, 0); 222 bridge->prepareMailbox(&mailbox, 0);
223 bridge->mailboxReleased(mailbox, lostResource); 223 bridge->mailboxReleased(mailbox, lostResource);
224 } 224 }
225 225
226 // Retry with mailbox released while bridge destruction is in progress. 226 // Retry with mailbox released while bridge destruction is in progress.
227 { 227 {
228 FakeGLES2Interface gl; 228 FakeGLES2Interface gl;
229 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); 229 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrapUnique(new FakeWebGraphicsContext3DProvider(&gl));
230 WebExternalTextureMailbox mailbox; 230 WebExternalTextureMailbox mailbox;
231 Canvas2DLayerBridge* rawBridge; 231 Canvas2DLayerBridge* rawBridge;
232 { 232 {
233 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(s td::move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge: :ForceAccelerationForTesting))); 233 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(s td::move(contextProvider), IntSize(300, 150), 0, NonOpaque, Canvas2DLayerBridge: :ForceAccelerationForTesting, nullptr)));
234 bridge->prepareMailbox(&mailbox, 0); 234 bridge->prepareMailbox(&mailbox, 0);
235 rawBridge = bridge.get(); 235 rawBridge = bridge.get();
236 } // bridge goes out of scope, but object is kept alive by self refe rences. 236 } // bridge goes out of scope, but object is kept alive by self refe rences.
237 // Before fixing crbug.com/411864, the following line you cause a me mory use after free 237 // Before fixing crbug.com/411864, the following line you cause a me mory use after free
238 // that sometimes causes a crash in normal builds and crashes consis tently with ASAN. 238 // that sometimes causes a crash in normal builds and crashes consis tently with ASAN.
239 rawBridge->mailboxReleased(mailbox, lostResource); // This should se lf-destruct the bridge. 239 rawBridge->mailboxReleased(mailbox, lostResource); // This should se lf-destruct the bridge.
240 } 240 }
241 } 241 }
242 242
243 void accelerationHintTest() 243 void accelerationHintTest()
244 { 244 {
245 { 245 {
246 FakeGLES2Interface gl; 246 FakeGLES2Interface gl;
247 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); 247 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrapUnique(new FakeWebGraphicsContext3DProvider(&gl));
248 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std:: move(contextProvider), IntSize(300, 300), 0, NonOpaque, Canvas2DLayerBridge::Ena bleAcceleration))); 248 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std:: move(contextProvider), IntSize(300, 300), 0, NonOpaque, Canvas2DLayerBridge::Ena bleAcceleration, nullptr)));
249 SkPaint paint; 249 SkPaint paint;
250 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); 250 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint);
251 RefPtr<SkImage> image = bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnitTests); 251 RefPtr<SkImage> image = bridge->newImageSnapshot(PreferAcceleration, SnapshotReasonUnitTests);
252 EXPECT_TRUE(bridge->checkSurfaceValid()); 252 EXPECT_TRUE(bridge->checkSurfaceValid());
253 EXPECT_TRUE(bridge->isAccelerated()); 253 EXPECT_TRUE(bridge->isAccelerated());
254 } 254 }
255 255
256 { 256 {
257 FakeGLES2Interface gl; 257 FakeGLES2Interface gl;
258 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrapUnique(new FakeWebGraphicsContext3DProvider(&gl)); 258 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider = wrapUnique(new FakeWebGraphicsContext3DProvider(&gl));
259 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std:: move(contextProvider), IntSize(300, 300), 0, NonOpaque, Canvas2DLayerBridge::Ena bleAcceleration))); 259 Canvas2DLayerBridgePtr bridge(adoptRef(new Canvas2DLayerBridge(std:: move(contextProvider), IntSize(300, 300), 0, NonOpaque, Canvas2DLayerBridge::Ena bleAcceleration, nullptr)));
260 SkPaint paint; 260 SkPaint paint;
261 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint); 261 bridge->canvas()->drawRect(SkRect::MakeXYWH(0, 0, 1, 1), paint);
262 RefPtr<SkImage> image = bridge->newImageSnapshot(PreferNoAcceleratio n, SnapshotReasonUnitTests); 262 RefPtr<SkImage> image = bridge->newImageSnapshot(PreferNoAcceleratio n, SnapshotReasonUnitTests);
263 EXPECT_TRUE(bridge->checkSurfaceValid()); 263 EXPECT_TRUE(bridge->checkSurfaceValid());
264 EXPECT_FALSE(bridge->isAccelerated()); 264 EXPECT_FALSE(bridge->isAccelerated());
265 } 265 }
266 } 266 }
267 }; 267 };
268 268
269 TEST_F(Canvas2DLayerBridgeTest, FullLifecycleSingleThreaded) 269 TEST_F(Canvas2DLayerBridgeTest, FullLifecycleSingleThreaded)
(...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 WebExternalTextureMailbox mailbox; 1058 WebExternalTextureMailbox mailbox;
1059 EXPECT_FALSE(bridge->prepareMailbox(&mailbox, 0)); 1059 EXPECT_FALSE(bridge->prepareMailbox(&mailbox, 0));
1060 EXPECT_TRUE(bridge->checkSurfaceValid()); 1060 EXPECT_TRUE(bridge->checkSurfaceValid());
1061 1061
1062 // Tear down the bridge on the thread so that 'bridge' can go out of scope 1062 // Tear down the bridge on the thread so that 'bridge' can go out of scope
1063 // without crashing due to thread checks 1063 // without crashing due to thread checks
1064 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge); 1064 postAndWaitDestroyBridgeTask(BLINK_FROM_HERE, testThread.get(), &bridge);
1065 } 1065 }
1066 1066
1067 } // namespace blink 1067 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698