Title: [86905] trunk
Revision
86905
Author
[email protected]
Date
2011-05-19 16:43:51 -0700 (Thu, 19 May 2011)

Log Message

2011-05-18  Kenneth Russell  <[email protected]>

        Reviewed by James Robinson.

        [chromium] Disable blending in compositor for WebGL layers with alpha=false
        https://bugs.webkit.org/show_bug.cgi?id=61091

        * compositing/webgl/webgl-no-alpha.html: Added.
        * platform/chromium-gpu/compositing/webgl/webgl-no-alpha-expected.png: Added.
        * platform/chromium-gpu/compositing/webgl/webgl-no-alpha-expected.txt: Added.
        * platform/mac-wk2/Skipped:
        * platform/mac/compositing/webgl/webgl-no-alpha-expected.png: Added.
        * platform/mac/compositing/webgl/webgl-no-alpha-expected.txt: Added.
2011-05-18  Kenneth Russell  <[email protected]>

        Reviewed by James Robinson.

        [chromium] Disable blending in compositor for WebGL layers with alpha=false
        https://bugs.webkit.org/show_bug.cgi?id=61091

        Test: compositing/webgl/webgl-no-alpha.html

        * platform/graphics/chromium/CanvasLayerChromium.cpp:
        (WebCore::CanvasLayerChromium::CanvasLayerChromium):
        (WebCore::CanvasLayerChromium::pushPropertiesTo):
        * platform/graphics/chromium/CanvasLayerChromium.h:
        * platform/graphics/chromium/WebGLLayerChromium.cpp:
        (WebCore::WebGLLayerChromium::setContext):
        * platform/graphics/chromium/cc/CCCanvasLayerImpl.cpp:
        (WebCore::CCCanvasLayerImpl::CCCanvasLayerImpl):
        (WebCore::CCCanvasLayerImpl::draw):
        * platform/graphics/chromium/cc/CCCanvasLayerImpl.h:
        (WebCore::CCCanvasLayerImpl::setHasAlpha):

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (86904 => 86905)


--- trunk/LayoutTests/ChangeLog	2011-05-19 23:17:00 UTC (rev 86904)
+++ trunk/LayoutTests/ChangeLog	2011-05-19 23:43:51 UTC (rev 86905)
@@ -1,3 +1,17 @@
+2011-05-18  Kenneth Russell  <[email protected]>
+
+        Reviewed by James Robinson.
+
+        [chromium] Disable blending in compositor for WebGL layers with alpha=false
+        https://bugs.webkit.org/show_bug.cgi?id=61091
+
+        * compositing/webgl/webgl-no-alpha.html: Added.
+        * platform/chromium-gpu/compositing/webgl/webgl-no-alpha-expected.png: Added.
+        * platform/chromium-gpu/compositing/webgl/webgl-no-alpha-expected.txt: Added.
+        * platform/mac-wk2/Skipped:
+        * platform/mac/compositing/webgl/webgl-no-alpha-expected.png: Added.
+        * platform/mac/compositing/webgl/webgl-no-alpha-expected.txt: Added.
+
 2011-05-18  Jeremy Noble  <[email protected]>
 
         Reviewed by Darin Adler.

Added: trunk/LayoutTests/compositing/webgl/webgl-no-alpha.html (0 => 86905)


--- trunk/LayoutTests/compositing/webgl/webgl-no-alpha.html	                        (rev 0)
+++ trunk/LayoutTests/compositing/webgl/webgl-no-alpha.html	2011-05-19 23:43:51 UTC (rev 86905)
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <style type="text/css" media="screen">
+      body {
+        outline: 10px solid transparent; /* affects layer sizes */
+      }
+      canvas {
+        margin: 20px;
+        width: 200px;
+        height: 200px;
+        padding: 0 20px;
+      }
+    
+      .compare {
+        margin-left: 40px;
+        margin-top: 20px;
+        width: 200px;
+        height: 200px;
+        background-color: rgba(0, 255, 0, 1.0);
+      }
+    </style>
+    <script>
+        if (window.layoutTestController) {
+            layoutTestController.overridePreference("WebKitWebGLEnabled", "1");
+            layoutTestController.dumpAsText(true);
+        }
+
+        function initWebGL(canvasName, vshader, fshader, attribs, clearColor, clearDepth)
+        {
+            var canvas = document.getElementById(canvasName);
+            var gl = canvas.getContext("experimental-webgl", {alpha: false});
+            if (!gl) {
+                alert("No WebGL context found");
+                return null;
+            }
+
+            gl.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
+            gl.clearDepth(clearDepth);
+
+            return gl;
+        }
+
+        function drawCanvas(canvasID)
+        {
+          var gl = initWebGL(canvasID, "", "", [], [ 0, 1, 0, 0 ], 1);
+          gl.viewport(0, 0, 200, 200);
+          gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
+        }
+
+        function init()
+        {
+          drawCanvas('canvas');
+        }
+    </script>
+  </head>
+  <body _onload_="init()">
+   
+    <div class="compare"></div>
+    <canvas id="canvas" width="200" height="200"></canvas>
+
+    <!-- Top and bottom should look the same. -->
+  </body>
+</html>

