WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch for review
resource-cache-3.patch (text/plain), 43.73 KB, created by
Said Abou-Hallawa
on 2020-10-10 19:52:55 PDT
(
hide
)
Description:
Patch for review
Filename:
MIME Type:
Creator:
Said Abou-Hallawa
Created:
2020-10-10 19:52:55 PDT
Size:
43.73 KB
patch
obsolete
>diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 2b96710108ae..8032d075d663 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,88 @@ >+2020-10-10 Said Abou-Hallawa <sabouhallawa@apple.com> >+ >+ [GPU Process] Introduce RemoteResourceCache to manage the remote resources in Web Process >+ https://bugs.webkit.org/show_bug.cgi?id=217558 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ RemoteResourceCache will be responsible for managing the remote resources >+ including their actual life cycle in the Web Process side. RemoteRenderingBackend >+ will be responsible only for the IPC communications with RemoteRenderingBackendProxy. >+ It will delegate all the resource management to its RemoteResourceCache. >+ >+ Because RemoteImageBuffer does the communication between WebCore and GPU >+ Process, RemoteResourceCache will keep two HashMaps to ease the mapping >+ in both directions: >+ >+ -- m_remoteImageBufferHashMap maps ImageBuffer* -> RemoteResourceIdentifier >+ -- m_remoteImageBufferMessageHandlerHashMap maps RemoteResourceIdentifier >+ -> RemoteImageBufferMessageHandler* >+ >+ To keep track of the resource referencing, RemoteResourceCache uses another >+ map which relates a remote resource with the set of remote drawing clients. >+ >+ -- m_remoteResourceClientsHashMap maps RemoteResourceIdentifier -> >+ HashSet<RemoteResourceIdentifier> >+ >+ The remote resource has stay alive till their clients replayed back their >+ DisplayList::Items which reference these resources. Once RemoteResourceCache >+ is requested to release a remote resource but it finds this resource is >+ referenced by a set of remote drawing clients, it moves the entry of this >+ resource from m_remoteResourceClientsHashMap to another HashMap named: >+ >+ -- m_remoteResourceClientsPendingReleaseHashMap maps RemoteResourceIdentifier >+ -> HashSet<RemoteResourceIdentifier> >+ >+ When an entry for a remote resource exists in m_remoteResourceClientsPendingReleaseHashMap >+ and no remote client references it anymore, RemoteResourceCache will tell >+ GPU Process to release its remote resource as well. >+ >+ * Sources.txt: >+ * WebKit.xcodeproj/project.pbxproj: >+ * WebProcess/GPU/graphics/RemoteImageBuffer.h: >+ (WebKit::RemoteImageBuffer::~RemoteImageBuffer): >+ (WebKit::RemoteImageBuffer::remoteResourceIdentifier const): >+ (WebKit::RemoteImageBuffer::RemoteImageBuffer): >+ * WebProcess/GPU/graphics/RemoteImageBufferMessageHandler.cpp: Removed. >+ * WebProcess/GPU/graphics/RemoteImageBufferMessageHandler.h: >+ (WebKit::RemoteImageBufferMessageHandler::commitFlushContext): >+ (WebKit::RemoteImageBufferMessageHandler::imageBufferIdentifier const): Deleted. >+ (): Deleted. >+ * WebProcess/GPU/graphics/RemoteRenderingBackend.cpp: >+ (WebKit::RemoteRenderingBackend::createImageBuffer): >+ (WebKit::RemoteRenderingBackend::releaseImageBuffer): >+ (WebKit::RemoteRenderingBackend::releaseRemoteClient): >+ (WebKit::RemoteRenderingBackend::remoteCreateImageBuffer): >+ (WebKit::RemoteRenderingBackend::remoteGetImageData): >+ (WebKit::RemoteRenderingBackend::remoteFlushDrawingContext): >+ (WebKit::RemoteRenderingBackend::remoteFlushDrawingContextAndCommit): >+ (WebKit::RemoteRenderingBackend::remoteReleaseRemoteResource): >+ (WebKit::RemoteRenderingBackend::createImageBufferBackend): >+ (WebKit::RemoteRenderingBackend::commitImageBufferFlushContext): >+ * WebProcess/GPU/graphics/RemoteRenderingBackend.h: >+ (WebKit::RemoteRenderingBackend::renderingBackendIdentifier const): Deleted. >+ * WebProcess/GPU/graphics/RemoteResourceCache.cpp: Added. >+ (WebKit::RemoteResourceCache::RemoteResourceCache): >+ (WebKit::RemoteResourceCache::createImageBuffer): >+ (WebKit::RemoteResourceCache::createImageBufferBackend): >+ (WebKit::RemoteResourceCache::commitImageBufferFlushContext): >+ (WebKit::RemoteResourceCache::releaseImageBuffer): >+ (WebKit::RemoteResourceCache::findImageBufferForClient): >+ (WebKit::RemoteResourceCache::addRemoteClient): >+ Links a remote resource with a drawing remote client. >+ >+ (WebKit::RemoteResourceCache::releaseRemoteResourcePendingRemoveClients): >+ (WebKit::RemoteResourceCache::removeRemoteClient): >+ Remove all the entries which includes a certain remote client. >+ >+ (WebKit::RemoteResourceCache::releaseRemoteClient): >+ A remote client has done flushing its DrawingContext. It's time to book- >+ keep the resource referencing and sync up with the GPU side if it has to >+ release some of the remote resources. >+ >+ * WebProcess/GPU/graphics/RemoteResourceCache.h: Added. >+ * WebProcess/Gamepad/WebGamepadProvider.cpp: >+ > 2020-10-09 Said Abou-Hallawa <sabouhallawa@apple.com> > > [GPU Process] Introduce RemoteResourceCacheProxy to manage the resources in the GPU Process >diff --git a/Source/WebKit/Sources.txt b/Source/WebKit/Sources.txt >index 67c133e67d3d..8e3b2affca00 100644 >--- a/Source/WebKit/Sources.txt >+++ b/Source/WebKit/Sources.txt >@@ -552,8 +552,8 @@ WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp > > WebProcess/GPU/GPUProcessConnection.cpp > WebProcess/GPU/graphics/ImageBufferShareableBitmapBackend.cpp >-WebProcess/GPU/graphics/RemoteImageBufferMessageHandler.cpp > WebProcess/GPU/graphics/RemoteRenderingBackend.cpp >+WebProcess/GPU/graphics/RemoteResourceCache.cpp > WebProcess/GPU/media/AudioTrackPrivateRemote.cpp > WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp > WebProcess/GPU/media/RemoteAudioDestinationProxy.cpp >diff --git a/Source/WebKit/WebKit.xcodeproj/project.pbxproj b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >index 345bbfb53606..2a8c42a5abe4 100644 >--- a/Source/WebKit/WebKit.xcodeproj/project.pbxproj >+++ b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >@@ -4177,7 +4177,6 @@ > 71A676A522C62318007D6295 /* WKTouchActionGestureRecognizer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WKTouchActionGestureRecognizer.mm; path = ios/WKTouchActionGestureRecognizer.mm; sourceTree = "<group>"; }; > 71FB810A2260627A00323677 /* WebsiteSimulatedMouseEventsDispatchPolicy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebsiteSimulatedMouseEventsDispatchPolicy.h; sourceTree = "<group>"; }; > 7227800B2408BD7D007D376B /* PlatformRemoteImageBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformRemoteImageBuffer.h; sourceTree = "<group>"; }; >- 7227800C24097A02007D376B /* RemoteImageBufferMessageHandler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteImageBufferMessageHandler.cpp; sourceTree = "<group>"; }; > 7227800D24097A02007D376B /* RemoteImageBufferMessageHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RemoteImageBufferMessageHandler.h; sourceTree = "<group>"; }; > 727A7F342407857D004D2931 /* ImageBufferShareableIOSurfaceBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImageBufferShareableIOSurfaceBackend.cpp; sourceTree = "<group>"; }; > 727A7F352407857F004D2931 /* ImageBufferShareableIOSurfaceBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageBufferShareableIOSurfaceBackend.h; sourceTree = "<group>"; }; >@@ -4190,6 +4189,8 @@ > 728E86F01795188C0087879E /* WebColorPickerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebColorPickerMac.mm; sourceTree = "<group>"; }; > 729D053225314FEF00422098 /* RemoteResourceCacheProxy.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteResourceCacheProxy.cpp; sourceTree = "<group>"; }; > 729D053325314FEF00422098 /* RemoteResourceCacheProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RemoteResourceCacheProxy.h; sourceTree = "<group>"; }; >+ 729D0535253173CC00422098 /* RemoteResourceCache.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteResourceCache.cpp; sourceTree = "<group>"; }; >+ 729D0536253173CC00422098 /* RemoteResourceCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RemoteResourceCache.h; sourceTree = "<group>"; }; > 75A8D2C4187CCF9F00C39C9E /* WKWebsiteDataStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKWebsiteDataStore.h; sourceTree = "<group>"; }; > 75A8D2C5187CCF9F00C39C9E /* WKWebsiteDataStore.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebsiteDataStore.mm; sourceTree = "<group>"; }; > 75A8D2D4187D1C0100C39C9E /* WKWebsiteDataStoreInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKWebsiteDataStoreInternal.h; sourceTree = "<group>"; }; >@@ -8080,11 +8081,12 @@ > 727A7F38240788F0004D2931 /* PlatformImageBufferShareableBackend.h */, > 7227800B2408BD7D007D376B /* PlatformRemoteImageBuffer.h */, > 727A7F492408AEE6004D2931 /* RemoteImageBuffer.h */, >- 7227800C24097A02007D376B /* RemoteImageBufferMessageHandler.cpp */, > 7227800D24097A02007D376B /* RemoteImageBufferMessageHandler.h */, > 5506409D2407160900AAE045 /* RemoteRenderingBackend.cpp */, > 5506409E2407160900AAE045 /* RemoteRenderingBackend.h */, > 550640A0240719E100AAE045 /* RemoteRenderingBackend.messages.in */, >+ 729D0535253173CC00422098 /* RemoteResourceCache.cpp */, >+ 729D0536253173CC00422098 /* RemoteResourceCache.h */, > 5506409F2407196A00AAE045 /* RenderingBackendIdentifier.h */, > ); > path = graphics; >diff --git a/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBuffer.h b/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBuffer.h >index e84916645145..afa06f84feed 100644 >--- a/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBuffer.h >+++ b/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBuffer.h >@@ -53,14 +53,19 @@ public: > > ~RemoteImageBuffer() > { >+ if (!m_remoteRenderingBackend) >+ return; > flushDrawingContext(); > } > >+ WebCore::RemoteResourceIdentifier remoteResourceIdentifier() const { return m_remoteResourceIdentifier; } >+ > protected: > RemoteImageBuffer(const WebCore::FloatSize& size, WebCore::RenderingMode renderingMode, float resolutionScale, WebCore::ColorSpace colorSpace, RemoteRenderingBackend& remoteRenderingBackend) > : BaseDisplayListImageBuffer(size) >- , RemoteImageBufferMessageHandler(size, renderingMode, resolutionScale, colorSpace, remoteRenderingBackend) >+ , m_remoteRenderingBackend(makeWeakPtr(remoteRenderingBackend)) > { >+ m_remoteResourceIdentifier = m_remoteRenderingBackend->remoteCreateImageBuffer(size, renderingMode, resolutionScale, colorSpace); > } > > void createBackend(const WebCore::FloatSize& logicalSize, const WebCore::IntSize& backendSize, float resolutionScale, WebCore::ColorSpace colorSpace, ImageBufferBackendHandle handle) override >@@ -69,22 +74,50 @@ protected: > m_backend = BackendType::create(logicalSize, backendSize, resolutionScale, colorSpace, WTFMove(handle)); > } > >- bool isBackendCreated() const override { return m_backend.get(); } >- > BackendType* ensureBackendCreated() const override > { >- if (!m_backend) >- const_cast<RemoteImageBuffer&>(*this).RemoteImageBufferMessageHandler::waitForCreateImageBufferBackend(); >+ if (!m_backend && m_remoteRenderingBackend) >+ m_remoteRenderingBackend->waitForCreateImageBufferBackend(); > return m_backend.get(); > } > >+ void flushContext() override >+ { >+ flushDrawingContext(); >+ m_backend->flushContext(); >+ } >+ >+ void flushDrawingContext() override >+ { >+ auto& displayList = m_drawingContext.displayList(); >+ if (!displayList.itemCount() || !m_remoteRenderingBackend) >+ return; >+ m_sentFlushIdentifier = m_remoteRenderingBackend->remoteFlushDrawingContextAndCommit(displayList, m_remoteResourceIdentifier); >+ m_remoteRenderingBackend->waitForCommitImageBufferFlushContext(); >+ m_remoteRenderingBackend->releaseRemoteClient(m_remoteResourceIdentifier); >+ displayList.clear(); >+ } >+ >+ void flushDrawingContext(const WebCore::DisplayList::DisplayList& displayList) override >+ { >+ if (!displayList.itemCount() || !m_remoteRenderingBackend) >+ return; >+ m_remoteRenderingBackend->remoteFlushDrawingContext(displayList, m_remoteResourceIdentifier); >+ } >+ > RefPtr<WebCore::ImageData> getImageData(WebCore::AlphaPremultiplication outputFormat, const WebCore::IntRect& srcRect) const override > { >+ if (!m_remoteRenderingBackend) >+ return nullptr; >+ > auto& displayList = const_cast<RemoteImageBuffer*>(this)->m_drawingContext.displayList(); >- const_cast<RemoteImageBuffer*>(this)->RemoteImageBufferMessageHandler::flushDrawingContext(displayList); >- auto result = const_cast<RemoteImageBuffer*>(this)->RemoteImageBufferMessageHandler::getImageData(outputFormat, srcRect); >+ if (displayList.itemCount()) { >+ const_cast<RemoteImageBuffer*>(this)->flushDrawingContext(displayList); >+ displayList.clear(); >+ } >+ > // getImageData is synchronous, which means we've already received the CommitImageBufferFlushContext message. >- return result; >+ return m_remoteRenderingBackend->remoteGetImageData(outputFormat, srcRect, m_remoteResourceIdentifier); > } > > void putImageData(WebCore::AlphaPremultiplication inputFormat, const WebCore::ImageData& imageData, const WebCore::IntRect& srcRect, const WebCore::IntPoint& destPoint = { }, WebCore::AlphaPremultiplication destFormat = WebCore::AlphaPremultiplication::Premultiplied) override >@@ -95,26 +128,18 @@ protected: > m_drawingContext.recorder().putImageData(inputFormat, imageData, srcRect, destPoint, destFormat); > } > >- void flushContext() override >- { >- flushDrawingContext(); >- m_backend->flushContext(); >- } >- >- void flushDrawingContext() override >- { >- auto& displayList = m_drawingContext.displayList(); >- if (displayList.itemCount()) >- RemoteImageBufferMessageHandler::flushDrawingContextAndWaitCommit(displayList); >- } >- > void willAppendItem(const WebCore::DisplayList::Item&) override > { > constexpr size_t DisplayListBatchSize = 512; > auto& displayList = m_drawingContext.displayList(); >- if (displayList.itemCount() >= DisplayListBatchSize) >- RemoteImageBufferMessageHandler::flushDrawingContext(displayList); >+ if (displayList.itemCount() < DisplayListBatchSize || !m_remoteRenderingBackend) >+ return; >+ flushDrawingContext(displayList); >+ displayList.clear(); > } >+ >+ WeakPtr<RemoteRenderingBackend> m_remoteRenderingBackend; >+ WebCore::RemoteResourceIdentifier m_remoteResourceIdentifier; > }; > > } // namespace WebKit >diff --git a/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferMessageHandler.cpp b/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferMessageHandler.cpp >deleted file mode 100644 >index 77150c7b0793..000000000000 >--- a/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferMessageHandler.cpp >+++ /dev/null >@@ -1,99 +0,0 @@ >-/* >- * Copyright (C) 2020 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. AND ITS 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 APPLE INC. OR ITS 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 "RemoteImageBufferMessageHandler.h" >- >-#if ENABLE(GPU_PROCESS) >- >-#include "ImageDataReference.h" >-#include "RemoteRenderingBackend.h" >-#include "RemoteRenderingBackendProxyMessages.h" >-#include <WebCore/DisplayListItems.h> >- >-namespace WebKit { >-using namespace WebCore; >- >-RemoteImageBufferMessageHandler::RemoteImageBufferMessageHandler(const FloatSize& size, RenderingMode renderingMode, float resolutionScale, ColorSpace colorSpace, RemoteRenderingBackend& remoteRenderingBackend) >- : m_remoteRenderingBackend(makeWeakPtr(remoteRenderingBackend)) >-{ >- // Create the RemoteImageBufferProxy. >- m_remoteRenderingBackend->send(Messages::RemoteRenderingBackendProxy::CreateImageBuffer(size, renderingMode, resolutionScale, colorSpace, m_imageBufferIdentifier), m_remoteRenderingBackend->renderingBackendIdentifier()); >-} >- >-RemoteImageBufferMessageHandler::~RemoteImageBufferMessageHandler() >-{ >- // Release the RemoteImageBufferProxy. >- if (!m_remoteRenderingBackend) >- return; >- m_remoteRenderingBackend->send(Messages::RemoteRenderingBackendProxy::ReleaseImageBuffer(m_imageBufferIdentifier), m_remoteRenderingBackend->renderingBackendIdentifier()); >-} >- >-RefPtr<ImageData> RemoteImageBufferMessageHandler::getImageData(AlphaPremultiplication outputFormat, const IntRect& srcRect) const >-{ >- IPC::ImageDataReference imageDataReference; >- m_remoteRenderingBackend->sendSync(Messages::RemoteRenderingBackendProxy::GetImageData(outputFormat, srcRect, m_imageBufferIdentifier), Messages::RemoteRenderingBackendProxy::GetImageData::Reply(imageDataReference), m_remoteRenderingBackend->renderingBackendIdentifier(), 1_s); >- return imageDataReference.buffer(); >-} >- >-void RemoteImageBufferMessageHandler::waitForCreateImageBufferBackend() >-{ >- if (m_remoteRenderingBackend && !isBackendCreated()) >- m_remoteRenderingBackend->waitForCreateImageBufferBackend(); >-} >- >-void RemoteImageBufferMessageHandler::waitForCommitImageBufferFlushContext() >-{ >- if (m_remoteRenderingBackend && isPendingFlush()) >- m_remoteRenderingBackend->waitForCommitImageBufferFlushContext(); >-} >- >-void RemoteImageBufferMessageHandler::flushDrawingContext(WebCore::DisplayList::DisplayList& displayList) >-{ >- if (!m_remoteRenderingBackend) >- return; >- >- m_remoteRenderingBackend->send(Messages::RemoteRenderingBackendProxy::FlushImageBufferDrawingContext(displayList, m_imageBufferIdentifier), m_remoteRenderingBackend->renderingBackendIdentifier()); >- displayList.clear(); >-} >- >-void RemoteImageBufferMessageHandler::flushDrawingContextAndWaitCommit(WebCore::DisplayList::DisplayList& displayList) >-{ >- if (!m_remoteRenderingBackend) >- return; >- m_sentFlushIdentifier = ImageBufferFlushIdentifier::generate(); >- m_remoteRenderingBackend->send(Messages::RemoteRenderingBackendProxy::FlushImageBufferDrawingContextAndCommit(displayList, m_sentFlushIdentifier, m_imageBufferIdentifier), m_remoteRenderingBackend->renderingBackendIdentifier()); >- displayList.clear(); >- waitForCommitImageBufferFlushContext(); >-} >- >-void RemoteImageBufferMessageHandler::commitFlushContext(ImageBufferFlushIdentifier flushIdentifier) >-{ >- m_receivedFlushIdentifier = flushIdentifier; >-} >- >-} // namespace WebKit >- >-#endif // ENABLE(GPU_PROCESS) >diff --git a/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferMessageHandler.h b/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferMessageHandler.h >index 6cfc85895a51..61dd58ce52fd 100644 >--- a/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferMessageHandler.h >+++ b/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferMessageHandler.h >@@ -29,50 +29,31 @@ > > #include "ImageBufferBackendHandle.h" > #include "ImageBufferFlushIdentifier.h" >-#include <WebCore/ColorSpace.h> >-#include <WebCore/DisplayList.h> >-#include <WebCore/FloatSize.h> > #include <WebCore/RemoteResourceIdentifier.h> >-#include <WebCore/RenderingMode.h> > > namespace WebCore { >+class FloatSize; > class ImageData; > enum class AlphaPremultiplication : uint8_t; >+enum class ColorSpace : uint8_t; > } > > namespace WebKit { > >-class RemoteRenderingBackend; >- > class RemoteImageBufferMessageHandler { > public: >- virtual ~RemoteImageBufferMessageHandler(); >- >- WebCore::RemoteResourceIdentifier remoteResourceIdentifier() const { return m_remoteResourceIdentifier; } >- > // Messages to be received. See RemoteRenderingBackend.messages.in. > virtual void createBackend(const WebCore::FloatSize& logicalSize, const WebCore::IntSize& backendSize, float resolutionScale, WebCore::ColorSpace, ImageBufferBackendHandle) = 0; > >- void commitFlushContext(ImageBufferFlushIdentifier); >- >-protected: >- RemoteImageBufferMessageHandler(const WebCore::FloatSize&, WebCore::RenderingMode, float resolutionScale, WebCore::ColorSpace, RemoteRenderingBackend&); >- >- virtual bool isBackendCreated() const = 0; > bool isPendingFlush() const { return m_sentFlushIdentifier != m_receivedFlushIdentifier; } > >- RefPtr<WebCore::ImageData> getImageData(WebCore::AlphaPremultiplication outputFormat, const WebCore::IntRect& srcRect) const; >- >- void waitForCreateImageBufferBackend(); >- void waitForCommitImageBufferFlushContext(); >+ void commitFlushContext(ImageBufferFlushIdentifier flushIdentifier) >+ { >+ m_receivedFlushIdentifier = flushIdentifier; >+ } > >- // Messages to be sent. See RemoteRenderingBackendProxy.messages.in. >- void flushDrawingContext(WebCore::DisplayList::DisplayList&); >- void flushDrawingContextAndWaitCommit(WebCore::DisplayList::DisplayList&); >- >-private: >- WeakPtr<RemoteRenderingBackend> m_remoteRenderingBackend; >- WebCore::RemoteResourceIdentifier m_remoteResourceIdentifier { WebCore::RemoteResourceIdentifier::generate() }; >+protected: >+ virtual ~RemoteImageBufferMessageHandler() = default; > > ImageBufferFlushIdentifier m_sentFlushIdentifier; > ImageBufferFlushIdentifier m_receivedFlushIdentifier; >diff --git a/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackend.cpp b/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackend.cpp >index dbbe9b83036f..c498cfa0d612 100644 >--- a/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackend.cpp >+++ b/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackend.cpp >@@ -88,38 +88,58 @@ bool RemoteRenderingBackend::waitForCommitImageBufferFlushContext() > > std::unique_ptr<ImageBuffer> RemoteRenderingBackend::createImageBuffer(const FloatSize& size, ShouldAccelerate shouldAccelerate, float resolutionScale, ColorSpace colorSpace) > { >- if (shouldAccelerate == ShouldAccelerate::Yes) { >- if (auto imageBuffer = AcceleratedRemoteImageBuffer::create(size, RenderingMode::RemoteAccelerated, resolutionScale, colorSpace, *this)) { >- m_imageBufferMessageHandlerMap.add(imageBuffer->remoteResourceIdentifier(), imageBuffer.get()); >- return imageBuffer; >- } >- } >+ return m_remoteResourceCache.createImageBuffer(size, shouldAccelerate, resolutionScale, colorSpace); >+} >+ >+void RemoteRenderingBackend::releaseImageBuffer(ImageBuffer& image) >+{ >+ m_remoteResourceCache.releaseImageBuffer(image); >+} >+ >+void RemoteRenderingBackend::releaseRemoteClient(RemoteResourceIdentifier remoteClientIdentifier) >+{ >+ m_remoteResourceCache.releaseRemoteClient(remoteClientIdentifier); >+} >+ >+RemoteResourceIdentifier RemoteRenderingBackend::remoteCreateImageBuffer(const FloatSize& size, RenderingMode renderingMode, float resolutionScale, ColorSpace colorSpace) >+{ >+ RemoteResourceIdentifier remoteResourceIdentifier = RemoteResourceIdentifier::generate(); >+ send(Messages::RemoteRenderingBackendProxy::CreateImageBuffer(size, renderingMode, resolutionScale, colorSpace, remoteResourceIdentifier), m_renderingBackendIdentifier); >+ return remoteResourceIdentifier; >+} >+ >+RefPtr<ImageData> RemoteRenderingBackend::remoteGetImageData(AlphaPremultiplication outputFormat, const IntRect& srcRect, RemoteResourceIdentifier remoteResourceIdentifier) >+{ >+ IPC::ImageDataReference imageDataReference; >+ sendSync(Messages::RemoteRenderingBackendProxy::GetImageData(outputFormat, srcRect, remoteResourceIdentifier), Messages::RemoteRenderingBackendProxy::GetImageData::Reply(imageDataReference), m_renderingBackendIdentifier, 1_s); >+ return imageDataReference.buffer(); >+} > >- if (auto imageBuffer = UnacceleratedRemoteImageBuffer::create(size, RenderingMode::RemoteUnaccelerated, resolutionScale, colorSpace, *this)) { >- m_imageBufferMessageHandlerMap.add(imageBuffer->remoteResourceIdentifier(), imageBuffer.get()); >- return imageBuffer; >- } >+void RemoteRenderingBackend::remoteFlushDrawingContext(const DisplayList::DisplayList& displayList, RemoteResourceIdentifier remoteResourceIdentifier) >+{ >+ send(Messages::RemoteRenderingBackendProxy::FlushImageBufferDrawingContext(displayList, remoteResourceIdentifier), m_renderingBackendIdentifier); >+} > >- return nullptr; >+ImageBufferFlushIdentifier RemoteRenderingBackend::remoteFlushDrawingContextAndCommit(const DisplayList::DisplayList& displayList, RemoteResourceIdentifier remoteResourceIdentifier) >+{ >+ ImageBufferFlushIdentifier sentFlushIdentifier = ImageBufferFlushIdentifier::generate(); >+ send(Messages::RemoteRenderingBackendProxy::FlushImageBufferDrawingContextAndCommit(displayList, sentFlushIdentifier, remoteResourceIdentifier), m_renderingBackendIdentifier); >+ return sentFlushIdentifier; > } > >-void RemoteRenderingBackend::releaseRemoteResource(RemoteResourceIdentifier remoteResourceIdentifier) >+void RemoteRenderingBackend::remoteReleaseRemoteResource(RemoteResourceIdentifier remoteResourceIdentifier) > { >- // CreateImageBuffer message should have been received before this one. >- bool found = m_imageBufferMessageHandlerMap.remove(remoteResourceIdentifier); >- ASSERT_UNUSED(found, found); >+ send(Messages::RemoteRenderingBackendProxy::ReleaseRemoteResource(remoteResourceIdentifier), m_renderingBackendIdentifier); > } > > void RemoteRenderingBackend::createImageBufferBackend(const FloatSize& logicalSize, const IntSize& backendSize, float resolutionScale, ColorSpace colorSpace, ImageBufferBackendHandle handle, RemoteResourceIdentifier remoteResourceIdentifier) > { >- if (auto imageBuffer = m_imageBufferMessageHandlerMap.get(remoteResourceIdentifier)) >- imageBuffer->createBackend(logicalSize, backendSize, resolutionScale, colorSpace, WTFMove(handle)); >+ m_remoteResourceCache.createImageBufferBackend(logicalSize, backendSize, resolutionScale, colorSpace, WTFMove(handle), remoteResourceIdentifier); > } > > void RemoteRenderingBackend::commitImageBufferFlushContext(ImageBufferFlushIdentifier flushIdentifier, RemoteResourceIdentifier remoteResourceIdentifier) > { >- if (auto imageBuffer = m_imageBufferMessageHandlerMap.get(remoteResourceIdentifier)) >- imageBuffer->commitFlushContext(flushIdentifier); >+ m_remoteResourceCache.commitImageBufferFlushContext(flushIdentifier, remoteResourceIdentifier); > } > > } // namespace WebKit >diff --git a/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackend.h b/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackend.h >index 28a643a48af5..96efe7c754ff 100644 >--- a/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackend.h >+++ b/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackend.h >@@ -32,15 +32,21 @@ > #include "MessageReceiver.h" > #include "MessageSender.h" > #include "RemoteImageBufferMessageHandler.h" >+#include "RemoteResourceCache.h" > #include "RenderingBackendIdentifier.h" >-#include <WebCore/ColorSpace.h> >-#include <WebCore/DisplayList.h> >-#include <WebCore/FloatSize.h> > #include <WebCore/RemoteResourceIdentifier.h> >-#include <WebCore/RenderingMode.h> >-#include <wtf/HashMap.h> > #include <wtf/WeakPtr.h> > >+namespace WebCore { >+namespace DisplayList { >+class DisplayList; >+class Item; >+} >+class FloatSize; >+enum class ColorSpace : uint8_t; >+enum class RenderingMode : uint8_t; >+} >+ > namespace WebKit { > > class RemoteRenderingBackend >@@ -52,8 +58,6 @@ public: > > ~RemoteRenderingBackend(); > >- RenderingBackendIdentifier renderingBackendIdentifier() const { return m_renderingBackendIdentifier; } >- > // IPC::MessageSender. > IPC::Connection* messageSenderConnection() const override; > uint64_t messageSenderDestinationID() const override; >@@ -61,11 +65,21 @@ public: > // IPC::MessageReceiver > void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override; > >- std::unique_ptr<WebCore::ImageBuffer> createImageBuffer(const WebCore::FloatSize&, WebCore::ShouldAccelerate, float resolutionScale, WebCore::ColorSpace); >- void releaseRemoteResource(WebCore::RemoteResourceIdentifier); >- > bool waitForCreateImageBufferBackend(); > bool waitForCommitImageBufferFlushContext(); >+ >+ // Resouce cache. >+ std::unique_ptr<WebCore::ImageBuffer> createImageBuffer(const WebCore::FloatSize&, WebCore::ShouldAccelerate, float resolutionScale, WebCore::ColorSpace); >+ void releaseImageBuffer(WebCore::ImageBuffer&); >+ RefPtr<WebCore::DisplayList::Item> createDrawImageBufferItem(WebCore::ImageBuffer&, const WebCore::FloatRect& destRect, const WebCore::FloatRect& srcRect, const WebCore::ImagePaintingOptions&, WebCore::RemoteResourceIdentifier); >+ void releaseRemoteClient(WebCore::RemoteResourceIdentifier); >+ >+ // Messages to be sent. >+ WebCore::RemoteResourceIdentifier remoteCreateImageBuffer(const WebCore::FloatSize&, WebCore::RenderingMode, float resolutionScale, WebCore::ColorSpace); >+ RefPtr<WebCore::ImageData> remoteGetImageData(WebCore::AlphaPremultiplication outputFormat, const WebCore::IntRect& srcRect, WebCore::RemoteResourceIdentifier); >+ void remoteFlushDrawingContext(const WebCore::DisplayList::DisplayList&, WebCore::RemoteResourceIdentifier); >+ ImageBufferFlushIdentifier remoteFlushDrawingContextAndCommit(const WebCore::DisplayList::DisplayList&, WebCore::RemoteResourceIdentifier); >+ void remoteReleaseRemoteResource(WebCore::RemoteResourceIdentifier); > > private: > RemoteRenderingBackend(); >@@ -74,8 +88,7 @@ private: > void createImageBufferBackend(const WebCore::FloatSize& logicalSize, const WebCore::IntSize& backendSize, float resolutionScale, WebCore::ColorSpace, ImageBufferBackendHandle, WebCore::RemoteResourceIdentifier); > void commitImageBufferFlushContext(ImageBufferFlushIdentifier, WebCore::RemoteResourceIdentifier); > >- using ImageBufferMessageHandlerMap = HashMap<WebCore::RemoteResourceIdentifier, RemoteImageBufferMessageHandler*>; >- ImageBufferMessageHandlerMap m_imageBufferMessageHandlerMap; >+ RemoteResourceCache m_remoteResourceCache { *this }; > RenderingBackendIdentifier m_renderingBackendIdentifier { RenderingBackendIdentifier::generate() }; > }; > >diff --git a/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCache.cpp b/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCache.cpp >index 8b137891791f..85bf27f3f02b 100644 >--- a/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCache.cpp >+++ b/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCache.cpp >@@ -1 +1,157 @@ >+/* >+ * Copyright (C) 2020 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. AND ITS 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 APPLE INC. OR ITS 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 "RemoteResourceCache.h" >+ >+#if ENABLE(GPU_PROCESS) >+ >+#include "PlatformRemoteImageBuffer.h" >+#include "RemoteRenderingBackend.h" >+#include "RemoteRenderingBackendProxyMessages.h" >+#include "WebPage.h" >+#include <WebCore/CachedImage.h> >+#include <WebCore/Settings.h> >+ >+namespace WebKit { >+using namespace WebCore; >+ >+RemoteResourceCache::RemoteResourceCache(RemoteRenderingBackend& remoteRenderingBackend) >+ : m_remoteRenderingBackend(remoteRenderingBackend) >+{ >+} >+ >+std::unique_ptr<ImageBuffer> RemoteResourceCache::createImageBuffer(const FloatSize& size, ShouldAccelerate shouldAccelerate, float resolutionScale, ColorSpace colorSpace) >+{ >+ if (shouldAccelerate == ShouldAccelerate::Yes) { >+ if (auto imageBuffer = AcceleratedRemoteImageBuffer::create(size, RenderingMode::RemoteAccelerated, resolutionScale, colorSpace, m_remoteRenderingBackend)) { >+ m_remoteImageBufferHashMap.add(imageBuffer.get(), imageBuffer->remoteResourceIdentifier()); >+ m_remoteImageBufferMessageHandlerHashMap.add(imageBuffer->remoteResourceIdentifier(), imageBuffer.get()); >+ return imageBuffer; >+ } >+ } >+ >+ if (auto imageBuffer = UnacceleratedRemoteImageBuffer::create(size, RenderingMode::RemoteUnaccelerated, resolutionScale, colorSpace, m_remoteRenderingBackend)) { >+ m_remoteImageBufferHashMap.add(imageBuffer.get(), imageBuffer->remoteResourceIdentifier()); >+ m_remoteImageBufferMessageHandlerHashMap.add(imageBuffer->remoteResourceIdentifier(), imageBuffer.get()); >+ return imageBuffer; >+ } >+ >+ return nullptr; >+} >+ >+void RemoteResourceCache::createImageBufferBackend(const FloatSize& logicalSize, const IntSize& backendSize, float resolutionScale, ColorSpace colorSpace, ImageBufferBackendHandle handle, RemoteResourceIdentifier remoteResourceIdentifier) >+{ >+ if (auto imageBuffer = m_remoteImageBufferMessageHandlerHashMap.get(remoteResourceIdentifier)) >+ imageBuffer->createBackend(logicalSize, backendSize, resolutionScale, colorSpace, WTFMove(handle)); >+} >+ >+void RemoteResourceCache::commitImageBufferFlushContext(ImageBufferFlushIdentifier flushIdentifier, RemoteResourceIdentifier remoteResourceIdentifier) >+{ >+ if (auto imageBuffer = m_remoteImageBufferMessageHandlerHashMap.get(remoteResourceIdentifier)) >+ imageBuffer->commitFlushContext(flushIdentifier); >+} >+ >+RemoteResourceIdentifier RemoteResourceCache::releaseImageBuffer(ImageBuffer& image) >+{ >+ // Remove the resource from the cache. >+ auto remoteResourceIdentifier = m_remoteImageBufferHashMap.take(&image); >+ ASSERT(remoteResourceIdentifier); >+ >+ // createImageBuffer should have been returned this ImageBuffer before. >+ bool found = m_remoteImageBufferMessageHandlerHashMap.remove(remoteResourceIdentifier); >+ ASSERT_UNUSED(found, found); >+ >+ // Tell the GPU process to remove this resource unless it's pending replaying back. >+ releaseRemoteResourcePendingRemoveClients(remoteResourceIdentifier); >+ return remoteResourceIdentifier; >+} >+ >+RemoteResourceIdentifier RemoteResourceCache::findImageBufferForClient(ImageBuffer& image, RemoteResourceIdentifier remoteClientIdentifier) >+{ >+ auto remoteResourceIdentifier = m_remoteImageBufferHashMap.get(&image); >+ addRemoteClient(remoteResourceIdentifier, remoteClientIdentifier); >+ return remoteResourceIdentifier; >+} >+ >+void RemoteResourceCache::addRemoteClient(RemoteResourceIdentifier remoteResourceIdentifier, RemoteResourceIdentifier remoteClientIdentifier) >+{ >+ if (!remoteResourceIdentifier) >+ return; >+ >+ // Add the "resource -> client" dependency in m_remoteResourceClientsHashMap. >+ auto& clients = m_remoteResourceClientsHashMap.ensure(remoteResourceIdentifier, [&] { >+ return RemoteClientsHashSet(); >+ }).iterator->value; >+ >+ clients.add(remoteClientIdentifier); >+} >+ >+void RemoteResourceCache::releaseRemoteResourcePendingRemoveClients(RemoteResourceIdentifier remoteResourceIdentifier) >+{ >+ ASSERT(!m_remoteResourceClientsPendingReleaseHashMap.contains(remoteResourceIdentifier)); >+ >+ // If we have recorded the resource -> client dependency before in m_remoteResourceClientsHashMap, move this >+ // dependency to m_remoteResourceClientsPendingReleaseHashMap. Otherwise remove the resource from the cache. >+ if (m_remoteResourceClientsHashMap.contains(remoteResourceIdentifier)) >+ m_remoteResourceClientsPendingReleaseHashMap.add(remoteResourceIdentifier, m_remoteResourceClientsHashMap.take(remoteResourceIdentifier)); >+ else >+ m_remoteRenderingBackend.remoteReleaseRemoteResource(remoteResourceIdentifier); >+} >+ >+Vector<RemoteResourceIdentifier> RemoteResourceCache::removeRemoteClient(RemoteResourceClientsHashMap& remoteResourceClientsHashMap, RemoteResourceIdentifier remoteClientIdentifier) >+{ >+ Vector<RemoteResourceIdentifier> remoteResourceClientsToBeRemoved; >+ >+ // Remove all the resource -> client dependencies from remoteResourceClientsHashMap. >+ for (auto& pair : remoteResourceClientsHashMap) { >+ pair.value.remove(remoteClientIdentifier); >+ if (pair.value.isEmpty()) >+ remoteResourceClientsToBeRemoved.append(pair.key); >+ } >+ >+ // Return a list of the unreferenced resources. >+ return remoteResourceClientsToBeRemoved; >+} >+ >+void RemoteResourceCache::releaseRemoteClient(RemoteResourceIdentifier remoteClientIdentifier) >+{ >+ // Remove all the resource -> client dependencies from m_remoteResourceClientsHashMap. >+ for (auto remoteResourceIdentifier : removeRemoteClient(m_remoteResourceClientsHashMap, remoteClientIdentifier)) >+ m_remoteResourceClientsHashMap.remove(remoteResourceIdentifier); >+ >+ // Remove all the resource -> client dependencies from m_remoteResourceClientsPendingReleaseHashMap. >+ for (auto remoteResourceIdentifier : removeRemoteClient(m_remoteResourceClientsPendingReleaseHashMap, remoteClientIdentifier)) { >+ // Remove the unreferenced resources from m_remoteResourceClientsPendingReleaseHashMap. >+ m_remoteResourceClientsPendingReleaseHashMap.remove(remoteResourceIdentifier); >+ >+ // Tell the GPU process to remove this resource. >+ m_remoteRenderingBackend.remoteReleaseRemoteResource(remoteResourceIdentifier); >+ } >+} >+ >+} // namespace WebKit >+ >+#endif // ENABLE(GPU_PROCESS) >diff --git a/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCache.h b/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCache.h >index 8b137891791f..2c2cde1d250e 100644 >--- a/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCache.h >+++ b/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCache.h >@@ -1 +1,84 @@ >+/* >+ * Copyright (C) 2020 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 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. >+ */ > >+#pragma once >+ >+#if ENABLE(GPU_PROCESS) >+ >+#include "ImageBufferBackendHandle.h" >+#include "ImageBufferFlushIdentifier.h" >+#include <WebCore/ImageBuffer.h> >+#include <WebCore/RemoteResourceIdentifier.h> >+#include <wtf/HashMap.h> >+#include <wtf/HashSet.h> >+ >+namespace WebCore { >+namespace DisplayList { >+class Item; >+} >+enum class ColorSpace : uint8_t; >+class Color; >+class FloatRect; >+class FloatSize; >+} >+ >+namespace WebKit { >+ >+class RemoteImageBufferMessageHandler; >+class RemoteRenderingBackend; >+ >+class RemoteResourceCache { >+public: >+ RemoteResourceCache(RemoteRenderingBackend&); >+ >+ std::unique_ptr<WebCore::ImageBuffer> createImageBuffer(const WebCore::FloatSize&, WebCore::ShouldAccelerate, float resolutionScale, WebCore::ColorSpace); >+ void createImageBufferBackend(const WebCore::FloatSize& logicalSize, const WebCore::IntSize& backendSize, float resolutionScale, WebCore::ColorSpace, ImageBufferBackendHandle, WebCore::RemoteResourceIdentifier); >+ void commitImageBufferFlushContext(ImageBufferFlushIdentifier, WebCore::RemoteResourceIdentifier); >+ >+ WebCore::RemoteResourceIdentifier releaseImageBuffer(WebCore::ImageBuffer&); >+ void releaseRemoteClient(WebCore::RemoteResourceIdentifier remoteClientIdentifier); >+ >+private: >+ using RemoteClientsHashSet = HashSet<WebCore::RemoteResourceIdentifier>; >+ using RemoteImageBufferHashMap = HashMap<WebCore::ImageBuffer*, WebCore::RemoteResourceIdentifier>; >+ using RemoteResourceClientsHashMap = HashMap<WebCore::RemoteResourceIdentifier, RemoteClientsHashSet>; >+ using RemoteImageBufferMessageHandlerHashMap = HashMap<WebCore::RemoteResourceIdentifier, RemoteImageBufferMessageHandler*>; >+ >+ WebCore::RemoteResourceIdentifier findImageBufferForClient(WebCore::ImageBuffer&, WebCore::RemoteResourceIdentifier); >+ >+ void addRemoteClient(WebCore::RemoteResourceIdentifier, WebCore::RemoteResourceIdentifier remoteClientIdentifier); >+ Vector<WebCore::RemoteResourceIdentifier> removeRemoteClient(RemoteResourceClientsHashMap&, WebCore::RemoteResourceIdentifier remoteClientIdentifier); >+ void releaseRemoteResourcePendingRemoveClients(WebCore::RemoteResourceIdentifier); >+ >+ RemoteImageBufferHashMap m_remoteImageBufferHashMap; >+ RemoteResourceClientsHashMap m_remoteResourceClientsHashMap; >+ RemoteResourceClientsHashMap m_remoteResourceClientsPendingReleaseHashMap; >+ RemoteImageBufferMessageHandlerHashMap m_remoteImageBufferMessageHandlerHashMap; >+ RemoteRenderingBackend& m_remoteRenderingBackend; >+}; >+ >+} // namespace WebKit >+ >+#endif // ENABLE(GPU_PROCESS) >diff --git a/Source/WebKit/WebProcess/Gamepad/WebGamepadProvider.cpp b/Source/WebKit/WebProcess/Gamepad/WebGamepadProvider.cpp >index 1ae515725361..30050ac07dc9 100644 >--- a/Source/WebKit/WebProcess/Gamepad/WebGamepadProvider.cpp >+++ b/Source/WebKit/WebProcess/Gamepad/WebGamepadProvider.cpp >@@ -29,6 +29,7 @@ > #if ENABLE(GAMEPAD) > > #include "GamepadData.h" >+#include "Logging.h" > #include "WebGamepad.h" > #include "WebProcess.h" > #include "WebProcessPoolMessages.h"
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 217558
:
411007
|
411025
|
411784
|
411787
|
411797
|
411815
|
411819
|
411829
|
412367
|
412380
|
412382