Remote Layer Tree: Proxy layer contents to the UI process
authortimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Oct 2013 05:23:38 +0000 (05:23 +0000)
committertimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Oct 2013 05:23:38 +0000 (05:23 +0000)
http://bugs.webkit.org/show_bug.cgi?id=123003

Reviewed by Anders Carlsson.

Proxy layer contents to the UI process. Contents are painted into ShareableBitmaps
for now, and are fully repainted on any invalidation. Also, contents do not respect
any kind of scale or use of contentsRect/etc.

* Shared/mac/RemoteLayerTreeTransaction.h:
* Shared/mac/RemoteLayerTreeTransaction.mm:
(WebKit::RemoteLayerTreeTransaction::LayerProperties::encode):
(WebKit::RemoteLayerTreeTransaction::LayerProperties::decode):
(WebKit::dumpChangedLayers):
Store/encode/decode/dump the new RemoteLayerBackingStore.

* UIProcess/mac/RemoteLayerTreeHost.mm:
(WebKit::RemoteLayerTreeHost::commit):
Fix a mistake where contentsRect was getting reset when contentsScale changed.
Set the layer contents when the backing store changes.

* WebKit2.xcodeproj/project.pbxproj:
Add RemoteLayerBackingStore.

* WebProcess/WebPage/mac/PlatformCALayerRemote.cpp:
(PlatformCALayerRemote::recursiveBuildTransaction):
Paint while building our transaction, and mark the backing store as changed
if we did any painting.

(PlatformCALayerRemote::ensureBackingStore):
Keep the backing store's properties up-to-date with our layer.

(PlatformCALayerRemote::setNeedsDisplay):
Inform the backing store that it needs to paint.

* WebProcess/WebPage/mac/PlatformCALayerRemote.h:

* WebProcess/WebPage/mac/RemoteLayerBackingStore.h: Added.
* WebProcess/WebPage/mac/RemoteLayerBackingStore.mm: Added.
(RemoteLayerBackingStore::RemoteLayerBackingStore):
(RemoteLayerBackingStore::encode):
(RemoteLayerBackingStore::decode):
Encode/decode our ShareableBitmap (via its handle) and size.

(RemoteLayerBackingStore::setNeedsDisplay):
For now, repaint the world.

(RemoteLayerBackingStore::display):
Create a new bitmap if needed, and paint into it.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@157623 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/Shared/mac/RemoteLayerTreeTransaction.h
Source/WebKit2/Shared/mac/RemoteLayerTreeTransaction.mm
Source/WebKit2/UIProcess/mac/RemoteLayerTreeHost.mm
Source/WebKit2/WebKit2.xcodeproj/project.pbxproj
Source/WebKit2/WebProcess/WebPage/mac/PlatformCALayerRemote.cpp
Source/WebKit2/WebProcess/WebPage/mac/PlatformCALayerRemote.h
Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerBackingStore.h [new file with mode: 0644]
Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerBackingStore.mm [new file with mode: 0644]

index 94abcf0..3f8f143 100644 (file)
@@ -1,3 +1,55 @@
+2013-10-17  Tim Horton  <timothy_horton@apple.com>
+
+        Remote Layer Tree: Proxy layer contents to the UI process
+        http://bugs.webkit.org/show_bug.cgi?id=123003
+
+        Reviewed by Anders Carlsson.
+
+        Proxy layer contents to the UI process. Contents are painted into ShareableBitmaps
+        for now, and are fully repainted on any invalidation. Also, contents do not respect
+        any kind of scale or use of contentsRect/etc.
+
+        * Shared/mac/RemoteLayerTreeTransaction.h:
+        * Shared/mac/RemoteLayerTreeTransaction.mm:
+        (WebKit::RemoteLayerTreeTransaction::LayerProperties::encode):
+        (WebKit::RemoteLayerTreeTransaction::LayerProperties::decode):
+        (WebKit::dumpChangedLayers):
+        Store/encode/decode/dump the new RemoteLayerBackingStore.
+
+        * UIProcess/mac/RemoteLayerTreeHost.mm:
+        (WebKit::RemoteLayerTreeHost::commit):
+        Fix a mistake where contentsRect was getting reset when contentsScale changed.
+        Set the layer contents when the backing store changes.
+
+        * WebKit2.xcodeproj/project.pbxproj:
+        Add RemoteLayerBackingStore.
+
+        * WebProcess/WebPage/mac/PlatformCALayerRemote.cpp:
+        (PlatformCALayerRemote::recursiveBuildTransaction):
+        Paint while building our transaction, and mark the backing store as changed
+        if we did any painting.
+
+        (PlatformCALayerRemote::ensureBackingStore):
+        Keep the backing store's properties up-to-date with our layer.
+
+        (PlatformCALayerRemote::setNeedsDisplay):
+        Inform the backing store that it needs to paint.
+
+        * WebProcess/WebPage/mac/PlatformCALayerRemote.h:
+
+        * WebProcess/WebPage/mac/RemoteLayerBackingStore.h: Added.
+        * WebProcess/WebPage/mac/RemoteLayerBackingStore.mm: Added.
+        (RemoteLayerBackingStore::RemoteLayerBackingStore):
+        (RemoteLayerBackingStore::encode):
+        (RemoteLayerBackingStore::decode):
+        Encode/decode our ShareableBitmap (via its handle) and size.
+
+        (RemoteLayerBackingStore::setNeedsDisplay):
+        For now, repaint the world.
+
+        (RemoteLayerBackingStore::display):
+        Create a new bitmap if needed, and paint into it.
+
 2013-10-17  Dan Bernstein  <mitz@apple.com>
 
         Fixed a typo in the definition of WK_API_ENABLED.
