Title: [100340] trunk/Source
Revision
100340
Author
commit-qu...@webkit.org
Date
2011-11-15 15:07:48 -0800 (Tue, 15 Nov 2011)

Log Message

Page/layer flashes after GPU-accelerated CSS transition
https://bugs.webkit.org/show_bug.cgi?id=72343

LayerRendererChromium was resizing the window to 1x1 at initialization.
In some cases, there is no drawLayers before switching back to
software rendering. This left the window resized to 1x1 and the
following software paints would therefore not be visible. This change
moves the reshape call into drawLayers so that it will only be called
if rendering will occur.

Patch by John Bates <jba...@google.com> on 2011-11-15
Reviewed by James Robinson.

New test: CCLayerTreeHostImplTest.reshapeNotCalledUntilDraw.

* platform/graphics/chromium/LayerRendererChromium.cpp:
(WebCore::LayerRendererChromium::viewportChanged):
(WebCore::LayerRendererChromium::doViewportChanged):
(WebCore::LayerRendererChromium::drawLayersInternal):
* platform/graphics/chromium/LayerRendererChromium.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (100339 => 100340)


--- trunk/Source/WebCore/ChangeLog	2011-11-15 23:07:28 UTC (rev 100339)
+++ trunk/Source/WebCore/ChangeLog	2011-11-15 23:07:48 UTC (rev 100340)
@@ -1,3 +1,25 @@
+2011-11-15  John Bates  <jba...@google.com>
+
+        Page/layer flashes after GPU-accelerated CSS transition
+        https://bugs.webkit.org/show_bug.cgi?id=72343
+
+        LayerRendererChromium was resizing the window to 1x1 at initialization.
+        In some cases, there is no drawLayers before switching back to
+        software rendering. This left the window resized to 1x1 and the
+        following software paints would therefore not be visible. This change
+        moves the reshape call into drawLayers so that it will only be called
+        if rendering will occur.
+
+        Reviewed by James Robinson.
+
+        New test: CCLayerTreeHostImplTest.reshapeNotCalledUntilDraw.
+
+        * platform/graphics/chromium/LayerRendererChromium.cpp:
+        (WebCore::LayerRendererChromium::viewportChanged):
+        (WebCore::LayerRendererChromium::doViewportChanged):
+        (WebCore::LayerRendererChromium::drawLayersInternal):
+        * platform/graphics/chromium/LayerRendererChromium.h:
+
 2011-11-15  Julien Chaffraix  <jchaffr...@webkit.org>
 
         Add the needed plumbing to parse display: -webkit-grid

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


--- trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2011-11-15 23:07:28 UTC (rev 100339)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp	2011-11-15 23:07:48 UTC (rev 100340)
@@ -175,6 +175,7 @@
     , m_context(context)
     , m_defaultRenderSurface(0)
     , m_sharedGeometryQuad(FloatRect(-0.5f, -0.5f, 1.0f, 1.0f))
+    , m_isViewportChanged(false)
 {
 }
 
@@ -276,8 +277,7 @@
 
 void LayerRendererChromium::viewportChanged()
 {
-    if (m_context)
-        m_context->reshape(std::max(1, viewportWidth()), std::max(1, viewportHeight()));
+    m_isViewportChanged = true;
 
     // Reset the current render surface to force an update of the viewport and
     // projection matrix next time useRenderSurface is called.
@@ -353,6 +353,14 @@
         return;
 
     TRACE_EVENT("LayerRendererChromium::drawLayers", this, 0);
+    if (m_isViewportChanged) {
+        // Only reshape when we know we are going to draw. Otherwise, the reshape
+        // can leave the window at the wrong size if we never draw and the proper
+        // viewport size is never set.
+        m_isViewportChanged = false;
+        m_context->reshape(viewportWidth(), viewportHeight());
+    }
+
     CCLayerImpl* rootDrawLayer = rootLayer();
     makeContextCurrent();
 

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


--- trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h	2011-11-15 23:07:28 UTC (rev 100339)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h	2011-11-15 23:07:48 UTC (rev 100340)
@@ -231,6 +231,8 @@
     CCLayerSorter m_layerSorter;
 
     FloatQuad m_sharedGeometryQuad;
+
+    bool m_isViewportChanged;
 };
 
 // Setting DEBUG_GL_CALLS to 1 will call glGetError() after almost every GL

Modified: trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp (100339 => 100340)


--- trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp	2011-11-15 23:07:28 UTC (rev 100339)
+++ trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp	2011-11-15 23:07:48 UTC (rev 100340)
@@ -292,5 +292,45 @@
     EXPECT_TRUE(layer2->drawn());
 }
 
+class ReshapeTrackerContext: public MockWebGraphicsContext3D {
+public:
+    ReshapeTrackerContext() : m_reshapeCalled(false) { }
 
+    virtual bool initialize(Attributes, WebView*, bool renderDirectlyToWebView) { return true; }
+
+    virtual void reshape(int width, int height)
+    {
+        m_reshapeCalled = true;
+    }
+
+    bool reshapeCalled() const { return m_reshapeCalled; }
+
+private:
+    bool m_reshapeCalled;
+};
+
+// Only reshape when we know we are going to draw. Otherwise, the reshape
+// can leave the window at the wrong size if we never draw and the proper
+// viewport size is never set.
+TEST_F(CCLayerTreeHostImplTest, reshapeNotCalledUntilDraw)
+{
+    GraphicsContext3D::Attributes attrs;
+    ReshapeTrackerContext* reshapeTracker = new ReshapeTrackerContext();
+    RefPtr<GraphicsContext3D> context = GraphicsContext3DPrivate::createGraphicsContextFromWebContext(adoptPtr(reshapeTracker), attrs, 0, GraphicsContext3D::RenderDirectlyToHostWindow, GraphicsContext3DPrivate::ForUseOnThisThread);
+    m_hostImpl->initializeLayerRenderer(context);
+    m_hostImpl->setViewport(IntSize(10, 10));
+
+    RefPtr<CCLayerImpl> root = CCLayerImpl::create(0);
+    root->setAnchorPoint(FloatPoint(0, 0));
+    root->setBounds(IntSize(10, 10));
+    root->setDrawsContent(true);
+    root->setBackgroundColor(Color(1, 1, 1, 1));
+    m_hostImpl->setRootLayer(root);
+    EXPECT_FALSE(reshapeTracker->reshapeCalled());
+
+    m_hostImpl->drawLayers();
+    EXPECT_TRUE(reshapeTracker->reshapeCalled());
+}
+
+
 } // namespace
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to