<!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>[235037] releases/WebKitGTK/webkit-2.22/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/235037">235037</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2018-08-20 04:10:26 -0700 (Mon, 20 Aug 2018)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/234932">r234932</a> - [Nicosia] Add Nicosia::ImageBackingTextureMapperImpl
https://bugs.webkit.org/show_bug.cgi?id=188550

Reviewed by Carlos Garcia Campos.

Add the Nicosia::ImageBackingTextureMapperImpl class, the
TextureMapper-specific implementation that will extend the ImageBacking
class.

This class will be used to contain and manage updates for layers that
are backed by image objects. The CoordinatedGraphicsLayer instance will
use the LayerState object to track the currently-presented image objects
and to store the latest update of these objects. The Update struct
contains information about the current visibility of the image in the
layer tree as well as the Nicosia::Buffer object containing the painted
image data that's to be presented on the screen.

During the layer flush the flushUpdate() method will move the current
update data into the pending position, from which this data will be
gathered by the composition component through the takeUpdate() method
and used to update the CoordinatedBackingStore object that's kept in
the CompositionState object on this impl class.

This will be deployed for use in the CoordinatedGraphicsLayer at a later
stage as it requires a larger rework in both CoordinatedGraphicsLayer as
well as the CoordinatedGraphicsScene classes.

The implementation itself differs from the current image backing support
in CoordinatedGraphicsLayer and CompositingCoordinator by abandoning the
idea of sharing single image backings between layers that might be
backed by identical Image objects. We thus end up trading any memory
consumption benefit in these scenarios for a much simplified
implementation. Overall this area needs more research both in figuring
out whether there's worthy improvements in grouping image backings, as
well as investigating whether it's possible to avoid additional image
rasterization by just leveraging direct pixel data via the
NativeImagePtr object.

