<!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>[225260] trunk</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/225260">225260</a></dd>
<dt>Author</dt> <dd>zandobersek@gmail.com</dd>
<dt>Date</dt> <dd>2017-11-28 23:07:35 -0800 (Tue, 28 Nov 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Cairo] Limit the number of active contexts in GraphicsContext3DCairo
https://bugs.webkit.org/show_bug.cgi?id=166968

Reviewed by Alex Christensen.

Source/WebCore:

Cairo's implementation of GraphicsContext3D should follow the Mac's
and limit the number of active GraphicsContext3D objects.

The active contexts are listed in a global Deque, with the first
among them being recycled when the GraphicsContext3D::create()
function sees that the limit has been reached. That function still
returns null if even after recycling the number of contexts didn't
decrease.

Finally, in the GraphicsContext3D destructor, the context being
destroyed is removed from the list of active contexts.

No new tests -- relevant tests are now passing.

* platform/graphics/cairo/GraphicsContext3DCairo.cpp:
(WebCore::activeContexts):
(WebCore::GraphicsContext3D::create):
(WebCore::GraphicsContext3D::~GraphicsContext3D):

LayoutTests:

* platform/gtk/TestExpectations: Unskip WebGL tests that were failing
due to missing active context limit management.
* platform/wpe/TestExpectations: Ditto.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformgtkTestExpectations">trunk/LayoutTests/platform/gtk/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformwpeTestExpectations">trunk/LayoutTests/platform/wpe/TestExpectations</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscairoGraphicsContext3DCairocpp">trunk/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (225259 => 225260)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog      2017-11-29 06:16:54 UTC (rev 225259)
+++ trunk/LayoutTests/ChangeLog 2017-11-29 07:07:35 UTC (rev 225260)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2017-11-28  Zan Dobersek  <zdobersek@igalia.com>
+
+        [Cairo] Limit the number of active contexts in GraphicsContext3DCairo
+        https://bugs.webkit.org/show_bug.cgi?id=166968
+
+        Reviewed by Alex Christensen.
+
+        * platform/gtk/TestExpectations: Unskip WebGL tests that were failing
+        due to missing active context limit management.
+        * platform/wpe/TestExpectations: Ditto.
+
</ins><span class="cx"> 2017-11-28  Joseph Pecoraro  <pecoraro@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Write script syntax tree tests for template literals and default parameter values
</span></span></pre></div>
<a id="trunkLayoutTestsplatformgtkTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/gtk/TestExpectations (225259 => 225260)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/gtk/TestExpectations  2017-11-29 06:16:54 UTC (rev 225259)
+++ trunk/LayoutTests/platform/gtk/TestExpectations     2017-11-29 07:07:35 UTC (rev 225260)
</span><span class="lines">@@ -489,11 +489,6 @@
</span><span class="cx"> webkit.org/b/169917 webgl/1.0.3/conformance/renderbuffers/feedback-loop.html [ Failure ]
</span><span class="cx"> webkit.org/b/169917 webgl/1.0.3/conformance/rendering/point-no-attributes.html [ Failure ]
</span><span class="cx"> webkit.org/b/169917 webgl/1.0.3/conformance/textures/texture-copying-feedback-loops.html [ Failure ]
</span><del>-webkit.org/b/169917 webgl/many-contexts-access-after-loss.html [ Failure ]
-webkit.org/b/169917 webgl/many-contexts.html [ Failure ]
-webkit.org/b/169917 webgl/max-active-contexts-console-warning.html [ Failure ]
-webkit.org/b/169917 webgl/max-active-contexts-gc.html [ Failure ]
-webkit.org/b/169917 webgl/max-active-contexts-oldest-context-lost.html [ Failure ]
</del><span class="cx"> webkit.org/b/169917 webgl/webgl-vertex-array-object-defined.html [ Failure ]
</span><span class="cx"> webkit.org/b/169917 webgl/webgl-border.html [ ImageOnlyFailure ]
</span><span class="cx"> webkit.org/b/169917 webgl/webgl-box-shadow.html [ ImageOnlyFailure ]
</span><span class="lines">@@ -533,7 +528,6 @@
</span><span class="cx"> webkit.org/b/169917 webgl/1.0.3/conformance/uniforms/uniform-values-per-program.html [ Slow ]
</span><span class="cx"> webkit.org/b/169917 webgl/1.0.3/conformance/context/context-eviction-with-garbage-collection.html [ Slow ]
</span><span class="cx"> webkit.org/b/169917 webgl/1.0.3/conformance/glsl/misc/struct-nesting-of-variable-names.html [ Slow ]
</span><del>-webkit.org/b/169917 webgl/max-active-contexts-webglcontextlost-prevent-default.html [ Timeout ]
</del><span class="cx"> # WebGL crashes
</span><span class="cx"> webkit.org/b/169917 fast/canvas/webgl/webgl-draw-buffers.html [ Failure Crash ]
</span><span class="cx"> webkit.org/b/169917 webgl/1.0.3/conformance/extensions/webgl-draw-buffers.html [ Failure Crash ]
</span></span></pre></div>
<a id="trunkLayoutTestsplatformwpeTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/wpe/TestExpectations (225259 => 225260)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/wpe/TestExpectations  2017-11-29 06:16:54 UTC (rev 225259)
+++ trunk/LayoutTests/platform/wpe/TestExpectations     2017-11-29 07:07:35 UTC (rev 225260)
</span><span class="lines">@@ -144,13 +144,6 @@
</span><span class="cx"> # Pixel test result oddities
</span><span class="cx"> Bug(WPE) webgl/webgl-border.html [ ImageOnlyFailure ]
</span><span class="cx"> Bug(WPE) webgl/webgl-box-shadow.html [ ImageOnlyFailure ]
</span><del>-# Unknown
-Bug(WPE) webgl/many-contexts-access-after-loss.html [ Failure ]
-Bug(WPE) webgl/many-contexts.html [ Failure ]
-Bug(WPE) webgl/max-active-contexts-console-warning.html [ Failure ]
-Bug(WPE) webgl/max-active-contexts-gc.html [ Failure ]
-Bug(WPE) webgl/max-active-contexts-oldest-context-lost.html [ Failure ]
-webkit.org/b/169917 webgl/max-active-contexts-webglcontextlost-prevent-default.html [ Timeout ]
</del><span class="cx"> # Slow
</span><span class="cx"> webkit.org/b/169917 webgl/1.0.2/conformance/glsl/misc/shader-uniform-packing-restrictions.html [ Slow ]
</span><span class="cx"> webkit.org/b/169917 webgl/1.0.2/conformance/glsl/misc/shader-with-non-reserved-words.html [ Slow ]
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (225259 => 225260)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2017-11-29 06:16:54 UTC (rev 225259)
+++ trunk/Source/WebCore/ChangeLog      2017-11-29 07:07:35 UTC (rev 225260)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2017-11-28  Zan Dobersek  <zdobersek@igalia.com>
+
+        [Cairo] Limit the number of active contexts in GraphicsContext3DCairo
+        https://bugs.webkit.org/show_bug.cgi?id=166968
+
+        Reviewed by Alex Christensen.
+
+        Cairo's implementation of GraphicsContext3D should follow the Mac's
+        and limit the number of active GraphicsContext3D objects.
+
+        The active contexts are listed in a global Deque, with the first
+        among them being recycled when the GraphicsContext3D::create()
+        function sees that the limit has been reached. That function still
+        returns null if even after recycling the number of contexts didn't
+        decrease.
+
+        Finally, in the GraphicsContext3D destructor, the context being
+        destroyed is removed from the list of active contexts.
+
+        No new tests -- relevant tests are now passing.
+
+        * platform/graphics/cairo/GraphicsContext3DCairo.cpp:
+        (WebCore::activeContexts):
+        (WebCore::GraphicsContext3D::create):
+        (WebCore::GraphicsContext3D::~GraphicsContext3D):
+
</ins><span class="cx"> 2017-11-28  Zalan Bujtas  <zalan@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Clean up spanners before creating nested column context
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscairoGraphicsContext3DCairocpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp (225259 => 225260)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp  2017-11-29 06:16:54 UTC (rev 225259)
+++ trunk/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp     2017-11-29 07:07:35 UTC (rev 225260)
</span><span class="lines">@@ -40,6 +40,8 @@
</span><span class="cx"> #include "PlatformContextCairo.h"
</span><span class="cx"> #include "RefPtrCairo.h"
</span><span class="cx"> #include <cairo.h>
</span><ins>+#include <wtf/Deque.h>
+#include <wtf/NeverDestroyed.h>
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(WIN)
</span><span class="cx"> #include <GLSLANG/ShaderLang.h>
</span><span class="lines">@@ -65,6 +67,13 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+static const size_t MaxActiveContexts = 16;
+static Deque<GraphicsContext3D*, MaxActiveContexts>& activeContexts()
+{
+    static NeverDestroyed<Deque<GraphicsContext3D*, MaxActiveContexts>> s_activeContexts;
+    return s_activeContexts;
+}
+
</ins><span class="cx"> RefPtr<GraphicsContext3D> GraphicsContext3D::create(GraphicsContext3DAttributes attributes, HostWindow* hostWindow, GraphicsContext3D::RenderStyle renderStyle)
</span><span class="cx"> {
</span><span class="cx">     // This implementation doesn't currently support rendering directly to the HostWindow.
</span><span class="lines">@@ -82,6 +91,15 @@
</span><span class="cx">     if (!success)
</span><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><ins>+    auto& contexts = activeContexts();
+    if (contexts.size() >= MaxActiveContexts)
+        contexts.first()->recycleContext();
+
+    // Calling recycleContext() above should have lead to the graphics context being
+    // destroyed and thus removed from the active contexts list.
+    if (contexts.size() >= MaxActiveContexts)
+        return nullptr;
+
</ins><span class="cx">     // Create the GraphicsContext3D object first in order to establist a current context on this thread.
</span><span class="cx">     auto context = adoptRef(new GraphicsContext3D(attributes, hostWindow, renderStyle));
</span><span class="cx"> 
</span><span class="lines">@@ -91,6 +109,7 @@
</span><span class="cx">         return nullptr;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    contexts.append(context.get());
</ins><span class="cx">     return context;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -251,6 +270,9 @@
</span><span class="cx"> 
</span><span class="cx">     if (m_vao)
</span><span class="cx">         deleteVertexArray(m_vao);
</span><ins>+
+    auto* activeContext = activeContexts().takeLast([this](auto* it) { return it == this; });
+    ASSERT_UNUSED(activeContext, !!activeContext);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GraphicsContext3D::ImageExtractor::~ImageExtractor()
</span></span></pre>
</div>
</div>

</body>
</html>