Added: trunk/LayoutTests/platform/chromium-gpu/compositing/webgl/webgl-no-alpha-expected.png


(Binary files differ)
Property changes on: trunk/LayoutTests/platform/chromium-gpu/compositing/webgl/webgl-no-alpha-expected.png ___________________________________________________________________

Added: svn:mime-type

Added: trunk/LayoutTests/platform/chromium-gpu/compositing/webgl/webgl-no-alpha-expected.txt (0 => 86905)


--- trunk/LayoutTests/platform/chromium-gpu/compositing/webgl/webgl-no-alpha-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium-gpu/compositing/webgl/webgl-no-alpha-expected.txt	2011-05-19 23:43:51 UTC (rev 86905)
@@ -0,0 +1 @@
+

Added: trunk/LayoutTests/platform/mac/compositing/webgl/webgl-no-alpha-expected.png


(Binary files differ)
Property changes on: trunk/LayoutTests/platform/mac/compositing/webgl/webgl-no-alpha-expected.png ___________________________________________________________________

Added: svn:mime-type

Added: trunk/LayoutTests/platform/mac/compositing/webgl/webgl-no-alpha-expected.txt (0 => 86905)


--- trunk/LayoutTests/platform/mac/compositing/webgl/webgl-no-alpha-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/mac/compositing/webgl/webgl-no-alpha-expected.txt	2011-05-19 23:43:51 UTC (rev 86905)
@@ -0,0 +1 @@
+

Modified: trunk/LayoutTests/platform/mac-wk2/Skipped (86904 => 86905)


--- trunk/LayoutTests/platform/mac-wk2/Skipped	2011-05-19 23:17:00 UTC (rev 86904)
+++ trunk/LayoutTests/platform/mac-wk2/Skipped	2011-05-19 23:43:51 UTC (rev 86905)
@@ -861,6 +861,7 @@
 fast/canvas/webgl/uninitialized-test.html
 compositing/webgl/webgl-background-color.html
 compositing/webgl/webgl-reflection.html
+compositing/webgl/webgl-no-alpha.html
 compositing/webgl/webgl-nonpremultiplied-blend.html
 fast/canvas/webgl/array-buffer-crash.html
 fast/canvas/webgl/array-buffer-view-crash.html

Modified: trunk/Source/WebCore/ChangeLog (86904 => 86905)


--- trunk/Source/WebCore/ChangeLog	2011-05-19 23:17:00 UTC (rev 86904)
+++ trunk/Source/WebCore/ChangeLog	2011-05-19 23:43:51 UTC (rev 86905)
@@ -1,3 +1,24 @@
+2011-05-18  Kenneth Russell  <[email protected]>
+
+        Reviewed by James Robinson.
+
+        [chromium] Disable blending in compositor for WebGL layers with alpha=false
+        https://bugs.webkit.org/show_bug.cgi?id=61091
+
+        Test: compositing/webgl/webgl-no-alpha.html
+
+        * platform/graphics/chromium/CanvasLayerChromium.cpp:
+        (WebCore::CanvasLayerChromium::CanvasLayerChromium):
+        (WebCore::CanvasLayerChromium::pushPropertiesTo):
+        * platform/graphics/chromium/CanvasLayerChromium.h:
+        * platform/graphics/chromium/WebGLLayerChromium.cpp:
+        (WebCore::WebGLLayerChromium::setContext):
+        * platform/graphics/chromium/cc/CCCanvasLayerImpl.cpp:
+        (WebCore::CCCanvasLayerImpl::CCCanvasLayerImpl):
+        (WebCore::CCCanvasLayerImpl::draw):
+        * platform/graphics/chromium/cc/CCCanvasLayerImpl.h:
+        (WebCore::CCCanvasLayerImpl::setHasAlpha):
+
 2011-05-18  Jeremy Noble  <[email protected]>
 
         Reviewed by Darin Adler.

Modified: trunk/Source/WebCore/platform/graphics/chromium/CanvasLayerChromium.cpp (86904 => 86905)


--- trunk/Source/WebCore/platform/graphics/chromium/CanvasLayerChromium.cpp	2011-05-19 23:17:00 UTC (rev 86904)
+++ trunk/Source/WebCore/platform/graphics/chromium/CanvasLayerChromium.cpp	2011-05-19 23:43:51 UTC (rev 86905)
@@ -44,6 +44,7 @@
     : LayerChromium(owner)
     , m_textureChanged(true)
     , m_textureId(0)
+    , m_hasAlpha(true)
     , m_premultipliedAlpha(true)
 {
 }
