<!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>[190956] releases/WebKitGTK/webkit-2.10/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/190956">190956</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-10-13 03:47:08 -0700 (Tue, 13 Oct 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/190558">r190558</a> - GLContext should control ownership of context-related objects
https://bugs.webkit.org/show_bug.cgi?id=149794

Reviewed by Martin Robinson.

Creation of GLContext objects can depend on various platform-specific
objects like native window representations. Since these objects are
used solely for the GLContext purposes, it would make sense to allow
GLContext to provide an extensible way to impose ownership on these
objects and control their lifetime.

GLContext::Data is declared with a defaulted virtual destructor.
Users of these implementations can declare classes that derive from
GLContext::Data and store context-related objects in instances of the
derived class, and ensure that these objects are properly cleaned up
when GLContext destroys the Data object.

The GLContext::Data object is managed through a protected
std::unique_ptr&lt;&gt; member in the GLContext class. For now the member
is only set in GLContextEGL::createWindowContext() and is destroyed
during the GLContext destruction.

The local OffscreenContextData class in
PlatformDisplayWayland::createSharingGLContext() derives from
GLContext::Data and is used to store the wl_surface and
EGLNativeWindowType (aka wl_egl_window) objects for offscreen
GLContexts under the Wayland platform that are used for the sharing
context and WebGL, effectively avoiding the leak that would further
propagate problems into the compositor and the graphics library.
(Such offscreen contexts are actually mimicked via a 1x1px
wl_egl_window object that acts as a dummy base for the related
wl_surface object).

