<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[160894] trunk/Source/WebCore</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/160894">160894</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2013-12-19 19:48:10 -0800 (Thu, 19 Dec 2013)</dd>
</dl>
<h3>Log Message</h3>
<pre>Clarify the behavior of composited canvases
https://bugs.webkit.org/show_bug.cgi?id=126042
Reviewed by Tim Horton.
Different platforms composite 2D and 3D canvases in different ways.
"Accelerated 2D" canvases, and WebGL are always set as GraphicsLayer
contents.
"IOSurface" canvases (Mac and iOS-only) get a compositing layer, but
paint into it (because this is fast, and a convenient way to get
synchronization).
So make these behaviors explicit in RenderLayerBacking and RenderLayerCompositor.
No behavior changes on OS X, bug fix on iOS.
* rendering/RenderLayerBacking.cpp:
(WebCore::canvasCompositingStrategy):
(WebCore::RenderLayerBacking::updateGraphicsLayerConfiguration):
(WebCore::RenderLayerBacking::containsPaintedContent):
(WebCore::RenderLayerBacking::contentChanged):
* rendering/RenderLayerBacking.h:
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::requiresCompositingForCanvas):</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerBackingcpp">trunk/Source/WebCore/rendering/RenderLayerBacking.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerBackingh">trunk/Source/WebCore/rendering/RenderLayerBacking.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerCompositorcpp">trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (160893 => 160894)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2013-12-20 03:33:24 UTC (rev 160893)
+++ trunk/Source/WebCore/ChangeLog        2013-12-20 03:48:10 UTC (rev 160894)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2013-12-19 Simon Fraser <simon.fraser@apple.com>
+
+ Clarify the behavior of composited canvases
+ https://bugs.webkit.org/show_bug.cgi?id=126042
+
+ Reviewed by Tim Horton.
+
+ Different platforms composite 2D and 3D canvases in different ways.
+
+ "Accelerated 2D" canvases, and WebGL are always set as GraphicsLayer
+ contents.
+
+ "IOSurface" canvases (Mac and iOS-only) get a compositing layer, but
+ paint into it (because this is fast, and a convenient way to get
+ synchronization).
+
+ So make these behaviors explicit in RenderLayerBacking and RenderLayerCompositor.
+ No behavior changes on OS X, bug fix on iOS.
+
+ * rendering/RenderLayerBacking.cpp:
+ (WebCore::canvasCompositingStrategy):
+ (WebCore::RenderLayerBacking::updateGraphicsLayerConfiguration):
+ (WebCore::RenderLayerBacking::containsPaintedContent):
+ (WebCore::RenderLayerBacking::contentChanged):
+ * rendering/RenderLayerBacking.h:
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::requiresCompositingForCanvas):
+
</ins><span class="cx"> 2013-12-19 Joseph Pecoraro <pecoraro@apple.com>
</span><span class="cx">
</span><span class="cx"> Web Inspector: Add InspectorFrontendHost.debuggableType to let the frontend know it's backend is JavaScript or Web
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerBackingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (160893 => 160894)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp        2013-12-20 03:33:24 UTC (rev 160893)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp        2013-12-20 03:48:10 UTC (rev 160894)
</span><span class="lines">@@ -81,18 +81,23 @@
</span><span class="cx"> static bool hasBoxDecorationsOrBackgroundImage(const RenderStyle*);
</span><span class="cx"> static IntRect clipBox(RenderBox& renderer);
</span><span class="cx">
</span><del>-static inline bool isAcceleratedCanvas(RenderObject* renderer)
</del><ins>+CanvasCompositingStrategy canvasCompositingStrategy(const RenderObject& renderer)
</ins><span class="cx"> {
</span><del>-#if ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS)
- if (renderer->isCanvas()) {
- const HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer->node());
- if (CanvasRenderingContext* context = canvas->renderingContext())
- return context->isAccelerated();
- }
</del><ins>+ ASSERT(renderer.isCanvas());
+
+ const HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer.node());
+ CanvasRenderingContext* context = canvas->renderingContext();
+ if (!context || !context->isAccelerated())
+ return UnacceleratedCanvas;
+
+ if (context->is3d())
+ return CanvasAsLayerContents;
+
+#if ENABLE(ACCELERATED_2D_CANVAS)
+ return CanvasAsLayerContents;
</ins><span class="cx"> #else
</span><del>- UNUSED_PARAM(renderer);
</del><ins>+ return CanvasPaintedToLayer; // On Mac and iOS we paint accelerated canvases into their layers.
</ins><span class="cx"> #endif
</span><del>- return false;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // Get the scrolling coordinator in a way that works inside RenderLayerBacking's destructor.
</span><span class="lines">@@ -626,7 +631,7 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS)
</span><del>- else if (isAcceleratedCanvas(&renderer())) {
</del><ins>+ else if (renderer().isCanvas() && canvasCompositingStrategy(renderer()) == CanvasAsLayerContents) {
</ins><span class="cx"> const HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer().element());
</span><span class="cx"> if (CanvasRenderingContext* context = canvas->renderingContext())
</span><span class="cx"> m_graphicsLayer->setContentsToCanvas(context->platformLayer());
</span><span class="lines">@@ -1832,9 +1837,9 @@
</span><span class="cx"> if (renderer().isVideo() && toRenderVideo(renderer()).shouldDisplayVideo())
</span><span class="cx"> return m_owningLayer.hasBoxDecorationsOrBackground();
</span><span class="cx"> #endif
</span><del>-#if PLATFORM(MAC) && !PLATFORM(IOS) && USE(CA)
-#elif ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS) || PLATFORM(IOS_SIMULATOR)
- if (isAcceleratedCanvas(&renderer()))
</del><ins>+
+#if ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS)
+ if (renderer().isCanvas() && canvasCompositingStrategy(renderer()) == CanvasAsLayerContents)
</ins><span class="cx"> return m_owningLayer.hasBoxDecorationsOrBackground();
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="lines">@@ -1883,7 +1888,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS)
</span><del>- if ((changeType == CanvasChanged || changeType == CanvasPixelsChanged) && isAcceleratedCanvas(&renderer())) {
</del><ins>+ if ((changeType == CanvasChanged || changeType == CanvasPixelsChanged) && renderer().isCanvas() && canvasCompositingStrategy(renderer()) == CanvasAsLayerContents) {
</ins><span class="cx"> m_graphicsLayer->setContentsNeedsDisplay();
</span><span class="cx"> return;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerBackingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.h (160893 => 160894)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerBacking.h        2013-12-20 03:33:24 UTC (rev 160893)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.h        2013-12-20 03:48:10 UTC (rev 160894)
</span><span class="lines">@@ -328,6 +328,13 @@
</span><span class="cx"> static bool m_creatingPrimaryGraphicsLayer;
</span><span class="cx"> };
</span><span class="cx">
</span><ins>+enum CanvasCompositingStrategy {
+ UnacceleratedCanvas,
+ CanvasPaintedToLayer,
+ CanvasAsLayerContents
+};
+CanvasCompositingStrategy canvasCompositingStrategy(const RenderObject&);
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx">
</span><span class="cx"> #endif // USE(ACCELERATED_COMPOSITING)
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerCompositorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (160893 => 160894)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2013-12-20 03:33:24 UTC (rev 160893)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp        2013-12-20 03:48:10 UTC (rev 160894)
</span><span class="lines">@@ -2263,13 +2263,14 @@
</span><span class="cx"> return false;
</span><span class="cx">
</span><span class="cx"> if (renderer.isCanvas()) {
</span><del>- HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer.element());
</del><span class="cx"> #if USE(COMPOSITING_FOR_SMALL_CANVASES)
</span><span class="cx"> bool isCanvasLargeEnoughToForceCompositing = true;
</span><span class="cx"> #else
</span><ins>+ HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer.element());
</ins><span class="cx"> bool isCanvasLargeEnoughToForceCompositing = canvas->size().area() >= canvasAreaThresholdRequiringCompositing;
</span><span class="cx"> #endif
</span><del>- return canvas->renderingContext() && canvas->renderingContext()->isAccelerated() && (canvas->renderingContext()->is3d() || isCanvasLargeEnoughToForceCompositing);
</del><ins>+ CanvasCompositingStrategy compositingStrategy = canvasCompositingStrategy(renderer);
+ return compositingStrategy == CanvasAsLayerContents || (compositingStrategy == CanvasPaintedToLayer && isCanvasLargeEnoughToForceCompositing);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> return false;
</span></span></pre>
</div>
</div>
</body>
</html>