| OLD | NEW |
| 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 12 matching lines...) Expand all Loading... |
| 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "platform/graphics/gpu/DrawingBuffer.h" | 31 #include "platform/graphics/gpu/DrawingBuffer.h" |
| 32 | 32 |
| 33 #include "cc/resources/single_release_callback.h" |
| 34 #include "cc/resources/texture_mailbox.h" |
| 33 #include "gpu/command_buffer/client/gles2_interface_stub.h" | 35 #include "gpu/command_buffer/client/gles2_interface_stub.h" |
| 34 #include "gpu/command_buffer/common/capabilities.h" | 36 #include "gpu/command_buffer/common/capabilities.h" |
| 37 #include "gpu/command_buffer/common/mailbox.h" |
| 38 #include "gpu/command_buffer/common/sync_token.h" |
| 35 #include "platform/RuntimeEnabledFeatures.h" | 39 #include "platform/RuntimeEnabledFeatures.h" |
| 36 #include "platform/graphics/ImageBuffer.h" | 40 #include "platform/graphics/ImageBuffer.h" |
| 37 #include "platform/graphics/UnacceleratedImageBufferSurface.h" | 41 #include "platform/graphics/UnacceleratedImageBufferSurface.h" |
| 38 #include "platform/graphics/gpu/Extensions3DUtil.h" | 42 #include "platform/graphics/gpu/Extensions3DUtil.h" |
| 39 #include "public/platform/Platform.h" | 43 #include "public/platform/Platform.h" |
| 40 #include "public/platform/WebExternalTextureMailbox.h" | |
| 41 #include "public/platform/WebGraphicsContext3DProvider.h" | 44 #include "public/platform/WebGraphicsContext3DProvider.h" |
| 42 #include "public/platform/functional/WebFunction.h" | 45 #include "public/platform/functional/WebFunction.h" |
| 43 #include "testing/gmock/include/gmock/gmock.h" | 46 #include "testing/gmock/include/gmock/gmock.h" |
| 44 #include "testing/gtest/include/gtest/gtest.h" | 47 #include "testing/gtest/include/gtest/gtest.h" |
| 45 #include "wtf/PtrUtil.h" | 48 #include "wtf/PtrUtil.h" |
| 46 #include "wtf/RefPtr.h" | 49 #include "wtf/RefPtr.h" |
| 47 #include <memory> | 50 #include <memory> |
| 48 | 51 |
| 49 using testing::Test; | 52 using testing::Test; |
| 50 using testing::_; | 53 using testing::_; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 | 107 |
| 105 void GetIntegerv(GLenum pname, GLint* value) override | 108 void GetIntegerv(GLenum pname, GLint* value) override |
| 106 { | 109 { |
| 107 if (pname == GL_MAX_TEXTURE_SIZE) | 110 if (pname == GL_MAX_TEXTURE_SIZE) |
| 108 *value = 1024; | 111 *value = 1024; |
| 109 } | 112 } |
| 110 | 113 |
| 111 void GenMailboxCHROMIUM(GLbyte* mailbox) override | 114 void GenMailboxCHROMIUM(GLbyte* mailbox) override |
| 112 { | 115 { |
| 113 ++m_currentMailboxByte; | 116 ++m_currentMailboxByte; |
| 114 WebExternalTextureMailbox temp; | 117 memset(mailbox, m_currentMailboxByte, GL_MAILBOX_SIZE_CHROMIUM); |
| 115 memset(mailbox, m_currentMailboxByte, sizeof(temp.name)); | |
| 116 } | 118 } |
| 117 | 119 |
| 118 void ProduceTextureDirectCHROMIUM(GLuint texture, GLenum target, const GLbyt
e* mailbox) override | 120 void ProduceTextureDirectCHROMIUM(GLuint texture, GLenum target, const GLbyt
e* mailbox) override |
| 119 { | 121 { |
| 120 ASSERT_EQ(target, drawingBufferTextureTarget()); | 122 ASSERT_EQ(target, drawingBufferTextureTarget()); |
| 121 | 123 |
| 122 if (!m_createImageChromiumFail) { | 124 if (!m_createImageChromiumFail) { |
| 123 ASSERT_TRUE(m_textureSizes.contains(texture)); | 125 ASSERT_TRUE(m_textureSizes.contains(texture)); |
| 124 m_mostRecentlyProducedSize = m_textureSizes.get(texture); | 126 m_mostRecentlyProducedSize = m_textureSizes.get(texture); |
| 125 } | 127 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 { | 167 { |
| 166 if (target == imageCHROMIUMTextureTarget()) { | 168 if (target == imageCHROMIUMTextureTarget()) { |
| 167 m_imageSizes.set(m_currentImageId, IntSize()); | 169 m_imageSizes.set(m_currentImageId, IntSize()); |
| 168 m_imageToTextureMap.remove(imageId); | 170 m_imageToTextureMap.remove(imageId); |
| 169 ReleaseTexImage2DMock(imageId); | 171 ReleaseTexImage2DMock(imageId); |
| 170 } | 172 } |
| 171 } | 173 } |
| 172 | 174 |
| 173 void GenSyncTokenCHROMIUM(GLuint64 fenceSync, GLbyte* syncToken) override | 175 void GenSyncTokenCHROMIUM(GLuint64 fenceSync, GLbyte* syncToken) override |
| 174 { | 176 { |
| 175 memcpy(syncToken, &fenceSync, sizeof(fenceSync)); | 177 static uint64_t uniqueId = 1; |
| 178 gpu::SyncToken source(gpu::GPU_IO, 1, gpu::CommandBufferId::FromUnsafeVa
lue(uniqueId++), 2); |
| 179 memcpy(syncToken, &source, sizeof(source)); |
| 176 } | 180 } |
| 177 | 181 |
| 178 void GenTextures(GLsizei n, GLuint* textures) override | 182 void GenTextures(GLsizei n, GLuint* textures) override |
| 179 { | 183 { |
| 180 static GLuint id = 1; | 184 static GLuint id = 1; |
| 181 for (GLsizei i = 0; i < n; ++i) | 185 for (GLsizei i = 0; i < n; ++i) |
| 182 textures[i] = id++; | 186 textures[i] = id++; |
| 183 } | 187 } |
| 184 | 188 |
| 185 GLuint boundTexture() const { return m_boundTexture; } | 189 GLuint boundTexture() const { return m_boundTexture; } |
| 186 GLuint boundTextureTarget() const { return m_boundTextureTarget; } | 190 GLuint boundTextureTarget() const { return m_boundTextureTarget; } |
| 187 GLuint mostRecentlyWaitedSyncToken() const { return m_mostRecentlyWaitedSync
Token; } | 191 gpu::SyncToken mostRecentlyWaitedSyncToken() const { return m_mostRecentlyWa
itedSyncToken; } |
| 188 GLuint nextImageIdToBeCreated() const { return m_currentImageId; } | 192 GLuint nextImageIdToBeCreated() const { return m_currentImageId; } |
| 189 IntSize mostRecentlyProducedSize() const { return m_mostRecentlyProducedSize
; } | 193 IntSize mostRecentlyProducedSize() const { return m_mostRecentlyProducedSize
; } |
| 190 | 194 |
| 191 void setCreateImageChromiumFail(bool fail) { m_createImageChromiumFail = fai
l; } | 195 void setCreateImageChromiumFail(bool fail) { m_createImageChromiumFail = fai
l; } |
| 192 | 196 |
| 193 private: | 197 private: |
| 194 GLuint m_boundTexture = 0; | 198 GLuint m_boundTexture = 0; |
| 195 GLuint m_boundTextureTarget = 0; | 199 GLuint m_boundTextureTarget = 0; |
| 196 GLuint m_mostRecentlyWaitedSyncToken = 0; | 200 gpu::SyncToken m_mostRecentlyWaitedSyncToken; |
| 197 GLbyte m_currentMailboxByte = 0; | 201 GLbyte m_currentMailboxByte = 0; |
| 198 IntSize m_mostRecentlyProducedSize; | 202 IntSize m_mostRecentlyProducedSize; |
| 199 bool m_createImageChromiumFail = false; | 203 bool m_createImageChromiumFail = false; |
| 200 GLuint m_currentImageId = 1; | 204 GLuint m_currentImageId = 1; |
| 201 HashMap<GLuint, IntSize> m_textureSizes; | 205 HashMap<GLuint, IntSize> m_textureSizes; |
| 202 HashMap<GLuint, IntSize> m_imageSizes; | 206 HashMap<GLuint, IntSize> m_imageSizes; |
| 203 HashMap<GLuint, GLuint> m_imageToTextureMap; | 207 HashMap<GLuint, GLuint> m_imageToTextureMap; |
| 204 }; | 208 }; |
| 205 | 209 |
| 206 static const int initialWidth = 100; | 210 static const int initialWidth = 100; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 m_drawingBuffer = DrawingBufferForTests::create(std::move(provider), Int
Size(initialWidth, initialHeight), DrawingBuffer::Preserve); | 273 m_drawingBuffer = DrawingBufferForTests::create(std::move(provider), Int
Size(initialWidth, initialHeight), DrawingBuffer::Preserve); |
| 270 CHECK(m_drawingBuffer); | 274 CHECK(m_drawingBuffer); |
| 271 } | 275 } |
| 272 | 276 |
| 273 GLES2InterfaceForTests* m_gl; | 277 GLES2InterfaceForTests* m_gl; |
| 274 RefPtr<DrawingBufferForTests> m_drawingBuffer; | 278 RefPtr<DrawingBufferForTests> m_drawingBuffer; |
| 275 }; | 279 }; |
| 276 | 280 |
| 277 TEST_F(DrawingBufferTest, verifyResizingProperlyAffectsMailboxes) | 281 TEST_F(DrawingBufferTest, verifyResizingProperlyAffectsMailboxes) |
| 278 { | 282 { |
| 279 WebExternalTextureMailbox mailbox; | 283 cc::TextureMailbox textureMailbox; |
| 284 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; |
| 285 bool useSharedMemory = false; |
| 280 | 286 |
| 281 IntSize initialSize(initialWidth, initialHeight); | 287 IntSize initialSize(initialWidth, initialHeight); |
| 282 IntSize alternateSize(initialWidth, alternateHeight); | 288 IntSize alternateSize(initialWidth, alternateHeight); |
| 283 | 289 |
| 284 // Produce one mailbox at size 100x100. | 290 // Produce one mailbox at size 100x100. |
| 285 m_drawingBuffer->markContentsChanged(); | 291 m_drawingBuffer->markContentsChanged(); |
| 286 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); | 292 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release
Callback, useSharedMemory)); |
| 287 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); | 293 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); |
| 288 | 294 |
| 289 // Resize to 100x50. | 295 // Resize to 100x50. |
| 290 m_drawingBuffer->reset(IntSize(initialWidth, alternateHeight)); | 296 m_drawingBuffer->reset(IntSize(initialWidth, alternateHeight)); |
| 291 m_drawingBuffer->mailboxReleased(mailbox, false); | 297 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); |
| 292 | 298 |
| 293 // Produce a mailbox at this size. | 299 // Produce a mailbox at this size. |
| 294 m_drawingBuffer->markContentsChanged(); | 300 m_drawingBuffer->markContentsChanged(); |
| 295 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); | 301 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release
Callback, useSharedMemory)); |
| 296 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize()); | 302 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize()); |
| 297 | 303 |
| 298 // Reset to initial size. | 304 // Reset to initial size. |
| 299 m_drawingBuffer->reset(IntSize(initialWidth, initialHeight)); | 305 m_drawingBuffer->reset(IntSize(initialWidth, initialHeight)); |
| 300 m_drawingBuffer->mailboxReleased(mailbox, false); | 306 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); |
| 301 | 307 |
| 302 // Prepare another mailbox and verify that it's the correct size. | 308 // Prepare another mailbox and verify that it's the correct size. |
| 303 m_drawingBuffer->markContentsChanged(); | 309 m_drawingBuffer->markContentsChanged(); |
| 304 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); | 310 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release
Callback, useSharedMemory)); |
| 305 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); | 311 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); |
| 306 | 312 |
| 307 // Prepare one final mailbox and verify that it's the correct size. | 313 // Prepare one final mailbox and verify that it's the correct size. |
| 308 m_drawingBuffer->mailboxReleased(mailbox, false); | 314 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); |
| 309 m_drawingBuffer->markContentsChanged(); | 315 m_drawingBuffer->markContentsChanged(); |
| 310 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); | 316 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release
Callback, useSharedMemory)); |
| 311 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); | 317 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); |
| 312 m_drawingBuffer->mailboxReleased(mailbox, false); | 318 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); |
| 313 m_drawingBuffer->beginDestruction(); | 319 m_drawingBuffer->beginDestruction(); |
| 314 } | 320 } |
| 315 | 321 |
| 316 TEST_F(DrawingBufferTest, verifyDestructionCompleteAfterAllMailboxesReleased) | 322 TEST_F(DrawingBufferTest, verifyDestructionCompleteAfterAllMailboxesReleased) |
| 317 { | 323 { |
| 318 bool live = true; | 324 bool live = true; |
| 319 m_drawingBuffer->m_live = &live; | 325 m_drawingBuffer->m_live = &live; |
| 320 | 326 |
| 321 WebExternalTextureMailbox mailbox1; | 327 cc::TextureMailbox textureMailbox1; |
| 322 WebExternalTextureMailbox mailbox2; | 328 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1; |
| 323 WebExternalTextureMailbox mailbox3; | 329 cc::TextureMailbox textureMailbox2; |
| 330 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2; |
| 331 cc::TextureMailbox textureMailbox3; |
| 332 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3; |
| 333 bool useSharedMemory = false; |
| 324 | 334 |
| 325 IntSize initialSize(initialWidth, initialHeight); | 335 IntSize initialSize(initialWidth, initialHeight); |
| 326 | 336 |
| 327 // Produce mailboxes. | 337 // Produce mailboxes. |
| 328 m_drawingBuffer->markContentsChanged(); | 338 m_drawingBuffer->markContentsChanged(); |
| 329 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox1, 0)); | 339 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1, &releas
eCallback1, useSharedMemory)); |
| 330 m_drawingBuffer->markContentsChanged(); | 340 m_drawingBuffer->markContentsChanged(); |
| 331 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox2, 0)); | 341 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2, &releas
eCallback2, useSharedMemory)); |
| 332 m_drawingBuffer->markContentsChanged(); | 342 m_drawingBuffer->markContentsChanged(); |
| 333 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox3, 0)); | 343 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3, &releas
eCallback3, useSharedMemory)); |
| 334 | 344 |
| 335 m_drawingBuffer->markContentsChanged(); | 345 m_drawingBuffer->markContentsChanged(); |
| 336 m_drawingBuffer->mailboxReleased(mailbox1, false); | 346 releaseCallback1->Run(gpu::SyncToken(), false /* lostResource */); |
| 337 | 347 |
| 338 m_drawingBuffer->beginDestruction(); | 348 m_drawingBuffer->beginDestruction(); |
| 339 EXPECT_EQ(live, true); | 349 ASSERT_EQ(live, true); |
| 340 | 350 |
| 341 DrawingBufferForTests* weakPointer = m_drawingBuffer.get(); | 351 DrawingBufferForTests* rawPointer = m_drawingBuffer.get(); |
| 342 m_drawingBuffer.clear(); | 352 m_drawingBuffer.clear(); |
| 343 EXPECT_EQ(live, true); | 353 ASSERT_EQ(live, true); |
| 344 | 354 |
| 345 weakPointer->markContentsChanged(); | 355 rawPointer->markContentsChanged(); |
| 346 weakPointer->mailboxReleased(mailbox2, false); | 356 releaseCallback2->Run(gpu::SyncToken(), false /* lostResource */); |
| 347 EXPECT_EQ(live, true); | 357 ASSERT_EQ(live, true); |
| 348 | 358 |
| 349 weakPointer->markContentsChanged(); | 359 rawPointer->markContentsChanged(); |
| 350 weakPointer->mailboxReleased(mailbox3, false); | 360 releaseCallback3->Run(gpu::SyncToken(), false /* lostResource */); |
| 351 EXPECT_EQ(live, false); | 361 ASSERT_EQ(live, false); |
| 352 } | 362 } |
| 353 | 363 |
| 354 TEST_F(DrawingBufferTest, verifyDrawingBufferStaysAliveIfResourcesAreLost) | 364 TEST_F(DrawingBufferTest, verifyDrawingBufferStaysAliveIfResourcesAreLost) |
| 355 { | 365 { |
| 356 bool live = true; | 366 bool live = true; |
| 357 m_drawingBuffer->m_live = &live; | 367 m_drawingBuffer->m_live = &live; |
| 358 WebExternalTextureMailbox mailbox1; | 368 |
| 359 WebExternalTextureMailbox mailbox2; | 369 cc::TextureMailbox textureMailbox1; |
| 360 WebExternalTextureMailbox mailbox3; | 370 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1; |
| 371 cc::TextureMailbox textureMailbox2; |
| 372 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2; |
| 373 cc::TextureMailbox textureMailbox3; |
| 374 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3; |
| 375 bool useSharedMemory = false; |
| 361 | 376 |
| 362 m_drawingBuffer->markContentsChanged(); | 377 m_drawingBuffer->markContentsChanged(); |
| 363 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox1, 0)); | 378 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1, &releas
eCallback1, useSharedMemory)); |
| 364 m_drawingBuffer->markContentsChanged(); | 379 m_drawingBuffer->markContentsChanged(); |
| 365 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox2, 0)); | 380 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2, &releas
eCallback2, useSharedMemory)); |
| 366 m_drawingBuffer->markContentsChanged(); | 381 m_drawingBuffer->markContentsChanged(); |
| 367 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox3, 0)); | 382 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3, &releas
eCallback3, useSharedMemory)); |
| 368 | 383 |
| 369 m_drawingBuffer->markContentsChanged(); | 384 m_drawingBuffer->markContentsChanged(); |
| 370 m_drawingBuffer->mailboxReleased(mailbox1, true); | 385 releaseCallback1->Run(gpu::SyncToken(), true /* lostResource */); |
| 371 EXPECT_EQ(live, true); | 386 EXPECT_EQ(live, true); |
| 372 | 387 |
| 373 m_drawingBuffer->beginDestruction(); | 388 m_drawingBuffer->beginDestruction(); |
| 374 EXPECT_EQ(live, true); | 389 EXPECT_EQ(live, true); |
| 375 | 390 |
| 376 m_drawingBuffer->markContentsChanged(); | 391 m_drawingBuffer->markContentsChanged(); |
| 377 m_drawingBuffer->mailboxReleased(mailbox2, false); | 392 releaseCallback2->Run(gpu::SyncToken(), false /* lostResource */); |
| 378 EXPECT_EQ(live, true); | 393 EXPECT_EQ(live, true); |
| 379 | 394 |
| 380 DrawingBufferForTests* weakPtr = m_drawingBuffer.get(); | 395 DrawingBufferForTests* rawPtr = m_drawingBuffer.get(); |
| 381 m_drawingBuffer.clear(); | 396 m_drawingBuffer.clear(); |
| 382 EXPECT_EQ(live, true); | 397 EXPECT_EQ(live, true); |
| 383 | 398 |
| 384 weakPtr->markContentsChanged(); | 399 rawPtr->markContentsChanged(); |
| 385 weakPtr->mailboxReleased(mailbox3, true); | 400 releaseCallback3->Run(gpu::SyncToken(), true /* lostResource */); |
| 386 EXPECT_EQ(live, false); | 401 EXPECT_EQ(live, false); |
| 387 } | 402 } |
| 388 | 403 |
| 389 class TextureMailboxWrapper { | |
| 390 public: | |
| 391 explicit TextureMailboxWrapper(const WebExternalTextureMailbox& mailbox) | |
| 392 : m_mailbox(mailbox) | |
| 393 { } | |
| 394 | |
| 395 bool operator==(const TextureMailboxWrapper& other) const | |
| 396 { | |
| 397 return !memcmp(m_mailbox.name, other.m_mailbox.name, sizeof(m_mailbox.na
me)); | |
| 398 } | |
| 399 | |
| 400 bool operator!=(const TextureMailboxWrapper& other) const | |
| 401 { | |
| 402 return !(*this == other); | |
| 403 } | |
| 404 | |
| 405 private: | |
| 406 WebExternalTextureMailbox m_mailbox; | |
| 407 }; | |
| 408 | |
| 409 TEST_F(DrawingBufferTest, verifyOnlyOneRecycledMailboxMustBeKept) | 404 TEST_F(DrawingBufferTest, verifyOnlyOneRecycledMailboxMustBeKept) |
| 410 { | 405 { |
| 411 WebExternalTextureMailbox mailbox1; | 406 cc::TextureMailbox textureMailbox1; |
| 412 WebExternalTextureMailbox mailbox2; | 407 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1; |
| 413 WebExternalTextureMailbox mailbox3; | 408 cc::TextureMailbox textureMailbox2; |
| 409 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2; |
| 410 cc::TextureMailbox textureMailbox3; |
| 411 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3; |
| 412 bool useSharedMemory = false; |
| 414 | 413 |
| 415 // Produce mailboxes. | 414 // Produce mailboxes. |
| 416 m_drawingBuffer->markContentsChanged(); | 415 m_drawingBuffer->markContentsChanged(); |
| 417 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox1, 0)); | 416 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1, &releas
eCallback1, useSharedMemory)); |
| 418 m_drawingBuffer->markContentsChanged(); | 417 m_drawingBuffer->markContentsChanged(); |
| 419 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox2, 0)); | 418 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2, &releas
eCallback2, useSharedMemory)); |
| 420 m_drawingBuffer->markContentsChanged(); | 419 m_drawingBuffer->markContentsChanged(); |
| 421 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox3, 0)); | 420 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3, &releas
eCallback3, useSharedMemory)); |
| 422 | 421 |
| 423 // Release mailboxes by specific order; 1, 3, 2. | 422 // Release mailboxes by specific order; 1, 3, 2. |
| 424 m_drawingBuffer->markContentsChanged(); | 423 m_drawingBuffer->markContentsChanged(); |
| 425 m_drawingBuffer->mailboxReleased(mailbox1, false); | 424 releaseCallback1->Run(gpu::SyncToken(), false /* lostResource */); |
| 426 m_drawingBuffer->markContentsChanged(); | 425 m_drawingBuffer->markContentsChanged(); |
| 427 m_drawingBuffer->mailboxReleased(mailbox3, false); | 426 releaseCallback3->Run(gpu::SyncToken(), false /* lostResource */); |
| 428 m_drawingBuffer->markContentsChanged(); | 427 m_drawingBuffer->markContentsChanged(); |
| 429 m_drawingBuffer->mailboxReleased(mailbox2, false); | 428 releaseCallback2->Run(gpu::SyncToken(), false /* lostResource */); |
| 430 | 429 |
| 431 // The first recycled mailbox must be 2. 1 and 3 were deleted by FIFO order
because | 430 // The first recycled mailbox must be 2. 1 and 3 were deleted by FIFO order
because |
| 432 // DrawingBuffer never keeps more than one mailbox. | 431 // DrawingBuffer never keeps more than one mailbox. |
| 433 WebExternalTextureMailbox recycledMailbox1; | 432 cc::TextureMailbox recycledTextureMailbox1; |
| 433 std::unique_ptr<cc::SingleReleaseCallback> recycledReleaseCallback1; |
| 434 m_drawingBuffer->markContentsChanged(); | 434 m_drawingBuffer->markContentsChanged(); |
| 435 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&recycledMailbox1, 0)); | 435 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&recycledTextureMailbox1,
&recycledReleaseCallback1, useSharedMemory)); |
| 436 EXPECT_EQ(TextureMailboxWrapper(mailbox2), TextureMailboxWrapper(recycledMai
lbox1)); | 436 EXPECT_EQ(textureMailbox2.mailbox(), recycledTextureMailbox1.mailbox()); |
| 437 | 437 |
| 438 // The second recycled mailbox must be a new mailbox. | 438 // The second recycled mailbox must be a new mailbox. |
| 439 WebExternalTextureMailbox recycledMailbox2; | 439 cc::TextureMailbox recycledTextureMailbox2; |
| 440 std::unique_ptr<cc::SingleReleaseCallback> recycledReleaseCallback2; |
| 440 m_drawingBuffer->markContentsChanged(); | 441 m_drawingBuffer->markContentsChanged(); |
| 441 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&recycledMailbox2, 0)); | 442 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&recycledTextureMailbox2,
&recycledReleaseCallback2, useSharedMemory)); |
| 442 EXPECT_NE(TextureMailboxWrapper(mailbox1), TextureMailboxWrapper(recycledMai
lbox2)); | 443 EXPECT_NE(textureMailbox1.mailbox(), recycledTextureMailbox2.mailbox()); |
| 443 EXPECT_NE(TextureMailboxWrapper(mailbox2), TextureMailboxWrapper(recycledMai
lbox2)); | 444 EXPECT_NE(textureMailbox2.mailbox(), recycledTextureMailbox2.mailbox()); |
| 444 EXPECT_NE(TextureMailboxWrapper(mailbox3), TextureMailboxWrapper(recycledMai
lbox2)); | 445 EXPECT_NE(textureMailbox3.mailbox(), recycledTextureMailbox2.mailbox()); |
| 445 | 446 |
| 446 m_drawingBuffer->mailboxReleased(recycledMailbox1, false); | 447 recycledReleaseCallback1->Run(gpu::SyncToken(), false /* lostResource */); |
| 447 m_drawingBuffer->mailboxReleased(recycledMailbox2, false); | 448 recycledReleaseCallback2->Run(gpu::SyncToken(), false /* lostResource */); |
| 448 m_drawingBuffer->beginDestruction(); | 449 m_drawingBuffer->beginDestruction(); |
| 449 } | 450 } |
| 450 | 451 |
| 451 TEST_F(DrawingBufferTest, verifyInsertAndWaitSyncTokenCorrectly) | 452 TEST_F(DrawingBufferTest, verifyInsertAndWaitSyncTokenCorrectly) |
| 452 { | 453 { |
| 453 WebExternalTextureMailbox mailbox; | 454 cc::TextureMailbox textureMailbox; |
| 455 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; |
| 456 bool useSharedMemory = false; |
| 454 | 457 |
| 455 // Produce mailboxes. | 458 // Produce mailboxes. |
| 456 m_drawingBuffer->markContentsChanged(); | 459 m_drawingBuffer->markContentsChanged(); |
| 457 EXPECT_EQ(0u, m_gl->mostRecentlyWaitedSyncToken()); | 460 EXPECT_EQ(gpu::SyncToken(), m_gl->mostRecentlyWaitedSyncToken()); |
| 458 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); | 461 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release
Callback, useSharedMemory)); |
| 459 // prepareMailbox() does not wait for any sync point. | 462 // PrepareTextureMailbox() does not wait for any sync point. |
| 460 EXPECT_EQ(0u, m_gl->mostRecentlyWaitedSyncToken()); | 463 EXPECT_EQ(gpu::SyncToken(), m_gl->mostRecentlyWaitedSyncToken()); |
| 461 | 464 |
| 462 GLuint64 waitSyncToken = 0; | 465 gpu::SyncToken waitSyncToken; |
| 463 m_gl->GenSyncTokenCHROMIUM(m_gl->InsertFenceSyncCHROMIUM(), reinterpret_cast
<GLbyte*>(&waitSyncToken)); | 466 m_gl->GenSyncTokenCHROMIUM(m_gl->InsertFenceSyncCHROMIUM(), waitSyncToken.Ge
tData()); |
| 464 memcpy(mailbox.syncToken, &waitSyncToken, sizeof(waitSyncToken)); | 467 releaseCallback->Run(waitSyncToken, false /* lostResource */); |
| 465 mailbox.validSyncToken = true; | |
| 466 m_drawingBuffer->mailboxReleased(mailbox, false); | |
| 467 // m_drawingBuffer will wait for the sync point when recycling. | 468 // m_drawingBuffer will wait for the sync point when recycling. |
| 468 EXPECT_EQ(0u, m_gl->mostRecentlyWaitedSyncToken()); | 469 EXPECT_EQ(gpu::SyncToken(), m_gl->mostRecentlyWaitedSyncToken()); |
| 469 | 470 |
| 470 m_drawingBuffer->markContentsChanged(); | 471 m_drawingBuffer->markContentsChanged(); |
| 471 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); | 472 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release
Callback, useSharedMemory)); |
| 472 // m_drawingBuffer waits for the sync point when recycling in prepareMailbox
(). | 473 // m_drawingBuffer waits for the sync point when recycling in PrepareTexture
Mailbox(). |
| 473 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken()); | 474 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken()); |
| 474 | 475 |
| 475 m_drawingBuffer->beginDestruction(); | 476 m_drawingBuffer->beginDestruction(); |
| 476 m_gl->GenSyncTokenCHROMIUM(m_gl->InsertFenceSyncCHROMIUM(), reinterpret_cast
<GLbyte*>(&waitSyncToken)); | 477 m_gl->GenSyncTokenCHROMIUM(m_gl->InsertFenceSyncCHROMIUM(), waitSyncToken.Ge
tData()); |
| 477 memcpy(mailbox.syncToken, &waitSyncToken, sizeof(waitSyncToken)); | 478 releaseCallback->Run(waitSyncToken, false /* lostResource */); |
| 478 mailbox.validSyncToken = true; | |
| 479 m_drawingBuffer->mailboxReleased(mailbox, false); | |
| 480 // m_drawingBuffer waits for the sync point because the destruction is in pr
ogress. | 479 // m_drawingBuffer waits for the sync point because the destruction is in pr
ogress. |
| 481 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken()); | 480 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken()); |
| 482 } | 481 } |
| 483 | 482 |
| 484 class DrawingBufferImageChromiumTest : public DrawingBufferTest { | 483 class DrawingBufferImageChromiumTest : public DrawingBufferTest { |
| 485 protected: | 484 protected: |
| 486 void SetUp() override | 485 void SetUp() override |
| 487 { | 486 { |
| 488 std::unique_ptr<GLES2InterfaceForTests> gl = wrapUnique(new GLES2Interfa
ceForTests); | 487 std::unique_ptr<GLES2InterfaceForTests> gl = wrapUnique(new GLES2Interfa
ceForTests); |
| 489 m_gl = gl.get(); | 488 m_gl = gl.get(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 500 void TearDown() override | 499 void TearDown() override |
| 501 { | 500 { |
| 502 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(false); | 501 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(false); |
| 503 } | 502 } |
| 504 | 503 |
| 505 GLuint m_imageId0; | 504 GLuint m_imageId0; |
| 506 }; | 505 }; |
| 507 | 506 |
| 508 TEST_F(DrawingBufferImageChromiumTest, verifyResizingReallocatesImages) | 507 TEST_F(DrawingBufferImageChromiumTest, verifyResizingReallocatesImages) |
| 509 { | 508 { |
| 510 WebExternalTextureMailbox mailbox; | 509 cc::TextureMailbox textureMailbox; |
| 510 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; |
| 511 bool useSharedMemory = false; |
| 511 | 512 |
| 512 IntSize initialSize(initialWidth, initialHeight); | 513 IntSize initialSize(initialWidth, initialHeight); |
| 513 IntSize alternateSize(initialWidth, alternateHeight); | 514 IntSize alternateSize(initialWidth, alternateHeight); |
| 514 | 515 |
| 515 GLuint m_imageId1 = m_gl->nextImageIdToBeCreated(); | 516 GLuint m_imageId1 = m_gl->nextImageIdToBeCreated(); |
| 516 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId1)).Times(1); | 517 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId1)).Times(1); |
| 517 // Produce one mailbox at size 100x100. | 518 // Produce one mailbox at size 100x100. |
| 518 m_drawingBuffer->markContentsChanged(); | 519 m_drawingBuffer->markContentsChanged(); |
| 519 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); | 520 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release
Callback, useSharedMemory)); |
| 520 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); | 521 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); |
| 521 EXPECT_TRUE(mailbox.allowOverlay); | 522 EXPECT_TRUE(textureMailbox.is_overlay_candidate()); |
| 522 testing::Mock::VerifyAndClearExpectations(m_gl); | 523 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 523 | 524 |
| 524 GLuint m_imageId2 = m_gl->nextImageIdToBeCreated(); | 525 GLuint m_imageId2 = m_gl->nextImageIdToBeCreated(); |
| 525 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId2)).Times(1); | 526 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId2)).Times(1); |
| 526 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId0)).Times(1); | 527 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId0)).Times(1); |
| 527 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId0)).Times(1); | 528 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId0)).Times(1); |
| 528 // Resize to 100x50. | 529 // Resize to 100x50. |
| 529 m_drawingBuffer->reset(IntSize(initialWidth, alternateHeight)); | 530 m_drawingBuffer->reset(IntSize(initialWidth, alternateHeight)); |
| 530 m_drawingBuffer->mailboxReleased(mailbox, false); | 531 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); |
| 531 testing::Mock::VerifyAndClearExpectations(m_gl); | 532 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 532 | 533 |
| 533 GLuint m_imageId3 = m_gl->nextImageIdToBeCreated(); | 534 GLuint m_imageId3 = m_gl->nextImageIdToBeCreated(); |
| 534 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId3)).Times(1); | 535 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId3)).Times(1); |
| 535 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId1)).Times(1); | 536 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId1)).Times(1); |
| 536 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId1)).Times(1); | 537 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId1)).Times(1); |
| 537 // Produce a mailbox at this size. | 538 // Produce a mailbox at this size. |
| 538 m_drawingBuffer->markContentsChanged(); | 539 m_drawingBuffer->markContentsChanged(); |
| 539 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); | 540 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release
Callback, useSharedMemory)); |
| 540 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize()); | 541 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize()); |
| 541 EXPECT_TRUE(mailbox.allowOverlay); | 542 EXPECT_TRUE(textureMailbox.is_overlay_candidate()); |
| 542 testing::Mock::VerifyAndClearExpectations(m_gl); | 543 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 543 | 544 |
| 544 GLuint m_imageId4 = m_gl->nextImageIdToBeCreated(); | 545 GLuint m_imageId4 = m_gl->nextImageIdToBeCreated(); |
| 545 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId4)).Times(1); | 546 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId4)).Times(1); |
| 546 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId2)).Times(1); | 547 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId2)).Times(1); |
| 547 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId2)).Times(1); | 548 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId2)).Times(1); |
| 548 // Reset to initial size. | 549 // Reset to initial size. |
| 549 m_drawingBuffer->reset(IntSize(initialWidth, initialHeight)); | 550 m_drawingBuffer->reset(IntSize(initialWidth, initialHeight)); |
| 550 m_drawingBuffer->mailboxReleased(mailbox, false); | 551 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); |
| 551 testing::Mock::VerifyAndClearExpectations(m_gl); | 552 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 552 | 553 |
| 553 GLuint m_imageId5 = m_gl->nextImageIdToBeCreated(); | 554 GLuint m_imageId5 = m_gl->nextImageIdToBeCreated(); |
| 554 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId5)).Times(1); | 555 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId5)).Times(1); |
| 555 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId3)).Times(1); | 556 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId3)).Times(1); |
| 556 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId3)).Times(1); | 557 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId3)).Times(1); |
| 557 // Prepare another mailbox and verify that it's the correct size. | 558 // Prepare another mailbox and verify that it's the correct size. |
| 558 m_drawingBuffer->markContentsChanged(); | 559 m_drawingBuffer->markContentsChanged(); |
| 559 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); | 560 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release
Callback, useSharedMemory)); |
| 560 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); | 561 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); |
| 561 EXPECT_TRUE(mailbox.allowOverlay); | 562 EXPECT_TRUE(textureMailbox.is_overlay_candidate()); |
| 562 testing::Mock::VerifyAndClearExpectations(m_gl); | 563 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 563 | 564 |
| 564 // Prepare one final mailbox and verify that it's the correct size. | 565 // Prepare one final mailbox and verify that it's the correct size. |
| 565 m_drawingBuffer->mailboxReleased(mailbox, false); | 566 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); |
| 566 m_drawingBuffer->markContentsChanged(); | 567 m_drawingBuffer->markContentsChanged(); |
| 567 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); | 568 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release
Callback, useSharedMemory)); |
| 568 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); | 569 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); |
| 569 EXPECT_TRUE(mailbox.allowOverlay); | 570 EXPECT_TRUE(textureMailbox.is_overlay_candidate()); |
| 570 m_drawingBuffer->mailboxReleased(mailbox, false); | 571 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); |
| 571 | 572 |
| 572 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId5)).Times(1); | 573 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId5)).Times(1); |
| 573 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId5)).Times(1); | 574 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId5)).Times(1); |
| 574 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId4)).Times(1); | 575 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId4)).Times(1); |
| 575 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId4)).Times(1); | 576 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId4)).Times(1); |
| 576 m_drawingBuffer->beginDestruction(); | 577 m_drawingBuffer->beginDestruction(); |
| 577 testing::Mock::VerifyAndClearExpectations(m_gl); | 578 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 578 } | 579 } |
| 579 | 580 |
| 580 TEST_F(DrawingBufferImageChromiumTest, allocationFailure) | 581 TEST_F(DrawingBufferImageChromiumTest, allocationFailure) |
| 581 { | 582 { |
| 582 WebExternalTextureMailbox mailboxes[3]; | 583 cc::TextureMailbox textureMailbox1; |
| 584 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1; |
| 585 cc::TextureMailbox textureMailbox2; |
| 586 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2; |
| 587 cc::TextureMailbox textureMailbox3; |
| 588 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3; |
| 589 bool useSharedMemory = false; |
| 583 | 590 |
| 584 // Request a mailbox. An image should already be created. Everything works | 591 // Request a mailbox. An image should already be created. Everything works |
| 585 // as expected. | 592 // as expected. |
| 586 EXPECT_CALL(*m_gl, BindTexImage2DMock(_)).Times(1); | 593 EXPECT_CALL(*m_gl, BindTexImage2DMock(_)).Times(1); |
| 587 IntSize initialSize(initialWidth, initialHeight); | 594 IntSize initialSize(initialWidth, initialHeight); |
| 588 m_drawingBuffer->markContentsChanged(); | 595 m_drawingBuffer->markContentsChanged(); |
| 589 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailboxes[0], 0)); | 596 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1, &releas
eCallback1, useSharedMemory)); |
| 590 EXPECT_TRUE(mailboxes[0].allowOverlay); | 597 EXPECT_TRUE(textureMailbox1.is_overlay_candidate()); |
| 591 testing::Mock::VerifyAndClearExpectations(m_gl); | 598 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 592 | 599 |
| 593 // Force image CHROMIUM creation failure. Request another mailbox. It should | 600 // Force image CHROMIUM creation failure. Request another mailbox. It should |
| 594 // still be provided, but this time with allowOverlay = false. | 601 // still be provided, but this time with allowOverlay = false. |
| 595 m_gl->setCreateImageChromiumFail(true); | 602 m_gl->setCreateImageChromiumFail(true); |
| 596 m_drawingBuffer->markContentsChanged(); | 603 m_drawingBuffer->markContentsChanged(); |
| 597 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailboxes[1], 0)); | 604 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2, &releas
eCallback2, useSharedMemory)); |
| 598 EXPECT_FALSE(mailboxes[1].allowOverlay); | 605 EXPECT_FALSE(textureMailbox2.is_overlay_candidate()); |
| 599 | 606 |
| 600 // Check that if image CHROMIUM starts working again, mailboxes are | 607 // Check that if image CHROMIUM starts working again, mailboxes are |
| 601 // correctly created with allowOverlay = true. | 608 // correctly created with allowOverlay = true. |
| 602 EXPECT_CALL(*m_gl, BindTexImage2DMock(_)).Times(1); | 609 EXPECT_CALL(*m_gl, BindTexImage2DMock(_)).Times(1); |
| 603 m_gl->setCreateImageChromiumFail(false); | 610 m_gl->setCreateImageChromiumFail(false); |
| 604 m_drawingBuffer->markContentsChanged(); | 611 m_drawingBuffer->markContentsChanged(); |
| 605 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailboxes[2], 0)); | 612 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3, &releas
eCallback3, useSharedMemory)); |
| 606 EXPECT_TRUE(mailboxes[2].allowOverlay); | 613 EXPECT_TRUE(textureMailbox3.is_overlay_candidate()); |
| 607 testing::Mock::VerifyAndClearExpectations(m_gl); | 614 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 608 | 615 |
| 609 for (int i = 0; i < 3; ++i) | 616 releaseCallback1->Run(gpu::SyncToken(), false /* lostResource */); |
| 610 m_drawingBuffer->mailboxReleased(mailboxes[i], false); | 617 releaseCallback2->Run(gpu::SyncToken(), false /* lostResource */); |
| 618 releaseCallback3->Run(gpu::SyncToken(), false /* lostResource */); |
| 611 | 619 |
| 612 EXPECT_CALL(*m_gl, DestroyImageMock(_)).Times(3); | 620 EXPECT_CALL(*m_gl, DestroyImageMock(_)).Times(3); |
| 613 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(_)).Times(3); | 621 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(_)).Times(3); |
| 614 m_drawingBuffer->beginDestruction(); | 622 m_drawingBuffer->beginDestruction(); |
| 615 testing::Mock::VerifyAndClearExpectations(m_gl); | 623 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 616 } | 624 } |
| 617 | 625 |
| 618 class DepthStencilTrackingGLES2Interface : public gpu::gles2::GLES2InterfaceStub
{ | 626 class DepthStencilTrackingGLES2Interface : public gpu::gles2::GLES2InterfaceStub
{ |
| 619 public: | 627 public: |
| 620 void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum render
buffertarget, GLuint renderbuffer) override | 628 void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum render
buffertarget, GLuint renderbuffer) override |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 751 EXPECT_EQ(0u, trackingGL->depthAttachment()); | 759 EXPECT_EQ(0u, trackingGL->depthAttachment()); |
| 752 EXPECT_EQ(0u, trackingGL->stencilAttachment()); | 760 EXPECT_EQ(0u, trackingGL->stencilAttachment()); |
| 753 } | 761 } |
| 754 | 762 |
| 755 drawingBuffer->beginDestruction(); | 763 drawingBuffer->beginDestruction(); |
| 756 } | 764 } |
| 757 } | 765 } |
| 758 | 766 |
| 759 TEST_F(DrawingBufferTest, verifySetIsHiddenProperlyAffectsMailboxes) | 767 TEST_F(DrawingBufferTest, verifySetIsHiddenProperlyAffectsMailboxes) |
| 760 { | 768 { |
| 761 blink::WebExternalTextureMailbox mailbox; | 769 cc::TextureMailbox textureMailbox; |
| 770 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; |
| 771 bool useSharedMemory = false; |
| 762 | 772 |
| 763 // Produce mailboxes. | 773 // Produce mailboxes. |
| 764 m_drawingBuffer->markContentsChanged(); | 774 m_drawingBuffer->markContentsChanged(); |
| 765 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); | 775 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release
Callback, useSharedMemory)); |
| 766 | 776 |
| 767 m_gl->GenSyncTokenCHROMIUM(m_gl->InsertFenceSyncCHROMIUM(), mailbox.syncToke
n); | 777 gpu::SyncToken waitSyncToken; |
| 768 mailbox.validSyncToken = true; | 778 m_gl->GenSyncTokenCHROMIUM(m_gl->InsertFenceSyncCHROMIUM(), waitSyncToken.Ge
tData()); |
| 769 m_drawingBuffer->setIsHidden(true); | 779 m_drawingBuffer->setIsHidden(true); |
| 770 m_drawingBuffer->mailboxReleased(mailbox); | 780 releaseCallback->Run(waitSyncToken, false /* lostResource */); |
| 771 // m_drawingBuffer deletes mailbox immediately when hidden. | 781 // m_drawingBuffer deletes mailbox immediately when hidden. |
| 772 | 782 |
| 773 GLuint waitSyncToken = 0; | |
| 774 memcpy(&waitSyncToken, mailbox.syncToken, sizeof(waitSyncToken)); | |
| 775 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken()); | 783 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken()); |
| 776 | 784 |
| 777 m_drawingBuffer->beginDestruction(); | 785 m_drawingBuffer->beginDestruction(); |
| 778 } | 786 } |
| 779 | 787 |
| 780 } // namespace blink | 788 } // namespace blink |
| OLD | NEW |