Title: [116722] trunk/Source
Revision
116722
Author
[email protected]
Date
2012-05-10 20:07:08 -0700 (Thu, 10 May 2012)

Log Message

Sync with impl thread when removing references to external textures
https://bugs.webkit.org/show_bug.cgi?id=86054

We want to ensure the client side is safe to release textures, so we
sync with the impl thread when:
- we change the texture (and we had one)
- the layer is removed from the tree (and we had a texture)
- the layer is destroyed (and we had a texture)

Reviewed by James Robinson.

Test: TextureLayerChromiumTest.

* platform/graphics/chromium/TextureLayerChromium.cpp:
(WebCore::TextureLayerChromium::~TextureLayerChromium):
(WebCore::TextureLayerChromium::setTextureId):
(WebCore::TextureLayerChromium::setLayerTreeHost):
(WebCore):
* platform/graphics/chromium/TextureLayerChromium.h:
(TextureLayerChromium):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (116721 => 116722)


--- trunk/Source/WebCore/ChangeLog	2012-05-11 02:47:12 UTC (rev 116721)
+++ trunk/Source/WebCore/ChangeLog	2012-05-11 03:07:08 UTC (rev 116722)
@@ -1,3 +1,26 @@
+2012-05-10  Antoine Labour  <[email protected]>
+
+        Sync with impl thread when removing references to external textures
+        https://bugs.webkit.org/show_bug.cgi?id=86054
+
+        We want to ensure the client side is safe to release textures, so we
+        sync with the impl thread when:
+        - we change the texture (and we had one)
+        - the layer is removed from the tree (and we had a texture)
+        - the layer is destroyed (and we had a texture)
+
+        Reviewed by James Robinson.
+
+        Test: TextureLayerChromiumTest.
+
+        * platform/graphics/chromium/TextureLayerChromium.cpp:
+        (WebCore::TextureLayerChromium::~TextureLayerChromium):
+        (WebCore::TextureLayerChromium::setTextureId):
+        (WebCore::TextureLayerChromium::setLayerTreeHost):
+        (WebCore):
+        * platform/graphics/chromium/TextureLayerChromium.h:
+        (TextureLayerChromium):
+
 2012-05-10  Kent Tamura  <[email protected]>
 
         [Chromium] attempt to build fix for Chromium-mac.

Modified: trunk/Source/WebCore/platform/graphics/chromium/TextureLayerChromium.cpp (116721 => 116722)


--- trunk/Source/WebCore/platform/graphics/chromium/TextureLayerChromium.cpp	2012-05-11 02:47:12 UTC (rev 116721)
+++ trunk/Source/WebCore/platform/graphics/chromium/TextureLayerChromium.cpp	2012-05-11 03:07:08 UTC (rev 116722)
@@ -54,8 +54,12 @@
 
 TextureLayerChromium::~TextureLayerChromium()
 {
-    if (m_rateLimitContext && m_client && layerTreeHost())
-        layerTreeHost()->stopRateLimiter(m_client->context());
+    if (layerTreeHost()) {
+        if (m_textureId)
+            layerTreeHost()->acquireLayerTextures();
+        if (m_rateLimitContext && m_client)
+            layerTreeHost()->stopRateLimiter(m_client->context());
+    }
 }
 
 PassOwnPtr<CCLayerImpl> TextureLayerChromium::createCCLayerImpl()
@@ -91,6 +95,10 @@
 
 void TextureLayerChromium::setTextureId(unsigned id)
 {
+    if (m_textureId == id)
+        return;
+    if (m_textureId && layerTreeHost())
+        layerTreeHost()->acquireLayerTextures();
     m_textureId = id;
     setNeedsCommit();
 }
@@ -103,6 +111,13 @@
         layerTreeHost()->startRateLimiter(m_client->context());
 }
 