index 7d48404..5716f34 100644 (file)
@@ -26,6 +26,7 @@
 #ifndef RemoteLayerTreeTransaction_h
 #define RemoteLayerTreeTransaction_h
 
+#include "RemoteLayerBackingStore.h"
 #include <WebCore/Color.h>
 #include <WebCore/FloatPoint3D.h>
 #include <WebCore/FloatSize.h>
@@ -71,7 +72,8 @@ public:
         MinificationFilterChanged = 1 << 20,
         MagnificationFilterChanged = 1 << 21,
         SpeedChanged = 1 << 22,
-        TimeOffsetChanged = 1 << 23
+        TimeOffsetChanged = 1 << 23,
+        BackingStoreChanged = 1 << 24
     };
 
     struct LayerCreationProperties {
@@ -117,6 +119,7 @@ public:
         WebCore::PlatformCALayer::FilterType magnificationFilter;
         float speed;
         double timeOffset;
+        RemoteLayerBackingStore backingStore;
     };
 
     explicit RemoteLayerTreeTransaction();
index 89b4909..9a2e076 100644 (file)
@@ -137,6 +137,9 @@ void RemoteLayerTreeTransaction::LayerProperties::encode(CoreIPC::ArgumentEncode
 
     if (changedProperties & TimeOffsetChanged)
         encoder << timeOffset;
+
+    if (changedProperties & BackingStoreChanged)
+        encoder << backingStore;
 }
 
 bool RemoteLayerTreeTransaction::LayerProperties::decode(CoreIPC::ArgumentDecoder& decoder, LayerProperties& result)
@@ -264,6 +267,11 @@ bool RemoteLayerTreeTransaction::LayerProperties::decode(CoreIPC::ArgumentDecode
             return false;
     }
 
+    if (result.changedProperties & BackingStoreChanged) {
+        if (!decoder.decode(result.backingStore))
+            return false;
+    }
+
     return true;
 }
 
@@ -587,6 +595,16 @@ static void dumpChangedLayers(StringBuilder& builder, const HashMap<RemoteLayerT
             builder.append(')');
         }
 
+        if (layerProperties.changedProperties & RemoteLayerTreeTransaction::BackingStoreChanged) {
+            builder.append('\n');
+            writeIndent(builder, 3);
+            builder.append("(backingStore ");
+            builder.appendNumber(layerProperties.backingStore.bitmap()->size().width());
+            builder.append(" ");
+            builder.appendNumber(layerProperties.backingStore.bitmap()->size().height());
+            builder.append(')');
+        }
+
         builder.append(")\n");
     }
 }
index feb0847..20ebfd6 100644 (file)
@@ -28,6 +28,7 @@
 
 #import "RemoteLayerTreeHostMessages.h"
 #import "RemoteLayerTreeTransaction.h"
+#import "ShareableBitmap.h"
 #import "WebPageProxy.h"
 #import "WebProcessProxy.h"
 #import <WebCore/PlatformLayer.h>
@@ -183,7 +184,7 @@ void RemoteLayerTreeHost::commit(const RemoteLayerTreeTransaction& transaction)
             layer.contentsRect = properties.contentsRect;
 
         if (properties.changedProperties & RemoteLayerTreeTransaction::ContentsScaleChanged)
