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

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

Issue 2402603002: State management cleanup (Closed)
Patch Set: Make state dirtying explosive 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 #include "testing/gtest/include/gtest/gtest.h" 42 #include "testing/gtest/include/gtest/gtest.h"
43 #include "wtf/PtrUtil.h" 43 #include "wtf/PtrUtil.h"
44 #include "wtf/RefPtr.h" 44 #include "wtf/RefPtr.h"
45 #include <memory> 45 #include <memory>
46 46
47 using testing::Test; 47 using testing::Test;
48 using testing::_; 48 using testing::_;
49 49
50 namespace blink { 50 namespace blink {
51 51
52 class DrawingBufferTest : public Test { 52 class DrawingBufferTest : public Test, public DrawingBufferStateTracker {
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 InitializeRestoreState();
60 SetRestoreState();
59 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider = 61 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider =
60 wrapUnique(new WebGraphicsContext3DProviderForTests(std::move(gl))); 62 wrapUnique(new WebGraphicsContext3DProviderForTests(std::move(gl)));
61 m_drawingBuffer = DrawingBufferForTests::create( 63 m_drawingBuffer = DrawingBufferForTests::create(
62 std::move(provider), initialSize, DrawingBuffer::Preserve); 64 std::move(provider), this, initialSize, DrawingBuffer::Preserve);
63 CHECK(m_drawingBuffer); 65 CHECK(m_drawingBuffer);
64 } 66 }
65 67
68 void GetDrawingBufferRestoreState(
69 DrawingBufferRestoreState* restoreState) override {
70 *restoreState = m_restoreState;
71 }
72
73 void InitializeRestoreState() {
74 m_restoreState.scissorEnabled = true;
75 m_restoreState.clearColor[0] = 0.5;
76 m_restoreState.clearColor[3] = 0.8;
77 m_restoreState.clearDepth = 0.8;
78 m_restoreState.clearStencil = 37;
79 m_restoreState.colorMask[1] = GL_TRUE;
80 m_restoreState.colorMask[2] = GL_TRUE;
81 m_restoreState.depthMask = GL_FALSE;
82 m_restoreState.stencilMask = GL_FALSE;
83 m_restoreState.packAlignment = 7;
84 m_restoreState.activeTexture2DBinding = 0xbeef1;
85 m_restoreState.renderbufferBinding = 0xbeef2;
86 m_restoreState.drawFramebufferBinding = 0xbeef3;
87 m_restoreState.readFramebufferBinding = 0xbeef4;
88 m_restoreState.pixelUnpackBufferBinding = 0xbeef5;
89 }
90
91 void SetRestoreState() {
92 if (m_restoreState.scissorEnabled)
93 m_gl->Enable(GL_SCISSOR_TEST);
94 else
95 m_gl->Disable(GL_SCISSOR_TEST);
96
97 m_gl->ClearColor(m_restoreState.clearColor[0], m_restoreState.clearColor[1],
98 m_restoreState.clearColor[2],
99 m_restoreState.clearColor[3]);
100 m_gl->ClearDepthf(m_restoreState.clearDepth);
101 m_gl->ClearStencil(m_restoreState.clearStencil);
102 m_gl->ColorMask(m_restoreState.colorMask[0], m_restoreState.colorMask[1],
103 m_restoreState.colorMask[2], m_restoreState.colorMask[3]);
104 m_gl->DepthMask(m_restoreState.depthMask);
105 m_gl->StencilMask(m_restoreState.stencilMask);
106 m_gl->PixelStorei(GL_PACK_ALIGNMENT, m_restoreState.packAlignment);
107 m_gl->BindTexture(GL_TEXTURE_2D, m_restoreState.activeTexture2DBinding);
108 m_gl->BindRenderbuffer(GL_RENDERBUFFER, m_restoreState.renderbufferBinding);
109 m_gl->BindFramebuffer(GL_DRAW_FRAMEBUFFER,
110 m_restoreState.drawFramebufferBinding);
111 m_gl->BindFramebuffer(GL_READ_FRAMEBUFFER,
112 m_restoreState.readFramebufferBinding);
113 m_gl->BindBuffer(GL_PIXEL_UNPACK_BUFFER,
114 m_restoreState.pixelUnpackBufferBinding);
115 }
116 void VerifyStateWasRestored() {
117 DrawingBufferRestoreState actual = m_gl->getActualRestoreState();
118 for (size_t i = 0; i < 4; ++i) {
119 EXPECT_EQ(actual.clearColor[0], m_restoreState.clearColor[0]);
120 EXPECT_EQ(actual.colorMask[0], m_restoreState.colorMask[0]);
121 }
122 EXPECT_EQ(actual.clearDepth, m_restoreState.clearDepth);
123 EXPECT_EQ(actual.clearStencil, m_restoreState.clearStencil);
124 EXPECT_EQ(actual.depthMask, m_restoreState.depthMask);
125 EXPECT_EQ(actual.stencilMask, m_restoreState.stencilMask);
126 EXPECT_EQ(actual.packAlignment, m_restoreState.packAlignment);
127 EXPECT_EQ(actual.activeTexture2DBinding,
128 m_restoreState.activeTexture2DBinding);
129 EXPECT_EQ(actual.renderbufferBinding, m_restoreState.renderbufferBinding);
130 EXPECT_EQ(actual.drawFramebufferBinding,
131 m_restoreState.drawFramebufferBinding);
132 EXPECT_EQ(actual.readFramebufferBinding,
133 m_restoreState.readFramebufferBinding);
134 EXPECT_EQ(actual.pixelUnpackBufferBinding,
135 m_restoreState.pixelUnpackBufferBinding);
136 }
137
66 GLES2InterfaceForTests* m_gl; 138 GLES2InterfaceForTests* m_gl;
67 RefPtr<DrawingBufferForTests> m_drawingBuffer; 139 RefPtr<DrawingBufferForTests> m_drawingBuffer;
140 DrawingBufferRestoreState m_restoreState;
68 }; 141 };
69 142
70 TEST_F(DrawingBufferTest, verifyResizingProperlyAffectsMailboxes) { 143 TEST_F(DrawingBufferTest, verifyResizingProperlyAffectsMailboxes) {
144 VerifyStateWasRestored();
71 cc::TextureMailbox textureMailbox; 145 cc::TextureMailbox textureMailbox;
72 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; 146 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback;
73 147
74 IntSize initialSize(InitialWidth, InitialHeight); 148 IntSize initialSize(InitialWidth, InitialHeight);
75 IntSize alternateSize(InitialWidth, AlternateHeight); 149 IntSize alternateSize(InitialWidth, AlternateHeight);
76 150
77 // Produce one mailbox at size 100x100. 151 // Produce one mailbox at size 100x100.
78 m_drawingBuffer->markContentsChanged(); 152 m_drawingBuffer->markContentsChanged();
79 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, 153 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox,
80 &releaseCallback)); 154 &releaseCallback));
155 VerifyStateWasRestored();
81 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); 156 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize());
82 157
83 // Resize to 100x50. 158 // Resize to 100x50.
84 m_drawingBuffer->reset(alternateSize); 159 m_drawingBuffer->resize(alternateSize);
160 VerifyStateWasRestored();
85 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); 161 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */);
162 VerifyStateWasRestored();
86 163
87 // Produce a mailbox at this size. 164 // Produce a mailbox at this size.
88 m_drawingBuffer->markContentsChanged(); 165 m_drawingBuffer->markContentsChanged();
89 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, 166 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox,
90 &releaseCallback)); 167 &releaseCallback));
91 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize()); 168 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize());
169 VerifyStateWasRestored();
92 170
93 // Reset to initial size. 171 // Reset to initial size.
94 m_drawingBuffer->reset(initialSize); 172 m_drawingBuffer->resize(initialSize);
173 VerifyStateWasRestored();
95 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); 174 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */);
175 VerifyStateWasRestored();
96 176
97 // Prepare another mailbox and verify that it's the correct size. 177 // Prepare another mailbox and verify that it's the correct size.
98 m_drawingBuffer->markContentsChanged(); 178 m_drawingBuffer->markContentsChanged();
99 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, 179 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox,
100 &releaseCallback)); 180 &releaseCallback));
101 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); 181 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize());
182 VerifyStateWasRestored();
102 183
103 // Prepare one final mailbox and verify that it's the correct size. 184 // Prepare one final mailbox and verify that it's the correct size.
104 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); 185 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */);
105 m_drawingBuffer->markContentsChanged(); 186 m_drawingBuffer->markContentsChanged();
106 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, 187 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox,
107 &releaseCallback)); 188 &releaseCallback));
189 VerifyStateWasRestored();
108 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); 190 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize());
109 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); 191 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */);
110 m_drawingBuffer->beginDestruction(); 192 m_drawingBuffer->beginDestruction();
111 } 193 }
112 194
113 TEST_F(DrawingBufferTest, verifyDestructionCompleteAfterAllMailboxesReleased) { 195 TEST_F(DrawingBufferTest, verifyDestructionCompleteAfterAllMailboxesReleased) {
114 bool live = true; 196 bool live = true;
115 m_drawingBuffer->m_live = &live; 197 m_drawingBuffer->m_live = &live;
116 198
117 cc::TextureMailbox textureMailbox1; 199 cc::TextureMailbox textureMailbox1;
118 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1; 200 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1;
119 cc::TextureMailbox textureMailbox2; 201 cc::TextureMailbox textureMailbox2;
120 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2; 202 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2;
121 cc::TextureMailbox textureMailbox3; 203 cc::TextureMailbox textureMailbox3;
122 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3; 204 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3;
123 205
124 IntSize initialSize(InitialWidth, InitialHeight); 206 IntSize initialSize(InitialWidth, InitialHeight);
125 207
126 // Produce mailboxes. 208 // Produce mailboxes.
127 m_drawingBuffer->markContentsChanged(); 209 m_drawingBuffer->markContentsChanged();
210 m_drawingBuffer->clearFramebuffers(GL_STENCIL_BUFFER_BIT);
211 VerifyStateWasRestored();
128 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1, 212 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1,
129 &releaseCallback1)); 213 &releaseCallback1));
130 m_drawingBuffer->markContentsChanged(); 214 m_drawingBuffer->markContentsChanged();
215 m_drawingBuffer->clearFramebuffers(GL_DEPTH_BUFFER_BIT);
216 VerifyStateWasRestored();
131 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2, 217 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2,
132 &releaseCallback2)); 218 &releaseCallback2));
133 m_drawingBuffer->markContentsChanged(); 219 m_drawingBuffer->markContentsChanged();
220 m_drawingBuffer->clearFramebuffers(GL_COLOR_BUFFER_BIT);
221 VerifyStateWasRestored();
134 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3, 222 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3,
135 &releaseCallback3)); 223 &releaseCallback3));
136 224
137 m_drawingBuffer->markContentsChanged(); 225 m_drawingBuffer->markContentsChanged();
138 releaseCallback1->Run(gpu::SyncToken(), false /* lostResource */); 226 releaseCallback1->Run(gpu::SyncToken(), false /* lostResource */);
139 227
140 m_drawingBuffer->beginDestruction(); 228 m_drawingBuffer->beginDestruction();
141 ASSERT_EQ(live, true); 229 ASSERT_EQ(live, true);
142 230
143 DrawingBufferForTests* rawPointer = m_drawingBuffer.get(); 231 DrawingBufferForTests* rawPointer = m_drawingBuffer.get();
(...skipping 16 matching lines...) Expand all
160 cc::TextureMailbox textureMailbox1; 248 cc::TextureMailbox textureMailbox1;
161 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1; 249 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1;
162 cc::TextureMailbox textureMailbox2; 250 cc::TextureMailbox textureMailbox2;
163 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2; 251 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2;
164 cc::TextureMailbox textureMailbox3; 252 cc::TextureMailbox textureMailbox3;
165 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3; 253 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3;
166 254
167 m_drawingBuffer->markContentsChanged(); 255 m_drawingBuffer->markContentsChanged();
168 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1, 256 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1,
169 &releaseCallback1)); 257 &releaseCallback1));
258 VerifyStateWasRestored();
170 m_drawingBuffer->markContentsChanged(); 259 m_drawingBuffer->markContentsChanged();
171 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2, 260 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2,
172 &releaseCallback2)); 261 &releaseCallback2));
262 VerifyStateWasRestored();
173 m_drawingBuffer->markContentsChanged(); 263 m_drawingBuffer->markContentsChanged();
174 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3, 264 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3,
175 &releaseCallback3)); 265 &releaseCallback3));
266 VerifyStateWasRestored();
176 267
177 m_drawingBuffer->markContentsChanged(); 268 m_drawingBuffer->markContentsChanged();
178 releaseCallback1->Run(gpu::SyncToken(), true /* lostResource */); 269 releaseCallback1->Run(gpu::SyncToken(), true /* lostResource */);
179 EXPECT_EQ(live, true); 270 EXPECT_EQ(live, true);
180 271
181 m_drawingBuffer->beginDestruction(); 272 m_drawingBuffer->beginDestruction();
182 EXPECT_EQ(live, true); 273 EXPECT_EQ(live, true);
183 274
184 m_drawingBuffer->markContentsChanged(); 275 m_drawingBuffer->markContentsChanged();
185 releaseCallback2->Run(gpu::SyncToken(), false /* lostResource */); 276 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()); 371 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken());
281 } 372 }
282 373
283 class DrawingBufferImageChromiumTest : public DrawingBufferTest { 374 class DrawingBufferImageChromiumTest : public DrawingBufferTest {
284 protected: 375 protected:
285 void SetUp() override { 376 void SetUp() override {
286 IntSize initialSize(InitialWidth, InitialHeight); 377 IntSize initialSize(InitialWidth, InitialHeight);
287 std::unique_ptr<GLES2InterfaceForTests> gl = 378 std::unique_ptr<GLES2InterfaceForTests> gl =
288 wrapUnique(new GLES2InterfaceForTests); 379 wrapUnique(new GLES2InterfaceForTests);
289 m_gl = gl.get(); 380 m_gl = gl.get();
381 InitializeRestoreState();
382 SetRestoreState();
290 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider = 383 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider =
291 wrapUnique(new WebGraphicsContext3DProviderForTests(std::move(gl))); 384 wrapUnique(new WebGraphicsContext3DProviderForTests(std::move(gl)));
292 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(true); 385 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(true);
293 m_imageId0 = m_gl->nextImageIdToBeCreated(); 386 m_imageId0 = m_gl->nextImageIdToBeCreated();
294 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId0)).Times(1); 387 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId0)).Times(1);
295 m_drawingBuffer = DrawingBufferForTests::create( 388 m_drawingBuffer = DrawingBufferForTests::create(
296 std::move(provider), initialSize, DrawingBuffer::Preserve); 389 std::move(provider), this, initialSize, DrawingBuffer::Preserve);
297 CHECK(m_drawingBuffer); 390 CHECK(m_drawingBuffer);
298 testing::Mock::VerifyAndClearExpectations(m_gl); 391 testing::Mock::VerifyAndClearExpectations(m_gl);
299 } 392 }
300 393
301 void TearDown() override { 394 void TearDown() override {
302 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(false); 395 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(false);
303 } 396 }
304 397
305 GLuint m_imageId0; 398 GLuint m_imageId0;
306 }; 399 };
307 400
308 TEST_F(DrawingBufferImageChromiumTest, verifyResizingReallocatesImages) { 401 TEST_F(DrawingBufferImageChromiumTest, verifyResizingReallocatesImages) {
309 cc::TextureMailbox textureMailbox; 402 cc::TextureMailbox textureMailbox;
310 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; 403 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback;
311 404
312 IntSize initialSize(InitialWidth, InitialHeight); 405 IntSize initialSize(InitialWidth, InitialHeight);
313 IntSize alternateSize(InitialWidth, AlternateHeight); 406 IntSize alternateSize(InitialWidth, AlternateHeight);
314 407
315 GLuint m_imageId1 = m_gl->nextImageIdToBeCreated(); 408 GLuint m_imageId1 = m_gl->nextImageIdToBeCreated();
316 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId1)).Times(1); 409 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId1)).Times(1);
317 // Produce one mailbox at size 100x100. 410 // Produce one mailbox at size 100x100.
318 m_drawingBuffer->markContentsChanged(); 411 m_drawingBuffer->markContentsChanged();
319 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, 412 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox,
320 &releaseCallback)); 413 &releaseCallback));
321 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); 414 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize());
322 EXPECT_TRUE(textureMailbox.is_overlay_candidate()); 415 EXPECT_TRUE(textureMailbox.is_overlay_candidate());
323 testing::Mock::VerifyAndClearExpectations(m_gl); 416 testing::Mock::VerifyAndClearExpectations(m_gl);
417 VerifyStateWasRestored();
324 418
325 GLuint m_imageId2 = m_gl->nextImageIdToBeCreated(); 419 GLuint m_imageId2 = m_gl->nextImageIdToBeCreated();
326 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId2)).Times(1); 420 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId2)).Times(1);
327 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId0)).Times(1); 421 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId0)).Times(1);
328 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId0)).Times(1); 422 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId0)).Times(1);
329 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId1)).Times(1); 423 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId1)).Times(1);
330 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId1)).Times(1); 424 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId1)).Times(1);
331 // Resize to 100x50. 425 // Resize to 100x50.
332 m_drawingBuffer->reset(alternateSize); 426 m_drawingBuffer->resize(alternateSize);
427 VerifyStateWasRestored();
333 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); 428 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */);
429 VerifyStateWasRestored();
334 testing::Mock::VerifyAndClearExpectations(m_gl); 430 testing::Mock::VerifyAndClearExpectations(m_gl);
335 431
336 GLuint m_imageId3 = m_gl->nextImageIdToBeCreated(); 432 GLuint m_imageId3 = m_gl->nextImageIdToBeCreated();
337 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId3)).Times(1); 433 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId3)).Times(1);
338 // Produce a mailbox at this size. 434 // Produce a mailbox at this size.
339 m_drawingBuffer->markContentsChanged(); 435 m_drawingBuffer->markContentsChanged();
340 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, 436 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox,
341 &releaseCallback)); 437 &releaseCallback));
342 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize()); 438 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize());
343 EXPECT_TRUE(textureMailbox.is_overlay_candidate()); 439 EXPECT_TRUE(textureMailbox.is_overlay_candidate());
344 testing::Mock::VerifyAndClearExpectations(m_gl); 440 testing::Mock::VerifyAndClearExpectations(m_gl);
345 441
346 GLuint m_imageId4 = m_gl->nextImageIdToBeCreated(); 442 GLuint m_imageId4 = m_gl->nextImageIdToBeCreated();
347 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId4)).Times(1); 443 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId4)).Times(1);
348 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId2)).Times(1); 444 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId2)).Times(1);
349 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId2)).Times(1); 445 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId2)).Times(1);
350 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId3)).Times(1); 446 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId3)).Times(1);
351 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId3)).Times(1); 447 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId3)).Times(1);
352 // Reset to initial size. 448 // Reset to initial size.
353 m_drawingBuffer->reset(initialSize); 449 m_drawingBuffer->resize(initialSize);
450 VerifyStateWasRestored();
354 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); 451 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */);
452 VerifyStateWasRestored();
355 testing::Mock::VerifyAndClearExpectations(m_gl); 453 testing::Mock::VerifyAndClearExpectations(m_gl);
356 454
357 GLuint m_imageId5 = m_gl->nextImageIdToBeCreated(); 455 GLuint m_imageId5 = m_gl->nextImageIdToBeCreated();
358 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId5)).Times(1); 456 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId5)).Times(1);
359 // Prepare another mailbox and verify that it's the correct size. 457 // Prepare another mailbox and verify that it's the correct size.
360 m_drawingBuffer->markContentsChanged(); 458 m_drawingBuffer->markContentsChanged();
361 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, 459 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox,
362 &releaseCallback)); 460 &releaseCallback));
363 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); 461 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize());
364 EXPECT_TRUE(textureMailbox.is_overlay_candidate()); 462 EXPECT_TRUE(textureMailbox.is_overlay_candidate());
(...skipping 26 matching lines...) Expand all
391 489
392 // Request a mailbox. An image should already be created. Everything works 490 // Request a mailbox. An image should already be created. Everything works
393 // as expected. 491 // as expected.
394 EXPECT_CALL(*m_gl, BindTexImage2DMock(_)).Times(1); 492 EXPECT_CALL(*m_gl, BindTexImage2DMock(_)).Times(1);
395 IntSize initialSize(InitialWidth, InitialHeight); 493 IntSize initialSize(InitialWidth, InitialHeight);
396 m_drawingBuffer->markContentsChanged(); 494 m_drawingBuffer->markContentsChanged();
397 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1, 495 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1,
398 &releaseCallback1)); 496 &releaseCallback1));
399 EXPECT_TRUE(textureMailbox1.is_overlay_candidate()); 497 EXPECT_TRUE(textureMailbox1.is_overlay_candidate());
400 testing::Mock::VerifyAndClearExpectations(m_gl); 498 testing::Mock::VerifyAndClearExpectations(m_gl);
499 VerifyStateWasRestored();
401 500
402 // Force image CHROMIUM creation failure. Request another mailbox. It should 501 // Force image CHROMIUM creation failure. Request another mailbox. It should
403 // still be provided, but this time with allowOverlay = false. 502 // still be provided, but this time with allowOverlay = false.
404 m_gl->setCreateImageChromiumFail(true); 503 m_gl->setCreateImageChromiumFail(true);
405 m_drawingBuffer->markContentsChanged(); 504 m_drawingBuffer->markContentsChanged();
406 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2, 505 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2,
407 &releaseCallback2)); 506 &releaseCallback2));
408 EXPECT_FALSE(textureMailbox2.is_overlay_candidate()); 507 EXPECT_FALSE(textureMailbox2.is_overlay_candidate());
508 VerifyStateWasRestored();
409 509
410 // Check that if image CHROMIUM starts working again, mailboxes are 510 // Check that if image CHROMIUM starts working again, mailboxes are
411 // correctly created with allowOverlay = true. 511 // correctly created with allowOverlay = true.
412 EXPECT_CALL(*m_gl, BindTexImage2DMock(_)).Times(1); 512 EXPECT_CALL(*m_gl, BindTexImage2DMock(_)).Times(1);
413 m_gl->setCreateImageChromiumFail(false); 513 m_gl->setCreateImageChromiumFail(false);
414 m_drawingBuffer->markContentsChanged(); 514 m_drawingBuffer->markContentsChanged();
415 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3, 515 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3,
416 &releaseCallback3)); 516 &releaseCallback3));
417 EXPECT_TRUE(textureMailbox3.is_overlay_candidate()); 517 EXPECT_TRUE(textureMailbox3.is_overlay_candidate());
418 testing::Mock::VerifyAndClearExpectations(m_gl); 518 testing::Mock::VerifyAndClearExpectations(m_gl);
519 VerifyStateWasRestored();
419 520
420 releaseCallback1->Run(gpu::SyncToken(), false /* lostResource */); 521 releaseCallback1->Run(gpu::SyncToken(), false /* lostResource */);
421 releaseCallback2->Run(gpu::SyncToken(), false /* lostResource */); 522 releaseCallback2->Run(gpu::SyncToken(), false /* lostResource */);
422 releaseCallback3->Run(gpu::SyncToken(), false /* lostResource */); 523 releaseCallback3->Run(gpu::SyncToken(), false /* lostResource */);
423 524
424 EXPECT_CALL(*m_gl, DestroyImageMock(_)).Times(3); 525 EXPECT_CALL(*m_gl, DestroyImageMock(_)).Times(3);
425 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(_)).Times(3); 526 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(_)).Times(3);
426 m_drawingBuffer->beginDestruction(); 527 m_drawingBuffer->beginDestruction();
427 testing::Mock::VerifyAndClearExpectations(m_gl); 528 testing::Mock::VerifyAndClearExpectations(m_gl);
428 } 529 }
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
525 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider = 626 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider =
526 wrapUnique(new WebGraphicsContext3DProviderForTests(std::move(gl))); 627 wrapUnique(new WebGraphicsContext3DProviderForTests(std::move(gl)));
527 DrawingBuffer::PreserveDrawingBuffer preserve = DrawingBuffer::Preserve; 628 DrawingBuffer::PreserveDrawingBuffer preserve = DrawingBuffer::Preserve;
528 629
529 bool premultipliedAlpha = false; 630 bool premultipliedAlpha = false;
530 bool wantAlphaChannel = true; 631 bool wantAlphaChannel = true;
531 bool wantDepthBuffer = cases[i].requestDepth; 632 bool wantDepthBuffer = cases[i].requestDepth;
532 bool wantStencilBuffer = cases[i].requestStencil; 633 bool wantStencilBuffer = cases[i].requestStencil;
533 bool wantAntialiasing = false; 634 bool wantAntialiasing = false;
534 RefPtr<DrawingBuffer> drawingBuffer = DrawingBuffer::create( 635 RefPtr<DrawingBuffer> drawingBuffer = DrawingBuffer::create(
535 std::move(provider), IntSize(10, 10), premultipliedAlpha, 636 std::move(provider), nullptr, IntSize(10, 10), premultipliedAlpha,
536 wantAlphaChannel, wantDepthBuffer, wantStencilBuffer, wantAntialiasing, 637 wantAlphaChannel, wantDepthBuffer, wantStencilBuffer, wantAntialiasing,
537 preserve, DrawingBuffer::WebGL1, DrawingBuffer::AllowChromiumImage); 638 preserve, DrawingBuffer::WebGL1, DrawingBuffer::AllowChromiumImage);
538 639
539 // When we request a depth or a stencil buffer, we will get both. 640 // When we request a depth or a stencil buffer, we will get both.
540 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil, 641 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil,
541 drawingBuffer->hasDepthBuffer()); 642 drawingBuffer->hasDepthBuffer());
542 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil, 643 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil,
543 drawingBuffer->hasStencilBuffer()); 644 drawingBuffer->hasStencilBuffer());
544 EXPECT_EQ(cases[i].expectedRenderBuffers, 645 EXPECT_EQ(cases[i].expectedRenderBuffers,
545 trackingGL->numAllocatedRenderBuffer()); 646 trackingGL->numAllocatedRenderBuffer());
546 if (cases[i].requestDepth || cases[i].requestStencil) { 647 if (cases[i].requestDepth || cases[i].requestStencil) {
547 EXPECT_NE(0u, trackingGL->depthStencilAttachment()); 648 EXPECT_NE(0u, trackingGL->depthStencilAttachment());
548 EXPECT_EQ(0u, trackingGL->depthAttachment()); 649 EXPECT_EQ(0u, trackingGL->depthAttachment());
549 EXPECT_EQ(0u, trackingGL->stencilAttachment()); 650 EXPECT_EQ(0u, trackingGL->stencilAttachment());
550 } else { 651 } else {
551 EXPECT_EQ(0u, trackingGL->depthStencilAttachment()); 652 EXPECT_EQ(0u, trackingGL->depthStencilAttachment());
552 EXPECT_EQ(0u, trackingGL->depthAttachment()); 653 EXPECT_EQ(0u, trackingGL->depthAttachment());
553 EXPECT_EQ(0u, trackingGL->stencilAttachment()); 654 EXPECT_EQ(0u, trackingGL->stencilAttachment());
554 } 655 }
555 656
556 drawingBuffer->reset(IntSize(10, 20)); 657 drawingBuffer->resize(IntSize(10, 20));
557 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil, 658 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil,
558 drawingBuffer->hasDepthBuffer()); 659 drawingBuffer->hasDepthBuffer());
559 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil, 660 EXPECT_EQ(cases[i].requestDepth || cases[i].requestStencil,
560 drawingBuffer->hasStencilBuffer()); 661 drawingBuffer->hasStencilBuffer());
561 EXPECT_EQ(cases[i].expectedRenderBuffers, 662 EXPECT_EQ(cases[i].expectedRenderBuffers,
562 trackingGL->numAllocatedRenderBuffer()); 663 trackingGL->numAllocatedRenderBuffer());
563 if (cases[i].requestDepth || cases[i].requestStencil) { 664 if (cases[i].requestDepth || cases[i].requestStencil) {
564 EXPECT_NE(0u, trackingGL->depthStencilAttachment()); 665 EXPECT_NE(0u, trackingGL->depthStencilAttachment());
565 EXPECT_EQ(0u, trackingGL->depthAttachment()); 666 EXPECT_EQ(0u, trackingGL->depthAttachment());
566 EXPECT_EQ(0u, trackingGL->stencilAttachment()); 667 EXPECT_EQ(0u, trackingGL->stencilAttachment());
(...skipping 22 matching lines...) Expand all
589 m_drawingBuffer->setIsHidden(true); 690 m_drawingBuffer->setIsHidden(true);
590 releaseCallback->Run(waitSyncToken, false /* lostResource */); 691 releaseCallback->Run(waitSyncToken, false /* lostResource */);
591 // m_drawingBuffer deletes mailbox immediately when hidden. 692 // m_drawingBuffer deletes mailbox immediately when hidden.
592 693
593 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken()); 694 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken());
594 695
595 m_drawingBuffer->beginDestruction(); 696 m_drawingBuffer->beginDestruction();
596 } 697 }
597 698
598 } // namespace blink 699 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698