Diff
Modified: trunk/Source/WebKit/ChangeLog (288846 => 288847)
--- trunk/Source/WebKit/ChangeLog 2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/ChangeLog 2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,3 +1,62 @@
+2022-01-31 Said Abou-Hallawa <[email protected]>
+
+ [GPU Process] Remove the resource use counters from the remote resource cache
+ https://bugs.webkit.org/show_bug.cgi?id=235636
+
+ Reviewed by Simon Fraser.
+
+ The display list items and the resource management messages are both
+ communicated from the WebProcess and the GPUProcess through the stream
+ connection. The resources will be sent to the GPUProcess, consumed by
+ the display items and then released in the right order. So there is no
+ need anymore for the resource use counters.
+
+ * GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
+ (WebKit::RemoteDisplayListRecorder::setStateWithQualifiedIdentifiers):
+ (WebKit::RemoteDisplayListRecorder::clipToImageBufferWithQualifiedIdentifier):
+ (WebKit::RemoteDisplayListRecorder::drawGlyphsWithQualifiedIdentifier):
+ (WebKit::RemoteDisplayListRecorder::drawImageBufferWithQualifiedIdentifier):
+ (WebKit::RemoteDisplayListRecorder::drawNativeImageWithQualifiedIdentifier):
+ (WebKit::RemoteDisplayListRecorder::drawPatternWithQualifiedIdentifier):
+ * GPUProcess/graphics/RemoteRenderingBackend.cpp:
+ (WebKit::RemoteRenderingBackend::releaseRemoteResource):
+ (WebKit::RemoteRenderingBackend::releaseRemoteResourceWithQualifiedIdentifier):
+ * GPUProcess/graphics/RemoteRenderingBackend.h:
+ * GPUProcess/graphics/RemoteRenderingBackend.messages.in:
+ * GPUProcess/graphics/RemoteResourceCache.cpp:
+ (WebKit::RemoteResourceCache::cacheImageBuffer):
+ (WebKit::RemoteResourceCache::cacheNativeImage):
+ (WebKit::RemoteResourceCache::cacheFont):
+ (WebKit::RemoteResourceCache::releaseRemoteResource):
+ (WebKit::RemoteResourceCache::ensureResourceUseCounter): Deleted.
+ (WebKit::RemoteResourceCache::maybeRemoveResource): Deleted.
+ (WebKit::RemoteResourceCache::recordResourceUse): Deleted.
+ (WebKit::RemoteResourceCache::updateHasActiveDrawables): Deleted.
+ * GPUProcess/graphics/RemoteResourceCache.h:
+ (WebKit::RemoteResourceCache::hasActiveDrawables const):
+ (): Deleted.
+ * WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.cpp:
+ (WebKit::RemoteDisplayListRecorderProxy::recordResourceUse):
+ * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
+ (WebKit::RemoteRenderingBackendProxy::releaseRemoteResource):
+ (WebKit::RemoteRenderingBackendProxy::recordNativeImageUse): Deleted.
+ (WebKit::RemoteRenderingBackendProxy::recordFontUse): Deleted.
+ (WebKit::RemoteRenderingBackendProxy::recordImageBufferUse): Deleted.
+ * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
+ * WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp:
+ (WebKit::RemoteResourceCacheProxy::cacheImageBuffer):
+ (WebKit::RemoteResourceCacheProxy::cachedImageBuffer const):
+ (WebKit::RemoteResourceCacheProxy::releaseImageBuffer):
+ (WebKit::RemoteResourceCacheProxy::recordImageBufferUse):
+ (WebKit::RemoteResourceCacheProxy::recordNativeImageUse):
+ (WebKit::RemoteResourceCacheProxy::recordFontUse):
+ (WebKit::RemoteResourceCacheProxy::releaseNativeImage):
+ (WebKit::RemoteResourceCacheProxy::clearNativeImageMap):
+ (WebKit::RemoteResourceCacheProxy::releaseAllRemoteFonts):
+ (WebKit::RemoteResourceCacheProxy::finalizeRenderingUpdateForFonts):
+ (WebKit::RemoteResourceCacheProxy::remoteResourceCacheWasDestroyed):
+ * WebProcess/GPU/graphics/RemoteResourceCacheProxy.h:
+
2022-01-31 Per Arne Vollan <[email protected]>
[macOS][WP] Add required syscall
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp (288846 => 288847)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp 2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp 2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -134,12 +134,6 @@
fillPatternImage = resourceCache().cachedNativeImage(fillPatternImageIdentifier);
handleItem(WTFMove(item), strokePatternImage.get(), fillPatternImage.get());
-
- if (strokePatternImage)
- resourceCache().recordResourceUse(strokePatternImageIdentifier);
-
- if (fillPatternImage)
- resourceCache().recordResourceUse(fillPatternImageIdentifier);
}
void RemoteDisplayListRecorder::setLineCap(LineCap lineCap)
@@ -193,7 +187,6 @@
}
handleItem(DisplayList::ClipToImageBuffer(imageBufferIdentifier.object(), destinationRect), *imageBuffer);
- resourceCache().recordResourceUse(imageBufferIdentifier);
}
void RemoteDisplayListRecorder::clipOutToPath(const Path& path)
@@ -275,7 +268,6 @@
}
handleItem(WTFMove(item), *font);
- resourceCache().recordResourceUse(fontIdentifier);
}
void RemoteDisplayListRecorder::drawImageBuffer(RenderingResourceIdentifier imageBufferIdentifier, const FloatRect& destinationRect, const FloatRect& srcRect, const ImagePaintingOptions& options)
@@ -294,7 +286,6 @@
}
handleItem(DisplayList::DrawImageBuffer(imageBufferIdentifier.object(), destinationRect, srcRect, options), *imageBuffer);
- resourceCache().recordResourceUse(imageBufferIdentifier);
}
void RemoteDisplayListRecorder::drawNativeImage(RenderingResourceIdentifier imageIdentifier, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions& options)
@@ -313,7 +304,6 @@
}
handleItem(DisplayList::DrawNativeImage(imageIdentifier.object(), imageSize, destRect, srcRect, options), *image);
- resourceCache().recordResourceUse(imageIdentifier);
}
void RemoteDisplayListRecorder::drawPattern(RenderingResourceIdentifier imageIdentifier, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& transform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options)
@@ -332,7 +322,6 @@
}
handleItem(DisplayList::DrawPattern(imageIdentifier.object(), imageSize, destRect, tileRect, transform, phase, spacing, options), *image);
- resourceCache().recordResourceUse(imageIdentifier);
}
void RemoteDisplayListRecorder::beginTransparencyLayer(float opacity)
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp (288846 => 288847)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp 2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp 2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -390,17 +390,17 @@
m_remoteResourceCache.deleteAllFonts();
}
-void RemoteRenderingBackend::releaseRemoteResource(RenderingResourceIdentifier renderingResourceIdentifier, uint64_t useCount)
+void RemoteRenderingBackend::releaseRemoteResource(RenderingResourceIdentifier renderingResourceIdentifier)
{
// Immediately turn the RenderingResourceIdentifier (which is error-prone) to a QualifiedRenderingResourceIdentifier,
// and use a helper function to make sure that don't accidentally use the RenderingResourceIdentifier (because the helper function can't see it).
- releaseRemoteResourceWithQualifiedIdentifier({ renderingResourceIdentifier, m_gpuConnectionToWebProcess->webProcessIdentifier() }, useCount);
+ releaseRemoteResourceWithQualifiedIdentifier({ renderingResourceIdentifier, m_gpuConnectionToWebProcess->webProcessIdentifier() });
}
-void RemoteRenderingBackend::releaseRemoteResourceWithQualifiedIdentifier(QualifiedRenderingResourceIdentifier renderingResourceIdentifier, uint64_t useCount)
+void RemoteRenderingBackend::releaseRemoteResourceWithQualifiedIdentifier(QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
{
ASSERT(!RunLoop::isMain());
- auto success = m_remoteResourceCache.releaseRemoteResource(renderingResourceIdentifier, useCount);
+ auto success = m_remoteResourceCache.releaseRemoteResource(renderingResourceIdentifier);
MESSAGE_CHECK(success, "Resource is being released before being cached.");
updateRenderingResourceRequest();
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h (288846 => 288847)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h 2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h 2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -117,7 +117,7 @@
void cacheNativeImage(const ShareableBitmap::Handle&, WebCore::RenderingResourceIdentifier);
void cacheFont(Ref<WebCore::Font>&&);
void deleteAllFonts();
- void releaseRemoteResource(WebCore::RenderingResourceIdentifier, uint64_t useCount);
+ void releaseRemoteResource(WebCore::RenderingResourceIdentifier);
void finalizeRenderingUpdate(RenderingUpdateID);
// Received messages translated to use QualifiedRenderingResourceIdentifier.
@@ -127,7 +127,7 @@
void getShareableBitmapForImageBufferWithQualifiedIdentifier(QualifiedRenderingResourceIdentifier, WebCore::PreserveResolution, CompletionHandler<void(ShareableBitmap::Handle&&)>&&);
void cacheNativeImageWithQualifiedIdentifier(const ShareableBitmap::Handle&, QualifiedRenderingResourceIdentifier);
void didCreateSharedDisplayListHandleWithQualifiedIdentifier(WebCore::DisplayList::ItemBufferIdentifier, const SharedMemory::IPCHandle&, QualifiedRenderingResourceIdentifier destinationBufferIdentifier);
- void releaseRemoteResourceWithQualifiedIdentifier(QualifiedRenderingResourceIdentifier, uint64_t useCount);
+ void releaseRemoteResourceWithQualifiedIdentifier(QualifiedRenderingResourceIdentifier);
void cacheFontWithQualifiedIdentifier(Ref<WebCore::Font>&&, QualifiedRenderingResourceIdentifier);
Ref<IPC::StreamConnectionWorkQueue> m_workQueue;
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in (288846 => 288847)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in 2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in 2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,4 +1,4 @@
-# Copyright (C) 2020 Apple Inc. All rights reserved.
+# Copyright (C) 2020-2022 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -35,7 +35,7 @@
CacheNativeImage(WebKit::ShareableBitmap::Handle handle, WebCore::RenderingResourceIdentifier renderingResourceIdentifier) NotStreamEncodable
CacheFont(IPC::FontReference font) NotStreamEncodable
DeleteAllFonts()
- ReleaseRemoteResource(WebCore::RenderingResourceIdentifier renderingResourceIdentifier, uint64_t useCount)
+ ReleaseRemoteResource(WebCore::RenderingResourceIdentifier renderingResourceIdentifier)
FinalizeRenderingUpdate(WebKit::RenderingUpdateID renderingUpdateID)
}
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp (288846 => 288847)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp 2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp 2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -36,20 +36,10 @@
{
}
-RemoteResourceCache::RemoteResourceCache(RemoteResourceCache&& other)
- : m_resourceHeap(WTFMove(other.m_resourceHeap))
- , m_resourceUseCounters(WTFMove(other.m_resourceUseCounters))
-{
- updateHasActiveDrawables();
-}
-
void RemoteResourceCache::cacheImageBuffer(Ref<ImageBuffer>&& imageBuffer, QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
{
ASSERT(renderingResourceIdentifier.object() == imageBuffer->renderingResourceIdentifier());
m_resourceHeap.add(renderingResourceIdentifier, WTFMove(imageBuffer));
- updateHasActiveDrawables();
-
- ensureResourceUseCounter(renderingResourceIdentifier);
}
ImageBuffer* RemoteResourceCache::cachedImageBuffer(QualifiedRenderingResourceIdentifier renderingResourceIdentifier) const
@@ -61,9 +51,6 @@
{
ASSERT(renderingResourceIdentifier.object() == image->renderingResourceIdentifier());
m_resourceHeap.add(renderingResourceIdentifier, WTFMove(image));
- updateHasActiveDrawables();
-
- ensureResourceUseCounter(renderingResourceIdentifier);
}
NativeImage* RemoteResourceCache::cachedNativeImage(QualifiedRenderingResourceIdentifier renderingResourceIdentifier) const
@@ -75,8 +62,6 @@
{
ASSERT(renderingResourceIdentifier.object() == font->renderingResourceIdentifier());
m_resourceHeap.add(renderingResourceIdentifier, WTFMove(font));
-
- ensureResourceUseCounter(renderingResourceIdentifier);
}
Font* RemoteResourceCache::cachedFont(QualifiedRenderingResourceIdentifier renderingResourceIdentifier) const
@@ -84,103 +69,22 @@
return m_resourceHeap.getFont(renderingResourceIdentifier);
}
-void RemoteResourceCache::ensureResourceUseCounter(QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
-{
- auto result = m_resourceUseCounters.add(renderingResourceIdentifier, ResourceUseCounter { });
- if (!result.isNewEntry) {
- auto& state = result.iterator->value.state;
- // FIXME: We should consider making this assertion MESSAGE_CHECK the web process.
- ASSERT(state == ResourceState::ToBeDeleted);
- state = ResourceState::Alive;
- }
-}
-
void RemoteResourceCache::deleteAllFonts()
{
m_resourceHeap.deleteAllFonts();
}
-bool RemoteResourceCache::maybeRemoveResource(QualifiedRenderingResourceIdentifier renderingResourceIdentifier, ResourceUseCountersMap::iterator& iterator)
+bool RemoteResourceCache::releaseRemoteResource(QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
{
- auto& value = iterator->value;
- if (value.state == ResourceState::Alive || value.useOrPendingCount < 0)
- return true;
-
- if (value.useOrPendingCount) {
- // This means we've hit a situation that's something like the following:
- //
- // The WP sends:
- // 1. Send cache resource message
- // 2. Use resource 2x
- // 3. Send release resource message with useCount = 2
- // 4. Send cache resource message again for the same resource
- // 5. Use resource 4 times
- // 6. Send release resource message with useCount = 4
- //
- // The GPUP sees:
- // 1. The cache resource message
- // 2. Use resource 2x
- // 3. Use resource 3x more times (from step 5 above)
- // 4. Release resource message with useCount = 2 <== This part right here
- // 5. ... more stuff ...
- //
- // In this situation, we've got a head-start on a future frame's rendering commands,
- // using a resource which was cached from a previous frame. (This is not a problem.)
- // Therefore, we know that, in the future, there's going to be another cache resource
- // message which will want us to cache this exact same resource that we already have
- // cached.
- //
- // So, let's just not remove the resource, just in case there are _more_ rendering
- // commands we can get a head start on before the cache resource message eventually
- // gets delivered. The eventual cache resource command is smart enough to realize that
- // the thing it's supposed to be caching is already in the cache, and will correctly
- // do nothing.
-
- return true;
- }
-
- m_resourceUseCounters.remove(iterator);
-
if (m_resourceHeap.removeImageBuffer(renderingResourceIdentifier)
- || m_resourceHeap.removeNativeImage(renderingResourceIdentifier)) {
- updateHasActiveDrawables();
+ || m_resourceHeap.removeNativeImage(renderingResourceIdentifier)
+ || m_resourceHeap.removeFont(renderingResourceIdentifier))
return true;
- }
- if (m_resourceHeap.removeFont(renderingResourceIdentifier))
- return true;
// Caching the remote resource should have happened before releasing it.
return false;
}
-void RemoteResourceCache::recordResourceUse(QualifiedRenderingResourceIdentifier renderingResourceIdentifier)
-{
- auto iterator = m_resourceUseCounters.find(renderingResourceIdentifier);
-
- ASSERT(iterator != m_resourceUseCounters.end());
-
- ResourceUseCounter& useCounter = iterator->value;
- ++useCounter.useOrPendingCount;
-
- maybeRemoveResource(renderingResourceIdentifier, iterator);
-}
-
-bool RemoteResourceCache::releaseRemoteResource(QualifiedRenderingResourceIdentifier renderingResourceIdentifier, uint64_t useCount)
-{
- auto iterator = m_resourceUseCounters.find(renderingResourceIdentifier);
- if (iterator == m_resourceUseCounters.end())
- return false;
- ResourceUseCounter& useCounter = iterator->value;
- useCounter.state = ResourceState::ToBeDeleted;
- useCounter.useOrPendingCount -= useCount;
- return maybeRemoveResource(renderingResourceIdentifier, iterator);
-}
-
-void RemoteResourceCache::updateHasActiveDrawables()
-{
- m_hasActiveDrawables = m_resourceHeap.hasImageBuffer() || m_resourceHeap.hasNativeImage();
-}
-
} // namespace WebKit
#endif // ENABLE(GPU_PROCESS)
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h (288846 => 288847)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h 2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h 2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -43,7 +43,6 @@
class RemoteResourceCache {
public:
RemoteResourceCache(WebCore::ProcessIdentifier webProcessIdentifier);
- RemoteResourceCache(RemoteResourceCache&&);
void cacheImageBuffer(Ref<WebCore::ImageBuffer>&&, QualifiedRenderingResourceIdentifier);
WebCore::ImageBuffer* cachedImageBuffer(QualifiedRenderingResourceIdentifier) const;
@@ -52,45 +51,14 @@
void cacheFont(Ref<WebCore::Font>&&, QualifiedRenderingResourceIdentifier);
WebCore::Font* cachedFont(QualifiedRenderingResourceIdentifier) const;
void deleteAllFonts();
- bool releaseRemoteResource(QualifiedRenderingResourceIdentifier, uint64_t useCount);
- void recordResourceUse(QualifiedRenderingResourceIdentifier);
+ bool releaseRemoteResource(QualifiedRenderingResourceIdentifier);
const WebCore::DisplayList::ResourceHeap& resourceHeap() const { return m_resourceHeap; }
- bool hasActiveDrawables() const { return m_hasActiveDrawables; }
+ bool hasActiveDrawables() const { return m_resourceHeap.hasImageBuffer() || m_resourceHeap.hasNativeImage(); }
private:
- // Because the cache/release messages are sent asynchronously from the display list items which
- // reference the resources, it's totally possible that we see a release message before we've
- // executed all the display list items which reference the resource. The web process tells us
- // how many display list items will reference this resource, and we defer deletion of the resource
- // until we execute that many display list items. It's actually a bit worse than this, though,
- // because we may actually see a *new* cache message during the time when deletion is deferred.
- //
- // We can only safely delete a resource when:
- // 1. All the cache messages have an accompanying release message, and
- // 2. We've processed as many display list items that reference a particular resource as the web
- // process has encoded.
- enum class ResourceState {
- Alive,
- ToBeDeleted
- };
- struct ResourceUseCounter {
- ResourceState state { ResourceState::Alive };
- int64_t useOrPendingCount { 0 };
- };
- using ResourceUseCountersMap = HashMap<QualifiedRenderingResourceIdentifier, ResourceUseCounter>;
-
- bool maybeRemoveResource(QualifiedRenderingResourceIdentifier, ResourceUseCountersMap::iterator&);
- void ensureResourceUseCounter(QualifiedRenderingResourceIdentifier);
-
- void updateHasActiveDrawables();
-
QualifiedResourceHeap m_resourceHeap;
-
- ResourceUseCountersMap m_resourceUseCounters;
-
- std::atomic<bool> m_hasActiveDrawables { false };
};
} // namespace WebKit
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.cpp (288846 => 288847)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.cpp 2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.cpp 2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -419,7 +419,7 @@
return false;
}
- m_renderingBackend->recordNativeImageUse(image);
+ m_renderingBackend->remoteResourceCacheProxy().recordNativeImageUse(image);
return true;
}
@@ -433,7 +433,7 @@
if (!canDrawImageBuffer(imageBuffer))
return false;
- m_renderingBackend->recordImageBufferUse(imageBuffer);
+ m_renderingBackend->remoteResourceCacheProxy().recordImageBufferUse(imageBuffer);
return true;
}
@@ -455,7 +455,7 @@
return false;
}
- m_renderingBackend->recordFontUse(font);
+ m_renderingBackend->remoteResourceCacheProxy().recordFontUse(font);
return true;
}
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp (288846 => 288847)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp 2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp 2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -258,9 +258,9 @@
sendToStream(Messages::RemoteRenderingBackend::DeleteAllFonts());
}
-void RemoteRenderingBackendProxy::releaseRemoteResource(RenderingResourceIdentifier renderingResourceIdentifier, uint64_t useCount)
+void RemoteRenderingBackendProxy::releaseRemoteResource(RenderingResourceIdentifier renderingResourceIdentifier)
{
- sendToStream(Messages::RemoteRenderingBackend::ReleaseRemoteResource(renderingResourceIdentifier, useCount));
+ sendToStream(Messages::RemoteRenderingBackend::ReleaseRemoteResource(renderingResourceIdentifier));
}
void RemoteRenderingBackendProxy::finalizeRenderingUpdate()
@@ -326,21 +326,6 @@
m_needsWakeUpSemaphoreForDisplayListStream = false;
}
-void RemoteRenderingBackendProxy::recordNativeImageUse(NativeImage& image)
-{
- m_remoteResourceCacheProxy.recordNativeImageUse(image);
-}
-
-void RemoteRenderingBackendProxy::recordFontUse(Font& font)
-{
- m_remoteResourceCacheProxy.recordFontUse(font);
-}
-
-void RemoteRenderingBackendProxy::recordImageBufferUse(ImageBuffer& imageBuffer)
-{
- m_remoteResourceCacheProxy.recordImageBufferUse(imageBuffer);
-}
-
bool RemoteRenderingBackendProxy::isCached(const ImageBuffer& imageBuffer) const
{
if (auto cachedImageBuffer = m_remoteResourceCacheProxy.cachedImageBuffer(imageBuffer.renderingResourceIdentifier())) {
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h (288846 => 288847)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h 2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h 2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -97,7 +97,7 @@
void cacheNativeImage(const ShareableBitmap::Handle&, WebCore::RenderingResourceIdentifier);
void cacheFont(Ref<WebCore::Font>&&);
void deleteAllFonts();
- void releaseRemoteResource(WebCore::RenderingResourceIdentifier, uint64_t useCount);
+ void releaseRemoteResource(WebCore::RenderingResourceIdentifier);
void finalizeRenderingUpdate();
RenderingUpdateID renderingUpdateID() const { return m_renderingUpdateID; }
@@ -131,10 +131,6 @@
sendToStream(WTFMove(message), renderingBackendIdentifier());
}
- void recordNativeImageUse(WebCore::NativeImage&);
- void recordFontUse(WebCore::Font&);
- void recordImageBufferUse(WebCore::ImageBuffer&);
-
private:
explicit RemoteRenderingBackendProxy(WebPage&);
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp (288846 => 288847)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp 2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp 2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -46,13 +46,13 @@
void RemoteResourceCacheProxy::cacheImageBuffer(WebCore::ImageBuffer& imageBuffer)
{
- auto addResult = m_imageBuffers.add(imageBuffer.renderingResourceIdentifier(), ImageBufferState { imageBuffer, 0 });
+ auto addResult = m_imageBuffers.add(imageBuffer.renderingResourceIdentifier(), imageBuffer);
ASSERT_UNUSED(addResult, addResult.isNewEntry);
}
ImageBuffer* RemoteResourceCacheProxy::cachedImageBuffer(RenderingResourceIdentifier renderingResourceIdentifier) const
{
- return m_imageBuffers.get(renderingResourceIdentifier).imageBuffer.get();
+ return m_imageBuffers.get(renderingResourceIdentifier).get();
}
void RemoteResourceCacheProxy::releaseImageBuffer(RenderingResourceIdentifier renderingResourceIdentifier)
@@ -60,12 +60,10 @@
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);
+ m_remoteRenderingBackendProxy.releaseRemoteResource(renderingResourceIdentifier);
}
inline static RefPtr<ShareableBitmap> createShareableBitmapFromNativeImage(NativeImage& image)
@@ -87,18 +85,14 @@
void RemoteResourceCacheProxy::recordImageBufferUse(WebCore::ImageBuffer& imageBuffer)
{
auto iterator = m_imageBuffers.find(imageBuffer.renderingResourceIdentifier());
- ASSERT(iterator != m_imageBuffers.end());
-
- ++iterator->value.useCount;
+ ASSERT_UNUSED(iterator, iterator != m_imageBuffers.end());
}
void RemoteResourceCacheProxy::recordNativeImageUse(NativeImage& image)
{
auto iterator = m_nativeImages.find(image.renderingResourceIdentifier());
- if (iterator != m_nativeImages.end()) {
- ++iterator->value.useCount;
+ if (iterator != m_nativeImages.end())
return;
- }
auto bitmap = createShareableBitmapFromNativeImage(image);
if (!bitmap)
@@ -110,7 +104,7 @@
return;
handle.takeOwnershipOfMemory(MemoryLedger::Graphics);
- m_nativeImages.add(image.renderingResourceIdentifier(), NativeImageState { image, 1 });
+ m_nativeImages.add(image.renderingResourceIdentifier(), image);
// Set itself as an observer to NativeImage, so releaseNativeImage()
// gets called when NativeImage is being deleleted.
@@ -122,9 +116,7 @@
void RemoteResourceCacheProxy::recordFontUse(Font& font)
{
- auto result = m_fonts.ensure(font.renderingResourceIdentifier(), [&] {
- return FontState { m_remoteRenderingBackendProxy.renderingUpdateID(), 1 };
- });
+ auto result = m_fonts.add(font.renderingResourceIdentifier(), m_remoteRenderingBackendProxy.renderingUpdateID());
if (result.isNewEntry) {
m_remoteRenderingBackendProxy.cacheFont(font);
@@ -133,9 +125,8 @@
}
auto& currentState = result.iterator->value;
- ++currentState.useCount;
- if (currentState.lastRenderingUpdateVersionUsedWithin != m_remoteRenderingBackendProxy.renderingUpdateID()) {
- currentState.lastRenderingUpdateVersionUsedWithin = m_remoteRenderingBackendProxy.renderingUpdateID();
+ if (currentState != m_remoteRenderingBackendProxy.renderingUpdateID()) {
+ currentState = m_remoteRenderingBackendProxy.renderingUpdateID();
++m_numberOfFontsUsedInCurrentRenderingUpdate;
}
}
@@ -145,18 +136,16 @@
auto iterator = m_nativeImages.find(renderingResourceIdentifier);
RELEASE_ASSERT(iterator != m_nativeImages.end());
- auto useCount = iterator->value.useCount;
-
auto success = m_nativeImages.remove(iterator);
ASSERT_UNUSED(success, success);
- m_remoteRenderingBackendProxy.releaseRemoteResource(renderingResourceIdentifier, useCount);
+ m_remoteRenderingBackendProxy.releaseRemoteResource(renderingResourceIdentifier);
}
void RemoteResourceCacheProxy::clearNativeImageMap()
{
for (auto& nativeImageState : m_nativeImages.values())
- nativeImageState.image->removeObserver(*this);
+ nativeImageState->removeObserver(*this);
m_nativeImages.clear();
}
@@ -168,7 +157,7 @@
void RemoteResourceCacheProxy::releaseAllRemoteFonts()
{
for (auto& fontState : m_fonts)
- m_remoteRenderingBackendProxy.releaseRemoteResource(fontState.key, fontState.value.useCount);
+ m_remoteRenderingBackendProxy.releaseRemoteResource(fontState.key);
}
void RemoteResourceCacheProxy::clearFontMap()
@@ -189,9 +178,9 @@
HashSet<WebCore::RenderingResourceIdentifier> toRemove;
auto renderingUpdateID = m_remoteRenderingBackendProxy.renderingUpdateID();
for (auto& item : m_fonts) {
- if (renderingUpdateID - item.value.lastRenderingUpdateVersionUsedWithin >= minimumRenderingUpdateCountToKeepFontAlive) {
+ if (renderingUpdateID - item.value >= minimumRenderingUpdateCountToKeepFontAlive) {
toRemove.add(item.key);
- m_remoteRenderingBackendProxy.releaseRemoteResource(item.key, item.value.useCount);
+ m_remoteRenderingBackendProxy.releaseRemoteResource(item.key);
}
}
@@ -213,17 +202,16 @@
// Get a copy of m_imageBuffers.values() because clearBackend()
// may release some of the cached ImageBuffers.
- for (auto& item : copyToVector(m_imageBuffers.values())) {
- if (!item.imageBuffer)
+ for (auto& imageBuffer : copyToVector(m_imageBuffers.values())) {
+ if (!imageBuffer)
continue;
- item.useCount = 0;
- item.imageBuffer->clearBackend();
+ imageBuffer->clearBackend();
}
- for (auto& item : m_imageBuffers.values()) {
- if (!item.imageBuffer)
+ for (auto& imageBuffer : m_imageBuffers.values()) {
+ if (!imageBuffer)
continue;
- m_remoteRenderingBackendProxy.createRemoteImageBuffer(*item.imageBuffer);
+ m_remoteRenderingBackendProxy.createRemoteImageBuffer(*imageBuffer);
}
}
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h (288846 => 288847)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h 2022-01-31 22:36:14 UTC (rev 288846)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h 2022-01-31 22:52:12 UTC (rev 288847)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -63,23 +63,9 @@
unsigned imagesCount() const { return m_nativeImages.size(); }
private:
- struct ImageBufferState {
- WeakPtr<WebCore::ImageBuffer> imageBuffer;
- uint64_t useCount;
- };
- using ImageBufferHashMap = HashMap<WebCore::RenderingResourceIdentifier, ImageBufferState>;
-
- struct NativeImageState {
- WeakPtr<WebCore::NativeImage> image;
- uint64_t useCount;
- };
- using NativeImageHashMap = HashMap<WebCore::RenderingResourceIdentifier, NativeImageState>;
-
- struct FontState {
- RenderingUpdateID lastRenderingUpdateVersionUsedWithin;
- uint64_t useCount;
- };
- using FontHashMap = HashMap<WebCore::RenderingResourceIdentifier, FontState>;
+ using ImageBufferHashMap = HashMap<WebCore::RenderingResourceIdentifier, WeakPtr<WebCore::ImageBuffer>>;
+ using NativeImageHashMap = HashMap<WebCore::RenderingResourceIdentifier, WeakPtr<WebCore::NativeImage>>;
+ using FontHashMap = HashMap<WebCore::RenderingResourceIdentifier, RenderingUpdateID>;
void releaseNativeImage(WebCore::RenderingResourceIdentifier) override;
void clearNativeImageMap();