@@ -63,6 +64,7 @@
 
     CCCanvasLayerImpl* canvasLayer = static_cast<CCCanvasLayerImpl*>(layer);
     canvasLayer->setTextureId(m_textureId);
+    canvasLayer->setHasAlpha(m_hasAlpha);
     canvasLayer->setPremultipliedAlpha(m_premultipliedAlpha);
 }
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/CanvasLayerChromium.h (86904 => 86905)


--- trunk/Source/WebCore/platform/graphics/chromium/CanvasLayerChromium.h	2011-05-19 23:17:00 UTC (rev 86904)
+++ trunk/Source/WebCore/platform/graphics/chromium/CanvasLayerChromium.h	2011-05-19 23:43:51 UTC (rev 86905)
@@ -54,6 +54,7 @@
 
     bool m_textureChanged;
     unsigned m_textureId;
+    bool m_hasAlpha;
     bool m_premultipliedAlpha;
 };
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/WebGLLayerChromium.cpp (86904 => 86905)


--- trunk/Source/WebCore/platform/graphics/chromium/WebGLLayerChromium.cpp	2011-05-19 23:17:00 UTC (rev 86904)
+++ trunk/Source/WebCore/platform/graphics/chromium/WebGLLayerChromium.cpp	2011-05-19 23:43:51 UTC (rev 86905)
@@ -121,7 +121,9 @@
         m_textureUpdated = true;
     }
     m_textureId = textureId;
-    m_premultipliedAlpha = m_context->getContextAttributes().premultipliedAlpha;
+    GraphicsContext3D::Attributes attributes = m_context->getContextAttributes();
+    m_hasAlpha = attributes.alpha;
+    m_premultipliedAlpha = attributes.premultipliedAlpha;
     m_contextSupportsRateLimitingExtension = m_context->getExtensions()->supports("GL_CHROMIUM_rate_limit_offscreen_context");
 }
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCCanvasLayerImpl.cpp (86904 => 86905)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCCanvasLayerImpl.cpp	2011-05-19 23:17:00 UTC (rev 86904)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCCanvasLayerImpl.cpp	2011-05-19 23:43:51 UTC (rev 86905)
@@ -39,6 +39,7 @@
 CCCanvasLayerImpl::CCCanvasLayerImpl(LayerChromium* owner, int id)
     : CCLayerImpl(owner, id)
     , m_textureId(0)
+    , m_hasAlpha(true)
     , m_premultipliedAlpha(true)
 {
 }
@@ -55,15 +56,22 @@
     GraphicsContext3D* context = layerRenderer()->context();
     GLC(context, context->activeTexture(GraphicsContext3D::TEXTURE0));
     GLC(context, context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_textureId));
-    GC3Denum sfactor = m_premultipliedAlpha ? GraphicsContext3D::ONE : GraphicsContext3D::SRC_ALPHA;
-    GLC(context, context->blendFunc(sfactor, GraphicsContext3D::ONE_MINUS_SRC_ALPHA));
+    if (!m_hasAlpha) {
+        // Even though the WebGL layer's texture was likely allocated
+        // as GL_RGB, disable blending anyway for better robustness.
+        context->disable(GraphicsContext3D::BLEND);
+    } else {
+        GC3Denum sfactor = m_premultipliedAlpha ? GraphicsContext3D::ONE : GraphicsContext3D::SRC_ALPHA;
+        GLC(context, context->blendFunc(sfactor, GraphicsContext3D::ONE_MINUS_SRC_ALPHA));
+    }
     layerRenderer()->useShader(program->program());
     GLC(context, context->uniform1i(program->fragmentShader().samplerLocation(), 0));
     LayerChromium::drawTexturedQuad(context, layerRenderer()->projectionMatrix(), drawTransform(),
                                     bounds().width(), bounds().height(), drawOpacity(),
                                     program->vertexShader().matrixLocation(),
                                     program->fragmentShader().alphaLocation());
-
+    if (!m_hasAlpha)
+        context->enable(GraphicsContext3D::BLEND);
 }
 
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCCanvasLayerImpl.h (86904 => 86905)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCCanvasLayerImpl.h	2011-05-19 23:17:00 UTC (rev 86904)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCCanvasLayerImpl.h	2011-05-19 23:43:51 UTC (rev 86905)
@@ -47,11 +47,13 @@
     virtual void dumpLayerProperties(TextStream&, int indent) const;
 
     void setTextureId(unsigned id) { m_textureId = id; }
+    void setHasAlpha(bool hasAlpha) { m_hasAlpha = hasAlpha; }
     void setPremultipliedAlpha(bool premultipliedAlpha) { m_premultipliedAlpha = premultipliedAlpha; }
 private:
     CCCanvasLayerImpl(LayerChromium*, int);
 
     unsigned m_textureId;
+    bool m_hasAlpha;
     bool m_premultipliedAlpha;
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to