-            layer.contentsRect = properties.contentsRect;
+            layer.contentsScale = properties.contentsScale;
 
         if (properties.changedProperties & RemoteLayerTreeTransaction::MinificationFilterChanged)
             layer.minificationFilter = toCAFilterType(properties.minificationFilter);
@@ -196,6 +197,12 @@ void RemoteLayerTreeHost::commit(const RemoteLayerTreeTransaction& transaction)
 
         if (properties.changedProperties & RemoteLayerTreeTransaction::TimeOffsetChanged)
             layer.timeOffset = properties.timeOffset;
+
+        if (properties.changedProperties & RemoteLayerTreeTransaction::BackingStoreChanged) {
+            // FIXME: Do we need Copy?
+            RetainPtr<CGImageRef> image = properties.backingStore.bitmap()->makeCGImageCopy();
+            layer.contents = (id)image.get();
+        }
     }
 
     for (auto destroyedLayer : transaction.destroyedLayers())
index 5d37fad..10d71e6 100644 (file)
                2D2ADF0B16362DDB00197E47 /* PDFPluginAnnotation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D2ADF031636243500197E47 /* PDFPluginAnnotation.mm */; };
                2D2ADF1016364D8200197E47 /* PDFPluginChoiceAnnotation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D2ADF0E16364D8200197E47 /* PDFPluginChoiceAnnotation.mm */; };
                2D429BFD1721E2C700EC681F /* PDFPluginPasswordField.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D429BFB1721E2BA00EC681F /* PDFPluginPasswordField.mm */; };
+               2D47B56C1810714E003A3AEE /* RemoteLayerBackingStore.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D47B56A1810714E003A3AEE /* RemoteLayerBackingStore.mm */; };
+               2D47B56D1810714E003A3AEE /* RemoteLayerBackingStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D47B56B1810714E003A3AEE /* RemoteLayerBackingStore.h */; };
                2D870D1016234FFE000A3F20 /* PDFPlugin.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D870D0E1622B7F9000A3F20 /* PDFPlugin.mm */; };
                2DA049B3180CCCD300AAFA9E /* PlatformCALayerRemote.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2DA049B1180CCCD300AAFA9E /* PlatformCALayerRemote.cpp */; };
                2DA049B4180CCCD300AAFA9E /* PlatformCALayerRemote.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DA049B2180CCCD300AAFA9E /* PlatformCALayerRemote.h */; };
                2D2ADF0E16364D8200197E47 /* PDFPluginChoiceAnnotation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = PDFPluginChoiceAnnotation.mm; path = PDF/PDFPluginChoiceAnnotation.mm; sourceTree = "<group>"; };
                2D429BFA1721E2BA00EC681F /* PDFPluginPasswordField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PDFPluginPasswordField.h; path = PDF/PDFPluginPasswordField.h; sourceTree = "<group>"; };
                2D429BFB1721E2BA00EC681F /* PDFPluginPasswordField.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = PDFPluginPasswordField.mm; path = PDF/PDFPluginPasswordField.mm; sourceTree = "<group>"; };
+               2D47B56A1810714E003A3AEE /* RemoteLayerBackingStore.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RemoteLayerBackingStore.mm; sourceTree = "<group>"; };
+               2D47B56B1810714E003A3AEE /* RemoteLayerBackingStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoteLayerBackingStore.h; sourceTree = "<group>"; };
                2D870D0D1622B7F9000A3F20 /* PDFPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PDFPlugin.h; path = PDF/PDFPlugin.h; sourceTree = "<group>"; };
                2D870D0E1622B7F9000A3F20 /* PDFPlugin.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = PDFPlugin.mm; path = PDF/PDFPlugin.mm; sourceTree = "<group>"; };
                2DA049B1180CCCD300AAFA9E /* PlatformCALayerRemote.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PlatformCALayerRemote.cpp; sourceTree = "<group>"; };
                                2DA049B6180CCD0A00AAFA9E /* GraphicsLayerCARemote.h */,
                                2DA049B1180CCCD300AAFA9E /* PlatformCALayerRemote.cpp */,
                                2DA049B2180CCCD300AAFA9E /* PlatformCALayerRemote.h */,
+                               2D47B56A1810714E003A3AEE /* RemoteLayerBackingStore.mm */,
+                               2D47B56B1810714E003A3AEE /* RemoteLayerBackingStore.h */,
                                1AB16AE8164B3A8800290D62 /* RemoteLayerTreeContext.h */,
                                1AB16AE7164B3A8800290D62 /* RemoteLayerTreeContext.mm */,
                                1AB16ADC1648598400290D62 /* RemoteLayerTreeDrawingArea.h */,
                                BCBAAC74144E61A50053F82F /* WKBrowsingContextControllerInternal.h in Headers */,
                                3788A05C14743C90006319E5 /* WKBrowsingContextControllerPrivate.h in Headers */,
                                BCBAACF41452324F0053F82F /* WKBrowsingContextGroup.h in Headers */,
