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
+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.
#ifndef RemoteLayerTreeTransaction_h
#define RemoteLayerTreeTransaction_h
+#include "RemoteLayerBackingStore.h"
#include <WebCore/Color.h>
#include <WebCore/FloatPoint3D.h>
#include <WebCore/FloatSize.h>
MinificationFilterChanged = 1 << 20,
MagnificationFilterChanged = 1 << 21,
SpeedChanged = 1 << 22,
- TimeOffsetChanged = 1 << 23
+ TimeOffsetChanged = 1 << 23,
+ BackingStoreChanged = 1 << 24
};
struct LayerCreationProperties {
WebCore::PlatformCALayer::FilterType magnificationFilter;
float speed;
double timeOffset;
+ RemoteLayerBackingStore backingStore;
};
explicit RemoteLayerTreeTransaction();
if (changedProperties & TimeOffsetChanged)
encoder << timeOffset;
+
+ if (changedProperties & BackingStoreChanged)
+ encoder << backingStore;
}
bool RemoteLayerTreeTransaction::LayerProperties::decode(CoreIPC::ArgumentDecoder& decoder, LayerProperties& result)
return false;
}
+ if (result.changedProperties & BackingStoreChanged) {
+ if (!decoder.decode(result.backingStore))
+ return false;
+ }
+
return true;
}
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");
}
}
#import "RemoteLayerTreeHostMessages.h"
#import "RemoteLayerTreeTransaction.h"
+#import "ShareableBitmap.h"
#import "WebPageProxy.h"
#import "WebProcessProxy.h"
#import <WebCore/PlatformLayer.h>
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);
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())
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 */,
#import "PlatformCALayerRemote.h"
+#import "RemoteLayerBackingStore.h"
#import "RemoteLayerTreeContext.h"
#import <WebCore/AnimationUtilities.h>
#import <WebCore/GraphicsContext.h>
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();
{
}
+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()
#if USE(ACCELERATED_COMPOSITING)
#include "RemoteLayerTreeTransaction.h"
-
#include <WebCore/PlatformCALayer.h>
#include <WebCore/PlatformLayer.h>
virtual AVPlayerLayer *playerLayer() const OVERRIDE;
+ void ensureBackingStore();
+
RemoteLayerTreeTransaction::LayerID m_layerID;
RemoteLayerTreeTransaction::LayerProperties m_properties;
WebCore::PlatformCALayerList m_children;
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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)