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

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

Issue 2407753002: Fix crash from state management cleanup (Closed)
Patch Set: Fix state restore missed Created 4 years, 2 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) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 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 are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 49
50 namespace blink { 50 namespace blink {
51 51
52 class DrawingBufferTest : public Test { 52 class DrawingBufferTest : public Test {
53 protected: 53 protected:
54 void SetUp() override { 54 void SetUp() override {
55 IntSize initialSize(InitialWidth, InitialHeight); 55 IntSize initialSize(InitialWidth, InitialHeight);
56 std::unique_ptr<GLES2InterfaceForTests> gl = 56 std::unique_ptr<GLES2InterfaceForTests> gl =
57 wrapUnique(new GLES2InterfaceForTests); 57 wrapUnique(new GLES2InterfaceForTests);
58 m_gl = gl.get(); 58 m_gl = gl.get();
59 SetAndSaveRestoreState(false);
59 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider = 60 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider =
60 wrapUnique(new WebGraphicsContext3DProviderForTests(std::move(gl))); 61 wrapUnique(new WebGraphicsContext3DProviderForTests(std::move(gl)));
61 m_drawingBuffer = DrawingBufferForTests::create( 62 m_drawingBuffer = DrawingBufferForTests::create(
62 std::move(provider), initialSize, DrawingBuffer::Preserve); 63 std::move(provider), m_gl, initialSize, DrawingBuffer::Preserve);
63 CHECK(m_drawingBuffer); 64 CHECK(m_drawingBuffer);
64 } 65 }
65 66
67 // Initialize GL state with unusual values, to verify that they are restored.
68 // The |invert| parameter will reverse all boolean parameters, so that all
69 // values are tested.
70 void SetAndSaveRestoreState(bool invert) {
71 GLboolean scissorEnabled = !invert;
72 GLfloat clearColor[4] = {0.1, 0.2, 0.3, 0.4};
73 GLfloat clearDepth = 0.8;
74 GLint clearStencil = 37;
75 GLboolean colorMask[4] = {invert, !invert, !invert, invert};
76 GLboolean depthMask = invert;
77 GLboolean stencilMask = invert;
78 GLint packAlignment = 7;
79 GLuint activeTexture2DBinding = 0xbeef1;
80 GLuint renderbufferBinding = 0xbeef2;
81 GLuint drawFramebufferBinding = 0xbeef3;
82 GLuint readFramebufferBinding = 0xbeef4;
83 GLuint pixelUnpackBufferBinding = 0xbeef5;
84
85 if (scissorEnabled)
86 m_gl->Enable(GL_SCISSOR_TEST);
87 else
88 m_gl->Disable(GL_SCISSOR_TEST);
89
90 m_gl->ClearColor(clearColor[0], clearColor[1], clearColor[2],
91 clearColor[3]);
92 m_gl->ClearDepthf(clearDepth);
93 m_gl->ClearStencil(clearStencil);
94 m_gl->ColorMask(colorMask[0], colorMask[1], colorMask[2], colorMask[3]);
95 m_gl->DepthMask(depthMask);
96 m_gl->StencilMask(stencilMask);
97 m_gl->PixelStorei(GL_PACK_ALIGNMENT, packAlignment);
98 m_gl->BindTexture(GL_TEXTURE_2D, activeTexture2DBinding);
99 m_gl->BindRenderbuffer(GL_RENDERBUFFER, renderbufferBinding);
100 m_gl->BindFramebuffer(GL_DRAW_FRAMEBUFFER, drawFramebufferBinding);
101 m_gl->BindFramebuffer(GL_READ_FRAMEBUFFER, readFramebufferBinding);
102 m_gl->BindBuffer(GL_PIXEL_UNPACK_BUFFER, pixelUnpackBufferBinding);
103
104 m_gl->SaveState();
105 }
106
107 void VerifyStateWasRestored() { m_gl->VeriyStateHasNotChangedSinceSave(); }
108
66 GLES2InterfaceForTests* m_gl; 109 GLES2InterfaceForTests* m_gl;
67 RefPtr<DrawingBufferForTests> m_drawingBuffer; 110 RefPtr<DrawingBufferForTests> m_drawingBuffer;
68 }; 111 };
69 112
70 TEST_F(DrawingBufferTest, verifyResizingProperlyAffectsMailboxes) { 113 TEST_F(DrawingBufferTest, verifyResizingProperlyAffectsMailboxes) {
114 VerifyStateWasRestored();
71 cc::TextureMailbox textureMailbox; 115 cc::TextureMailbox textureMailbox;
72 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; 116 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback;
73 117
74 IntSize initialSize(InitialWidth, InitialHeight); 118 IntSize initialSize(InitialWidth, InitialHeight);
75 IntSize alternateSize(InitialWidth, AlternateHeight); 119 IntSize alternateSize(InitialWidth, AlternateHeight);
76 120
77 // Produce one mailbox at size 100x100. 121 // Produce one mailbox at size 100x100.
78 m_drawingBuffer->markContentsChanged(); 122 m_drawingBuffer->markContentsChanged();
79 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, 123 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox,
80 &releaseCallback)); 124 &releaseCallback));
125 VerifyStateWasRestored();
81 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); 126 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize());
82 127
83 // Resize to 100x50. 128 // Resize to 100x50.
84 m_drawingBuffer->reset(alternateSize); 129 m_drawingBuffer->resize(alternateSize);
130 VerifyStateWasRestored();
85 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); 131 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */);
132 VerifyStateWasRestored();
86 133
87 // Produce a mailbox at this size. 134 // Produce a mailbox at this size.
88 m_drawingBuffer->markContentsChanged(); 135 m_drawingBuffer->markContentsChanged();
89 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, 136 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox,
90 &releaseCallback)); 137 &releaseCallback));
91 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize()); 138 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize());
139 VerifyStateWasRestored();
92 140
93 // Reset to initial size. 141 // Reset to initial size.
94 m_drawingBuffer->reset(initialSize); 142 m_drawingBuffer->resize(initialSize);
143 VerifyStateWasRestored();
144 SetAndSaveRestoreState(true);
95 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); 145 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */);
146 VerifyStateWasRestored();
96 147
97 // Prepare another mailbox and verify that it's the correct size. 148 // Prepare another mailbox and verify that it's the correct size.
98 m_drawingBuffer->markContentsChanged(); 149 m_drawingBuffer->markContentsChanged();
99 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, 150 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox,
100 &releaseCallback)); 151 &releaseCallback));
101 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); 152 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize());
153 VerifyStateWasRestored();
102 154
103 // Prepare one final mailbox and verify that it's the correct size. 155 // Prepare one final mailbox and verify that it's the correct size.
104 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); 156 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */);
105 m_drawingBuffer->markContentsChanged(); 157 m_drawingBuffer->markContentsChanged();
106 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, 158 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox,
107 &releaseCallback)); 159 &releaseCallback));
160 VerifyStateWasRestored();
108 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); 161 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize());
109 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); 162 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */);
110 m_drawingBuffer->beginDestruction(); 163 m_drawingBuffer->beginDestruction();
111 } 164 }
112 165
113 TEST_F(DrawingBufferTest, verifyDestructionCompleteAfterAllMailboxesReleased) { 166 TEST_F(DrawingBufferTest, verifyDestructionCompleteAfterAllMailboxesReleased) {
114 bool live = true; 167 bool live = true;
115 m_drawingBuffer->m_live = &live; 168 m_drawingBuffer->m_live = &live;
116 169
117 cc::TextureMailbox textureMailbox1; 170 cc::TextureMailbox textureMailbox1;
118 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1; 171 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1;
119 cc::TextureMailbox textureMailbox2; 172 cc::TextureMailbox textureMailbox2;
120 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2; 173 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2;
121 cc::TextureMailbox textureMailbox3; 174 cc::TextureMailbox textureMailbox3;
122 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3; 175 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3;
123 176
124 IntSize initialSize(InitialWidth, InitialHeight); 177 IntSize initialSize(InitialWidth, InitialHeight);
125 178
126 // Produce mailboxes. 179 // Produce mailboxes.
127 m_drawingBuffer->markContentsChanged(); 180 m_drawingBuffer->markContentsChanged();
181 m_drawingBuffer->clearFramebuffers(GL_STENCIL_BUFFER_BIT);
182 VerifyStateWasRestored();
128 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1, 183 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1,
129 &releaseCallback1)); 184 &releaseCallback1));
130 m_drawingBuffer->markContentsChanged(); 185 m_drawingBuffer->markContentsChanged();
186 m_drawingBuffer->clearFramebuffers(GL_DEPTH_BUFFER_BIT);
187 VerifyStateWasRestored();
131 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2, 188 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2,
132 &releaseCallback2)); 189 &releaseCallback2));
133 m_drawingBuffer->markContentsChanged(); 190 m_drawingBuffer->markContentsChanged();
191 m_drawingBuffer->clearFramebuffers(GL_COLOR_BUFFER_BIT);
192 VerifyStateWasRestored();
134 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3, 193 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3,
135 &releaseCallback3)); 194 &releaseCallback3));
136 195
137 m_drawingBuffer->markContentsChanged(); 196 m_drawingBuffer->markContentsChanged();
138 releaseCallback1->Run(gpu::SyncToken(), false /* lostResource */); 197 releaseCallback1->Run(gpu::SyncToken(), false /* lostResource */);
139 198
140 m_drawingBuffer->beginDestruction(); 199 m_drawingBuffer->beginDestruction();
141 ASSERT_EQ(live, true); 200 ASSERT_EQ(live, true);
142 201
143 DrawingBufferForTests* rawPointer = m_drawingBuffer.get(); 202 DrawingBufferForTests* rawPointer = m_drawingBuffer.get();
(...skipping 16 matching lines...) Expand all
160 cc::TextureMailbox textureMailbox1; 219 cc::TextureMailbox textureMailbox1;
161 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1; 220 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1;
162 cc::TextureMailbox textureMailbox2; 221 cc::TextureMailbox textureMailbox2;
163 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2; 222 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2;
164 cc::TextureMailbox textureMailbox3; 223 cc::TextureMailbox textureMailbox3;
165 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3; 224 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3;
166 225
167 m_drawingBuffer->markContentsChanged(); 226 m_drawingBuffer->markContentsChanged();
168 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1, 227 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1,
169 &releaseCallback1)); 228 &releaseCallback1));
229 VerifyStateWasRestored();
170 m_drawingBuffer->markContentsChanged(); 230 m_drawingBuffer->markContentsChanged();
171 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2, 231 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2,
172 &releaseCallback2)); 232 &releaseCallback2));
233 VerifyStateWasRestored();
173 m_drawingBuffer->markContentsChanged(); 234 m_drawingBuffer->markContentsChanged();
174 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3, 235 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3,
175 &releaseCallback3)); 236 &releaseCallback3));
237 VerifyStateWasRestored();
176 238
177 m_drawingBuffer->markContentsChanged(); 239 m_drawingBuffer->markContentsChanged();
178 releaseCallback1->Run(gpu::SyncToken(), true /* lostResource */); 240 releaseCallback1->Run(gpu::SyncToken(), true /* lostResource */);
179 EXPECT_EQ(live, true); 241 EXPECT_EQ(live, true);
180 242
181 m_drawingBuffer->beginDestruction(); 243 m_drawingBuffer->beginDestruction();
182 EXPECT_EQ(live, true); 244 EXPECT_EQ(live, true);
183 245
184 m_drawingBuffer->markContentsChanged(); 246 m_drawingBuffer->markContentsChanged();
185 releaseCallback2->Run(gpu::SyncToken(), false /* lostResource */); 247 releaseCallback2->Run(gpu::SyncToken(), false /* lostResource */);
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken()); 342 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken());
281 } 343 }
282 344
283 class DrawingBufferImageChromiumTest : public DrawingBufferTest { 345 class DrawingBufferImageChromiumTest : public DrawingBufferTest {
284 protected: 346 protected:
285 void SetUp() override { 347 void SetUp() override {
286 IntSize initialSize(InitialWidth, InitialHeight); 348 IntSize initialSize(InitialWidth, InitialHeight);
287 std::unique_ptr<GLES2InterfaceForTests> gl = 349 std::unique_ptr<GLES2InterfaceForTests> gl =
288 wrapUnique(new GLES2InterfaceForTests); 350 wrapUnique(new GLES2InterfaceForTests);
289 m_gl = gl.get(); 351 m_gl = gl.get();
352 SetAndSaveRestoreState(true);
290 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider = 353 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider =
291 wrapUnique(new WebGraphicsContext3DProviderForTests(std::move(gl))); 354 wrapUnique(new WebGraphicsContext3DProviderForTests(std::move(gl)));
292 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(true); 355 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(true);
293 m_imageId0 = m_gl->nextImageIdToBeCreated(); 356 m_imageId0 = m_gl->nextImageIdToBeCreated();
294 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId0)).Times(1); 357 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId0)).Times(1);
295 m_drawingBuffer = DrawingBufferForTests::create( 358 m_drawingBuffer = DrawingBufferForTests::create(
296 std::move(provider), initialSize, DrawingBuffer::Preserve); 359 std::move(provider), m_gl, initialSize, DrawingBuffer::Preserve);
297 CHECK(m_drawingBuffer); 360 CHECK(m_drawingBuffer);
298 testing::Mock::VerifyAndClearExpectations(m_gl); 361 testing::Mock::VerifyAndClearExpectations(m_gl);
299 } 362 }
300 363
301 void TearDown() override { 364 void TearDown() override {
302 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(false); 365 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(false);
303 } 366 }
304 367
305 GLuint m_imageId0; 368 GLuint m_imageId0;
306 }; 369 };
307 370
308 TEST_F(DrawingBufferImageChromiumTest, verifyResizingReallocatesImages) { 371 TEST_F(DrawingBufferImageChromiumTest, verifyResizingReallocatesImages) {
309 cc::TextureMailbox textureMailbox; 372 cc::TextureMailbox textureMailbox;
310 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; 373 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback;
311 374
312 IntSize initialSize(InitialWidth, InitialHeight); 375 IntSize initialSize(InitialWidth, InitialHeight);
313 IntSize alternateSize(InitialWidth, AlternateHeight); 376 IntSize alternateSize(InitialWidth, AlternateHeight);
314 377
315 GLuint m_imageId1 = m_gl->nextImageIdToBeCreated(); 378 GLuint m_imageId1 = m_gl->nextImageIdToBeCreated();
316 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId1)).Times(1); 379 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId1)).Times(1);
317 // Produce one mailbox at size 100x100. 380 // Produce one mailbox at size 100x100.
318 m_drawingBuffer->markContentsChanged(); 381 m_drawingBuffer->markContentsChanged();
319 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, 382 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox,
320 &releaseCallback)); 383 &releaseCallback));
321 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); 384 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize());
322 EXPECT_TRUE(textureMailbox.is_overlay_candidate()); 385 EXPECT_TRUE(textureMailbox.is_overlay_candidate());
323 testing::Mock::VerifyAndClearExpectations(m_gl); 386 testing::Mock::VerifyAndClearExpectations(m_gl);
387 VerifyStateWasRestored();
324 388
325 GLuint m_imageId2 = m_gl->nextImageIdToBeCreated(); 389 GLuint m_imageId2 = m_gl->nextImageIdToBeCreated();
326 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId2)).Times(1); 390 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId2)).Times(1);
327 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId0)).Times(1); 391 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId0)).Times(1);
328 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId0)).Times(1); 392 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId0)).Times(1);
329 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId1)).Times(1); 393 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId1)).Times(1);
330 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId1)).Times(1); 394 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId1)).Times(1);
331 // Resize to 100x50. 395 // Resize to 100x50.
332 m_drawingBuffer->reset(alternateSize); 396 m_drawingBuffer->resize(alternateSize);
397 VerifyStateWasRestored();
333 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); 398 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */);
399 VerifyStateWasRestored();
334 testing::Mock::VerifyAndClearExpectations(m_gl); 400 testing::Mock::VerifyAndClearExpectations(m_gl);
335 401
336 GLuint m_imageId3 = m_gl->nextImageIdToBeCreated(); 402 GLuint m_imageId3 = m_gl->nextImageIdToBeCreated();
337 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId3)).Times(1); 403 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId3)).Times(1);
338 // Produce a mailbox at this size. 404 // Produce a mailbox at this size.
339 m_drawingBuffer->markContentsChanged(); 405 m_drawingBuffer->markContentsChanged();
340 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, 406 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox,
341 &releaseCallback)); 407 &releaseCallback));
342 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize()); 408 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize());
343 EXPECT_TRUE(textureMailbox.is_overlay_candidate()); 409 EXPECT_TRUE(textureMailbox.is_overlay_candidate());
344 testing::Mock::VerifyAndClearExpectations(m_gl); 410 testing::Mock::VerifyAndClearExpectations(m_gl);
345 411
346 GLuint m_imageId4 = m_gl->nextImageIdToBeCreated(); 412 GLuint m_imageId4 = m_gl->nextImageIdToBeCreated();
347 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId4)).Times(1); 413 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId4)).Times(1);
348 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId2)).Times(1); 414 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId2)).Times(1);
349 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId2)).Times(1); 415 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId2)).Times(1);
350 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId3)).Times(1); 416 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId3)).Times(1);
351 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId3)).Times(1); 417 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId3)).Times(1);
352 // Reset to initial size. 418 // Reset to initial size.
353 m_drawingBuffer->reset(initialSize); 419 m_drawingBuffer->resize(initialSize);
420 VerifyStateWasRestored();
354 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); 421 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */);
422 VerifyStateWasRestored();
355 testing::Mock::VerifyAndClearExpectations(m_gl); 423 testing::Mock::VerifyAndClearExpectations(m_gl);
356 424
357 GLuint m_imageId5 = m_gl->nextImageIdToBeCreated(); 425 GLuint m_imageId5 = m_gl->nextImageIdToBeCreated();
358 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId5)).Times(1); 426 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId5)).Times(1);
359 // Prepare another mailbox and verify that it's the correct size. 427 // Prepare another mailbox and verify that it's the correct size.
360 m_drawingBuffer->markContentsChanged(); 428 m_drawingBuffer->markContentsChanged();
361 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, 429 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox,
362 &releaseCallback)); 430 &releaseCallback));
363 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); 431 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize());
364 EXPECT_TRUE(textureMailbox.is_overlay_candidate()); 432 EXPECT_TRUE(textureMailbox.is_overlay_candidate());
(...skipping 26 matching lines...) Expand all
391 459
392 // Request a mailbox. An image should already be created. Everything works 460 // Request a mailbox. An image should already be created. Everything works
393 // as expected. 461 // as expected.
394 EXPECT_CALL(*m_gl, BindTexImage2DMock(_)).Times(1); 462 EXPECT_CALL(*m_gl, BindTexImage2DMock(_)).Times(1);
395 IntSize initialSize(InitialWidth, InitialHeight); 463 IntSize initialSize(InitialWidth, InitialHeight);
396 m_drawingBuffer->markContentsChanged(); 464 m_drawingBuffer->markContentsChanged();
397 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1, 465 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1,
398 &releaseCallback1)); 466 &releaseCallback1));
399 EXPECT_TRUE(textureMailbox1.is_overlay_candidate()); 467 EXPECT_TRUE(textureMailbox1.is_overlay_candidate());
400 testing::Mock::VerifyAndClearExpectations(m_gl); 468 testing::Mock::VerifyAndClearExpectations(m_gl);
469 VerifyStateWasRestored();
401 470
402 // Force image CHROMIUM creation failure. Request another mailbox. It should 471 // Force image CHROMIUM creation failure. Request another mailbox. It should
403 // still be provided, but this time with allowOverlay = false. 472 // still be provided, but this time with allowOverlay = false.
404 m_gl->setCreateImageChromiumFail(true); 473 m_gl->setCreateImageChromiumFail(true);
405 m_drawingBuffer->markContentsChanged(); 474 m_drawingBuffer->markContentsChanged();
406 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2, 475 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2,
407 &releaseCallback2)); 476 &releaseCallback2));
408 EXPECT_FALSE(textureMailbox2.is_overlay_candidate()); 477 EXPECT_FALSE(textureMailbox2.is_overlay_candidate());
478 VerifyStateWasRestored();
409 479
410 // Check that if image CHROMIUM starts working again, mailboxes are 480 // Check that if image CHROMIUM starts working again, mailboxes are
411 // correctly created with allowOverlay = true. 481 // correctly created with allowOverlay = true.
412 EXPECT_CALL(*m_gl, BindTexImage2DMock(_)).Times(1); 482 EXPECT_CALL(*m_gl, BindTexImage2DMock(_)).Times(1);
413 m_gl->setCreateImageChromiumFail(false); 483 m_gl->setCreateImageChromiumFail(false);
414 m_drawingBuffer->markContentsChanged(); 484 m_drawingBuffer->markContentsChanged();
415 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3, 485 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3,
416 &releaseCallback3)); 486 &releaseCallback3));
417 EXPECT_TRUE(textureMailbox3.is_overlay_candidate()); 487 EXPECT_TRUE(textureMailbox3.is_overlay_candidate());
418 testing::Mock::VerifyAndClearExpectations(m_gl); 488 testing::Mock::VerifyAndClearExpectations(m_gl);
489 VerifyStateWasRestored();
419 490
420 releaseCallback1->Run(gpu::SyncToken(), false /* lostResource */); 491 releaseCallback1->Run(gpu::SyncToken(), false /* lostResource */);
421 releaseCallback2->Run(gpu::SyncToken(), false /* lostResource */); 492 releaseCallback2->Run(gpu::SyncToken(), false /* lostResource */);
422 releaseCallback3->Run(gpu::SyncToken(), false /* lostResource */); 493 releaseCallback3->Run(gpu::SyncToken(), false /* lostResource */);
423 494
424 EXPECT_CALL(*m_gl, DestroyImageMock(_)).Times(3); 495 EXPECT_CALL(*m_gl, DestroyImageMock(_)).Times(3);
425 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(_)).Times(3); 496 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(_)).Times(3);
426 m_drawingBuffer->beginDestruction(); 497 m_drawingBuffer->beginDestruction();
427 testing::Mock::VerifyAndClearExpectations(m_gl); 498 testing::Mock::VerifyAndClearExpectations(m_gl);
428 } 499 }
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
525 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider = 596 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider =
526 wrapUnique(new WebGraphicsContext3DProviderForTests(std::move(gl))); 597 wrapUnique(new WebGraphicsContext3DProviderForTests(std::move(gl)));
527 DrawingBuffer::PreserveDrawingBuffer preserve = DrawingBuffer::Preserve; 598 DrawingBuffer::PreserveDrawingBuffer preserve = DrawingBuffer::Preserve;
528 599
529 bool premultipliedAlpha = false; 600 bool premultipliedAlpha = false;
530 bool wantAlphaChannel = true; 601 bool wantAlphaChannel = true;
531 bool wantDepthBuffer = cases[i].requestDepth; 602 bool wantDepthBuffer = cases[i].requestDepth;
532 bool wantStencilBuffer = cases[i].requestStencil; 603 bool wantStencilBuffer = cases[i].requestStencil;
533 bool wantAntialiasing = false; 604 bool wantAntialiasing = false;
534 RefPtr<DrawingBuffer> drawingBuffer = DrawingBuffer::create( 605 RefPtr<DrawingBuffer> drawingBuffer = DrawingBuffer::create(
535 std::move(provider), IntSize(10, 10), premultipliedAlpha, 606 std::move(provider), nullptr, IntSize(10, 10), premultipliedAlpha,
536 wantAlphaChannel, wantDepthBuffer, wantStencilBuffer, wantAntialiasing, 607 wantAlphaChannel, wantDepthBuffer, wantStencilBuffer, wantAntialiasing,
537 preserve, DrawingBuffer::WebGL1, DrawingBuffer::AllowChromiumImage); 608 preserve, DrawingBuffer::WebGL1, DrawingBuffer::AllowChromiumImage);
538 609
539 // When we request a depth or a stencil buffer, we will get both. 610 // When we request a depth or a stencil buffer, we will get both.
540 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil, 611 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil,
541 drawingBuffer->hasDepthBuffer()); 612 drawingBuffer->hasDepthBuffer());
542 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil, 613 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil,
543 drawingBuffer->hasStencilBuffer()); 614 drawingBuffer->hasStencilBuffer());
544 EXPECT_EQ(cases[i].expectedRenderBuffers, 615 EXPECT_EQ(cases[i].expectedRenderBuffers,
545 trackingGL->numAllocatedRenderBuffer()); 616 trackingGL->numAllocatedRenderBuffer());
546 if (cases[i].requestDepth || cases[i].requestStencil) { 617 if (cases[i].requestDepth || cases[i].requestStencil) {
547 EXPECT_NE(0u, trackingGL->depthStencilAttachment()); 618 EXPECT_NE(0u, trackingGL->depthStencilAttachment());
548 EXPECT_EQ(0u, trackingGL->depthAttachment()); 619 EXPECT_EQ(0u, trackingGL->depthAttachment());
549 EXPECT_EQ(0u, trackingGL->stencilAttachment()); 620 EXPECT_EQ(0u, trackingGL->stencilAttachment());
550 } else { 621 } else {
551 EXPECT_EQ(0u, trackingGL->depthStencilAttachment()); 622 EXPECT_EQ(0u, trackingGL->depthStencilAttachment());
552 EXPECT_EQ(0u, trackingGL->depthAttachment()); 623 EXPECT_EQ(0u, trackingGL->depthAttachment());
553 EXPECT_EQ(0u, trackingGL->stencilAttachment()); 624 EXPECT_EQ(0u, trackingGL->stencilAttachment());
554 } 625 }
555 626
556 drawingBuffer->reset(IntSize(10, 20)); 627 drawingBuffer->resize(IntSize(10, 20));
557 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil, 628 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil,
558 drawingBuffer->hasDepthBuffer()); 629 drawingBuffer->hasDepthBuffer());
559 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil, 630 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil,
560 drawingBuffer->hasStencilBuffer()); 631 drawingBuffer->hasStencilBuffer());
561 EXPECT_EQ(cases[i].expectedRenderBuffers, 632 EXPECT_EQ(cases[i].expectedRenderBuffers,
562 trackingGL->numAllocatedRenderBuffer()); 633 trackingGL->numAllocatedRenderBuffer());
563 if (cases[i].requestDepth || cases[i].requestStencil) { 634 if (cases[i].requestDepth || cases[i].requestStencil) {
564 EXPECT_NE(0u, trackingGL->depthStencilAttachment()); 635 EXPECT_NE(0u, trackingGL->depthStencilAttachment());
565 EXPECT_EQ(0u, trackingGL->depthAttachment()); 636 EXPECT_EQ(0u, trackingGL->depthAttachment());
566 EXPECT_EQ(0u, trackingGL->stencilAttachment()); 637 EXPECT_EQ(0u, trackingGL->stencilAttachment());
(...skipping 22 matching lines...) Expand all
589 m_drawingBuffer->setIsHidden(true); 660 m_drawingBuffer->setIsHidden(true);
590 releaseCallback->Run(waitSyncToken, false /* lostResource */); 661 releaseCallback->Run(waitSyncToken, false /* lostResource */);
591 // m_drawingBuffer deletes mailbox immediately when hidden. 662 // m_drawingBuffer deletes mailbox immediately when hidden.
592 663
593 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken()); 664 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken());
594 665
595 m_drawingBuffer->beginDestruction(); 666 m_drawingBuffer->beginDestruction();
596 } 667 }
597 668
598 } // namespace blink 669 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698