virtual void SetUp() { OwnPtr<WebGraphicsContext3DForTests> context = adoptPtr(new WebGraphicsContext3DForTests); m_context = context.get(); RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(true); m_imageId0 = webContext()->nextImageIdToBeCreated(); EXPECT_CALL(*webContext(), bindTexImage2DMock(m_imageId0)).Times(1); m_drawingBuffer = DrawingBufferForTests::create(context.release(), IntSize(initialWidth, initialHeight), DrawingBuffer::Preserve); testing::Mock::VerifyAndClearExpectations(webContext()); }
TEST_F(DrawingBufferTest, verifySetIsHiddenProperlyAffectsMailboxes) { blink::WebExternalTextureMailbox mailbox; // Produce mailboxes. m_drawingBuffer->markContentsChanged(); EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); unsigned waitSyncPoint = webContext()->insertSyncPoint(); mailbox.syncPoint = waitSyncPoint; m_drawingBuffer->setIsHidden(true); m_drawingBuffer->mailboxReleased(mailbox); // m_drawingBuffer deletes mailbox immediately when hidden. EXPECT_EQ(waitSyncPoint, webContext()->mostRecentlyWaitedSyncPoint()); m_drawingBuffer->beginDestruction(); }
TEST_F(DrawingBufferTest, verifyInsertAndWaitSyncTokenCorrectly) { WebExternalTextureMailbox mailbox; // Produce mailboxes. m_drawingBuffer->markContentsChanged(); EXPECT_EQ(0u, webContext()->mostRecentlyWaitedSyncToken()); EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); // prepareMailbox() does not wait for any sync point. EXPECT_EQ(0u, webContext()->mostRecentlyWaitedSyncToken()); WGC3Duint waitSyncToken = 0; webContext()->insertSyncPoint(reinterpret_cast<WGC3Dbyte*>(&waitSyncToken)); memcpy(mailbox.syncToken, &waitSyncToken, sizeof(waitSyncToken)); mailbox.validSyncToken = true; m_drawingBuffer->mailboxReleased(mailbox, false); // m_drawingBuffer will wait for the sync point when recycling. EXPECT_EQ(0u, webContext()->mostRecentlyWaitedSyncToken()); m_drawingBuffer->markContentsChanged(); EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); // m_drawingBuffer waits for the sync point when recycling in prepareMailbox(). EXPECT_EQ(waitSyncToken, webContext()->mostRecentlyWaitedSyncToken()); m_drawingBuffer->beginDestruction(); webContext()->insertSyncPoint(reinterpret_cast<WGC3Dbyte*>(&waitSyncToken)); memcpy(mailbox.syncToken, &waitSyncToken, sizeof(waitSyncToken)); mailbox.validSyncToken = true; m_drawingBuffer->mailboxReleased(mailbox, false); // m_drawingBuffer waits for the sync point because the destruction is in progress. EXPECT_EQ(waitSyncToken, webContext()->mostRecentlyWaitedSyncToken()); }
TEST_F(DrawingBufferTest, verifyInsertAndWaitSyncPointCorrectly) { WebExternalTextureMailbox mailbox; // Produce mailboxes. m_drawingBuffer->markContentsChanged(); EXPECT_EQ(0u, webContext()->mostRecentlyWaitedSyncPoint()); EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); // prepareMailbox() does not wait for any sync point. EXPECT_EQ(0u, webContext()->mostRecentlyWaitedSyncPoint()); unsigned waitSyncPoint = webContext()->insertSyncPoint(); mailbox.syncPoint = waitSyncPoint; m_drawingBuffer->mailboxReleased(mailbox, false); // m_drawingBuffer will wait for the sync point when recycling. EXPECT_EQ(0u, webContext()->mostRecentlyWaitedSyncPoint()); m_drawingBuffer->markContentsChanged(); EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); // m_drawingBuffer waits for the sync point when recycling in prepareMailbox(). EXPECT_EQ(waitSyncPoint, webContext()->mostRecentlyWaitedSyncPoint()); m_drawingBuffer->beginDestruction(); waitSyncPoint = webContext()->insertSyncPoint(); mailbox.syncPoint = waitSyncPoint; m_drawingBuffer->mailboxReleased(mailbox, false); // m_drawingBuffer waits for the sync point because the destruction is in progress. EXPECT_EQ(waitSyncPoint, webContext()->mostRecentlyWaitedSyncPoint()); }
TEST_F(DrawingBufferTest, verifyResizingProperlyAffectsMailboxes) { WebExternalTextureMailbox mailbox; IntSize initialSize(initialWidth, initialHeight); IntSize alternateSize(initialWidth, alternateHeight); // Produce one mailbox at size 100x100. m_drawingBuffer->markContentsChanged(); EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); EXPECT_EQ(initialSize, webContext()->mostRecentlyProducedSize()); // Resize to 100x50. m_drawingBuffer->reset(IntSize(initialWidth, alternateHeight)); m_drawingBuffer->mailboxReleased(mailbox, false); // Produce a mailbox at this size. m_drawingBuffer->markContentsChanged(); EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); EXPECT_EQ(alternateSize, webContext()->mostRecentlyProducedSize()); // Reset to initial size. m_drawingBuffer->reset(IntSize(initialWidth, initialHeight)); m_drawingBuffer->mailboxReleased(mailbox, false); // Prepare another mailbox and verify that it's the correct size. m_drawingBuffer->markContentsChanged(); EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); EXPECT_EQ(initialSize, webContext()->mostRecentlyProducedSize()); // Prepare one final mailbox and verify that it's the correct size. m_drawingBuffer->mailboxReleased(mailbox, false); m_drawingBuffer->markContentsChanged(); EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); EXPECT_EQ(initialSize, webContext()->mostRecentlyProducedSize()); m_drawingBuffer->mailboxReleased(mailbox, false); m_drawingBuffer->beginDestruction(); }
TEST_F(DrawingBufferImageChromiumTest, verifyResizingReallocatesImages) { WebExternalTextureMailbox mailbox; IntSize initialSize(initialWidth, initialHeight); IntSize alternateSize(initialWidth, alternateHeight); WGC3Duint m_imageId1 = webContext()->nextImageIdToBeCreated(); EXPECT_CALL(*webContext(), bindTexImage2DMock(m_imageId1)).Times(1); // Produce one mailbox at size 100x100. m_drawingBuffer->markContentsChanged(); EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); EXPECT_EQ(initialSize, webContext()->mostRecentlyProducedSize()); EXPECT_TRUE(mailbox.allowOverlay); testing::Mock::VerifyAndClearExpectations(webContext()); WGC3Duint m_imageId2 = webContext()->nextImageIdToBeCreated(); EXPECT_CALL(*webContext(), bindTexImage2DMock(m_imageId2)).Times(1); EXPECT_CALL(*webContext(), destroyImageMock(m_imageId0)).Times(1); EXPECT_CALL(*webContext(), releaseTexImage2DMock(m_imageId0)).Times(1); // Resize to 100x50. m_drawingBuffer->reset(IntSize(initialWidth, alternateHeight)); m_drawingBuffer->mailboxReleased(mailbox, false); testing::Mock::VerifyAndClearExpectations(webContext()); WGC3Duint m_imageId3 = webContext()->nextImageIdToBeCreated(); EXPECT_CALL(*webContext(), bindTexImage2DMock(m_imageId3)).Times(1); EXPECT_CALL(*webContext(), destroyImageMock(m_imageId1)).Times(1); EXPECT_CALL(*webContext(), releaseTexImage2DMock(m_imageId1)).Times(1); // Produce a mailbox at this size. m_drawingBuffer->markContentsChanged(); EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); EXPECT_EQ(alternateSize, webContext()->mostRecentlyProducedSize()); EXPECT_TRUE(mailbox.allowOverlay); testing::Mock::VerifyAndClearExpectations(webContext()); WGC3Duint m_imageId4 = webContext()->nextImageIdToBeCreated(); EXPECT_CALL(*webContext(), bindTexImage2DMock(m_imageId4)).Times(1); EXPECT_CALL(*webContext(), destroyImageMock(m_imageId2)).Times(1); EXPECT_CALL(*webContext(), releaseTexImage2DMock(m_imageId2)).Times(1); // Reset to initial size. m_drawingBuffer->reset(IntSize(initialWidth, initialHeight)); m_drawingBuffer->mailboxReleased(mailbox, false); testing::Mock::VerifyAndClearExpectations(webContext()); WGC3Duint m_imageId5 = webContext()->nextImageIdToBeCreated(); EXPECT_CALL(*webContext(), bindTexImage2DMock(m_imageId5)).Times(1); EXPECT_CALL(*webContext(), destroyImageMock(m_imageId3)).Times(1); EXPECT_CALL(*webContext(), releaseTexImage2DMock(m_imageId3)).Times(1); // Prepare another mailbox and verify that it's the correct size. m_drawingBuffer->markContentsChanged(); EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); EXPECT_EQ(initialSize, webContext()->mostRecentlyProducedSize()); EXPECT_TRUE(mailbox.allowOverlay); testing::Mock::VerifyAndClearExpectations(webContext()); // Prepare one final mailbox and verify that it's the correct size. m_drawingBuffer->mailboxReleased(mailbox, false); m_drawingBuffer->markContentsChanged(); EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); EXPECT_EQ(initialSize, webContext()->mostRecentlyProducedSize()); EXPECT_TRUE(mailbox.allowOverlay); m_drawingBuffer->mailboxReleased(mailbox, false); EXPECT_CALL(*webContext(), destroyImageMock(m_imageId5)).Times(1); EXPECT_CALL(*webContext(), releaseTexImage2DMock(m_imageId5)).Times(1); EXPECT_CALL(*webContext(), destroyImageMock(m_imageId4)).Times(1); EXPECT_CALL(*webContext(), releaseTexImage2DMock(m_imageId4)).Times(1); m_drawingBuffer->beginDestruction(); testing::Mock::VerifyAndClearExpectations(webContext()); }