Title: [112568] trunk/Source
Revision
112568
Author
[email protected]
Date
2012-03-29 13:36:02 -0700 (Thu, 29 Mar 2012)

Log Message

[chromium] Ensure framebuffer exists at the start of beginDrawingFrame.
https://bugs.webkit.org/show_bug.cgi?id=82569

Patch by Michal Mocny <[email protected]> on 2012-03-29
Reviewed by James Robinson.

Source/WebCore:

Updated LayerRendererChromiumTest unittests.

* platform/graphics/chromium/LayerRendererChromium.cpp:
(WebCore::LayerRendererChromium::setVisible):
(WebCore::LayerRendererChromium::beginDrawingFrame):
* platform/graphics/chromium/LayerRendererChromium.h:
* platform/graphics/chromium/cc/CCSingleThreadProxy.cpp:
(WebCore::CCSingleThreadProxy::compositeAndReadback):
* platform/graphics/chromium/cc/CCThreadProxy.cpp:
(WebCore::CCThreadProxy::compositeAndReadback):
(WebCore::CCThreadProxy::requestReadbackOnImplThread):

Source/WebKit/chromium:

* tests/LayerRendererChromiumTest.cpp:
(FakeLayerRendererChromiumClient::FakeLayerRendererChromiumClient):
(FakeLayerRendererChromiumClient::rootLayer):
(FakeLayerRendererChromiumClient):
(TEST_F):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (112567 => 112568)


--- trunk/Source/WebCore/ChangeLog	2012-03-29 20:31:32 UTC (rev 112567)
+++ trunk/Source/WebCore/ChangeLog	2012-03-29 20:36:02 UTC (rev 112568)
@@ -1,3 +1,22 @@
+2012-03-29  Michal Mocny  <[email protected]>
+
+        [chromium] Ensure framebuffer exists at the start of beginDrawingFrame.
+        https://bugs.webkit.org/show_bug.cgi?id=82569
+
+        Reviewed by James Robinson.
+
+        Updated LayerRendererChromiumTest unittests.
+
+        * platform/graphics/chromium/LayerRendererChromium.cpp:
+        (WebCore::LayerRendererChromium::setVisible):
+        (WebCore::LayerRendererChromium::beginDrawingFrame):
+        * platform/graphics/chromium/LayerRendererChromium.h:
+        * platform/graphics/chromium/cc/CCSingleThreadProxy.cpp:
+        (WebCore::CCSingleThreadProxy::compositeAndReadback):
+        * platform/graphics/chromium/cc/CCThreadProxy.cpp:
+        (WebCore::CCThreadProxy::compositeAndReadback):
+        (WebCore::CCThreadProxy::requestReadbackOnImplThread):
+
 2012-03-29  Ryosuke Niwa  <[email protected]>
 
         Add a compile assert for the size of RenderBlock

Modified: trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp (112567 => 112568)


--- trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2012-03-29 20:31:32 UTC (rev 112567)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2012-03-29 20:36:02 UTC (rev 112568)
@@ -350,10 +350,6 @@
     if (!visible)
         releaseRenderSurfaceTextures();
 
