Diff
Modified: trunk/Source/WebKit/ChangeLog (279991 => 279992)
--- trunk/Source/WebKit/ChangeLog 2021-07-16 18:18:05 UTC (rev 279991)
+++ trunk/Source/WebKit/ChangeLog 2021-07-16 18:24:35 UTC (rev 279992)
@@ -1,3 +1,50 @@
+2021-07-16 Tim Horton <timothy_hor...@apple.com>
+
+ Adopt BifurcatedGraphicsContext for backing store + display list RemoteLayerBackingStore
+ https://bugs.webkit.org/show_bug.cgi?id=226425
+ <rdar://77929299>
+
+ Reviewed by Sam Weinig.
+
+ Instead of "display list backed RemoteLayerBackingStore" being its own
+ backing store type, we make "includes a display list" a separate bit.
+ This way, we can paint both a bitmap (IOSurface or CG bitmap, all
+ exactly as it normally is), and also carry a sidecar display list.
+
+ * Shared/RemoteLayerTree/RemoteLayerBackingStore.h:
+ * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm:
+ (WebKit::RemoteLayerBackingStore::ensureBackingStore):
+ (WebKit::RemoteLayerBackingStore::encode const):
+ (WebKit::RemoteLayerBackingStore::decode):
+ (WebKit::RemoteLayerBackingStore::swapToValidFrontBuffer):
+ (WebKit::RemoteLayerBackingStore::supportsPartialRepaint):
+ We can't partially repaint the display list, and require its rendering
+ to match the painted backing store, so disable partial repaint entirely
+ if display lists are being used.
+
+ (WebKit::RemoteLayerBackingStore::display):
+ (WebKit::RemoteLayerBackingStore::drawInContext):
+ Adopt BifurcatedGraphicsContext in order to paint into the aforementioned
+ bitmap and display list simultaneously.
+ A future patch may abstract this into a new ImageBuffer type
+ instead of polluting RemoteLayerBackingStore with it.
+
+ Leave a temporary workaround for a CoreAnimation bug, which can be
+ disabled via `defaults write`, but is enabled by default.
+
+ (WebKit::layerContentsForBufferHandle):
+ (WebKit::RemoteLayerBackingStore::applyBackingStoreToLayer):
+ (WebKit::RemoteLayerBackingStore::Buffer::discard):
+ * UIProcess/RemoteLayerTree/cocoa/RemoteLayerTreeLayers.h:
+ * UIProcess/RemoteLayerTree/cocoa/RemoteLayerTreeLayers.mm:
+ (-[WKCompositingLayer _setWKContents:withDisplayList:]):
+ (-[WKCompositingLayer _setWKContentsDisplayList:]): Deleted.
+ (-[WKCompositingLayer _wkContentsDisplayList]): Deleted.
+ Pass the display list data to CoreAnimation alongside the bitmap.
+
+ * WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemote.cpp:
+ (WebKit::PlatformCALayerRemote::updateBackingStore):
+
2021-07-16 Megan Gardner <megan_gard...@apple.com>
Pipe App Highlight scrolling through UI Process in preparation for Note Overlay avoidance.
Modified: trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.h (279991 => 279992)
--- trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.h 2021-07-16 18:18:05 UTC (rev 279991)
+++ trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.h 2021-07-16 18:24:35 UTC (rev 279992)
@@ -54,13 +54,11 @@
enum class Type : uint8_t {
IOSurface,
- Bitmap,
-#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
- CGDisplayList,
-#endif
+ Bitmap
};
- void ensureBackingStore(Type, WebCore::FloatSize, float scale, bool deepColor, bool isOpaque);
+ enum class IncludeDisplayList : bool { No, Yes };
+ void ensureBackingStore(Type, WebCore::FloatSize, float scale, bool deepColor, bool isOpaque, IncludeDisplayList);
void setNeedsDisplay(const WebCore::IntRect);
void setNeedsDisplay();
@@ -88,7 +86,7 @@
return !!m_frontBuffer.imageBuffer;
}
- std::unique_ptr<WebCore::ThreadSafeImageBufferFlusher> takePendingFlusher();
+ Vector<std::unique_ptr<WebCore::ThreadSafeImageBufferFlusher>> takePendingFlushers();
enum class BufferType {
Front,
@@ -120,6 +118,9 @@
struct Buffer {
RefPtr<WebCore::ImageBuffer> imageBuffer;
+#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
+ RefPtr<WebCore::ImageBuffer> displayListImageBuffer;
+#endif
bool isVolatile = false;
explicit operator bool() const
@@ -134,10 +135,14 @@
Buffer m_backBuffer;
Buffer m_secondaryBackBuffer;
std::optional<ImageBufferBackendHandle> m_bufferHandle;
+#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
+ std::optional<ImageBufferBackendHandle> m_displayListBufferHandle;
+#endif
- std::unique_ptr<WebCore::ThreadSafeImageBufferFlusher> m_frontBufferFlusher;
+ Vector<std::unique_ptr<WebCore::ThreadSafeImageBufferFlusher>> m_frontBufferFlushers;
Type m_type;
+ IncludeDisplayList m_includeDisplayList { IncludeDisplayList::No };
bool m_deepColor { false };
WebCore::RepaintRectList m_paintingRects;
@@ -151,13 +156,18 @@
template<> struct EnumTraits<WebKit::RemoteLayerBackingStore::Type> {
using values = EnumValues<
- WebKit::RemoteLayerBackingStore::Type
- , WebKit::RemoteLayerBackingStore::Type::IOSurface
- , WebKit::RemoteLayerBackingStore::Type::Bitmap
-#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
- , WebKit::RemoteLayerBackingStore::Type::CGDisplayList
-#endif
+ WebKit::RemoteLayerBackingStore::Type,
+ WebKit::RemoteLayerBackingStore::Type::IOSurface,
+ WebKit::RemoteLayerBackingStore::Type::Bitmap
>;
};
+template<> struct EnumTraits<WebKit::RemoteLayerBackingStore::IncludeDisplayList> {
+ using values = EnumValues<
+ WebKit::RemoteLayerBackingStore::IncludeDisplayList,
+ WebKit::RemoteLayerBackingStore::IncludeDisplayList::No,
+ WebKit::RemoteLayerBackingStore::IncludeDisplayList::Yes
+ >;
+};
+
} // namespace WTF
Modified: trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm (279991 => 279992)
--- trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm 2021-07-16 18:18:05 UTC (rev 279991)
+++ trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm 2021-07-16 18:24:35 UTC (rev 279992)
@@ -1,4 +1,4 @@
- /*
+/*
* Copyright (C) 2013-2021 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -38,6 +38,7 @@
#import "WebCoreArgumentCoders.h"
#import "WebProcess.h"
#import <QuartzCore/QuartzCore.h>
+#import <WebCore/BifurcatedGraphicsContext.h>
#import <WebCore/GraphicsContextCG.h>
#import <WebCore/IOSurface.h>
#import <WebCore/ImageBuffer.h>
@@ -75,9 +76,9 @@
context->backingStoreWillBeDestroyed(*this);
}
-void RemoteLayerBackingStore::ensureBackingStore(Type type, WebCore::FloatSize size, float scale, bool deepColor, bool isOpaque)
+void RemoteLayerBackingStore::ensureBackingStore(Type type, WebCore::FloatSize size, float scale, bool deepColor, bool isOpaque, IncludeDisplayList includeDisplayList)
{
- if (m_type == type && m_size == size && m_scale == scale && m_deepColor == deepColor && m_isOpaque == isOpaque)
+ if (m_type == type && m_size == size && m_scale == scale && m_deepColor == deepColor && m_isOpaque == isOpaque && m_includeDisplayList == includeDisplayList)
return;
m_type = type;
@@ -85,6 +86,7 @@
m_scale = scale;
m_deepColor = deepColor;
m_isOpaque = isOpaque;
+ m_includeDisplayList = includeDisplayList;
if (m_frontBuffer) {
// If we have a valid backing store, we need to ensure that it gets completely
@@ -108,6 +110,7 @@
encoder << m_size;
encoder << m_scale;
encoder << m_isOpaque;
+ encoder << m_includeDisplayList;
std::optional<ImageBufferBackendHandle> handle;
if (m_frontBuffer.imageBuffer) {
@@ -121,15 +124,18 @@
case Type::Bitmap:
handle = static_cast<UnacceleratedImageBufferShareableBackend&>(*m_frontBuffer.imageBuffer->ensureBackendCreated()).createImageBufferBackendHandle();
break;
-#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
- case Type::CGDisplayList:
- handle = static_cast<CGDisplayListImageBufferBackend&>(*m_frontBuffer.imageBuffer->ensureBackendCreated()).createImageBufferBackendHandle();
- break;
-#endif
}
}
encoder << handle;
+
+#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
+ std::optional<ImageBufferBackendHandle> displayListHandle;
+ if (m_frontBuffer.displayListImageBuffer)
+ displayListHandle = static_cast<CGDisplayListImageBufferBackend&>(*m_frontBuffer.displayListImageBuffer->ensureBackendCreated()).createImageBufferBackendHandle();
+
+ encoder << displayListHandle;
+#endif
}
bool RemoteLayerBackingStore::decode(IPC::Decoder& decoder, RemoteLayerBackingStore& result)
@@ -146,9 +152,17 @@
if (!decoder.decode(result.m_isOpaque))
return false;
+ if (!decoder.decode(result.m_includeDisplayList))
+ return false;
+
if (!decoder.decode(result.m_bufferHandle))
return false;
+#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
+ if (!decoder.decode(result.m_displayListBufferHandle))
+ return false;
+#endif
+
return true;
}
@@ -222,32 +236,24 @@
else
m_frontBuffer.imageBuffer = WebCore::ConcreteImageBuffer<UnacceleratedImageBufferShareableBackend>::create(m_size, m_scale, WebCore::DestinationColorSpace::SRGB(), pixelFormat(), nullptr);
break;
+ }
+
#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
- case Type::CGDisplayList:
- m_frontBuffer.imageBuffer = WebCore::ConcreteImageBuffer<CGDisplayListImageBufferBackend>::create(m_size, m_scale, WebCore::DestinationColorSpace::SRGB(), pixelFormat(), nullptr);
- break;
+ if (m_includeDisplayList == IncludeDisplayList::Yes)
+ m_frontBuffer.displayListImageBuffer = WebCore::ConcreteImageBuffer<CGDisplayListImageBufferBackend>::create(m_size, m_scale, WebCore::DestinationColorSpace::SRGB(), pixelFormat(), nullptr);
#endif
- }
}
bool RemoteLayerBackingStore::supportsPartialRepaint()
{
- switch (m_type) {
- case Type::IOSurface:
- case Type::Bitmap:
- return true;
-#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
- case Type::CGDisplayList:
- return false;
-#endif
- }
-
- return true;
+ // FIXME: Find a way to support partial repaint for backing store that
+ // includes a display list without allowing unbounded memory growth.
+ return m_includeDisplayList == IncludeDisplayList::No;
}
bool RemoteLayerBackingStore::display()
{
- ASSERT(!m_frontBufferFlusher);
+ ASSERT(!m_frontBufferFlushers.size());
m_lastDisplayTime = MonotonicTime::now();
@@ -274,7 +280,50 @@
if (!m_frontBuffer.imageBuffer)
return true;
- WebCore::GraphicsContext& context = m_frontBuffer.imageBuffer->context();
+
+ if (m_includeDisplayList == IncludeDisplayList::Yes) {
+#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
+ auto& displayListContext = m_frontBuffer.displayListImageBuffer->context();
+
+ // FIXME: Remove this when <rdar://problem/80487697> is fixed.
+ static std::optional<bool> needsMissingFlipWorkaround;
+ if (!needsMissingFlipWorkaround) {
+ id defaultValue = [[NSUserDefaults standardUserDefaults] objectForKey:@"WebKitNeedsWorkaroundFor80487697"];
+ needsMissingFlipWorkaround = defaultValue ? [defaultValue boolValue] : true;
+ }
+ if (needsMissingFlipWorkaround.value()) {
+ displayListContext.scale(WebCore::FloatSize(m_scale, -m_scale));
+ displayListContext.translate(0, -m_size.height());
+ }
+
+ WebCore::BifurcatedGraphicsContext context(m_frontBuffer.imageBuffer->context(), displayListContext);
+#else
+ WebCore::GraphicsContext& context = m_frontBuffer.imageBuffer->context();
+#endif
+ drawInContext(context);
+ } else {
+ WebCore::GraphicsContext& context = m_frontBuffer.imageBuffer->context();
+ drawInContext(context);
+ }
+
+ m_dirtyRegion = WebCore::Region();
+ m_paintingRects.clear();
+
+ m_layer->owner()->platformCALayerLayerDidDisplay(m_layer);
+
+ m_frontBuffer.imageBuffer->flushDrawingContextAsync();
+
+ m_frontBufferFlushers.append(m_frontBuffer.imageBuffer->createFlusher());
+#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
+ if (m_includeDisplayList == IncludeDisplayList::Yes)
+ m_frontBufferFlushers.append(m_frontBuffer.displayListImageBuffer->createFlusher());
+#endif
+
+ return true;
+}
+
+void RemoteLayerBackingStore::drawInContext(WebCore::GraphicsContext& context)
+{
WebCore::GraphicsContextStateSaver stateSaver(context);
// If we have less than webLayerMaxRectsToPaint rects to paint and they cover less
@@ -297,6 +346,7 @@
m_paintingRects.append(scaledRect);
}
+ WebCore::IntRect layerBounds(WebCore::IntPoint(), WebCore::expandedIntSize(m_size));
if (!m_dirtyRegion.contains(layerBounds)) {
ASSERT(m_backBuffer.imageBuffer);
context.drawImageBuffer(*m_backBuffer.imageBuffer, { {0, 0}, m_size }, { {0, 0}, m_size }, { WebCore::CompositeOperator::Copy });
@@ -354,17 +404,6 @@
ASSERT_NOT_REACHED();
break;
};
-
- m_dirtyRegion = WebCore::Region();
- m_paintingRects.clear();
-
- m_layer->owner()->platformCALayerLayerDidDisplay(m_layer);
-
- m_frontBuffer.imageBuffer->flushDrawingContextAsync();
-
- m_frontBufferFlusher = m_frontBuffer.imageBuffer->createFlusher();
-
- return true;
}
void RemoteLayerBackingStore::enumerateRectsBeingDrawn(WebCore::GraphicsContext& context, void (^block)(WebCore::FloatRect))
@@ -387,42 +426,51 @@
ASSERT(m_bufferHandle);
layer.contentsOpaque = m_isOpaque;
+ id contents = nil;
WTF::switchOn(*m_bufferHandle,
[&] (ShareableBitmap::Handle& handle) {
ASSERT(m_type == Type::Bitmap);
auto bitmap = ShareableBitmap::create(handle);
- layer.contents = (__bridge id)bitmap->makeCGImageCopy().get();
+ contents = bitmap->makeCGImageCopy().bridgingAutorelease();
},
[&] (MachSendRight& machSendRight) {
ASSERT(m_type == Type::IOSurface);
switch (contentsType) {
- case LayerContentsType::IOSurface: {
+ case RemoteLayerBackingStore::LayerContentsType::IOSurface: {
auto surface = WebCore::IOSurface::createFromSendRight(WTFMove(machSendRight), WebCore::DestinationColorSpace::SRGB());
- layer.contents = surface ? surface->asLayerContents() : nil;
+ contents = surface ? surface->asLayerContents() : nil;
break;
}
- case LayerContentsType::CAMachPort:
- layer.contents = (__bridge id)adoptCF(CAMachPortCreate(machSendRight.leakSendRight())).get();
+ case RemoteLayerBackingStore::LayerContentsType::CAMachPort:
+ contents = adoptCF(CAMachPortCreate(machSendRight.leakSendRight())).bridgingAutorelease();
break;
}
}
#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
, [&] (IPC::SharedBufferCopy& buffer) {
- ASSERT(m_type == Type::CGDisplayList);
- ASSERT([layer isKindOfClass:[WKCompositingLayer class]]);
- if (![layer isKindOfClass:[WKCompositingLayer class]])
- return;
- [layer setValue:@1 forKeyPath:WKCGDisplayListEnabledKey];
- auto data = ""
- [(WKCompositingLayer *)layer _setWKContentsDisplayList:data.get()];
+ ASSERT_NOT_REACHED();
}
#endif
);
+
+#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
+ if (m_displayListBufferHandle) {
+ ASSERT([layer isKindOfClass:[WKCompositingLayer class]]);
+ if (![layer isKindOfClass:[WKCompositingLayer class]])
+ return;
+ [layer setValue:@1 forKeyPath:WKCGDisplayListEnabledKey];
+ auto data = ""
+ [(WKCompositingLayer *)layer _setWKContents:contents withDisplayList:data.get()];
+ return;
+ }
+#endif
+
+ layer.contents = contents;
}
-std::unique_ptr<WebCore::ThreadSafeImageBufferFlusher> RemoteLayerBackingStore::takePendingFlusher()
+Vector<std::unique_ptr<WebCore::ThreadSafeImageBufferFlusher>> RemoteLayerBackingStore::takePendingFlushers()
{
- return std::exchange(m_frontBufferFlusher, nullptr);
+ return std::exchange(m_frontBufferFlushers, { });
}
bool RemoteLayerBackingStore::setBufferVolatility(BufferType bufferType, bool isVolatile)
@@ -488,6 +536,9 @@
if (imageBuffer)
imageBuffer->releaseBufferToPool();
imageBuffer = nullptr;
+#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
+ displayListImageBuffer = nullptr;
+#endif
}
} // namespace WebKit
Modified: trunk/Source/WebKit/UIProcess/RemoteLayerTree/cocoa/RemoteLayerTreeLayers.h (279991 => 279992)
--- trunk/Source/WebKit/UIProcess/RemoteLayerTree/cocoa/RemoteLayerTreeLayers.h 2021-07-16 18:18:05 UTC (rev 279991)
+++ trunk/Source/WebKit/UIProcess/RemoteLayerTree/cocoa/RemoteLayerTreeLayers.h 2021-07-16 18:24:35 UTC (rev 279992)
@@ -33,7 +33,7 @@
@interface WKCompositingLayer : CALayer
#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
-@property (nonatomic, retain, setter=_setWKContentsDisplayList:) __attribute__((NSObject)) CFDataRef _wkContentsDisplayList;
+- (void)_setWKContents:(id)contents withDisplayList:(CFDataRef)data;
#endif
@end
Modified: trunk/Source/WebKit/UIProcess/RemoteLayerTree/cocoa/RemoteLayerTreeLayers.mm (279991 => 279992)
--- trunk/Source/WebKit/UIProcess/RemoteLayerTree/cocoa/RemoteLayerTreeLayers.mm 2021-07-16 18:18:05 UTC (rev 279991)
+++ trunk/Source/WebKit/UIProcess/RemoteLayerTree/cocoa/RemoteLayerTreeLayers.mm 2021-07-16 18:24:35 UTC (rev 279992)
@@ -36,11 +36,7 @@
#import <WebKitAdditions/CGDisplayListImageBufferAdditions.h>
#endif
-@implementation WKCompositingLayer {
-#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
- RetainPtr<CFDataRef> _contentsDisplayList;
-#endif
-}
+@implementation WKCompositingLayer
- (NSString *)description
{
@@ -48,23 +44,14 @@
}
#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
-- (void)_setWKContentsDisplayList:(CFDataRef)data
+- (void)_setWKContents:(id)contents withDisplayList:(CFDataRef)data
{
- _contentsDisplayList = data;
- [self setNeedsDisplay];
+ self.contents = contents;
+ [self setValue:(id)data forKeyPath:WKCGDisplayListContentsKey];
+
+
}
-- (CFDataRef)_wkContentsDisplayList
-{
- return _contentsDisplayList.get();
-}
-
-- (void)drawInContext:(CGContextRef)context
-{
- if (!_contentsDisplayList)
- return;
- WKCGContextDrawCGCommandsEncodedData(context, _contentsDisplayList.get(), nullptr);
-}
#endif // ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
@end
Modified: trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemote.cpp (279991 => 279992)
--- trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemote.cpp 2021-07-16 18:18:05 UTC (rev 279991)
+++ trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemote.cpp 2021-07-16 18:24:35 UTC (rev 279992)
@@ -234,11 +234,12 @@
ASSERT(m_properties.backingStoreAttached);
auto type = m_acceleratesDrawing ? RemoteLayerBackingStore::Type::IOSurface : RemoteLayerBackingStore::Type::Bitmap;
+ auto includeDisplayList = RemoteLayerBackingStore::IncludeDisplayList::No;
#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
if (m_context->useCGDisplayListsForDOMRendering())
- type = RemoteLayerBackingStore::Type::CGDisplayList;
+ includeDisplayList = RemoteLayerBackingStore::IncludeDisplayList::Yes;
#endif
- m_properties.backingStore->ensureBackingStore(type, m_properties.bounds.size(), m_properties.contentsScale, m_wantsDeepColorBackingStore, m_properties.opaque);
+ m_properties.backingStore->ensureBackingStore(type, m_properties.bounds.size(), m_properties.contentsScale, m_wantsDeepColorBackingStore, m_properties.opaque, includeDisplayList);
}
void PlatformCALayerRemote::setNeedsDisplayInRect(const FloatRect& rect)
Modified: trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm (279991 => 279992)
--- trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm 2021-07-16 18:18:05 UTC (rev 279991)
+++ trunk/Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm 2021-07-16 18:24:35 UTC (rev 279992)
@@ -387,10 +387,8 @@
for (auto& layer : layerTransaction.changedLayers()) {
if (layer->properties().changedProperties & RemoteLayerTreeTransaction::BackingStoreChanged) {
hadAnyChangedBackingStore = true;
- if (layer->properties().backingStore) {
- if (auto pendingFlusher = layer->properties().backingStore->takePendingFlusher())
- flushers.append(WTFMove(pendingFlusher));
- }
+ if (layer->properties().backingStore)
+ flushers.appendVector(layer->properties().backingStore->takePendingFlushers());
}
layer->didCommit();