Diff
Modified: trunk/Source/WebCore/ChangeLog (280400 => 280401)
--- trunk/Source/WebCore/ChangeLog 2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebCore/ChangeLog 2021-07-28 21:46:53 UTC (rev 280401)
@@ -1,3 +1,30 @@
+2021-07-28 Myles C. Maxfield <mmaxfi...@apple.com>
+
+ [GPU Process] Start tracking resource uses for ImageBuffers
+ https://bugs.webkit.org/show_bug.cgi?id=228225
+
+ Reviewed by Said Abou-Hallawa.
+
+ This is part 4 of https://bugs.webkit.org/show_bug.cgi?id=228216.
+
+ This works the same way as NativeImages/Fonts (https://bugs.webkit.org/show_bug.cgi?id=228224).
+ The only real difference to how ImageBuffers work today is that RemoteImageBufferProxy's destructor
+ doesn't directly tell the RemoteRenderingBackendProxy to release its RenderingResourceIdentifier,
+ but instead this codepath goes through the RemoteResourceCacheProxy which is tracking the number of
+ uses of the resource. This is so the RemoteResourceCacheProxy can inject the use count into the
+ ReleaseRemoteResource command.
+
+ Covered by existing tests.
+
+ * platform/graphics/displaylists/DisplayListRecorder.cpp:
+ (WebCore::DisplayList::Recorder::drawImageBuffer):
+ (WebCore::DisplayList::Recorder::clipToImageBuffer):
+ * platform/graphics/displaylists/DisplayListRecorder.h:
+ (WebCore::DisplayList::Recorder::Delegate::recordImageBufferUse):
+ * platform/graphics/displaylists/DisplayListReplayer.cpp:
+ (WebCore::DisplayList::applyImageBufferItem):
+ (WebCore::DisplayList::Replayer::applyItem):
+
2021-07-28 Eric Carlson <eric.carl...@apple.com>
[iOS] Ignore extra route change notifications
Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp (280400 => 280401)
--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp 2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp 2021-07-28 21:46:53 UTC (rev 280401)
@@ -204,6 +204,8 @@
GraphicsContext::drawImageBuffer(imageBuffer, destRect, srcRect, options);
return;
}
+ if (m_delegate)
+ m_delegate->recordImageBufferUse(imageBuffer);
m_displayList.cacheImageBuffer(imageBuffer);
append<DrawImageBuffer>(imageBuffer.renderingResourceIdentifier(), destRect, srcRect, options);
}
@@ -465,6 +467,8 @@
void Recorder::clipToImageBuffer(ImageBuffer& imageBuffer, const FloatRect& destRect)
{
+ if (m_delegate)
+ m_delegate->recordImageBufferUse(imageBuffer);
m_displayList.cacheImageBuffer(imageBuffer);
append<ClipToImageBuffer>(imageBuffer.renderingResourceIdentifier(), destRect);
}
Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h (280400 => 280401)
--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h 2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h 2021-07-28 21:46:53 UTC (rev 280401)
@@ -70,6 +70,7 @@
virtual void recordNativeImageUse(NativeImage&) { }
virtual bool isCachedImageBuffer(const ImageBuffer&) const { return false; }
virtual void recordFontUse(Font&) { }
+ virtual void recordImageBufferUse(ImageBuffer&) { }
virtual RenderingMode renderingMode() const { return RenderingMode::Unaccelerated; }
};
Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp (280400 => 280401)
--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp 2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListReplayer.cpp 2021-07-28 21:46:53 UTC (rev 280401)
@@ -55,12 +55,14 @@
}
template<class T>
-inline static std::optional<RenderingResourceIdentifier> applyImageBufferItem(GraphicsContext& context, const ImageBufferHashMap& imageBuffers, ItemHandle item)
+inline static std::optional<RenderingResourceIdentifier> applyImageBufferItem(GraphicsContext& context, const ImageBufferHashMap& imageBuffers, ItemHandle item, Replayer::Delegate* delegate)
{
auto& imageBufferItem = item.get<T>();
auto resourceIdentifier = imageBufferItem.imageBufferIdentifier();
if (auto* imageBuffer = imageBuffers.get(resourceIdentifier)) {
imageBufferItem.apply(context, *imageBuffer);
+ if (delegate)
+ delegate->recordResourceUse(resourceIdentifier);
return std::nullopt;
}
return resourceIdentifier;
@@ -133,13 +135,13 @@
return { std::nullopt, std::nullopt };
if (item.is<DrawImageBuffer>()) {
- if (auto missingCachedResourceIdentifier = applyImageBufferItem<DrawImageBuffer>(context(), m_imageBuffers, item))
+ if (auto missingCachedResourceIdentifier = applyImageBufferItem<DrawImageBuffer>(context(), m_imageBuffers, item, m_delegate))
return { StopReplayReason::MissingCachedResource, WTFMove(missingCachedResourceIdentifier) };
return { std::nullopt, std::nullopt };
}
if (item.is<ClipToImageBuffer>()) {
- if (auto missingCachedResourceIdentifier = applyImageBufferItem<ClipToImageBuffer>(context(), m_imageBuffers, item))
+ if (auto missingCachedResourceIdentifier = applyImageBufferItem<ClipToImageBuffer>(context(), m_imageBuffers, item, m_delegate))
return { StopReplayReason::MissingCachedResource, WTFMove(missingCachedResourceIdentifier) };
return { std::nullopt, std::nullopt };
}
Modified: trunk/Source/WebKit/ChangeLog (280400 => 280401)
--- trunk/Source/WebKit/ChangeLog 2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebKit/ChangeLog 2021-07-28 21:46:53 UTC (rev 280401)
@@ -1,3 +1,20 @@
+2021-07-28 Myles C. Maxfield <mmaxfi...@apple.com>
+
+ [GPU Process] Start tracking resource uses for ImageBuffers
+ https://bugs.webkit.org/show_bug.cgi?id=228225
+
+ Reviewed by Said Abou-Hallawa.
+
+ * WebProcess/GPU/graphics/RemoteImageBufferProxy.h:
+ (WebKit::RemoteImageBufferProxy::~RemoteImageBufferProxy):
+ * WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp:
+ (WebKit::RemoteResourceCacheProxy::cacheImageBuffer):
+ (WebKit::RemoteResourceCacheProxy::cachedImageBuffer):
+ (WebKit::RemoteResourceCacheProxy::releaseImageBuffer):
+ (WebKit::RemoteResourceCacheProxy::recordImageBufferUse):
+ (WebKit::RemoteResourceCacheProxy::remoteResourceCacheWasDestroyed):
+ * WebProcess/GPU/graphics/RemoteResourceCacheProxy.h:
+
2021-07-28 Aditya Keerthi <akeer...@apple.com>
[iOS] <select> picker value committed to incorrect element after programmatic focus change
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h (280400 => 280401)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h 2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h 2021-07-28 21:46:53 UTC (rev 280401)
@@ -72,7 +72,6 @@
flushDrawingContext();
m_remoteRenderingBackendProxy->remoteResourceCacheProxy().releaseImageBuffer(m_renderingResourceIdentifier);
- m_remoteRenderingBackendProxy->releaseRemoteResource(m_renderingResourceIdentifier, 0); // FIXME: Pass the real use count here.
}
ImageBufferBackendHandle createImageBufferBackendHandle()
@@ -323,6 +322,12 @@
m_remoteRenderingBackendProxy->remoteResourceCacheProxy().recordFontUse(font);
}
+ void recordImageBufferUse(WebCore::ImageBuffer& imageBuffer) final
+ {
+ if (m_remoteRenderingBackendProxy)
+ m_remoteRenderingBackendProxy->remoteResourceCacheProxy().recordImageBufferUse(imageBuffer);
+ }
+
WebCore::DisplayList::ItemBufferHandle createItemBuffer(size_t capacity) final
{
if (LIKELY(m_remoteRenderingBackendProxy))
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp (280400 => 280401)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp 2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp 2021-07-28 21:46:53 UTC (rev 280401)
@@ -47,19 +47,26 @@
void RemoteResourceCacheProxy::cacheImageBuffer(WebCore::ImageBuffer& imageBuffer)
{
- auto addResult = m_imageBuffers.add(imageBuffer.renderingResourceIdentifier(), makeWeakPtr(imageBuffer));
+ auto addResult = m_imageBuffers.add(imageBuffer.renderingResourceIdentifier(), ImageBufferState { makeWeakPtr(imageBuffer), 0 });
ASSERT_UNUSED(addResult, addResult.isNewEntry);
}
ImageBuffer* RemoteResourceCacheProxy::cachedImageBuffer(RenderingResourceIdentifier renderingResourceIdentifier)
{
- return m_imageBuffers.get(renderingResourceIdentifier).get();
+ return m_imageBuffers.get(renderingResourceIdentifier).imageBuffer.get();
}
void RemoteResourceCacheProxy::releaseImageBuffer(RenderingResourceIdentifier renderingResourceIdentifier)
{
- bool found = m_imageBuffers.remove(renderingResourceIdentifier);
- ASSERT_UNUSED(found, found);
+ auto iterator = m_imageBuffers.find(renderingResourceIdentifier);
+ RELEASE_ASSERT(iterator != m_imageBuffers.end());
+
+ auto useCount = iterator->value.useCount;
+
+ auto success = m_imageBuffers.remove(iterator);
+ ASSERT_UNUSED(success, success);
+
+ m_remoteRenderingBackendProxy.releaseRemoteResource(renderingResourceIdentifier, useCount);
}
inline static RefPtr<ShareableBitmap> createShareableBitmapFromNativeImage(NativeImage& image)
@@ -78,6 +85,14 @@
return bitmap;
}
+void RemoteResourceCacheProxy::recordImageBufferUse(WebCore::ImageBuffer& imageBuffer)
+{
+ auto iterator = m_imageBuffers.find(imageBuffer.renderingResourceIdentifier());
+ ASSERT(iterator != m_imageBuffers.end());
+
+ ++iterator->value.useCount;
+}
+
void RemoteResourceCacheProxy::recordNativeImageUse(NativeImage& image)
{
auto iterator = m_nativeImages.find(image.renderingResourceIdentifier());
@@ -182,11 +197,12 @@
void RemoteResourceCacheProxy::remoteResourceCacheWasDestroyed()
{
- for (auto& imageBuffer : m_imageBuffers.values()) {
- if (!imageBuffer)
+ for (auto& item : m_imageBuffers.values()) {
+ if (!item.imageBuffer)
continue;
- m_remoteRenderingBackendProxy.createRemoteImageBuffer(*imageBuffer);
- imageBuffer->clearBackend();
+ m_remoteRenderingBackendProxy.createRemoteImageBuffer(*item.imageBuffer);
+ item.useCount = 0;
+ item.imageBuffer->clearBackend();
}
m_nativeImages.clear();
clearFontMap();
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h (280400 => 280401)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h 2021-07-28 21:43:38 UTC (rev 280400)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h 2021-07-28 21:46:53 UTC (rev 280401)
@@ -52,6 +52,7 @@
void recordNativeImageUse(WebCore::NativeImage&);
void recordFontUse(WebCore::Font&);
+ void recordImageBufferUse(WebCore::ImageBuffer&);
void finalizeRenderingUpdate();
@@ -59,7 +60,11 @@
void releaseMemory();
private:
- using ImageBufferHashMap = HashMap<WebCore::RenderingResourceIdentifier, WeakPtr<WebCore::ImageBuffer>>;
+ struct ImageBufferState {
+ WeakPtr<WebCore::ImageBuffer> imageBuffer;
+ uint64_t useCount;
+ };
+ using ImageBufferHashMap = HashMap<WebCore::RenderingResourceIdentifier, ImageBufferState>;
struct NativeImageState {
WeakPtr<WebCore::NativeImage> image;