+                               2D47B56D1810714E003A3AEE /* RemoteLayerBackingStore.h in Headers */,
                                BCBAACF61452324F0053F82F /* WKBrowsingContextGroupPrivate.h in Headers */,
                                BCBAAD0B14560A430053F82F /* WKBrowsingContextLoadDelegate.h in Headers */,
                                BC204EEF11C83EC8008F3375 /* WKBundle.h in Headers */,
                                BCE81D98131AE02100241910 /* DictionaryPopupInfo.cpp in Sources */,
                                5167EEA1170377BF007681CA /* DiskCacheMonitor.mm in Sources */,
                                518E8F0716B2093700E91429 /* Download.cpp in Sources */,
+                               2D47B56C1810714E003A3AEE /* RemoteLayerBackingStore.mm in Sources */,
                                518E8F0916B2093700E91429 /* DownloadAuthenticationClient.cpp in Sources */,
                                518E8F0D16B2093700E91429 /* DownloadMac.mm in Sources */,
                                518E8F0B16B2093700E91429 /* DownloadManager.cpp in Sources */,
index 6d851ce..40e7f4a 100644 (file)
@@ -29,6 +29,7 @@
 
 #import "PlatformCALayerRemote.h"
 
+#import "RemoteLayerBackingStore.h"
 #import "RemoteLayerTreeContext.h"
 #import <WebCore/AnimationUtilities.h>
 #import <WebCore/GraphicsContext.h>
