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