diff options
Diffstat (limited to 'Source/WebKit/chromium/tests/CCRendererGLTest.cpp')
| -rw-r--r-- | Source/WebKit/chromium/tests/CCRendererGLTest.cpp | 447 | 
1 files changed, 0 insertions, 447 deletions
diff --git a/Source/WebKit/chromium/tests/CCRendererGLTest.cpp b/Source/WebKit/chromium/tests/CCRendererGLTest.cpp deleted file mode 100644 index 75e653d6f..000000000 --- a/Source/WebKit/chromium/tests/CCRendererGLTest.cpp +++ /dev/null @@ -1,447 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1.  Redistributions of source code must retain the above copyright - *     notice, this list of conditions and the following disclaimer. - * 2.  Redistributions in binary form must reproduce the above copyright - *     notice, this list of conditions and the following disclaimer in the - *     documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "CCRendererGL.h" - -#include "CCDrawQuad.h" -#include "CCPrioritizedTextureManager.h" -#include "CCSettings.h" -#include "CCSingleThreadProxy.h" -#include "CCTestCommon.h" -#include "FakeWebCompositorOutputSurface.h" -#include "FakeWebGraphicsContext3D.h" -#include "GraphicsContext3D.h" -#include "WebCompositorInitializer.h" -#include <gmock/gmock.h> -#include <gtest/gtest.h> -#include <public/WebTransformationMatrix.h> - -using namespace WebCore; -using namespace WebKit; -using namespace WebKitTests; - -class FrameCountingMemoryAllocationSettingContext : public FakeWebGraphicsContext3D { -public: -    FrameCountingMemoryAllocationSettingContext() : m_frame(0) { } - -    // WebGraphicsContext3D methods. - -    // This method would normally do a glSwapBuffers under the hood. -    virtual void prepareTexture() { m_frame++; } -    virtual void setMemoryAllocationChangedCallbackCHROMIUM(WebGraphicsMemoryAllocationChangedCallbackCHROMIUM* callback) { m_memoryAllocationChangedCallback = callback; } -    virtual WebString getString(WebKit::WGC3Denum name) -    { -        if (name == GraphicsContext3D::EXTENSIONS) -            return WebString("GL_CHROMIUM_set_visibility GL_CHROMIUM_gpu_memory_manager GL_CHROMIUM_discard_framebuffer"); -        return WebString(); -    } - -    // Methods added for test. -    int frameCount() { return m_frame; } -    void setMemoryAllocation(WebGraphicsMemoryAllocation allocation) -    { -        ASSERT(CCProxy::isImplThread()); -        // In single threaded mode we expect this callback on main thread. -        DebugScopedSetMainThread main; -        m_memoryAllocationChangedCallback->onMemoryAllocationChanged(allocation); -    } - -private: -    int m_frame; -    WebGraphicsMemoryAllocationChangedCallbackCHROMIUM* m_memoryAllocationChangedCallback; -}; - -class FakeCCRendererClient : public CCRendererClient { -public: -    FakeCCRendererClient() -        : m_setFullRootLayerDamageCount(0) -        , m_rootLayer(CCLayerImpl::create(1)) -        , m_memoryAllocationLimitBytes(CCPrioritizedTextureManager::defaultMemoryAllocationLimit()) -    { -        m_rootLayer->createRenderSurface(); -        CCRenderPass::Id renderPassId = m_rootLayer->renderSurface()->renderPassId(); -        OwnPtr<CCRenderPass> rootRenderPass = CCRenderPass::create(renderPassId, IntRect(), WebTransformationMatrix()); -        m_renderPassesInDrawOrder.append(rootRenderPass.get()); -        m_renderPasses.set(renderPassId, rootRenderPass.release()); -    } - -    // CCRendererClient methods. -    virtual const IntSize& deviceViewportSize() const OVERRIDE { static IntSize fakeSize(1, 1); return fakeSize; } -    virtual const CCLayerTreeSettings& settings() const OVERRIDE { static CCLayerTreeSettings fakeSettings; return fakeSettings; } -    virtual void didLoseContext() OVERRIDE { } -    virtual void onSwapBuffersComplete() OVERRIDE { } -    virtual void setFullRootLayerDamage() OVERRIDE { m_setFullRootLayerDamageCount++; } -    virtual void releaseContentsTextures() OVERRIDE { } -    virtual void setMemoryAllocationLimitBytes(size_t bytes) OVERRIDE { m_memoryAllocationLimitBytes = bytes; } - -    // Methods added for test. -    int setFullRootLayerDamageCount() const { return m_setFullRootLayerDamageCount; } - -    CCRenderPass* rootRenderPass() { return m_renderPassesInDrawOrder.last(); } -    const CCRenderPassList& renderPassesInDrawOrder() const { return m_renderPassesInDrawOrder; } -    const CCRenderPassIdHashMap& renderPasses() const { return m_renderPasses; } - -    size_t memoryAllocationLimitBytes() const { return m_memoryAllocationLimitBytes; } - -private: -    int m_setFullRootLayerDamageCount; -    DebugScopedSetImplThread m_implThread; -    OwnPtr<CCLayerImpl> m_rootLayer; -    CCRenderPassList m_renderPassesInDrawOrder; -    CCRenderPassIdHashMap m_renderPasses; -    size_t m_memoryAllocationLimitBytes; -}; - -class FakeCCRendererGL : public CCRendererGL { -public: -    FakeCCRendererGL(CCRendererClient* client, CCResourceProvider* resourceProvider) : CCRendererGL(client, resourceProvider, UnthrottledUploader) { } - -    // CCRendererGL methods. - -    // Changing visibility to public. -    using CCRendererGL::initialize; -    using CCRendererGL::isFramebufferDiscarded; -}; - -class CCRendererGLTest : public testing::Test { -protected: -    CCRendererGLTest() -        : m_suggestHaveBackbufferYes(1, true) -        , m_suggestHaveBackbufferNo(1, false) -        , m_compositorInitializer(0) -        , m_context(FakeWebCompositorOutputSurface::create(adoptPtr(new FrameCountingMemoryAllocationSettingContext()))) -        , m_resourceProvider(CCResourceProvider::create(m_context.get())) -        , m_renderer(&m_mockClient, m_resourceProvider.get()) -    { -    } - -    virtual void SetUp() -    { -        m_renderer.initialize(); -    } - -    void swapBuffers() -    { -        m_renderer.swapBuffers(); -    } - -    FrameCountingMemoryAllocationSettingContext* context() { return static_cast<FrameCountingMemoryAllocationSettingContext*>(m_context->context3D()); } - -    WebGraphicsMemoryAllocation m_suggestHaveBackbufferYes; -    WebGraphicsMemoryAllocation m_suggestHaveBackbufferNo; - -    WebCompositorInitializer m_compositorInitializer; -    OwnPtr<CCGraphicsContext> m_context; -    FakeCCRendererClient m_mockClient; -    OwnPtr<CCResourceProvider> m_resourceProvider; -    FakeCCRendererGL m_renderer; -    CCScopedSettings m_scopedSettings; -}; - -// Test CCRendererGL discardFramebuffer functionality: -// Suggest recreating framebuffer when one already exists. -// Expected: it does nothing. -TEST_F(CCRendererGLTest, SuggestBackbufferYesWhenItAlreadyExistsShouldDoNothing) -{ -    context()->setMemoryAllocation(m_suggestHaveBackbufferYes); -    EXPECT_EQ(0, m_mockClient.setFullRootLayerDamageCount()); -    EXPECT_FALSE(m_renderer.isFramebufferDiscarded()); - -    swapBuffers(); -    EXPECT_EQ(1, context()->frameCount()); -} - -// Test CCRendererGL discardFramebuffer functionality: -// Suggest discarding framebuffer when one exists and the renderer is not visible. -// Expected: it is discarded and damage tracker is reset. -TEST_F(CCRendererGLTest, SuggestBackbufferNoShouldDiscardBackbufferAndDamageRootLayerWhileNotVisible) -{ -    m_renderer.setVisible(false); -    context()->setMemoryAllocation(m_suggestHaveBackbufferNo); -    EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); -    EXPECT_TRUE(m_renderer.isFramebufferDiscarded()); -} - -// Test CCRendererGL discardFramebuffer functionality: -// Suggest discarding framebuffer when one exists and the renderer is visible. -// Expected: the allocation is ignored. -TEST_F(CCRendererGLTest, SuggestBackbufferNoDoNothingWhenVisible) -{ -    m_renderer.setVisible(true); -    context()->setMemoryAllocation(m_suggestHaveBackbufferNo); -    EXPECT_EQ(0, m_mockClient.setFullRootLayerDamageCount()); -    EXPECT_FALSE(m_renderer.isFramebufferDiscarded()); -} - - -// Test CCRendererGL discardFramebuffer functionality: -// Suggest discarding framebuffer when one does not exist. -// Expected: it does nothing. -TEST_F(CCRendererGLTest, SuggestBackbufferNoWhenItDoesntExistShouldDoNothing) -{ -    m_renderer.setVisible(false); -    context()->setMemoryAllocation(m_suggestHaveBackbufferNo); -    EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); -    EXPECT_TRUE(m_renderer.isFramebufferDiscarded()); - -    context()->setMemoryAllocation(m_suggestHaveBackbufferNo); -    EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); -    EXPECT_TRUE(m_renderer.isFramebufferDiscarded()); -} - -// Test CCRendererGL discardFramebuffer functionality: -// Begin drawing a frame while a framebuffer is discarded. -// Expected: will recreate framebuffer. -TEST_F(CCRendererGLTest, DiscardedBackbufferIsRecreatedForScopeDuration) -{ -    m_renderer.setVisible(false); -    context()->setMemoryAllocation(m_suggestHaveBackbufferNo); -    EXPECT_TRUE(m_renderer.isFramebufferDiscarded()); -    EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); - -    m_renderer.setVisible(true); -    m_renderer.drawFrame(m_mockClient.renderPassesInDrawOrder(), m_mockClient.renderPasses()); -    EXPECT_FALSE(m_renderer.isFramebufferDiscarded()); - -    swapBuffers(); -    EXPECT_EQ(1, context()->frameCount()); -} - -TEST_F(CCRendererGLTest, FramebufferDiscardedAfterReadbackWhenNotVisible) -{ -    m_renderer.setVisible(false); -    context()->setMemoryAllocation(m_suggestHaveBackbufferNo); -    EXPECT_TRUE(m_renderer.isFramebufferDiscarded()); -    EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount()); - -    char pixels[4]; -    m_renderer.drawFrame(m_mockClient.renderPassesInDrawOrder(), m_mockClient.renderPasses()); -    EXPECT_FALSE(m_renderer.isFramebufferDiscarded()); - -    m_renderer.getFramebufferPixels(pixels, IntRect(0, 0, 1, 1)); -    EXPECT_TRUE(m_renderer.isFramebufferDiscarded()); -    EXPECT_EQ(2, m_mockClient.setFullRootLayerDamageCount()); -} - -class ForbidSynchronousCallContext : public FakeWebGraphicsContext3D { -public: -    ForbidSynchronousCallContext() { } - -    virtual bool getActiveAttrib(WebGLId program, WGC3Duint index, ActiveInfo&) { ADD_FAILURE(); return false; } -    virtual bool getActiveUniform(WebGLId program, WGC3Duint index, ActiveInfo&) { ADD_FAILURE(); return false; } -    virtual void getAttachedShaders(WebGLId program, WGC3Dsizei maxCount, WGC3Dsizei* count, WebGLId* shaders) { ADD_FAILURE(); } -    virtual WGC3Dint getAttribLocation(WebGLId program, const WGC3Dchar* name) { ADD_FAILURE(); return 0; } -    virtual void getBooleanv(WGC3Denum pname, WGC3Dboolean* value) { ADD_FAILURE(); } -    virtual void getBufferParameteriv(WGC3Denum target, WGC3Denum pname, WGC3Dint* value) { ADD_FAILURE(); } -    virtual Attributes getContextAttributes() { ADD_FAILURE(); return m_attrs; } -    virtual WGC3Denum getError() { ADD_FAILURE(); return 0; } -    virtual void getFloatv(WGC3Denum pname, WGC3Dfloat* value) { ADD_FAILURE(); } -    virtual void getFramebufferAttachmentParameteriv(WGC3Denum target, WGC3Denum attachment, WGC3Denum pname, WGC3Dint* value) { ADD_FAILURE(); } -    virtual void getIntegerv(WGC3Denum pname, WGC3Dint* value) -    { -        if (pname == WebCore::GraphicsContext3D::MAX_TEXTURE_SIZE) -            *value = 1024; // MAX_TEXTURE_SIZE is cached client side, so it's OK to query. -        else -            ADD_FAILURE(); -    } - -    // We allow querying the shader compilation and program link status in debug mode, but not release. -    virtual void getProgramiv(WebGLId program, WGC3Denum pname, WGC3Dint* value) -    { -#ifndef NDEBUG -        *value = 1; -#else -        ADD_FAILURE(); -#endif -    } - -    virtual void getShaderiv(WebGLId shader, WGC3Denum pname, WGC3Dint* value) -    { -#ifndef NDEBUG -        *value = 1; -#else -        ADD_FAILURE(); -#endif -    } - -    virtual WebString getString(WGC3Denum name) -    { -        // We allow querying the extension string. -        // FIXME: It'd be better to check that we only do this before starting any other expensive work (like starting a compilation) -        if (name != WebCore::GraphicsContext3D::EXTENSIONS) -            ADD_FAILURE(); -        return WebString(); -    } - -    virtual WebString getProgramInfoLog(WebGLId program) { ADD_FAILURE(); return WebString(); } -    virtual void getRenderbufferParameteriv(WGC3Denum target, WGC3Denum pname, WGC3Dint* value) { ADD_FAILURE(); } - -    virtual WebString getShaderInfoLog(WebGLId shader) { ADD_FAILURE(); return WebString(); } -    virtual void getShaderPrecisionFormat(WGC3Denum shadertype, WGC3Denum precisiontype, WGC3Dint* range, WGC3Dint* precision) { ADD_FAILURE(); } -    virtual WebString getShaderSource(WebGLId shader) { ADD_FAILURE(); return WebString(); } -    virtual void getTexParameterfv(WGC3Denum target, WGC3Denum pname, WGC3Dfloat* value) { ADD_FAILURE(); } -    virtual void getTexParameteriv(WGC3Denum target, WGC3Denum pname, WGC3Dint* value) { ADD_FAILURE(); } -    virtual void getUniformfv(WebGLId program, WGC3Dint location, WGC3Dfloat* value) { ADD_FAILURE(); } -    virtual void getUniformiv(WebGLId program, WGC3Dint location, WGC3Dint* value) { ADD_FAILURE(); } -    virtual WGC3Dint getUniformLocation(WebGLId program, const WGC3Dchar* name) { ADD_FAILURE(); return 0; } -    virtual void getVertexAttribfv(WGC3Duint index, WGC3Denum pname, WGC3Dfloat* value) { ADD_FAILURE(); } -    virtual void getVertexAttribiv(WGC3Duint index, WGC3Denum pname, WGC3Dint* value) { ADD_FAILURE(); } -    virtual WGC3Dsizeiptr getVertexAttribOffset(WGC3Duint index, WGC3Denum pname) { ADD_FAILURE(); return 0; } -}; - -// This test isn't using the same fixture as CCRendererGLTest, and you can't mix TEST() and TEST_F() with the same name, hence LRC2. -TEST(CCRendererGLTest2, initializationDoesNotMakeSynchronousCalls) -{ -    CCScopedSettings scopedSettings; -    FakeCCRendererClient mockClient; -    OwnPtr<CCGraphicsContext> context(FakeWebCompositorOutputSurface::create(adoptPtr(new ForbidSynchronousCallContext))); -    OwnPtr<CCResourceProvider> resourceProvider(CCResourceProvider::create(context.get())); -    FakeCCRendererGL renderer(&mockClient, resourceProvider.get()); - -    EXPECT_TRUE(renderer.initialize()); -} - -class LoseContextOnFirstGetContext : public FakeWebGraphicsContext3D { -public: -    LoseContextOnFirstGetContext() -        : m_contextLost(false) -    { -    } - -    virtual bool makeContextCurrent() OVERRIDE -    { -        return !m_contextLost; -    } - -    virtual void getProgramiv(WebGLId program, WGC3Denum pname, WGC3Dint* value) OVERRIDE -    { -        m_contextLost = true; -        *value = 0; -    } - -    virtual void getShaderiv(WebGLId shader, WGC3Denum pname, WGC3Dint* value) OVERRIDE -    { -        m_contextLost = true; -        *value = 0; -    } - -    virtual WGC3Denum getGraphicsResetStatusARB() OVERRIDE -    { -        return m_contextLost ? 1 : 0; -    } - -private: -    bool m_contextLost; -}; - -TEST(CCRendererGLTest2, initializationWithQuicklyLostContextDoesNotAssert) -{ -    CCScopedSettings scopedSettings; -    FakeCCRendererClient mockClient; -    OwnPtr<CCGraphicsContext> context(FakeWebCompositorOutputSurface::create(adoptPtr(new LoseContextOnFirstGetContext))); -    OwnPtr<CCResourceProvider> resourceProvider(CCResourceProvider::create(context.get())); -    FakeCCRendererGL renderer(&mockClient, resourceProvider.get()); - -    renderer.initialize(); -} - -class ContextThatDoesNotSupportMemoryManagmentExtensions : public FakeWebGraphicsContext3D { -public: -    ContextThatDoesNotSupportMemoryManagmentExtensions() { } - -    // WebGraphicsContext3D methods. - -    // This method would normally do a glSwapBuffers under the hood. -    virtual void prepareTexture() { } -    virtual void setMemoryAllocationChangedCallbackCHROMIUM(WebGraphicsMemoryAllocationChangedCallbackCHROMIUM* callback) { } -    virtual WebString getString(WebKit::WGC3Denum name) { return WebString(); } -}; - -TEST(CCRendererGLTest2, initializationWithoutGpuMemoryManagerExtensionSupportShouldDefaultToNonZeroAllocation) -{ -    FakeCCRendererClient mockClient; -    OwnPtr<CCGraphicsContext> context(FakeWebCompositorOutputSurface::create(adoptPtr(new ContextThatDoesNotSupportMemoryManagmentExtensions))); -    OwnPtr<CCResourceProvider> resourceProvider(CCResourceProvider::create(context.get())); -    FakeCCRendererGL renderer(&mockClient, resourceProvider.get()); - -    renderer.initialize(); - -    EXPECT_GT(mockClient.memoryAllocationLimitBytes(), 0ul); -} - -class ClearCountingContext : public FakeWebGraphicsContext3D { -public: -    ClearCountingContext() : m_clear(0) { } - -    virtual void clear(WGC3Dbitfield) -    { -        m_clear++; -    } - -    int clearCount() const { return m_clear; } - -private: -    int m_clear; -}; - -TEST(CCRendererGLTest2, opaqueBackground) -{ -    FakeCCRendererClient mockClient; -    OwnPtr<CCGraphicsContext> ccContext(FakeWebCompositorOutputSurface::create(adoptPtr(new ClearCountingContext))); -    ClearCountingContext* context = static_cast<ClearCountingContext*>(ccContext->context3D()); -    OwnPtr<CCResourceProvider> resourceProvider(CCResourceProvider::create(ccContext.get())); -    FakeCCRendererGL renderer(&mockClient, resourceProvider.get()); - -    mockClient.rootRenderPass()->setHasTransparentBackground(false); - -    EXPECT_TRUE(renderer.initialize()); - -    renderer.drawFrame(mockClient.renderPassesInDrawOrder(), mockClient.renderPasses()); - -    // On DEBUG builds, render passes with opaque background clear to blue to -    // easily see regions that were not drawn on the screen. -#if defined(NDEBUG) -    EXPECT_EQ(0, context->clearCount()); -#else -    EXPECT_EQ(1, context->clearCount()); -#endif -} - -TEST(CCRendererGLTest2, transparentBackground) -{ -    FakeCCRendererClient mockClient; -    OwnPtr<CCGraphicsContext> ccContext(FakeWebCompositorOutputSurface::create(adoptPtr(new ClearCountingContext))); -    ClearCountingContext* context = static_cast<ClearCountingContext*>(ccContext->context3D()); -    OwnPtr<CCResourceProvider> resourceProvider(CCResourceProvider::create(ccContext.get())); -    FakeCCRendererGL renderer(&mockClient, resourceProvider.get()); - -    mockClient.rootRenderPass()->setHasTransparentBackground(true); - -    EXPECT_TRUE(renderer.initialize()); - -    renderer.drawFrame(mockClient.renderPassesInDrawOrder(), mockClient.renderPasses()); - -    EXPECT_EQ(1, context->clearCount()); -}  | 
