Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 2a8263edbfe035e846cb103a41d14a4df3a8d357
https://github.com/WebKit/WebKit/commit/2a8263edbfe035e846cb103a41d14a4df3a8d357
Author: Matt Woodrow <[email protected]>
Date: 2022-12-16 (Fri, 16 Dec 2022)
Changed paths:
R
LayoutTests/platform/ios/imported/w3c/web-platform-tests/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.getcontext.worker-expected.txt
M Source/WebCore/bindings/js/SerializedScriptValue.cpp
M Source/WebCore/html/ImageBitmap.cpp
M Source/WebCore/html/ImageBitmapBacking.cpp
M Source/WebCore/html/ImageBitmapBacking.h
M Source/WebCore/html/OffscreenCanvas.cpp
M Source/WebCore/html/OffscreenCanvas.h
M Source/WebCore/page/Chrome.cpp
M Source/WebCore/page/Chrome.h
M Source/WebCore/page/ChromeClient.cpp
M Source/WebCore/page/ChromeClient.h
M Source/WebCore/platform/GraphicsClient.h
M Source/WebCore/platform/graphics/ImageBuffer.cpp
M Source/WebCore/platform/graphics/ImageBuffer.h
M Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp
M Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h
M Source/WebKit/GPUProcess/GPUConnectionToWebProcess.messages.in
M Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.cpp
M Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.h
M Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp
M Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h
M Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in
M Source/WebKit/Scripts/webkit/messages.py
M Source/WebKit/Scripts/webkit/tests/MessageArgumentDescriptions.cpp
M Source/WebKit/WebKit.xcodeproj/project.pbxproj
M Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.cpp
M Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.h
M Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.cpp
M Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h
M Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp
M Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h
M Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp
M Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h
A
Source/WebKit/WebProcess/GPU/graphics/RemoteSerializedImageBufferIdentifier.h
M Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp
M Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h
M Source/WebKit/WebProcess/WebCoreSupport/WebWorkerClient.cpp
M Source/WebKit/WebProcess/WebCoreSupport/WebWorkerClient.h
Log Message:
-----------
Use SerializedImageBuffer to pass ImageBuffers between workers and the main
thread.
https://bugs.webkit.org/show_bug.cgi?id=244830
<rdar://99857231>
Reviewed by Kimmo Kinnunen.
Create SerializeImageBuffer to transfer ImageBuffers between threads.
Problem: RemoteImageBufferProxy objects cannot be used from any thread other
than the one they were
created one. The current code makes a clone into a non-remote ImageBuffer at
the locations where
we transfer to/from a worker thread.
The JS Web API here is that when you postMessage an ImageBitmap to a different
thread, the existing
object becomes invalid. Thus it is impossible to have concurrent references to
an image from multiple
threads.
One option would be to add a way to re-initialize an ImageBuffer object when it
is received on another thread.
That's difficult since it's hard to ensure that all members and nested objects
are handled correctly.
A variant of that would be to re-create the ImageBuffer when it's received on
the other thread. That's maybe
ok, but still weird that we have a pointer to an object that we're not allowed
to touch. We'd need to post it
back to it's original thread when we're done, what if that thread no longer
exists?
This takes a slightly different approach of creating a serialization object,
and making ImageBuffer non-threadsafe refcounted.
For RemoteImageBufferProxy, we only serialize the identifiers for the remote
object, and (via runtime asserts) ensure that the old
object will be consumed in the process.
This is definitely move heavyweight, but I like that it keeps the per-thread
instances where they belong. It doesn't avoid the
complexity of needing to post between threads for failure cases etc.
* Source/WebCore/page/Chrome.cpp:
(WebCore::Chrome::sinkIntoImageBuffer):
* Source/WebCore/page/Chrome.h:
* Source/WebCore/page/ChromeClient.cpp:
(WebCore::ChromeClient::sinkIntoImageBuffer):
* Source/WebCore/page/ChromeClient.h:
* Source/WebCore/platform/GraphicsClient.h:
* Source/WebCore/platform/graphics/ImageBuffer.cpp:
(WebCore::SerializedImageBuffer::sinkIntoImageBuffer):
(WebCore::DefaultSerializedImageBuffer::DefaultSerializedImageBuffer):
(WebCore::ImageBuffer::sinkIntoSerializedImageBuffer):
(WebCore::ImageBuffer::takeBackend):
* Source/WebCore/platform/graphics/ImageBuffer.h:
(WebCore::ImageBuffer::backendInfo):
(WebCore::SerializedImageBuffer::isRemoteSerializedImageBufferProxy const):
(WebCore::SerializedImageBuffer::isSerializedRemoteImageBuffer const):
* Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.cpp:
(WebKit::RemoteDisplayListRecorderProxy::disconnect):
(WebKit::RemoteDisplayListRecorderProxy::connect):
* Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.h:
* Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.cpp:
(WebKit::RemoteImageBufferProxy::RemoteImageBufferProxy):
(WebKit::RemoteImageBufferProxy::sinkIntoSerializedImageBuffer):
(WebKit::RemoteSerializedImageBufferProxy::sinkIntoImageBuffer):
(WebKit::RemoteSerializedImageBufferProxy::~RemoteSerializedImageBufferProxy):
* Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h:
(WebKit::RemoteImageBufferProxy::create):
(WebKit::RemoteSerializedImageBufferProxy::renderingResourceIdentifier):
(WebKit::RemoteSerializedImageBufferProxy::renderingBackendIdentifier const):
(WebKit::RemoteSerializedImageBufferProxy::RemoteSerializedImageBufferProxy):
(isType):
* Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
(WebKit::RemoteRenderingBackendProxy::~RemoteRenderingBackendProxy):
(WebKit::RemoteRenderingBackendProxy::createRemoteImageBuffer):
(WebKit::RemoteRenderingBackendProxy::transferImageBuffer):
* Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp:
(WebKit::RemoteResourceCacheProxy::clear):
(WebKit::RemoteResourceCacheProxy::releaseImageBuffer):
(WebKit::RemoteResourceCacheProxy::forgetImageBuffer):
* Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h:
* Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::sinkIntoImageBuffer):
* Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h:
* Source/WebKit/WebProcess/WebCoreSupport/WebWorkerClient.cpp:
(WebKit::WebWorkerClient::sinkIntoImageBuffer):
* Source/WebKit/WebProcess/WebCoreSupport/WebWorkerClient.h:
Use ThreadSafeObjectHeap to transfer RemoteImageBuffers between WorkQueues
We're currently dispatching messages between WorkQueue, which has indeterminate
order WRT IPC messages.
Using ThreadSafeObjectHeap should let us store and retrieve the references
directly, without waiting in queues.
* Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp:
(WebKit::GPUConnectionToWebProcess::releaseRenderingResource):
* Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h:
(WebKit::GPUConnectionToWebProcess::RemoteImageBufferData::RemoteImageBufferData):
(WebKit::GPUConnectionToWebProcess::serializedImageHeap):
* Source/WebKit/GPUProcess/GPUConnectionToWebProcess.messages.in:
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp:
(WebKit::RemoteRenderingBackend::moveToSerializedBuffer):
(WebKit::RemoteRenderingBackend::moveToImageBuffer):
(WebKit::RemoteRenderingBackend::transferImageBuffer): Deleted.
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h:
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in:
* Source/WebKit/Scripts/webkit/messages.py:
(serialized_identifiers):
(types_that_cannot_be_forward_declared):
(headers_for_type):
* Source/WebKit/Scripts/webkit/tests/MessageArgumentDescriptions.cpp:
(IPC::serializedIdentifiers):
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.cpp:
(WebKit::RemoteImageBufferProxy::sinkIntoSerializedImageBuffer):
(WebKit::RemoteSerializedImageBufferProxy::RemoteSerializedImageBufferProxy):
(WebKit::RemoteSerializedImageBufferProxy::sinkIntoImageBuffer):
(WebKit::RemoteSerializedImageBufferProxy::~RemoteSerializedImageBufferProxy):
* Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h:
(WebKit::RemoteSerializedImageBufferProxy::renderingBackendIdentifier const):
Deleted.
(WebKit::RemoteSerializedImageBufferProxy::RemoteSerializedImageBufferProxy):
Deleted.
(WebKit::RemoteSerializedImageBufferProxy::sinkIntoImageBufferCompleted):
Deleted.
* Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
(WebKit::RemoteRenderingBackendProxy::moveToSerializedBuffer):
(WebKit::RemoteRenderingBackendProxy::moveToImageBuffer):
(WebKit::RemoteRenderingBackendProxy::transferImageBuffer): Deleted.
* Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
*
Source/WebKit/WebProcess/GPU/graphics/RemoteSerializedImageBufferIdentifier.h:
Added.
Use SerializedImageBuffer to pass ImageBuffers between workers and the main
thread.
* Source/WebCore/bindings/js/SerializedScriptValue.cpp:
(WebCore::CloneDeserializer::readTransferredImageBitmap):
(WebCore::CloneDeserializer::readOffscreenCanvas):
(WebCore::SerializedScriptValue::create):
* Source/WebCore/html/ImageBitmap.cpp:
(WebCore::ImageBitmap::detachBitmaps):
* Source/WebCore/html/ImageBitmapBacking.cpp:
(WebCore::ImageBitmapBacking::disconnect):
(WebCore::ImageBitmapBacking::connect):
* Source/WebCore/html/ImageBitmapBacking.h:
* Source/WebCore/html/OffscreenCanvas.cpp:
(WebCore::DetachedOffscreenCanvas::DetachedOffscreenCanvas):
(WebCore::DetachedOffscreenCanvas::takeImageBuffer):
(WebCore::OffscreenCanvas::create):
(WebCore::OffscreenCanvas::pushBufferToPlaceholder):
(WebCore::OffscreenCanvas::commitToPlaceholderCanvas):
(WebCore::OffscreenCanvas::takeImageBuffer const):
* Source/WebCore/html/OffscreenCanvas.h:
Canonical link: https://commits.webkit.org/257979@main
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes