Chromium Code Reviews| Index: third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTestHelpers.h |
| diff --git a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTestHelpers.h b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTestHelpers.h |
| index 8ee8c7beb228ae9f03ab58cb1585c862520e5a24..d652f7255a437508e4a435690529da8e39e6fa07 100644 |
| --- a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTestHelpers.h |
| +++ b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTestHelpers.h |
| @@ -8,6 +8,7 @@ |
| #include "platform/graphics/gpu/Extensions3DUtil.h" |
| #include "public/platform/WebGraphicsContext3DProvider.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| namespace blink { |
| @@ -21,13 +22,14 @@ class DrawingBufferForTests : public DrawingBuffer { |
| public: |
| static PassRefPtr<DrawingBufferForTests> create( |
| std::unique_ptr<WebGraphicsContext3DProvider> contextProvider, |
| + DrawingBuffer::Client* client, |
| const IntSize& size, |
| PreserveDrawingBuffer preserve) { |
| std::unique_ptr<Extensions3DUtil> extensionsUtil = |
| Extensions3DUtil::create(contextProvider->contextGL()); |
| - RefPtr<DrawingBufferForTests> drawingBuffer = |
| - adoptRef(new DrawingBufferForTests( |
| - std::move(contextProvider), std::move(extensionsUtil), preserve)); |
| + RefPtr<DrawingBufferForTests> drawingBuffer = adoptRef( |
| + new DrawingBufferForTests(std::move(contextProvider), |
| + std::move(extensionsUtil), client, preserve)); |
| bool multisampleExtensionSupported = false; |
| if (!drawingBuffer->initialize(size, multisampleExtensionSupported)) { |
| drawingBuffer->beginDestruction(); |
| @@ -39,10 +41,12 @@ class DrawingBufferForTests : public DrawingBuffer { |
| DrawingBufferForTests( |
| std::unique_ptr<WebGraphicsContext3DProvider> contextProvider, |
| std::unique_ptr<Extensions3DUtil> extensionsUtil, |
| + DrawingBuffer::Client* client, |
| PreserveDrawingBuffer preserve) |
| : DrawingBuffer( |
| std::move(contextProvider), |
| std::move(extensionsUtil), |
| + client, |
| false /* discardFramebufferSupported */, |
| true /* wantAlphaChannel */, |
| false /* premultipliedAlpha */, |
| @@ -101,16 +105,88 @@ GLenum drawingBufferTextureTarget() { |
| return GL_TEXTURE_2D; |
| } |
| -class GLES2InterfaceForTests : public gpu::gles2::GLES2InterfaceStub { |
| +class GLES2InterfaceForTests : public gpu::gles2::GLES2InterfaceStub, |
| + public DrawingBuffer::Client { |
| public: |
| + // GLES2InterfaceStub implementation: |
| void BindTexture(GLenum target, GLuint texture) override { |
| - if (target != m_boundTextureTarget && texture == 0) |
| - return; |
| + if (target == GL_TEXTURE_2D) |
| + m_state.activeTexture2DBinding = texture; |
| + m_boundTextures[target] = texture; |
| + } |
| + |
| + void BindFramebuffer(GLenum target, GLuint framebuffer) override { |
| + switch (target) { |
| + case GL_FRAMEBUFFER: |
| + m_state.drawFramebufferBinding = framebuffer; |
| + m_state.readFramebufferBinding = framebuffer; |
| + break; |
| + case GL_DRAW_FRAMEBUFFER: |
| + m_state.drawFramebufferBinding = framebuffer; |
| + break; |
| + case GL_READ_FRAMEBUFFER: |
| + m_state.readFramebufferBinding = framebuffer; |
| + break; |
| + default: |
| + break; |
| + } |
| + } |
| + |
| + void BindRenderbuffer(GLenum target, GLuint renderbuffer) override { |
| + m_state.renderbufferBinding = renderbuffer; |
| + } |
| + |
| + void Enable(GLenum cap) { |
| + if (cap == GL_SCISSOR_TEST) |
| + m_state.scissorEnabled = true; |
| + } |
| + |
| + void Disable(GLenum cap) { |
| + if (cap == GL_SCISSOR_TEST) |
| + m_state.scissorEnabled = false; |
| + } |
| + |
| + void ClearColor(GLfloat red, |
| + GLfloat green, |
| + GLfloat blue, |
| + GLfloat alpha) override { |
| + m_state.clearColor[0] = red; |
| + m_state.clearColor[1] = green; |
| + m_state.clearColor[2] = blue; |
| + m_state.clearColor[3] = alpha; |
| + } |
| + |
| + void ClearDepthf(GLfloat depth) override { m_state.clearDepth = depth; } |
| + |
| + void ClearStencil(GLint s) override { m_state.clearStencil = s; } |
| + |
| + void ColorMask(GLboolean red, |
| + GLboolean green, |
| + GLboolean blue, |
| + GLboolean alpha) override { |
| + m_state.colorMask[0] = red; |
| + m_state.colorMask[1] = green; |
| + m_state.colorMask[2] = blue; |
| + m_state.colorMask[3] = alpha; |
| + } |
| + |
| + void DepthMask(GLboolean flag) override { m_state.depthMask = flag; } |
| + |
| + void StencilMask(GLuint mask) override { m_state.stencilMask = mask; } |
| + |
| + void StencilMaskSeparate(GLenum face, GLuint mask) override { |
| + if (face == GL_FRONT) |
| + m_state.stencilMask = mask; |
| + } |
| - // For simplicity, only allow one target to ever be bound. |
| - ASSERT_TRUE(m_boundTextureTarget == 0 || target == m_boundTextureTarget); |
| - m_boundTextureTarget = target; |
| - m_boundTexture = texture; |
| + void PixelStorei(GLenum pname, GLint param) override { |
| + if (pname == GL_PACK_ALIGNMENT) |
| + m_state.packAlignment = param; |
| + } |
| + |
| + void BindBuffer(GLenum target, GLuint buffer) override { |
| + if (target == GL_PIXEL_UNPACK_BUFFER) |
| + m_state.pixelUnpackBufferBinding = buffer; |
| } |
| GLuint64 InsertFenceSyncCHROMIUM() override { |
| @@ -158,7 +234,7 @@ class GLES2InterfaceForTests : public gpu::gles2::GLES2InterfaceStub { |
| GLenum type, |
| const void* pixels) override { |
| if (target == GL_TEXTURE_2D && !level) { |
| - m_textureSizes.set(m_boundTexture, IntSize(width, height)); |
| + m_textureSizes.set(m_boundTextures[target], IntSize(width, height)); |
| } |
| } |
| @@ -184,8 +260,9 @@ class GLES2InterfaceForTests : public gpu::gles2::GLES2InterfaceStub { |
| MOCK_METHOD1(BindTexImage2DMock, void(GLint imageId)); |
| void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) { |
| if (target == imageCHROMIUMTextureTarget()) { |
| - m_textureSizes.set(m_boundTexture, m_imageSizes.find(imageId)->value); |
| - m_imageToTextureMap.set(imageId, m_boundTexture); |
| + m_textureSizes.set(m_boundTextures[target], |
| + m_imageSizes.find(imageId)->value); |
| + m_imageToTextureMap.set(imageId, m_boundTextures[target]); |
| BindTexImage2DMock(imageId); |
| } |
| } |
| @@ -212,8 +289,42 @@ class GLES2InterfaceForTests : public gpu::gles2::GLES2InterfaceStub { |
| textures[i] = id++; |
| } |
| - GLuint boundTexture() const { return m_boundTexture; } |
| - GLuint boundTextureTarget() const { return m_boundTextureTarget; } |
| + // DrawingBuffer::Client implementation. |
| + bool DrawingBufferClientIsBoundForDraw() override { |
| + return !m_state.drawFramebufferBinding; |
| + } |
| + void DrawingBufferClientRestoreScissorTest() override { |
| + m_state.scissorEnabled = m_savedState.scissorEnabled; |
| + } |
| + void DrawingBufferClientRestoreMaskAndClearValues() override { |
| + memcpy(m_state.colorMask, m_savedState.colorMask, |
| + sizeof(m_state.colorMask)); |
| + m_state.clearDepth = m_savedState.clearDepth; |
| + m_state.clearStencil = m_savedState.clearStencil; |
| + |
| + memcpy(m_state.clearColor, m_savedState.clearColor, |
| + sizeof(m_state.clearColor)); |
| + m_state.depthMask = m_savedState.depthMask; |
| + m_state.stencilMask = m_savedState.stencilMask; |
| + } |
| + void DrawingBufferClientRestorePixelPackAlignment() override { |
| + m_state.packAlignment = m_savedState.packAlignment; |
| + } |
| + void DrawingBufferClientRestoreTexture2DBinding() override { |
| + m_state.activeTexture2DBinding = m_savedState.activeTexture2DBinding; |
| + } |
| + void DrawingBufferClientRestoreRenderbufferBinding() override { |
| + m_state.renderbufferBinding = m_savedState.renderbufferBinding; |
| + } |
| + void DrawingBufferClientRestoreFramebufferBinding() override { |
| + m_state.drawFramebufferBinding = m_savedState.drawFramebufferBinding; |
| + m_state.readFramebufferBinding = m_savedState.readFramebufferBinding; |
| + } |
| + void DrawingBufferClientRestorePixelUnpackBufferBinding() override { |
| + m_state.pixelUnpackBufferBinding = m_savedState.pixelUnpackBufferBinding; |
| + } |
| + |
| + // Testing methods. |
| gpu::SyncToken mostRecentlyWaitedSyncToken() const { |
| return m_mostRecentlyWaitedSyncToken; |
| } |
| @@ -226,9 +337,56 @@ class GLES2InterfaceForTests : public gpu::gles2::GLES2InterfaceStub { |
| m_createImageChromiumFail = fail; |
| } |
| + // Saves current GL state for later verification. |
| + void SaveState() { m_savedState = m_state; } |
| + void VeriyStateHasNotChangedSinceSave() const { |
|
Ken Russell (switch to Gerrit)
2016/10/11 06:21:57
typo: Veriy -> Verify
ccameron
2016/10/20 23:50:46
Done.
|
| + for (size_t i = 0; i < 4; ++i) { |
| + EXPECT_EQ(m_state.clearColor[0], m_savedState.clearColor[0]); |
| + EXPECT_EQ(m_state.colorMask[0], m_savedState.colorMask[0]); |
| + } |
| + EXPECT_EQ(m_state.clearDepth, m_savedState.clearDepth); |
| + EXPECT_EQ(m_state.clearStencil, m_savedState.clearStencil); |
| + EXPECT_EQ(m_state.depthMask, m_savedState.depthMask); |
| + EXPECT_EQ(m_state.stencilMask, m_savedState.stencilMask); |
| + EXPECT_EQ(m_state.packAlignment, m_savedState.packAlignment); |
| + EXPECT_EQ(m_state.activeTexture2DBinding, |
| + m_savedState.activeTexture2DBinding); |
| + EXPECT_EQ(m_state.renderbufferBinding, m_savedState.renderbufferBinding); |
| + EXPECT_EQ(m_state.drawFramebufferBinding, |
| + m_savedState.drawFramebufferBinding); |
| + EXPECT_EQ(m_state.readFramebufferBinding, |
| + m_savedState.readFramebufferBinding); |
| + EXPECT_EQ(m_state.pixelUnpackBufferBinding, |
| + m_savedState.pixelUnpackBufferBinding); |
| + } |
| + |
| private: |
| - GLuint m_boundTexture = 0; |
| - GLuint m_boundTextureTarget = 0; |
| + std::map<GLenum, GLuint> m_boundTextures; |
| + |
| + // State tracked to verify that it is restored correctly. |
| + struct State { |
| + bool scissorEnabled = false; |
| + |
| + GLfloat clearColor[4] = {0, 0, 0, 0}; |
| + GLfloat clearDepth = 0; |
| + GLint clearStencil = 0; |
| + |
| + GLboolean colorMask[4] = {0, 0, 0, 0}; |
| + GLboolean depthMask = 0; |
| + GLuint stencilMask = 0; |
| + |
| + GLint packAlignment = 4; |
| + |
| + // The bound 2D texture for the active texture unit. |
| + GLuint activeTexture2DBinding = 0; |
| + GLuint renderbufferBinding = 0; |
| + GLuint drawFramebufferBinding = 0; |
| + GLuint readFramebufferBinding = 0; |
| + GLuint pixelUnpackBufferBinding = 0; |
| + }; |
| + State m_state; |
| + State m_savedState; |
| + |
| gpu::SyncToken m_mostRecentlyWaitedSyncToken; |
| GLbyte m_currentMailboxByte = 0; |
| IntSize m_mostRecentlyProducedSize; |