Chromium Code Reviews| 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 15 matching lines...) Expand all Loading... | |
| 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" | 33 #include "cc/resources/single_release_callback.h" |
| 34 #include "cc/resources/texture_mailbox.h" | 34 #include "cc/resources/texture_mailbox.h" |
| 35 #include "gpu/command_buffer/client/gles2_interface_stub.h" | 35 #include "gpu/command_buffer/client/gles2_interface_stub.h" |
| 36 #include "gpu/command_buffer/common/capabilities.h" | |
| 37 #include "gpu/command_buffer/common/mailbox.h" | 36 #include "gpu/command_buffer/common/mailbox.h" |
| 38 #include "gpu/command_buffer/common/sync_token.h" | 37 #include "gpu/command_buffer/common/sync_token.h" |
| 39 #include "platform/RuntimeEnabledFeatures.h" | |
| 40 #include "platform/graphics/ImageBuffer.h" | 38 #include "platform/graphics/ImageBuffer.h" |
| 41 #include "platform/graphics/UnacceleratedImageBufferSurface.h" | 39 #include "platform/graphics/UnacceleratedImageBufferSurface.h" |
| 42 #include "platform/graphics/gpu/Extensions3DUtil.h" | 40 #include "platform/graphics/gpu/DrawingBufferTestHelpers.h" |
| 43 #include "public/platform/Platform.h" | 41 #include "public/platform/Platform.h" |
| 44 #include "public/platform/WebGraphicsContext3DProvider.h" | |
| 45 #include "public/platform/functional/WebFunction.h" | 42 #include "public/platform/functional/WebFunction.h" |
| 46 #include "testing/gmock/include/gmock/gmock.h" | |
| 47 #include "testing/gtest/include/gtest/gtest.h" | 43 #include "testing/gtest/include/gtest/gtest.h" |
| 48 #include "wtf/PtrUtil.h" | 44 #include "wtf/PtrUtil.h" |
| 49 #include "wtf/RefPtr.h" | 45 #include "wtf/RefPtr.h" |
| 50 #include <memory> | 46 #include <memory> |
| 51 | 47 |
| 52 using testing::Test; | 48 using testing::Test; |
| 53 using testing::_; | 49 using testing::_; |
| 54 | 50 |
| 55 namespace blink { | 51 namespace blink { |
| 56 | 52 |
| 57 namespace { | |
| 58 | |
| 59 // The target to use when binding a texture to a Chromium image. | |
| 60 GLenum imageCHROMIUMTextureTarget() | |
| 61 { | |
| 62 #if OS(MACOSX) | |
| 63 return GC3D_TEXTURE_RECTANGLE_ARB; | |
| 64 #else | |
| 65 return GL_TEXTURE_2D; | |
| 66 #endif | |
| 67 } | |
| 68 | |
| 69 // The target to use when preparing a mailbox texture. | |
| 70 GLenum drawingBufferTextureTarget() | |
| 71 { | |
| 72 if (RuntimeEnabledFeatures::webGLImageChromiumEnabled()) | |
| 73 return imageCHROMIUMTextureTarget(); | |
| 74 return GL_TEXTURE_2D; | |
| 75 } | |
| 76 | |
| 77 } // namespace | |
| 78 | |
| 79 class GLES2InterfaceForTests : public gpu::gles2::GLES2InterfaceStub { | |
| 80 public: | |
| 81 void BindTexture(GLenum target, GLuint texture) override | |
| 82 { | |
| 83 if (target != m_boundTextureTarget && texture == 0) | |
| 84 return; | |
| 85 | |
| 86 // For simplicity, only allow one target to ever be bound. | |
| 87 ASSERT_TRUE(m_boundTextureTarget == 0 || target == m_boundTextureTarget) ; | |
| 88 m_boundTextureTarget = target; | |
| 89 m_boundTexture = texture; | |
| 90 } | |
| 91 | |
| 92 GLuint64 InsertFenceSyncCHROMIUM() override | |
| 93 { | |
| 94 static GLuint64 syncPointGenerator = 0; | |
| 95 return ++syncPointGenerator; | |
| 96 } | |
| 97 | |
| 98 void WaitSyncTokenCHROMIUM(const GLbyte* syncToken) override | |
| 99 { | |
| 100 memcpy(&m_mostRecentlyWaitedSyncToken, syncToken, sizeof(m_mostRecentlyW aitedSyncToken)); | |
| 101 } | |
| 102 | |
| 103 GLenum CheckFramebufferStatus(GLenum target) override | |
| 104 { | |
| 105 return GL_FRAMEBUFFER_COMPLETE; | |
| 106 } | |
| 107 | |
| 108 void GetIntegerv(GLenum pname, GLint* value) override | |
| 109 { | |
| 110 if (pname == GL_MAX_TEXTURE_SIZE) | |
| 111 *value = 1024; | |
| 112 } | |
| 113 | |
| 114 void GenMailboxCHROMIUM(GLbyte* mailbox) override | |
| 115 { | |
| 116 ++m_currentMailboxByte; | |
| 117 memset(mailbox, m_currentMailboxByte, GL_MAILBOX_SIZE_CHROMIUM); | |
| 118 } | |
| 119 | |
| 120 void ProduceTextureDirectCHROMIUM(GLuint texture, GLenum target, const GLbyt e* mailbox) override | |
| 121 { | |
| 122 ASSERT_EQ(target, drawingBufferTextureTarget()); | |
| 123 | |
| 124 if (!m_createImageChromiumFail) { | |
| 125 ASSERT_TRUE(m_textureSizes.contains(texture)); | |
| 126 m_mostRecentlyProducedSize = m_textureSizes.get(texture); | |
| 127 } | |
| 128 } | |
| 129 | |
| 130 void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei wi dth, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixel s) override | |
| 131 { | |
| 132 if (target == GL_TEXTURE_2D && !level) { | |
| 133 m_textureSizes.set(m_boundTexture, IntSize(width, height)); | |
| 134 } | |
| 135 } | |
| 136 | |
| 137 GLuint CreateGpuMemoryBufferImageCHROMIUM(GLsizei width, GLsizei height, GLe num internalformat, GLenum usage) override | |
| 138 { | |
| 139 if (m_createImageChromiumFail) | |
| 140 return 0; | |
| 141 m_imageSizes.set(m_currentImageId, IntSize(width, height)); | |
| 142 return m_currentImageId++; | |
| 143 } | |
| 144 | |
| 145 MOCK_METHOD1(DestroyImageMock, void(GLuint imageId)); | |
| 146 void DestroyImageCHROMIUM(GLuint imageId) | |
| 147 { | |
| 148 m_imageSizes.remove(imageId); | |
| 149 // No textures should be bound to this. | |
| 150 ASSERT(m_imageToTextureMap.find(imageId) == m_imageToTextureMap.end()); | |
| 151 m_imageSizes.remove(imageId); | |
| 152 DestroyImageMock(imageId); | |
| 153 } | |
| 154 | |
| 155 MOCK_METHOD1(BindTexImage2DMock, void(GLint imageId)); | |
| 156 void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) | |
| 157 { | |
| 158 if (target == imageCHROMIUMTextureTarget()) { | |
| 159 m_textureSizes.set(m_boundTexture, m_imageSizes.find(imageId)->value ); | |
| 160 m_imageToTextureMap.set(imageId, m_boundTexture); | |
| 161 BindTexImage2DMock(imageId); | |
| 162 } | |
| 163 } | |
| 164 | |
| 165 MOCK_METHOD1(ReleaseTexImage2DMock, void(GLint imageId)); | |
| 166 void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) | |
| 167 { | |
| 168 if (target == imageCHROMIUMTextureTarget()) { | |
| 169 m_imageSizes.set(m_currentImageId, IntSize()); | |
| 170 m_imageToTextureMap.remove(imageId); | |
| 171 ReleaseTexImage2DMock(imageId); | |
| 172 } | |
| 173 } | |
| 174 | |
| 175 void GenSyncTokenCHROMIUM(GLuint64 fenceSync, GLbyte* syncToken) override | |
| 176 { | |
| 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)); | |
| 180 } | |
| 181 | |
| 182 void GenTextures(GLsizei n, GLuint* textures) override | |
| 183 { | |
| 184 static GLuint id = 1; | |
| 185 for (GLsizei i = 0; i < n; ++i) | |
| 186 textures[i] = id++; | |
| 187 } | |
| 188 | |
| 189 GLuint boundTexture() const { return m_boundTexture; } | |
| 190 GLuint boundTextureTarget() const { return m_boundTextureTarget; } | |
| 191 gpu::SyncToken mostRecentlyWaitedSyncToken() const { return m_mostRecentlyWa itedSyncToken; } | |
| 192 GLuint nextImageIdToBeCreated() const { return m_currentImageId; } | |
| 193 IntSize mostRecentlyProducedSize() const { return m_mostRecentlyProducedSize ; } | |
| 194 | |
| 195 void setCreateImageChromiumFail(bool fail) { m_createImageChromiumFail = fai l; } | |
| 196 | |
| 197 private: | |
| 198 GLuint m_boundTexture = 0; | |
| 199 GLuint m_boundTextureTarget = 0; | |
| 200 gpu::SyncToken m_mostRecentlyWaitedSyncToken; | |
| 201 GLbyte m_currentMailboxByte = 0; | |
| 202 IntSize m_mostRecentlyProducedSize; | |
| 203 bool m_createImageChromiumFail = false; | |
| 204 GLuint m_currentImageId = 1; | |
| 205 HashMap<GLuint, IntSize> m_textureSizes; | |
| 206 HashMap<GLuint, IntSize> m_imageSizes; | |
| 207 HashMap<GLuint, GLuint> m_imageToTextureMap; | |
| 208 }; | |
| 209 | |
| 210 static const int initialWidth = 100; | |
| 211 static const int initialHeight = 100; | |
| 212 static const int alternateHeight = 50; | |
| 213 | |
| 214 class DrawingBufferForTests : public DrawingBuffer { | |
| 215 public: | |
| 216 static PassRefPtr<DrawingBufferForTests> create(std::unique_ptr<WebGraphicsC ontext3DProvider> contextProvider, const IntSize& size, PreserveDrawingBuffer pr eserve) | |
| 217 { | |
| 218 std::unique_ptr<Extensions3DUtil> extensionsUtil = Extensions3DUtil::cre ate(contextProvider->contextGL()); | |
| 219 RefPtr<DrawingBufferForTests> drawingBuffer = adoptRef(new DrawingBuffer ForTests(std::move(contextProvider), std::move(extensionsUtil), preserve)); | |
| 220 bool multisampleExtensionSupported = false; | |
| 221 if (!drawingBuffer->initialize(size, multisampleExtensionSupported)) { | |
| 222 drawingBuffer->beginDestruction(); | |
| 223 return nullptr; | |
| 224 } | |
| 225 return drawingBuffer.release(); | |
| 226 } | |
| 227 | |
| 228 DrawingBufferForTests(std::unique_ptr<WebGraphicsContext3DProvider> contextP rovider, std::unique_ptr<Extensions3DUtil> extensionsUtil, PreserveDrawingBuffer preserve) | |
| 229 : DrawingBuffer(std::move(contextProvider), std::move(extensionsUtil), f alse /* discardFramebufferSupported */, | |
| 230 true /* wantAlphaChannel */, false /* premultipliedAlpha */, preserv e, WebGL1, | |
| 231 false /* wantDepth */, false /* wantStencil */) | |
| 232 , m_live(0) | |
| 233 { } | |
| 234 | |
| 235 ~DrawingBufferForTests() override | |
| 236 { | |
| 237 if (m_live) | |
| 238 *m_live = false; | |
| 239 } | |
| 240 | |
| 241 bool* m_live; | |
| 242 }; | |
| 243 | |
| 244 class WebGraphicsContext3DProviderForTests : public WebGraphicsContext3DProvider { | |
| 245 public: | |
| 246 WebGraphicsContext3DProviderForTests(std::unique_ptr<gpu::gles2::GLES2Interf ace> gl) | |
| 247 : m_gl(std::move(gl)) | |
| 248 { | |
| 249 } | |
| 250 | |
| 251 gpu::gles2::GLES2Interface* contextGL() override { return m_gl.get(); } | |
| 252 bool isSoftwareRendering() const override { return false; } | |
| 253 | |
| 254 // Not used by WebGL code. | |
| 255 GrContext* grContext() override { return nullptr; } | |
| 256 bool bindToCurrentThread() override { return false; } | |
| 257 gpu::Capabilities getCapabilities() override { return gpu::Capabilities(); } | |
| 258 void setLostContextCallback(WebClosure) {} | |
| 259 void setErrorMessageCallback(WebFunction<void(const char*, int32_t id)>) {} | |
| 260 | |
| 261 private: | |
| 262 std::unique_ptr<gpu::gles2::GLES2Interface> m_gl; | |
| 263 }; | |
| 264 | |
| 265 class DrawingBufferTest : public Test { | 53 class DrawingBufferTest : public Test { |
| 266 protected: | 54 protected: |
| 267 void SetUp() override | 55 void SetUp() override |
| 268 { | 56 { |
| 269 std::unique_ptr<GLES2InterfaceForTests> gl = wrapUnique(new GLES2Interfa ceForTests); | 57 std::unique_ptr<GLES2InterfaceForTests> gl = wrapUnique(new GLES2Interfa ceForTests); |
| 270 m_gl = gl.get(); | 58 m_gl = gl.get(); |
| 271 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider = wrapUni que(new WebGraphicsContext3DProviderForTests(std::move(gl))); | 59 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider = wrapUni que(new WebGraphicsContext3DProviderForTests(std::move(gl))); |
| 272 m_drawingBuffer = DrawingBufferForTests::create(std::move(provider), Int Size(initialWidth, initialHeight), DrawingBuffer::Preserve); | 60 m_drawingBuffer = DrawingBufferForTests::create(std::move(provider), Int Size(InitialWidth, InitialHeight), DrawingBuffer::Preserve); |
| 273 CHECK(m_drawingBuffer); | 61 CHECK(m_drawingBuffer); |
| 274 } | 62 } |
| 275 | 63 |
| 276 GLES2InterfaceForTests* m_gl; | 64 GLES2InterfaceForTests* m_gl; |
| 277 RefPtr<DrawingBufferForTests> m_drawingBuffer; | 65 RefPtr<DrawingBufferForTests> m_drawingBuffer; |
| 278 }; | 66 }; |
| 279 | 67 |
| 280 TEST_F(DrawingBufferTest, verifyResizingProperlyAffectsMailboxes) | 68 TEST_F(DrawingBufferTest, verifyResizingProperlyAffectsMailboxes) |
| 281 { | 69 { |
| 282 cc::TextureMailbox textureMailbox; | 70 cc::TextureMailbox textureMailbox; |
| 283 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; | 71 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; |
| 284 | 72 |
| 285 IntSize initialSize(initialWidth, initialHeight); | 73 IntSize initialSize(InitialWidth, InitialHeight); |
| 286 IntSize alternateSize(initialWidth, alternateHeight); | 74 IntSize alternateSize(InitialWidth, AlternateHeight); |
| 287 | 75 |
| 288 // Produce one mailbox at size 100x100. | 76 // Produce one mailbox at size 100x100. |
| 289 m_drawingBuffer->markContentsChanged(); | 77 m_drawingBuffer->markContentsChanged(); |
| 290 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release Callback)); | 78 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release Callback)); |
| 291 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); | 79 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); |
| 292 | 80 |
| 293 // Resize to 100x50. | 81 // Resize to 100x50. |
| 294 m_drawingBuffer->reset(IntSize(initialWidth, alternateHeight)); | 82 m_drawingBuffer->reset(IntSize(InitialWidth, AlternateHeight)); |
|
xidachen
2016/09/22 01:48:16
This is not introduced by your CL, but to be consi
| |
| 295 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); | 83 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); |
| 296 | 84 |
| 297 // Produce a mailbox at this size. | 85 // Produce a mailbox at this size. |
| 298 m_drawingBuffer->markContentsChanged(); | 86 m_drawingBuffer->markContentsChanged(); |
| 299 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release Callback)); | 87 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release Callback)); |
| 300 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize()); | 88 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize()); |
| 301 | 89 |
| 302 // Reset to initial size. | 90 // Reset to initial size. |
| 303 m_drawingBuffer->reset(IntSize(initialWidth, initialHeight)); | 91 m_drawingBuffer->reset(IntSize(InitialWidth, InitialHeight)); |
| 304 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); | 92 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); |
| 305 | 93 |
| 306 // Prepare another mailbox and verify that it's the correct size. | 94 // Prepare another mailbox and verify that it's the correct size. |
| 307 m_drawingBuffer->markContentsChanged(); | 95 m_drawingBuffer->markContentsChanged(); |
| 308 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release Callback)); | 96 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release Callback)); |
| 309 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); | 97 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); |
| 310 | 98 |
| 311 // Prepare one final mailbox and verify that it's the correct size. | 99 // Prepare one final mailbox and verify that it's the correct size. |
| 312 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); | 100 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); |
| 313 m_drawingBuffer->markContentsChanged(); | 101 m_drawingBuffer->markContentsChanged(); |
| 314 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release Callback)); | 102 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release Callback)); |
| 315 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); | 103 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); |
| 316 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); | 104 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); |
| 317 m_drawingBuffer->beginDestruction(); | 105 m_drawingBuffer->beginDestruction(); |
| 318 } | 106 } |
| 319 | 107 |
| 320 TEST_F(DrawingBufferTest, verifyDestructionCompleteAfterAllMailboxesReleased) | 108 TEST_F(DrawingBufferTest, verifyDestructionCompleteAfterAllMailboxesReleased) |
| 321 { | 109 { |
| 322 bool live = true; | 110 bool live = true; |
| 323 m_drawingBuffer->m_live = &live; | 111 m_drawingBuffer->m_live = &live; |
| 324 | 112 |
| 325 cc::TextureMailbox textureMailbox1; | 113 cc::TextureMailbox textureMailbox1; |
| 326 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1; | 114 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1; |
| 327 cc::TextureMailbox textureMailbox2; | 115 cc::TextureMailbox textureMailbox2; |
| 328 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2; | 116 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2; |
| 329 cc::TextureMailbox textureMailbox3; | 117 cc::TextureMailbox textureMailbox3; |
| 330 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3; | 118 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3; |
| 331 | 119 |
| 332 IntSize initialSize(initialWidth, initialHeight); | 120 IntSize initialSize(InitialWidth, InitialHeight); |
|
Ken Russell (switch to Gerrit)
2016/09/22 00:57:59
Unused?
| |
| 333 | 121 |
| 334 // Produce mailboxes. | 122 // Produce mailboxes. |
| 335 m_drawingBuffer->markContentsChanged(); | 123 m_drawingBuffer->markContentsChanged(); |
| 336 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1, &releas eCallback1)); | 124 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1, &releas eCallback1)); |
| 337 m_drawingBuffer->markContentsChanged(); | 125 m_drawingBuffer->markContentsChanged(); |
| 338 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2, &releas eCallback2)); | 126 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2, &releas eCallback2)); |
| 339 m_drawingBuffer->markContentsChanged(); | 127 m_drawingBuffer->markContentsChanged(); |
| 340 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3, &releas eCallback3)); | 128 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox3, &releas eCallback3)); |
| 341 | 129 |
| 342 m_drawingBuffer->markContentsChanged(); | 130 m_drawingBuffer->markContentsChanged(); |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 478 protected: | 266 protected: |
| 479 void SetUp() override | 267 void SetUp() override |
| 480 { | 268 { |
| 481 std::unique_ptr<GLES2InterfaceForTests> gl = wrapUnique(new GLES2Interfa ceForTests); | 269 std::unique_ptr<GLES2InterfaceForTests> gl = wrapUnique(new GLES2Interfa ceForTests); |
| 482 m_gl = gl.get(); | 270 m_gl = gl.get(); |
| 483 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider = wrapUni que(new WebGraphicsContext3DProviderForTests(std::move(gl))); | 271 std::unique_ptr<WebGraphicsContext3DProviderForTests> provider = wrapUni que(new WebGraphicsContext3DProviderForTests(std::move(gl))); |
| 484 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(true); | 272 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(true); |
| 485 m_imageId0 = m_gl->nextImageIdToBeCreated(); | 273 m_imageId0 = m_gl->nextImageIdToBeCreated(); |
| 486 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId0)).Times(1); | 274 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId0)).Times(1); |
| 487 m_drawingBuffer = DrawingBufferForTests::create(std::move(provider), | 275 m_drawingBuffer = DrawingBufferForTests::create(std::move(provider), |
| 488 IntSize(initialWidth, initialHeight), DrawingBuffer::Preserve); | 276 IntSize(InitialWidth, InitialHeight), DrawingBuffer::Preserve); |
| 489 CHECK(m_drawingBuffer); | 277 CHECK(m_drawingBuffer); |
| 490 testing::Mock::VerifyAndClearExpectations(m_gl); | 278 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 491 } | 279 } |
| 492 | 280 |
| 493 void TearDown() override | 281 void TearDown() override |
| 494 { | 282 { |
| 495 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(false); | 283 RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(false); |
| 496 } | 284 } |
| 497 | 285 |
| 498 GLuint m_imageId0; | 286 GLuint m_imageId0; |
| 499 }; | 287 }; |
| 500 | 288 |
| 501 TEST_F(DrawingBufferImageChromiumTest, verifyResizingReallocatesImages) | 289 TEST_F(DrawingBufferImageChromiumTest, verifyResizingReallocatesImages) |
| 502 { | 290 { |
| 503 cc::TextureMailbox textureMailbox; | 291 cc::TextureMailbox textureMailbox; |
| 504 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; | 292 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; |
| 505 | 293 |
| 506 IntSize initialSize(initialWidth, initialHeight); | 294 IntSize initialSize(InitialWidth, InitialHeight); |
| 507 IntSize alternateSize(initialWidth, alternateHeight); | 295 IntSize alternateSize(InitialWidth, AlternateHeight); |
| 508 | 296 |
| 509 GLuint m_imageId1 = m_gl->nextImageIdToBeCreated(); | 297 GLuint m_imageId1 = m_gl->nextImageIdToBeCreated(); |
| 510 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId1)).Times(1); | 298 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId1)).Times(1); |
| 511 // Produce one mailbox at size 100x100. | 299 // Produce one mailbox at size 100x100. |
| 512 m_drawingBuffer->markContentsChanged(); | 300 m_drawingBuffer->markContentsChanged(); |
| 513 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release Callback)); | 301 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release Callback)); |
| 514 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); | 302 EXPECT_EQ(initialSize, m_gl->mostRecentlyProducedSize()); |
| 515 EXPECT_TRUE(textureMailbox.is_overlay_candidate()); | 303 EXPECT_TRUE(textureMailbox.is_overlay_candidate()); |
| 516 testing::Mock::VerifyAndClearExpectations(m_gl); | 304 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 517 | 305 |
| 518 GLuint m_imageId2 = m_gl->nextImageIdToBeCreated(); | 306 GLuint m_imageId2 = m_gl->nextImageIdToBeCreated(); |
| 519 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId2)).Times(1); | 307 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId2)).Times(1); |
| 520 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId0)).Times(1); | 308 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId0)).Times(1); |
| 521 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId0)).Times(1); | 309 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId0)).Times(1); |
| 522 // Resize to 100x50. | 310 // Resize to 100x50. |
| 523 m_drawingBuffer->reset(IntSize(initialWidth, alternateHeight)); | 311 m_drawingBuffer->reset(IntSize(InitialWidth, AlternateHeight)); |
| 524 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); | 312 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); |
| 525 testing::Mock::VerifyAndClearExpectations(m_gl); | 313 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 526 | 314 |
| 527 GLuint m_imageId3 = m_gl->nextImageIdToBeCreated(); | 315 GLuint m_imageId3 = m_gl->nextImageIdToBeCreated(); |
| 528 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId3)).Times(1); | 316 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId3)).Times(1); |
| 529 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId1)).Times(1); | 317 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId1)).Times(1); |
| 530 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId1)).Times(1); | 318 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId1)).Times(1); |
| 531 // Produce a mailbox at this size. | 319 // Produce a mailbox at this size. |
| 532 m_drawingBuffer->markContentsChanged(); | 320 m_drawingBuffer->markContentsChanged(); |
| 533 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release Callback)); | 321 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release Callback)); |
| 534 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize()); | 322 EXPECT_EQ(alternateSize, m_gl->mostRecentlyProducedSize()); |
| 535 EXPECT_TRUE(textureMailbox.is_overlay_candidate()); | 323 EXPECT_TRUE(textureMailbox.is_overlay_candidate()); |
| 536 testing::Mock::VerifyAndClearExpectations(m_gl); | 324 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 537 | 325 |
| 538 GLuint m_imageId4 = m_gl->nextImageIdToBeCreated(); | 326 GLuint m_imageId4 = m_gl->nextImageIdToBeCreated(); |
| 539 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId4)).Times(1); | 327 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId4)).Times(1); |
| 540 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId2)).Times(1); | 328 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId2)).Times(1); |
| 541 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId2)).Times(1); | 329 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId2)).Times(1); |
| 542 // Reset to initial size. | 330 // Reset to initial size. |
| 543 m_drawingBuffer->reset(IntSize(initialWidth, initialHeight)); | 331 m_drawingBuffer->reset(initialSize); |
| 544 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); | 332 releaseCallback->Run(gpu::SyncToken(), false /* lostResource */); |
| 545 testing::Mock::VerifyAndClearExpectations(m_gl); | 333 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 546 | 334 |
| 547 GLuint m_imageId5 = m_gl->nextImageIdToBeCreated(); | 335 GLuint m_imageId5 = m_gl->nextImageIdToBeCreated(); |
| 548 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId5)).Times(1); | 336 EXPECT_CALL(*m_gl, BindTexImage2DMock(m_imageId5)).Times(1); |
| 549 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId3)).Times(1); | 337 EXPECT_CALL(*m_gl, DestroyImageMock(m_imageId3)).Times(1); |
| 550 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId3)).Times(1); | 338 EXPECT_CALL(*m_gl, ReleaseTexImage2DMock(m_imageId3)).Times(1); |
| 551 // Prepare another mailbox and verify that it's the correct size. | 339 // Prepare another mailbox and verify that it's the correct size. |
| 552 m_drawingBuffer->markContentsChanged(); | 340 m_drawingBuffer->markContentsChanged(); |
| 553 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release Callback)); | 341 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox, &release Callback)); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 576 cc::TextureMailbox textureMailbox1; | 364 cc::TextureMailbox textureMailbox1; |
| 577 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1; | 365 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback1; |
| 578 cc::TextureMailbox textureMailbox2; | 366 cc::TextureMailbox textureMailbox2; |
| 579 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2; | 367 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback2; |
| 580 cc::TextureMailbox textureMailbox3; | 368 cc::TextureMailbox textureMailbox3; |
| 581 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3; | 369 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback3; |
| 582 | 370 |
| 583 // Request a mailbox. An image should already be created. Everything works | 371 // Request a mailbox. An image should already be created. Everything works |
| 584 // as expected. | 372 // as expected. |
| 585 EXPECT_CALL(*m_gl, BindTexImage2DMock(_)).Times(1); | 373 EXPECT_CALL(*m_gl, BindTexImage2DMock(_)).Times(1); |
| 586 IntSize initialSize(initialWidth, initialHeight); | 374 IntSize initialSize(InitialWidth, InitialHeight); |
| 587 m_drawingBuffer->markContentsChanged(); | 375 m_drawingBuffer->markContentsChanged(); |
| 588 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1, &releas eCallback1)); | 376 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox1, &releas eCallback1)); |
| 589 EXPECT_TRUE(textureMailbox1.is_overlay_candidate()); | 377 EXPECT_TRUE(textureMailbox1.is_overlay_candidate()); |
| 590 testing::Mock::VerifyAndClearExpectations(m_gl); | 378 testing::Mock::VerifyAndClearExpectations(m_gl); |
| 591 | 379 |
| 592 // Force image CHROMIUM creation failure. Request another mailbox. It should | 380 // Force image CHROMIUM creation failure. Request another mailbox. It should |
| 593 // still be provided, but this time with allowOverlay = false. | 381 // still be provided, but this time with allowOverlay = false. |
| 594 m_gl->setCreateImageChromiumFail(true); | 382 m_gl->setCreateImageChromiumFail(true); |
| 595 m_drawingBuffer->markContentsChanged(); | 383 m_drawingBuffer->markContentsChanged(); |
| 596 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2, &releas eCallback2)); | 384 EXPECT_TRUE(m_drawingBuffer->PrepareTextureMailbox(&textureMailbox2, &releas eCallback2)); |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 770 m_drawingBuffer->setIsHidden(true); | 558 m_drawingBuffer->setIsHidden(true); |
| 771 releaseCallback->Run(waitSyncToken, false /* lostResource */); | 559 releaseCallback->Run(waitSyncToken, false /* lostResource */); |
| 772 // m_drawingBuffer deletes mailbox immediately when hidden. | 560 // m_drawingBuffer deletes mailbox immediately when hidden. |
| 773 | 561 |
| 774 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken()); | 562 EXPECT_EQ(waitSyncToken, m_gl->mostRecentlyWaitedSyncToken()); |
| 775 | 563 |
| 776 m_drawingBuffer->beginDestruction(); | 564 m_drawingBuffer->beginDestruction(); |
| 777 } | 565 } |
| 778 | 566 |
| 779 } // namespace blink | 567 } // namespace blink |
| OLD | NEW |