-    // FIXME: Remove this once framebuffer is automatically recreated on first use
-    if (visible)
-        ensureFramebuffer();
-
     // TODO: Replace setVisibilityCHROMIUM with an extension to explicitly manage front/backbuffers
     // crbug.com/116049
     if (m_capabilities.usingSetVisibility) {
@@ -406,6 +402,10 @@
 void LayerRendererChromium::beginDrawingFrame()
 {
     ASSERT(rootLayer());
+
+    // FIXME: Remove this once framebuffer is automatically recreated on first use
+    ensureFramebuffer();
+
     m_defaultRenderSurface = rootLayer()->renderSurface();
 
     // FIXME: use the frame begin time from the overall compositor scheduler.

Modified: trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h (112567 => 112568)


--- trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h	2012-03-29 20:31:32 UTC (rev 112567)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h	2012-03-29 20:36:02 UTC (rev 112568)
@@ -61,6 +61,7 @@
 class GeometryBinding;
 class GraphicsContext3D;
 class LayerRendererSwapBuffersCompleteCallbackAdapter;
+class LayerRendererGpuMemoryAllocationChangedCallbackAdapter;
 class ScopedEnsureFramebufferAllocation;
 
 class LayerRendererChromiumClient {
@@ -163,11 +164,12 @@
                           float width, float height, float opacity, const FloatQuad&,
                           int matrixLocation, int alphaLocation, int quadLocation);
 
+protected:
+    friend class LayerRendererGpuMemoryAllocationChangedCallbackAdapter;
     void discardFramebuffer();
     void ensureFramebuffer();
     bool isFramebufferDiscarded() const { return m_isFramebufferDiscarded; }
 
-protected:
     LayerRendererChromium(LayerRendererChromiumClient*, PassRefPtr<GraphicsContext3D>);
     bool initialize();
 
@@ -266,34 +268,7 @@
     bool m_isFramebufferDiscarded;
 };
 
-// The purpose of this helper is twofold:
-// 1. To ensure that a framebuffer is available for scope lifetime, and
-// 2. To reset framebuffer allocation to previous state on scope exit.
-// If the framebuffer is recreated, its contents are undefined.
-// FIXME: Prevent/delay discarding framebuffer via any means while any
-// instance of this is alive. At the moment, this isn't an issue.
-class ScopedEnsureFramebufferAllocation {
-public:
-    explicit ScopedEnsureFramebufferAllocation(LayerRendererChromium* layerRenderer)
-        : m_layerRenderer(layerRenderer)
-        , m_framebufferWasInitiallyDiscarded(layerRenderer->isFramebufferDiscarded())
-    {
-        if (m_framebufferWasInitiallyDiscarded)
-            m_layerRenderer->ensureFramebuffer();
-    }
 
-    ~ScopedEnsureFramebufferAllocation()
-    {
-        if (m_framebufferWasInitiallyDiscarded)
-            m_layerRenderer->discardFramebuffer();
-    }
-
-private:
-    LayerRendererChromium* m_layerRenderer;
-    bool m_framebufferWasInitiallyDiscarded;
-};
-
-
 // Setting DEBUG_GL_CALLS to 1 will call glGetError() after almost every GL
 // call made by the compositor. Useful for debugging rendering issues but
 // will significantly degrade performance.

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCSingleThreadProxy.cpp (112567 => 112568)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCSingleThreadProxy.cpp	2012-03-29 20:31:32 UTC (rev 112567)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCSingleThreadProxy.cpp	2012-03-29 20:36:02 UTC (rev 112568)
@@ -72,8 +72,6 @@
     TRACE_EVENT("CCSingleThreadProxy::compositeAndReadback", this, 0);
     ASSERT(CCProxy::isMainThread());
 
-    ScopedEnsureFramebufferAllocation ensureFramebuffer(m_layerTreeHostImpl->layerRenderer());
-
     if (!commitIfNeeded())
         return false;
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp (112567 => 112568)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp	2012-03-29 20:31:32 UTC (rev 112567)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp	2012-03-29 20:36:02 UTC (rev 112568)
@@ -93,8 +93,6 @@
     ASSERT(isMainThread());
     ASSERT(m_layerTreeHost);
 
-    ScopedEnsureFramebufferAllocation ensureFramebuffer(m_layerTreeHostImpl->layerRenderer());
-
     if (!m_layerRendererInitialized) {
         TRACE_EVENT("compositeAndReadback_EarlyOut_LR_Uninitialized", this, 0);
         return false;
@@ -125,6 +123,7 @@
         request->completion.signal();
         return;
     }
+
     m_readbackRequestOnImplThread = request;
     m_schedulerOnImplThread->setNeedsRedraw();
     m_schedulerOnImplThread->setNeedsForcedRedraw();

Modified: trunk/Source/WebKit/chromium/ChangeLog (112567 => 112568)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-03-29 20:31:32 UTC (rev 112567)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-03-29 20:36:02 UTC (rev 112568)
@@ -1,3 +1,16 @@
+2012-03-29  Michal Mocny  <[email protected]>
+
+        [chromium] Ensure framebuffer exists at the start of beginDrawingFrame.
+        https://bugs.webkit.org/show_bug.cgi?id=82569
+
+        Reviewed by James Robinson.
+
+        * tests/LayerRendererChromiumTest.cpp:
+        (FakeLayerRendererChromiumClient::FakeLayerRendererChromiumClient):
+        (FakeLayerRendererChromiumClient::rootLayer):
+        (FakeLayerRendererChromiumClient):
+        (TEST_F):
+
 2012-03-29  Adam Barth  <[email protected]>
 
         Move createURLLoader() into Platform

Modified: trunk/Source/WebKit/chromium/tests/LayerRendererChromiumTest.cpp (112567 => 112568)


--- trunk/Source/WebKit/chromium/tests/LayerRendererChromiumTest.cpp	2012-03-29 20:31:32 UTC (rev 112567)
+++ trunk/Source/WebKit/chromium/tests/LayerRendererChromiumTest.cpp	2012-03-29 20:36:02 UTC (rev 112568)
@@ -63,13 +63,17 @@
 
 class FakeLayerRendererChromiumClient : public LayerRendererChromiumClient {
 public:
-    FakeLayerRendererChromiumClient() : m_setFullRootLayerDamageCount(0) { }
+    FakeLayerRendererChromiumClient()
+        : m_setFullRootLayerDamageCount(0)
+        , m_rootLayer(CCLayerImpl::create(1))
+    {
+    }
 
     // LayerRendererChromiumClient methods.
     virtual const IntSize& viewportSize() const { static IntSize fakeSize; return fakeSize; }
     virtual const CCSettings& settings() const { static CCSettings fakeSettings; return fakeSettings; }
-    virtual CCLayerImpl* rootLayer() { return 0; }
-    virtual const CCLayerImpl* rootLayer() const { return 0; }
+    virtual CCLayerImpl* rootLayer() { return m_rootLayer.get(); }
+    virtual const CCLayerImpl* rootLayer() const { return m_rootLayer.get(); }
     virtual void didLoseContext() { }
     virtual void onSwapBuffersComplete() { }
     virtual void setFullRootLayerDamage() { m_setFullRootLayerDamageCount++; }
@@ -80,6 +84,7 @@
 private:
     int m_setFullRootLayerDamageCount;
     DebugScopedSetImplThread m_implThread;
+    OwnPtr<CCLayerImpl> m_rootLayer;
 };
 
 class FakeLayerRendererChromium : public LayerRendererChromium {
@@ -90,6 +95,7 @@
 
     // Changing visibility to public.
     using LayerRendererChromium::initialize;
+    using LayerRendererChromium::isFramebufferDiscarded;
 };
 
 class LayerRendererChromiumTest : public testing::Test {
@@ -178,51 +184,17 @@
 }
 
 // Test LayerRendererChromium discardFramebuffer functionality:
-// Discard framebuffer, then set visibility to true.
-// Expected: recreates the framebuffer.
-TEST_F(LayerRendererChromiumTest, SetVisibilityTrueShouldRecreateBackbuffer)
-{
-    m_mockContext.setMemoryAllocation(m_suggestHaveBackbufferNo);
-    EXPECT_TRUE(m_layerRendererChromium.isFramebufferDiscarded());
-
-    m_layerRendererChromium.setVisible(true);
-    EXPECT_FALSE(m_layerRendererChromium.isFramebufferDiscarded());
-}
-
-// Test LayerRendererChromium discardFramebuffer functionality:
-// Create a ScopedEnsureFramebufferAllocation while a framebuffer was discarded and then swapBuffers.
-// Expected: will recreate framebuffer scope duration, during which swaps will work fine, and discard on scope exit.
+// Begin drawing a frame while a framebuffer is discarded.
+// Expected: will recreate framebuffer.
 TEST_F(LayerRendererChromiumTest, DiscardedBackbufferIsRecreatredForScopeDuration)
 {
     m_mockContext.setMemoryAllocation(m_suggestHaveBackbufferNo);
     EXPECT_TRUE(m_layerRendererChromium.isFramebufferDiscarded());
     EXPECT_EQ(1, m_mockClient.setFullRootLayerDamageCount());
-    {
-        ScopedEnsureFramebufferAllocation ensureFramebuffer(&m_layerRendererChromium);
-        EXPECT_FALSE(m_layerRendererChromium.isFramebufferDiscarded());
 
-        swapBuffers();
-        EXPECT_EQ(1, m_mockContext.frameCount());
-    }
-    EXPECT_TRUE(m_layerRendererChromium.isFramebufferDiscarded());
-    EXPECT_EQ(2, m_mockClient.setFullRootLayerDamageCount());
-}
-
-// Test LayerRendererChromium discardFramebuffer functionality:
-// Create a ScopedEnsureFramebufferAllocation while a framebuffer was not discarded and then swapBuffers.
-// Expected: will have no effect.
-TEST_F(LayerRendererChromiumTest, EnsuringBackbufferForScopeDurationDoesNothingIfAlreadyExists)
-{
+    m_layerRendererChromium.beginDrawingFrame();
     EXPECT_FALSE(m_layerRendererChromium.isFramebufferDiscarded());
-    EXPECT_EQ(0, m_mockClient.setFullRootLayerDamageCount());
-    {
-        ScopedEnsureFramebufferAllocation ensureFramebuffer(&m_layerRendererChromium);
-        EXPECT_FALSE(m_layerRendererChromium.isFramebufferDiscarded());
-        EXPECT_EQ(0, m_mockClient.setFullRootLayerDamageCount());
 
-        swapBuffers();
-        EXPECT_EQ(1, m_mockContext.frameCount());
-    }
-    EXPECT_FALSE(m_layerRendererChromium.isFramebufferDiscarded());
-    EXPECT_EQ(0, m_mockClient.setFullRootLayerDamageCount());
+    swapBuffers();
+    EXPECT_EQ(1, m_mockContext.frameCount());
 }
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to