* platform/graphics/GLContext.h:
* platform/graphics/egl/GLContextEGL.cpp:
(WebCore::GLContextEGL::createWindowContext):
* platform/graphics/egl/GLContextEGL.h:
* platform/graphics/wayland/PlatformDisplayWayland.cpp:
(WebCore::PlatformDisplayWayland::createSharingGLContext):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCoreplatformgraphicsGLContexth">releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/GLContext.h</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCoreplatformgraphicseglGLContextEGLcpp">releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/egl/GLContextEGL.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCoreplatformgraphicseglGLContextEGLh">releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/egl/GLContextEGL.h</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCoreplatformgraphicswaylandPlatformDisplayWaylandcpp">releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/wayland/PlatformDisplayWayland.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit210SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog (190955 => 190956)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog        2015-10-13 10:45:40 UTC (rev 190955)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog        2015-10-13 10:47:08 UTC (rev 190956)
</span><span class="lines">@@ -1,5 +1,47 @@
</span><span class="cx"> 2015-10-05  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
</span><span class="cx"> 
</span><ins>+        GLContext should control ownership of context-related objects
+        https://bugs.webkit.org/show_bug.cgi?id=149794
+
+        Reviewed by Martin Robinson.
+
+        Creation of GLContext objects can depend on various platform-specific
+        objects like native window representations. Since these objects are
+        used solely for the GLContext purposes, it would make sense to allow
+        GLContext to provide an extensible way to impose ownership on these
+        objects and control their lifetime.
+
+        GLContext::Data is declared with a defaulted virtual destructor.
+        Users of these implementations can declare classes that derive from
+        GLContext::Data and store context-related objects in instances of the
+        derived class, and ensure that these objects are properly cleaned up
+        when GLContext destroys the Data object.
+
+        The GLContext::Data object is managed through a protected
+        std::unique_ptr&lt;&gt; member in the GLContext class. For now the member
+        is only set in GLContextEGL::createWindowContext() and is destroyed
+        during the GLContext destruction.
+
+        The local OffscreenContextData class in
+        PlatformDisplayWayland::createSharingGLContext() derives from
+        GLContext::Data and is used to store the wl_surface and
+        EGLNativeWindowType (aka wl_egl_window) objects for offscreen
+        GLContexts under the Wayland platform that are used for the sharing
+        context and WebGL, effectively avoiding the leak that would further
+        propagate problems into the compositor and the graphics library.
+        (Such offscreen contexts are actually mimicked via a 1x1px
+        wl_egl_window object that acts as a dummy base for the related
+        wl_surface object).
+
+        * platform/graphics/GLContext.h:
+        * platform/graphics/egl/GLContextEGL.cpp:
+        (WebCore::GLContextEGL::createWindowContext):
+        * platform/graphics/egl/GLContextEGL.h:
+        * platform/graphics/wayland/PlatformDisplayWayland.cpp:
+        (WebCore::PlatformDisplayWayland::createSharingGLContext):
+
+2015-10-05  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
+
</ins><span class="cx">         Make gdk.h inclusion in FontPlatformDataFreeType.cpp properly GTK-specific
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=149793
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCoreplatformgraphicsGLContexth"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/GLContext.h (190955 => 190956)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/GLContext.h        2015-10-13 10:45:40 UTC (rev 190955)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/GLContext.h        2015-10-13 10:47:08 UTC (rev 190956)
</span><span class="lines">@@ -79,6 +79,14 @@
</span><span class="cx"> #if ENABLE(GRAPHICS_CONTEXT_3D)
</span><span class="cx">     virtual PlatformGraphicsContext3D platformContext() = 0;
</span><span class="cx"> #endif
</span><ins>+
+    class Data {
+    public:
+        virtual ~Data() = default;
+    };
+
+protected:
+    std::unique_ptr&lt;Data&gt; m_contextData;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCoreplatformgraphicseglGLContextEGLcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/egl/GLContextEGL.cpp (190955 => 190956)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/egl/GLContextEGL.cpp        2015-10-13 10:45:40 UTC (rev 190955)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/egl/GLContextEGL.cpp        2015-10-13 10:47:08 UTC (rev 190956)
</span><span class="lines">@@ -95,7 +95,7 @@
</span><span class="cx">     return eglChooseConfig(sharedEGLDisplay(), attributeList, config, 1, &amp;numberConfigsReturned) &amp;&amp; numberConfigsReturned;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::unique_ptr&lt;GLContextEGL&gt; GLContextEGL::createWindowContext(EGLNativeWindowType window, GLContext* sharingContext)
</del><ins>+std::unique_ptr&lt;GLContextEGL&gt; GLContextEGL::createWindowContext(EGLNativeWindowType window, GLContext* sharingContext, std::unique_ptr&lt;GLContext::Data&gt;&amp;&amp; contextData)
</ins><span class="cx"> {
</span><span class="cx">     EGLContext eglSharingContext = sharingContext ? static_cast&lt;GLContextEGL*&gt;(sharingContext)-&gt;m_context : 0;
</span><span class="cx"> 
</span><span class="lines">@@ -117,7 +117,9 @@
</span><span class="cx">         return nullptr;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return std::make_unique&lt;GLContextEGL&gt;(context, surface, WindowSurface);
</del><ins>+    auto glContext = std::make_unique&lt;GLContextEGL&gt;(context, surface, WindowSurface);
+    glContext-&gt;m_contextData = WTF::move(contextData);
+    return glContext;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> std::unique_ptr&lt;GLContextEGL&gt; GLContextEGL::createPbufferContext(EGLContext sharingContext)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCoreplatformgraphicseglGLContextEGLh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/egl/GLContextEGL.h (190955 => 190956)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/egl/GLContextEGL.h        2015-10-13 10:45:40 UTC (rev 190955)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/egl/GLContextEGL.h        2015-10-13 10:47:08 UTC (rev 190956)
</span><span class="lines">@@ -36,7 +36,7 @@
</span><span class="cx"> public:
</span><span class="cx">     enum EGLSurfaceType { PbufferSurface, WindowSurface, PixmapSurface };
</span><span class="cx">     static std::unique_ptr&lt;GLContextEGL&gt; createContext(EGLNativeWindowType, GLContext* sharingContext = 0);
</span><del>-    static std::unique_ptr&lt;GLContextEGL&gt; createWindowContext(EGLNativeWindowType, GLContext* sharingContext);
</del><ins>+    static std::unique_ptr&lt;GLContextEGL&gt; createWindowContext(EGLNativeWindowType, GLContext* sharingContext, std::unique_ptr&lt;GLContext::Data&gt;&amp;&amp; = nullptr);
</ins><span class="cx"> 
</span><span class="cx">     GLContextEGL(EGLContext, EGLSurface, EGLSurfaceType);
</span><span class="cx"> #if PLATFORM(X11)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCoreplatformgraphicswaylandPlatformDisplayWaylandcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/wayland/PlatformDisplayWayland.cpp (190955 => 190956)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/wayland/PlatformDisplayWayland.cpp        2015-10-13 10:45:40 UTC (rev 190955)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/wayland/PlatformDisplayWayland.cpp        2015-10-13 10:47:08 UTC (rev 190956)
</span><span class="lines">@@ -131,9 +131,24 @@
</span><span class="cx"> 
</span><span class="cx"> std::unique_ptr&lt;GLContextEGL&gt; PlatformDisplayWayland::createSharingGLContext()
</span><span class="cx"> {
</span><del>-    struct wl_surface* wlSurface = wl_compositor_create_surface(m_compositor);
-    EGLNativeWindowType nativeWindow = wl_egl_window_create(wlSurface, 1, 1);
-    return GLContextEGL::createWindowContext(nativeWindow, nullptr);
</del><ins>+    class OffscreenContextData : public GLContext::Data {
+    public:
+        virtual ~OffscreenContextData()
+        {
+            wl_egl_window_destroy(nativeWindow);
+            wl_surface_destroy(surface);
+        }
+
+        struct wl_surface* surface;
+        EGLNativeWindowType nativeWindow;
+    };
+
+    auto contextData = std::make_unique&lt;OffscreenContextData&gt;();
+    contextData-&gt;surface = wl_compositor_create_surface(m_compositor);
+    contextData-&gt;nativeWindow = wl_egl_window_create(contextData-&gt;surface, 1, 1);
+
+    auto nativeWindow = contextData-&gt;nativeWindow;
+    return GLContextEGL::createWindowContext(nativeWindow, nullptr, WTF::move(contextData));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre>
</div>
</div>

</body>
</html>