* platform/TextureMapper.cmake:
* platform/graphics/nicosia/texmap/NicosiaImageBackingTextureMapperImpl.cpp: Added.
(Nicosia::ImageBackingTextureMapperImpl::createFactory):
(Nicosia::ImageBackingTextureMapperImpl::flushUpdate):
(Nicosia::ImageBackingTextureMapperImpl::takeUpdate):
* platform/graphics/nicosia/texmap/NicosiaImageBackingTextureMapperImpl.h: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit222SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.22/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit222SourceWebCoreplatformTextureMappercmake">releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/TextureMapper.cmake</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit222SourceWebCoreplatformgraphicsnicosiatexmapNicosiaImageBackingTextureMapperImplcpp">releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaImageBackingTextureMapperImpl.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit222SourceWebCoreplatformgraphicsnicosiatexmapNicosiaImageBackingTextureMapperImplh">releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaImageBackingTextureMapperImpl.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit222SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.22/Source/WebCore/ChangeLog (235036 => 235037)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.22/Source/WebCore/ChangeLog  2018-08-20 10:37:17 UTC (rev 235036)
+++ releases/WebKitGTK/webkit-2.22/Source/WebCore/ChangeLog     2018-08-20 11:10:26 UTC (rev 235037)
</span><span class="lines">@@ -1,3 +1,50 @@
</span><ins>+2018-08-16  Zan Dobersek  <zdobersek@igalia.com>
+
+        [Nicosia] Add Nicosia::ImageBackingTextureMapperImpl
+        https://bugs.webkit.org/show_bug.cgi?id=188550
+
+        Reviewed by Carlos Garcia Campos.
+
+        Add the Nicosia::ImageBackingTextureMapperImpl class, the
+        TextureMapper-specific implementation that will extend the ImageBacking
+        class.
+
+        This class will be used to contain and manage updates for layers that
+        are backed by image objects. The CoordinatedGraphicsLayer instance will
+        use the LayerState object to track the currently-presented image objects
+        and to store the latest update of these objects. The Update struct
+        contains information about the current visibility of the image in the
+        layer tree as well as the Nicosia::Buffer object containing the painted
+        image data that's to be presented on the screen.
+
+        During the layer flush the flushUpdate() method will move the current
+        update data into the pending position, from which this data will be
+        gathered by the composition component through the takeUpdate() method
+        and used to update the CoordinatedBackingStore object that's kept in
+        the CompositionState object on this impl class.
+
+        This will be deployed for use in the CoordinatedGraphicsLayer at a later
+        stage as it requires a larger rework in both CoordinatedGraphicsLayer as
+        well as the CoordinatedGraphicsScene classes.
+
+        The implementation itself differs from the current image backing support
+        in CoordinatedGraphicsLayer and CompositingCoordinator by abandoning the
+        idea of sharing single image backings between layers that might be
+        backed by identical Image objects. We thus end up trading any memory
+        consumption benefit in these scenarios for a much simplified
+        implementation. Overall this area needs more research both in figuring
+        out whether there's worthy improvements in grouping image backings, as
+        well as investigating whether it's possible to avoid additional image
+        rasterization by just leveraging direct pixel data via the
+        NativeImagePtr object.
+
+        * platform/TextureMapper.cmake:
+        * platform/graphics/nicosia/texmap/NicosiaImageBackingTextureMapperImpl.cpp: Added.
+        (Nicosia::ImageBackingTextureMapperImpl::createFactory):
+        (Nicosia::ImageBackingTextureMapperImpl::flushUpdate):
+        (Nicosia::ImageBackingTextureMapperImpl::takeUpdate):
+        * platform/graphics/nicosia/texmap/NicosiaImageBackingTextureMapperImpl.h: Added.
+
</ins><span class="cx"> 2018-08-16  Zalan Bujtas  <zalan@apple.com>
</span><span class="cx"> 
</span><span class="cx">         [lFC][Floating] Add estimated margin top computation.
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit222SourceWebCoreplatformTextureMappercmake"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/TextureMapper.cmake (235036 => 235037)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/TextureMapper.cmake       2018-08-20 10:37:17 UTC (rev 235036)
+++ releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/TextureMapper.cmake  2018-08-20 11:10:26 UTC (rev 235037)
</span><span class="lines">@@ -62,6 +62,7 @@
</span><span class="cx">         platform/graphics/nicosia/texmap/NicosiaCompositionLayerTextureMapperImpl.cpp
</span><span class="cx">         platform/graphics/nicosia/texmap/NicosiaContentLayerTextureMapperImpl.cpp
</span><span class="cx">         platform/graphics/nicosia/texmap/NicosiaGC3DLayer.cpp
</span><ins>+        platform/graphics/nicosia/texmap/NicosiaImageBackingTextureMapperImpl.cpp
</ins><span class="cx">     )
</span><span class="cx"> else ()
</span><span class="cx">     list(APPEND WebCore_SOURCES
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit222SourceWebCoreplatformgraphicsnicosiatexmapNicosiaImageBackingTextureMapperImplcpp"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaImageBackingTextureMapperImpl.cpp (0 => 235037)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaImageBackingTextureMapperImpl.cpp                          (rev 0)
+++ releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaImageBackingTextureMapperImpl.cpp     2018-08-20 11:10:26 UTC (rev 235037)
</span><span class="lines">@@ -0,0 +1,61 @@
</span><ins>+/*
+ * Copyright (C) 2018 Metrological Group B.V.
+ * Copyright (C) 2018 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials provided
+ *    with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "NicosiaImageBackingTextureMapperImpl.h"
+
+#if USE(TEXTURE_MAPPER)
+
+namespace Nicosia {
+
+auto ImageBackingTextureMapperImpl::createFactory() -> Factory
+{
+    return Factory(
+        [](ImageBacking&) {
+            return std::make_unique<ImageBackingTextureMapperImpl>();
+        });
+}
+
+ImageBackingTextureMapperImpl::ImageBackingTextureMapperImpl() = default;
+ImageBackingTextureMapperImpl::~ImageBackingTextureMapperImpl() = default;
+
+void ImageBackingTextureMapperImpl::flushUpdate()
+{
+    LockHolder locker(m_update.lock);
+    m_update.update = WTFMove(m_layerState.update);
+}
+
+auto ImageBackingTextureMapperImpl::takeUpdate() -> Update
+{
+    LockHolder locker(m_update.lock);
+    return WTFMove(m_update.update);
+}
+
+} // namespace Nicosia
+
+#endif
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit222SourceWebCoreplatformgraphicsnicosiatexmapNicosiaImageBackingTextureMapperImplh"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaImageBackingTextureMapperImpl.h (0 => 235037)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaImageBackingTextureMapperImpl.h                            (rev 0)
+++ releases/WebKitGTK/webkit-2.22/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaImageBackingTextureMapperImpl.h       2018-08-20 11:10:26 UTC (rev 235037)
</span><span class="lines">@@ -0,0 +1,110 @@
</span><ins>+/*
+ * Copyright (C) 2018 Metrological Group B.V.
+ * Copyright (C) 2018 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials provided
+ *    with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(TEXTURE_MAPPER)
+
+#include "CoordinatedBackingStore.h"
+#include "NicosiaBuffer.h"
+#include "NicosiaPlatformLayer.h"
+#include <wtf/Lock.h>
+
+namespace WebCore {
+class Image;
+}
+
+namespace Nicosia {
+
+class ImageBackingTextureMapperImpl final : public ImageBacking::Impl {
+public:
+    static Factory createFactory();
+
+    ImageBackingTextureMapperImpl();
+    virtual ~ImageBackingTextureMapperImpl();
+    bool isTextureMapperImpl() const override { return true; }
+
+    // A move-only update container.
+    struct Update {
+        Update() = default;
+        Update(const Update&) = delete;
+        Update& operator=(const Update&) = delete;
+        Update(Update&&) = default;
+        Update& operator=(Update&&) = default;
+
+        bool isVisible { false };
+        RefPtr<Nicosia::Buffer> buffer;
+    };
+
+    // An immutable layer-side state object. flushUpdate() prepares
+    // the current update for consumption by the composition-side.
+    struct LayerState {
+        LayerState() = default;
+        LayerState(const LayerState&) = delete;
+        LayerState& operator=(const LayerState&) = delete;
+        LayerState(LayerState&&) = delete;
+        LayerState& operator=(LayerState&&) = delete;
+
+        uintptr_t imageID { 0 };
+        uintptr_t nativeImageID { 0 };
+        Update update;
+    };
+    LayerState& layerState() { return m_layerState; }
+
+    void flushUpdate();
+
+    // An immutable composition-side state object. takeUpdate() returns the update
+    // information that's to be fed to the CoordinatedBackingStore object.
+    struct CompositionState {
+        CompositionState() = default;
+        CompositionState(const CompositionState&) = delete;
+        CompositionState& operator=(const CompositionState&) = delete;
+        CompositionState(CompositionState&&) = delete;
+        CompositionState& operator=(CompositionState&&) = delete;
+
+        RefPtr<WebCore::CoordinatedBackingStore> backingStore;
+    };
+    CompositionState& compositionState() { return m_compositionState; }
+
+    Update takeUpdate();
+
+private:
+    LayerState m_layerState;
+    CompositionState m_compositionState;
+
+    struct {
+        Lock lock;
+        Update update;
+    } m_update;
+};
+
+} // namespace Nicosia
+
+SPECIALIZE_TYPE_TRAITS_NICOSIA_IMAGEBACKING_IMPL(ImageBackingTextureMapperImpl, isTextureMapperImpl());
+
+#endif // USE(TEXTURE_MAPPER)
</ins></span></pre>
</div>
</div>

</body>
</html>