@@ -73,6 +74,9 @@ PlatformCALayerRemote::~PlatformCALayerRemote()
 
 void PlatformCALayerRemote::recursiveBuildTransaction(RemoteLayerTreeTransaction& transaction)
 {
+    if (m_properties.backingStore.display())
+        m_properties.notePropertiesChanged(RemoteLayerTreeTransaction::BackingStoreChanged);
+
     if (m_properties.changedProperties != RemoteLayerTreeTransaction::NoChange) {
         if (m_properties.changedProperties & RemoteLayerTreeTransaction::ChildrenChanged) {
             m_properties.children.clear();
@@ -94,8 +98,25 @@ void PlatformCALayerRemote::animationStarted(CFTimeInterval beginTime)
 {
 }
 
+void PlatformCALayerRemote::ensureBackingStore()
+{
+    if (m_properties.backingStore.layer() == this
+        && m_properties.backingStore.size() == m_properties.size
+        && m_properties.backingStore.isOpaque() == m_properties.opaque)
+        return;
+
+    m_properties.backingStore = RemoteLayerBackingStore(this, expandedIntSize(m_properties.size), m_properties.opaque);
+}
+
 void PlatformCALayerRemote::setNeedsDisplay(const FloatRect* dirtyRect)
 {
+    ensureBackingStore();
+
+    // FIXME: Need to map this through contentsRect/contentsScale/etc.
+    if (dirtyRect)
+        m_properties.backingStore.setNeedsDisplay(enclosingIntRect(*dirtyRect));
+    else
+        m_properties.backingStore.setNeedsDisplay();
 }
 
 void PlatformCALayerRemote::setContentsChanged()
index 6bbbb37..fa7f1bf 100644 (file)
@@ -29,7 +29,6 @@
 #if USE(ACCELERATED_COMPOSITING)
 
 #include "RemoteLayerTreeTransaction.h"
-
 #include <WebCore/PlatformCALayer.h>
 #include <WebCore/PlatformLayer.h>
 
@@ -149,6 +148,8 @@ private:
 
     virtual AVPlayerLayer *playerLayer() const OVERRIDE;
 
+    void ensureBackingStore();
+
     RemoteLayerTreeTransaction::LayerID m_layerID;
     RemoteLayerTreeTransaction::LayerProperties m_properties;
     WebCore::PlatformCALayerList m_children;
diff --git a/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerBackingStore.h b/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerBackingStore.h
new file mode 100644 (file)
index 0000000..f39123f
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * 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 APPLE INC. ``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 APPLE COMPUTER, INC. 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.
+ */
+
+#ifndef RemoteLayerBackingStore_h
+#define RemoteLayerBackingStore_h
+
+#if USE(ACCELERATED_COMPOSITING)
+
+#include "ShareableBitmap.h"
+#include <WebCore/IntRect.h>
+
+namespace WebKit {
+
+class PlatformCALayerRemote;
+
+class RemoteLayerBackingStore {
+public:
+    RemoteLayerBackingStore();
+    RemoteLayerBackingStore(PlatformCALayerRemote*, WebCore::IntSize, bool isOpaque);
+
+    void setNeedsDisplay(WebCore::IntRect);
+    void setNeedsDisplay();
+
+    bool display();
+
+    ShareableBitmap* bitmap() const { return m_bitmap.get(); }
+    WebCore::IntSize size() const { return m_size; }
+    bool isOpaque() const { return m_isOpaque; }
+
+    PlatformCALayerRemote* layer() const { return m_layer; }
+
+    void encode(CoreIPC::ArgumentEncoder&) const;
+    static bool decode(CoreIPC::ArgumentDecoder&, RemoteLayerBackingStore&);
+
+private:
+    PlatformCALayerRemote* m_layer;
+
+    WebCore::IntSize m_size;
+    bool m_isOpaque;
+
+    bool m_needsFullRepaint;
+
+    RefPtr<ShareableBitmap> m_bitmap;
+};
+
+} // namespace WebKit
+
+#endif // USE(ACCELERATED_COMPOSITING)
+
+#endif // RemoteLayerBackingStore_h
diff --git a/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerBackingStore.mm b/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerBackingStore.mm
new file mode 100644 (file)
index 0000000..5ac0694
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * 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 APPLE INC. ``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 APPLE COMPUTER, INC. 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.
+ */
+
+#import "config.h"
+#import "RemoteLayerBackingStore.h"
+
+#if USE(ACCELERATED_COMPOSITING)
+
+#import "PlatformCALayerRemote.h"
+#import "ArgumentCoders.h"
+#import "ShareableBitmap.h"
+#import "WebCoreArgumentCoders.h"
+
+using namespace WebCore;
+using namespace WebKit;
+
+RemoteLayerBackingStore::RemoteLayerBackingStore(PlatformCALayerRemote* layer, IntSize size, bool isOpaque)
+    : m_layer(layer)
+    , m_size(size)
+    , m_isOpaque(isOpaque)
+    , m_needsFullRepaint(true)
+{
+    ASSERT(layer);
+}
+
+RemoteLayerBackingStore::RemoteLayerBackingStore()
+    : m_layer(nullptr)
+{
+}
+
+void RemoteLayerBackingStore::encode(CoreIPC::ArgumentEncoder& encoder) const
+{
+    ShareableBitmap::Handle handle;
+    m_bitmap->createHandle(handle);
+
+    encoder << handle;
+    encoder << m_size;
+}
+
+bool RemoteLayerBackingStore::decode(CoreIPC::ArgumentDecoder& decoder, RemoteLayerBackingStore& result)
+{
+    ShareableBitmap::Handle handle;
+    if (!decoder.decode(handle))
+        return false;
+    result.m_bitmap = ShareableBitmap::create(handle);
+
+    if (!decoder.decode(result.m_size))
+        return false;
+
+    return true;
+}
+
+void RemoteLayerBackingStore::setNeedsDisplay(IntRect rect)
+{
+    // FIXME: Only repaint dirty regions.
+    setNeedsDisplay();
+}
+
+void RemoteLayerBackingStore::setNeedsDisplay()
+{
+    m_needsFullRepaint = true;
+}
+
+bool RemoteLayerBackingStore::display()
+{
+    if (!m_layer)
+        return false;
+
+    if (!m_layer->owner()->platformCALayerDrawsContent()) {
+        // If we previously were drawsContent=YES, and now are not, we need
+        // to note that our backing store has changed (by being cleared).
+        if (m_bitmap) {
+            m_bitmap = nullptr;
+            return true;
+        }
+        return false;
+    }
+
+    if (m_bitmap && !m_needsFullRepaint)
+        return false;
+
+    if (!m_bitmap) {
+        m_bitmap = ShareableBitmap::createShareable(m_size, m_isOpaque ? ShareableBitmap::NoFlags : ShareableBitmap::SupportsAlpha);
+        m_needsFullRepaint = true;
+    }
+
+    std::unique_ptr<GraphicsContext> context = m_bitmap->createGraphicsContext();
+    m_layer->owner()->platformCALayerPaintContents(*context.get(), IntRect(IntPoint(), m_size));
+
+    m_needsFullRepaint = false;
+
+    return true;
+}
+
+#endif // USE(ACCELERATED_COMPOSITING)