+void TextureLayerChromium::setLayerTreeHost(CCLayerTreeHost* host)
+{
+    if (m_textureId && layerTreeHost() && host != layerTreeHost())
+        layerTreeHost()->acquireLayerTextures();
+    LayerChromium::setLayerTreeHost(host);
+}
+
 bool TextureLayerChromium::drawsContent() const
 {
     return (m_client || m_textureId) && !m_contextLost && LayerChromium::drawsContent();

Modified: trunk/Source/WebCore/platform/graphics/chromium/TextureLayerChromium.h (116721 => 116722)


--- trunk/Source/WebCore/platform/graphics/chromium/TextureLayerChromium.h	2012-05-11 02:47:12 UTC (rev 116721)
+++ trunk/Source/WebCore/platform/graphics/chromium/TextureLayerChromium.h	2012-05-11 03:07:08 UTC (rev 116722)
@@ -79,6 +79,7 @@
 
     virtual void setNeedsDisplayRect(const FloatRect&) OVERRIDE;
 
+    virtual void setLayerTreeHost(CCLayerTreeHost*) OVERRIDE;
     virtual bool drawsContent() const OVERRIDE;
     virtual void update(CCTextureUpdater&, const CCOcclusionTracker*) OVERRIDE;
     virtual void pushPropertiesTo(CCLayerImpl*) OVERRIDE;

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.h (116721 => 116722)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.h	2012-05-11 02:47:12 UTC (rev 116721)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.h	2012-05-11 03:07:08 UTC (rev 116722)
@@ -162,7 +162,7 @@
     void didCommitAndDrawFrame() { m_client->didCommitAndDrawFrame(); }
     void didCompleteSwapBuffers() { m_client->didCompleteSwapBuffers(); }
     void deleteContentsTexturesOnImplThread(TextureAllocator*);
-    void acquireLayerTextures();
+    virtual void acquireLayerTextures();
     // Returns false if we should abort this frame due to initialization failure.
     bool updateLayers(CCTextureUpdater&);
 

Modified: trunk/Source/WebKit/chromium/WebKit.gypi (116721 => 116722)


--- trunk/Source/WebKit/chromium/WebKit.gypi	2012-05-11 02:47:12 UTC (rev 116721)
+++ trunk/Source/WebKit/chromium/WebKit.gypi	2012-05-11 03:07:08 UTC (rev 116722)
@@ -130,6 +130,7 @@
             'tests/RenderTableRowTest.cpp',
             'tests/ScrollbarLayerChromiumTest.cpp',
             'tests/TextureCopierTest.cpp',
+            'tests/TextureLayerChromiumTest.cpp',
             'tests/TextureManagerTest.cpp',
             'tests/ThrottledTextureUploaderTest.cpp',
             'tests/TiledLayerChromiumTest.cpp',

Added: trunk/Source/WebKit/chromium/tests/TextureLayerChromiumTest.cpp (0 => 116722)


--- trunk/Source/WebKit/chromium/tests/TextureLayerChromiumTest.cpp	                        (rev 0)
+++ trunk/Source/WebKit/chromium/tests/TextureLayerChromiumTest.cpp	2012-05-11 03:07:08 UTC (rev 116722)
@@ -0,0 +1,136 @@
+/*
+ * 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 "TextureLayerChromium.h"
+
+#include "FakeCCLayerTreeHostClient.h"
+#include "WebCompositor.h"
+#include "cc/CCLayerTreeHost.h"
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+using namespace WebCore;
+using ::testing::Mock;
+using ::testing::_;
+using ::testing::AtLeast;
+using ::testing::AnyNumber;
+
+namespace {
+
+class MockCCLayerTreeHost : public CCLayerTreeHost {
+public:
+    MockCCLayerTreeHost()
+        : CCLayerTreeHost(&m_fakeClient, CCSettings())
+    {
+        initialize();
+    }
+
+    MOCK_METHOD0(acquireLayerTextures, void());
+
+private:
+    FakeCCLayerTreeHostClient m_fakeClient;
+};
+
+
+class TextureLayerChromiumTest : public testing::Test {
+protected:
+    virtual void SetUp()
+    {
+        // Initialize without threading support.
+        WebKit::WebCompositor::initialize(0);
+        m_layerTreeHost = adoptPtr(new MockCCLayerTreeHost);
+    }
+
+    virtual void TearDown()
+    {
+        Mock::VerifyAndClearExpectations(m_layerTreeHost.get());
+        EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(AnyNumber());
+
+        m_layerTreeHost->setRootLayer(0);
+        m_layerTreeHost.clear();
+        WebKit::WebCompositor::shutdown();
+    }
+
+    OwnPtr<MockCCLayerTreeHost> m_layerTreeHost;
+};
+
+TEST_F(TextureLayerChromiumTest, syncImplWhenChangingTextureId)
+{
+    RefPtr<TextureLayerChromium> testLayer = TextureLayerChromium::create(0);
+    ASSERT_TRUE(testLayer);
+
+    EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(AnyNumber());
+    m_layerTreeHost->setRootLayer(testLayer);
+    Mock::VerifyAndClearExpectations(m_layerTreeHost.get());
+    EXPECT_EQ(testLayer->layerTreeHost(), m_layerTreeHost.get());
+
+    EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0);
+    testLayer->setTextureId(1);
+    Mock::VerifyAndClearExpectations(m_layerTreeHost.get());
+
+    EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(AtLeast(1));
+    testLayer->setTextureId(2);
+    Mock::VerifyAndClearExpectations(m_layerTreeHost.get());
+
+    EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(AtLeast(1));
+    testLayer->setTextureId(0);
+    Mock::VerifyAndClearExpectations(m_layerTreeHost.get());
+}
+
+TEST_F(TextureLayerChromiumTest, syncImplWhenRemovingFromTree)
+{
+    RefPtr<LayerChromium> rootLayer = LayerChromium::create();
+    ASSERT_TRUE(rootLayer);
+    RefPtr<LayerChromium> childLayer = LayerChromium::create();
+    ASSERT_TRUE(childLayer);
+    rootLayer->addChild(childLayer);
+    RefPtr<TextureLayerChromium> testLayer = TextureLayerChromium::create(0);
+    ASSERT_TRUE(testLayer);
+    testLayer->setTextureId(0);
+    childLayer->addChild(testLayer);
+
+    EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(AnyNumber());
+    m_layerTreeHost->setRootLayer(rootLayer);
+    Mock::VerifyAndClearExpectations(m_layerTreeHost.get());
+
+    EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0);
+    testLayer->removeFromParent();
+    Mock::VerifyAndClearExpectations(m_layerTreeHost.get());
+
+    EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0);
+    childLayer->addChild(testLayer);
+    Mock::VerifyAndClearExpectations(m_layerTreeHost.get());
+
+    EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(0);
+    testLayer->setTextureId(1);
+    Mock::VerifyAndClearExpectations(m_layerTreeHost.get());
+
+    EXPECT_CALL(*m_layerTreeHost, acquireLayerTextures()).Times(AtLeast(1));
+    testLayer->removeFromParent();
+    Mock::VerifyAndClearExpectations(m_layerTreeHost.get());
+}
+
+} // anonymous namespace
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to