| 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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 using testing::_; | 46 using testing::_; |
| 47 | 47 |
| 48 namespace blink { | 48 namespace blink { |
| 49 | 49 |
| 50 class WebGraphicsContext3DForTests : public MockWebGraphicsContext3D { | 50 class WebGraphicsContext3DForTests : public MockWebGraphicsContext3D { |
| 51 public: | 51 public: |
| 52 WebGraphicsContext3DForTests() | 52 WebGraphicsContext3DForTests() |
| 53 : MockWebGraphicsContext3D() | 53 : MockWebGraphicsContext3D() |
| 54 , m_boundTexture(0) | 54 , m_boundTexture(0) |
| 55 , m_currentMailboxByte(0) | 55 , m_currentMailboxByte(0) |
| 56 , m_mostRecentlyWaitedSyncPoint(0) | 56 , m_mostRecentlyWaitedSyncToken(0) |
| 57 , m_currentImageId(1) { } | 57 , m_currentImageId(1) |
| 58 { |
| 59 } |
| 58 | 60 |
| 59 void bindTexture(WGC3Denum target, WebGLId texture) override | 61 void bindTexture(WGC3Denum target, WebGLId texture) override |
| 60 { | 62 { |
| 61 if (target == GL_TEXTURE_2D) { | 63 if (target == GL_TEXTURE_2D) { |
| 62 m_boundTexture = texture; | 64 m_boundTexture = texture; |
| 63 } | 65 } |
| 64 } | 66 } |
| 65 | 67 |
| 66 void texImage2D(WGC3Denum target, WGC3Dint level, WGC3Denum internalformat,
WGC3Dsizei width, WGC3Dsizei height, WGC3Dint border, WGC3Denum format, WGC3Denu
m type, const void* pixels) override | 68 void texImage2D(WGC3Denum target, WGC3Dint level, WGC3Denum internalformat,
WGC3Dsizei width, WGC3Dsizei height, WGC3Dint border, WGC3Denum format, WGC3Denu
m type, const void* pixels) override |
| 67 { | 69 { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 82 ASSERT_EQ(target, static_cast<WGC3Denum>(GL_TEXTURE_2D)); | 84 ASSERT_EQ(target, static_cast<WGC3Denum>(GL_TEXTURE_2D)); |
| 83 ASSERT_TRUE(m_textureSizes.contains(texture)); | 85 ASSERT_TRUE(m_textureSizes.contains(texture)); |
| 84 m_mostRecentlyProducedSize = m_textureSizes.get(texture); | 86 m_mostRecentlyProducedSize = m_textureSizes.get(texture); |
| 85 } | 87 } |
| 86 | 88 |
| 87 IntSize mostRecentlyProducedSize() | 89 IntSize mostRecentlyProducedSize() |
| 88 { | 90 { |
| 89 return m_mostRecentlyProducedSize; | 91 return m_mostRecentlyProducedSize; |
| 90 } | 92 } |
| 91 | 93 |
| 92 unsigned insertSyncPoint() override | 94 bool insertSyncPoint(WGC3Dbyte* syncToken) override |
| 93 { | 95 { |
| 94 static unsigned syncPointGenerator = 0; | 96 static WGC3Duint syncPointGenerator = 0; |
| 95 return ++syncPointGenerator; | 97 WGC3Duint newSyncPoint = ++syncPointGenerator; |
| 98 memcpy(syncToken, &newSyncPoint, sizeof(newSyncPoint)); |
| 99 return true; |
| 96 } | 100 } |
| 97 | 101 |
| 98 void waitSyncPoint(unsigned syncPoint) override | 102 void waitSyncToken(const WGC3Dbyte* syncToken) override |
| 99 { | 103 { |
| 100 m_mostRecentlyWaitedSyncPoint = syncPoint; | 104 memcpy(&m_mostRecentlyWaitedSyncToken, syncToken, sizeof(m_mostRecentlyW
aitedSyncToken)); |
| 101 } | 105 } |
| 102 | 106 |
| 103 WGC3Duint createGpuMemoryBufferImageCHROMIUM(WGC3Dsizei width, WGC3Dsizei he
ight, WGC3Denum internalformat, WGC3Denum usage) override | 107 WGC3Duint createGpuMemoryBufferImageCHROMIUM(WGC3Dsizei width, WGC3Dsizei he
ight, WGC3Denum internalformat, WGC3Denum usage) override |
| 104 { | 108 { |
| 105 m_imageSizes.set(m_currentImageId, IntSize(width, height)); | 109 m_imageSizes.set(m_currentImageId, IntSize(width, height)); |
| 106 return m_currentImageId++; | 110 return m_currentImageId++; |
| 107 } | 111 } |
| 108 | 112 |
| 109 MOCK_METHOD1(destroyImageMock, void(WGC3Duint imageId)); | 113 MOCK_METHOD1(destroyImageMock, void(WGC3Duint imageId)); |
| 110 void destroyImageCHROMIUM(WGC3Duint imageId) | 114 void destroyImageCHROMIUM(WGC3Duint imageId) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 129 MOCK_METHOD1(releaseTexImage2DMock, void(WGC3Dint imageId)); | 133 MOCK_METHOD1(releaseTexImage2DMock, void(WGC3Dint imageId)); |
| 130 void releaseTexImage2DCHROMIUM(WGC3Denum target, WGC3Dint imageId) | 134 void releaseTexImage2DCHROMIUM(WGC3Denum target, WGC3Dint imageId) |
| 131 { | 135 { |
| 132 if (target == GL_TEXTURE_2D) { | 136 if (target == GL_TEXTURE_2D) { |
| 133 m_imageSizes.set(m_currentImageId, IntSize()); | 137 m_imageSizes.set(m_currentImageId, IntSize()); |
| 134 m_imageToTextureMap.remove(imageId); | 138 m_imageToTextureMap.remove(imageId); |
| 135 releaseTexImage2DMock(imageId); | 139 releaseTexImage2DMock(imageId); |
| 136 } | 140 } |
| 137 } | 141 } |
| 138 | 142 |
| 139 unsigned mostRecentlyWaitedSyncPoint() | 143 WGC3Duint mostRecentlyWaitedSyncToken() |
| 140 { | 144 { |
| 141 return m_mostRecentlyWaitedSyncPoint; | 145 return m_mostRecentlyWaitedSyncToken; |
| 142 } | 146 } |
| 143 | 147 |
| 144 WGC3Duint nextImageIdToBeCreated() | 148 WGC3Duint nextImageIdToBeCreated() |
| 145 { | 149 { |
| 146 return m_currentImageId; | 150 return m_currentImageId; |
| 147 } | 151 } |
| 148 | 152 |
| 149 private: | 153 private: |
| 150 WebGLId m_boundTexture; | 154 WebGLId m_boundTexture; |
| 151 HashMap<WebGLId, IntSize> m_textureSizes; | 155 HashMap<WebGLId, IntSize> m_textureSizes; |
| 152 WGC3Dbyte m_currentMailboxByte; | 156 WGC3Dbyte m_currentMailboxByte; |
| 153 IntSize m_mostRecentlyProducedSize; | 157 IntSize m_mostRecentlyProducedSize; |
| 154 unsigned m_mostRecentlyWaitedSyncPoint; | 158 WGC3Duint m_mostRecentlyWaitedSyncToken; |
| 155 WGC3Duint m_currentImageId; | 159 WGC3Duint m_currentImageId; |
| 156 HashMap<WGC3Duint, IntSize> m_imageSizes; | 160 HashMap<WGC3Duint, IntSize> m_imageSizes; |
| 157 HashMap<WGC3Duint, WebGLId> m_imageToTextureMap; | 161 HashMap<WGC3Duint, WebGLId> m_imageToTextureMap; |
| 158 }; | 162 }; |
| 159 | 163 |
| 160 static const int initialWidth = 100; | 164 static const int initialWidth = 100; |
| 161 static const int initialHeight = 100; | 165 static const int initialHeight = 100; |
| 162 static const int alternateHeight = 50; | 166 static const int alternateHeight = 50; |
| 163 | 167 |
| 164 class DrawingBufferForTests : public DrawingBuffer { | 168 class DrawingBufferForTests : public DrawingBuffer { |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&recycledMailbox2, 0)); | 398 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&recycledMailbox2, 0)); |
| 395 EXPECT_NE(TextureMailboxWrapper(mailbox1), TextureMailboxWrapper(recycledMai
lbox2)); | 399 EXPECT_NE(TextureMailboxWrapper(mailbox1), TextureMailboxWrapper(recycledMai
lbox2)); |
| 396 EXPECT_NE(TextureMailboxWrapper(mailbox2), TextureMailboxWrapper(recycledMai
lbox2)); | 400 EXPECT_NE(TextureMailboxWrapper(mailbox2), TextureMailboxWrapper(recycledMai
lbox2)); |
| 397 EXPECT_NE(TextureMailboxWrapper(mailbox3), TextureMailboxWrapper(recycledMai
lbox2)); | 401 EXPECT_NE(TextureMailboxWrapper(mailbox3), TextureMailboxWrapper(recycledMai
lbox2)); |
| 398 | 402 |
| 399 m_drawingBuffer->mailboxReleased(recycledMailbox1, false); | 403 m_drawingBuffer->mailboxReleased(recycledMailbox1, false); |
| 400 m_drawingBuffer->mailboxReleased(recycledMailbox2, false); | 404 m_drawingBuffer->mailboxReleased(recycledMailbox2, false); |
| 401 m_drawingBuffer->beginDestruction(); | 405 m_drawingBuffer->beginDestruction(); |
| 402 } | 406 } |
| 403 | 407 |
| 404 TEST_F(DrawingBufferTest, verifyInsertAndWaitSyncPointCorrectly) | 408 TEST_F(DrawingBufferTest, verifyInsertAndWaitSyncTokenCorrectly) |
| 405 { | 409 { |
| 406 WebExternalTextureMailbox mailbox; | 410 WebExternalTextureMailbox mailbox; |
| 407 | 411 |
| 408 // Produce mailboxes. | 412 // Produce mailboxes. |
| 409 m_drawingBuffer->markContentsChanged(); | 413 m_drawingBuffer->markContentsChanged(); |
| 410 EXPECT_EQ(0u, webContext()->mostRecentlyWaitedSyncPoint()); | 414 EXPECT_EQ(0u, webContext()->mostRecentlyWaitedSyncToken()); |
| 411 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); | 415 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); |
| 412 // prepareMailbox() does not wait for any sync point. | 416 // prepareMailbox() does not wait for any sync point. |
| 413 EXPECT_EQ(0u, webContext()->mostRecentlyWaitedSyncPoint()); | 417 EXPECT_EQ(0u, webContext()->mostRecentlyWaitedSyncToken()); |
| 414 | 418 |
| 415 unsigned waitSyncPoint = webContext()->insertSyncPoint(); | 419 mailbox.validSyncToken = webContext()->insertSyncPoint(mailbox.syncToken); |
| 416 mailbox.syncPoint = waitSyncPoint; | 420 ASSERT_TRUE(mailbox.validSyncToken); |
| 417 m_drawingBuffer->mailboxReleased(mailbox, false); | 421 m_drawingBuffer->mailboxReleased(mailbox, false); |
| 418 // m_drawingBuffer will wait for the sync point when recycling. | 422 // m_drawingBuffer will wait for the sync point when recycling. |
| 419 EXPECT_EQ(0u, webContext()->mostRecentlyWaitedSyncPoint()); | 423 EXPECT_EQ(0u, webContext()->mostRecentlyWaitedSyncToken()); |
| 420 | 424 |
| 421 m_drawingBuffer->markContentsChanged(); | 425 m_drawingBuffer->markContentsChanged(); |
| 422 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); | 426 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); |
| 423 // m_drawingBuffer waits for the sync point when recycling in prepareMailbox
(). | 427 // m_drawingBuffer waits for the sync point when recycling in prepareMailbox
(). |
| 424 EXPECT_EQ(waitSyncPoint, webContext()->mostRecentlyWaitedSyncPoint()); | 428 WGC3Duint waitSyncToken = 0; |
| 429 memcpy(&waitSyncToken, mailbox.syncToken, sizeof(waitSyncToken)); |
| 430 EXPECT_EQ(waitSyncToken, webContext()->mostRecentlyWaitedSyncToken()); |
| 425 | 431 |
| 426 m_drawingBuffer->beginDestruction(); | 432 m_drawingBuffer->beginDestruction(); |
| 427 waitSyncPoint = webContext()->insertSyncPoint(); | 433 mailbox.validSyncToken = webContext()->insertSyncPoint(mailbox.syncToken); |
| 428 mailbox.syncPoint = waitSyncPoint; | |
| 429 m_drawingBuffer->mailboxReleased(mailbox, false); | 434 m_drawingBuffer->mailboxReleased(mailbox, false); |
| 430 // m_drawingBuffer waits for the sync point because the destruction is in pr
ogress. | 435 // m_drawingBuffer waits for the sync point because the destruction is in pr
ogress. |
| 431 EXPECT_EQ(waitSyncPoint, webContext()->mostRecentlyWaitedSyncPoint()); | 436 memcpy(&waitSyncToken, mailbox.syncToken, sizeof(waitSyncToken)); |
| 437 EXPECT_EQ(waitSyncToken, webContext()->mostRecentlyWaitedSyncToken()); |
| 432 } | 438 } |
| 433 | 439 |
| 434 class DrawingBufferImageChromiumTest : public DrawingBufferTest { | 440 class DrawingBufferImageChromiumTest : public DrawingBufferTest { |
| 435 protected: | 441 protected: |
| 436 virtual void SetUp() | 442 virtual void SetUp() |
| 437 { | 443 { |
| 438 OwnPtr<WebGraphicsContext3DForTests> context = adoptPtr(new WebGraphicsC
ontext3DForTests); | 444 OwnPtr<WebGraphicsContext3DForTests> context = adoptPtr(new WebGraphicsC
ontext3DForTests); |
| 439 m_context = context.get(); | 445 m_context = context.get(); |
| 440 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(true); | 446 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(true); |
| 441 m_imageId0 = webContext()->nextImageIdToBeCreated(); | 447 m_imageId0 = webContext()->nextImageIdToBeCreated(); |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 } | 653 } |
| 648 | 654 |
| 649 TEST_F(DrawingBufferTest, verifySetIsHiddenProperlyAffectsMailboxes) | 655 TEST_F(DrawingBufferTest, verifySetIsHiddenProperlyAffectsMailboxes) |
| 650 { | 656 { |
| 651 blink::WebExternalTextureMailbox mailbox; | 657 blink::WebExternalTextureMailbox mailbox; |
| 652 | 658 |
| 653 // Produce mailboxes. | 659 // Produce mailboxes. |
| 654 m_drawingBuffer->markContentsChanged(); | 660 m_drawingBuffer->markContentsChanged(); |
| 655 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); | 661 EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); |
| 656 | 662 |
| 657 unsigned waitSyncPoint = webContext()->insertSyncPoint(); | 663 mailbox.validSyncToken = webContext()->insertSyncPoint(mailbox.syncToken); |
| 658 mailbox.syncPoint = waitSyncPoint; | |
| 659 m_drawingBuffer->setIsHidden(true); | 664 m_drawingBuffer->setIsHidden(true); |
| 660 m_drawingBuffer->mailboxReleased(mailbox); | 665 m_drawingBuffer->mailboxReleased(mailbox); |
| 661 // m_drawingBuffer deletes mailbox immediately when hidden. | 666 // m_drawingBuffer deletes mailbox immediately when hidden. |
| 662 EXPECT_EQ(waitSyncPoint, webContext()->mostRecentlyWaitedSyncPoint()); | 667 |
| 668 WGC3Duint waitSyncToken = 0; |
| 669 memcpy(&waitSyncToken, mailbox.syncToken, sizeof(waitSyncToken)); |
| 670 EXPECT_EQ(waitSyncToken, webContext()->mostRecentlyWaitedSyncToken()); |
| 663 | 671 |
| 664 m_drawingBuffer->beginDestruction(); | 672 m_drawingBuffer->beginDestruction(); |
| 665 } | 673 } |
| 666 | 674 |
| 667 } // namespace blink | 675 } // namespace blink |
| OLD | NEW |