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;
};