- Revision
- 285335
- Author
- [email protected]
- Date
- 2021-11-04 22:06:38 -0700 (Thu, 04 Nov 2021)
Log Message
Have RemoteMediaResource use SharedMemory
https://bugs.webkit.org/show_bug.cgi?id=232744
rdar://85045948
Reviewed by Alex Christensen.
When playing a non-mse media element, the loading gets initiated in the
GPU Process and proxied to the WebContent process via a RemoteMediaResource.
By using a SharedBuffer in the RemoteMediaResource wrapping a SharedMemory
we can allocate the buffer in the content process and pass it to the GPU
process without copy nor new allocations.
Playing a 694MB mp4, the GPU memory usage goes from 868MB to 14MB on an
iPhone running iOS 15.
This is a follow-up on bug 232422, what landed was missing this part.
* GPUProcess/media/RemoteMediaResource.cpp:
(WebKit::RemoteMediaResource::dataReceived):
* GPUProcess/media/RemoteMediaResource.h:
* GPUProcess/media/RemoteMediaResourceManager.cpp:
(WebKit::RemoteMediaResourceManager::dataReceived): Wrap SharedMemory into
a SharedBuffer.
* GPUProcess/media/RemoteMediaResourceManager.h:
* GPUProcess/media/RemoteMediaResourceManager.messages.in: Change data type
from an IPCDataReference to a ShareMemory's handle.
* WebProcess/GPU/media/RemoteMediaResourceProxy.cpp:
(WebKit::RemoteMediaResourceProxy::dataReceived): Allocate a SharedMemory
and copy the download data into it, before sending it to the GPU process.
Modified Paths
Diff
Modified: trunk/Source/WebKit/ChangeLog (285334 => 285335)
--- trunk/Source/WebKit/ChangeLog 2021-11-05 04:52:41 UTC (rev 285334)
+++ trunk/Source/WebKit/ChangeLog 2021-11-05 05:06:38 UTC (rev 285335)
@@ -1,3 +1,33 @@
+2021-11-04 Jean-Yves Avenard <[email protected]>
+
+ Have RemoteMediaResource use SharedMemory
+ https://bugs.webkit.org/show_bug.cgi?id=232744
+ rdar://85045948
+
+ Reviewed by Alex Christensen.
+
+ When playing a non-mse media element, the loading gets initiated in the
+ GPU Process and proxied to the WebContent process via a RemoteMediaResource.
+ By using a SharedBuffer in the RemoteMediaResource wrapping a SharedMemory
+ we can allocate the buffer in the content process and pass it to the GPU
+ process without copy nor new allocations.
+ Playing a 694MB mp4, the GPU memory usage goes from 868MB to 14MB on an
+ iPhone running iOS 15.
+ This is a follow-up on bug 232422, what landed was missing this part.
+
+ * GPUProcess/media/RemoteMediaResource.cpp:
+ (WebKit::RemoteMediaResource::dataReceived):
+ * GPUProcess/media/RemoteMediaResource.h:
+ * GPUProcess/media/RemoteMediaResourceManager.cpp:
+ (WebKit::RemoteMediaResourceManager::dataReceived): Wrap SharedMemory into
+ a SharedBuffer.
+ * GPUProcess/media/RemoteMediaResourceManager.h:
+ * GPUProcess/media/RemoteMediaResourceManager.messages.in: Change data type
+ from an IPCDataReference to a ShareMemory's handle.
+ * WebProcess/GPU/media/RemoteMediaResourceProxy.cpp:
+ (WebKit::RemoteMediaResourceProxy::dataReceived): Allocate a SharedMemory
+ and copy the download data into it, before sending it to the GPU process.
+
2021-11-04 Dean Jackson <[email protected]>
REGRESSION: AR Quicklook asset is shared instead of page URL
Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaResource.cpp (285334 => 285335)
--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaResource.cpp 2021-11-05 04:52:41 UTC (rev 285334)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaResource.cpp 2021-11-05 05:06:38 UTC (rev 285335)
@@ -96,10 +96,10 @@
m_client->dataSent(*this, bytesSent, totalBytesToBeSent);
}
-void RemoteMediaResource::dataReceived(const uint8_t* data, int64_t length)
+void RemoteMediaResource::dataReceived(Ref<SharedBuffer>&& data)
{
if (m_client)
- m_client->dataReceived(*this, data, length);
+ m_client->dataReceived(*this, WTFMove(data));
}
void RemoteMediaResource::accessControlCheckFailed(const ResourceError& error)
Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaResource.h (285334 => 285335)
--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaResource.h 2021-11-05 04:52:41 UTC (rev 285334)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaResource.h 2021-11-05 05:06:38 UTC (rev 285335)
@@ -29,10 +29,12 @@
#include "RemoteMediaResourceIdentifier.h"
#include <WebCore/PlatformMediaResourceLoader.h>
+#include <wtf/Ref.h>
#include <wtf/WeakPtr.h>
namespace WebCore {
class NetworkLoadMetrics;
+class SharedBuffer;
}
namespace WebKit {
@@ -55,7 +57,7 @@
void responseReceived(const WebCore::ResourceResponse&, bool, CompletionHandler<void(WebCore::ShouldContinuePolicyCheck)>&&);
void redirectReceived(WebCore::ResourceRequest&&, const WebCore::ResourceResponse&, CompletionHandler<void(WebCore::ResourceRequest&&)>&&);
void dataSent(uint64_t, uint64_t);
- void dataReceived(const uint8_t*, int64_t);
+ void dataReceived(Ref<WebCore::SharedBuffer>&&);
void accessControlCheckFailed(const WebCore::ResourceError&);
void loadFailed(const WebCore::ResourceError&);
void loadFinished(const WebCore::NetworkLoadMetrics&);
Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.cpp (285334 => 285335)
--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.cpp 2021-11-05 04:52:41 UTC (rev 285334)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.cpp 2021-11-05 05:06:38 UTC (rev 285335)
@@ -89,13 +89,16 @@
resource->dataSent(bytesSent, totalBytesToBeSent);
}
-void RemoteMediaResourceManager::dataReceived(RemoteMediaResourceIdentifier identifier, const IPC::DataReference& data)
+void RemoteMediaResourceManager::dataReceived(RemoteMediaResourceIdentifier identifier, const SharedMemory::IPCHandle& bufferHandle)
{
auto* resource = m_remoteMediaResources.get(identifier);
if (!resource || !resource->ready())
return;
- resource->dataReceived(data.data(), data.size());
+ auto sharedMemory = SharedMemory::map(bufferHandle.handle, SharedMemory::Protection::ReadOnly);
+ if (!sharedMemory)
+ return;
+ resource->dataReceived(sharedMemory->createSharedBuffer(bufferHandle.dataSize));
}
void RemoteMediaResourceManager::accessControlCheckFailed(RemoteMediaResourceIdentifier identifier, const ResourceError& error)
Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.h (285334 => 285335)
--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.h 2021-11-05 04:52:41 UTC (rev 285334)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.h 2021-11-05 05:06:38 UTC (rev 285335)
@@ -30,6 +30,7 @@
#include "DataReference.h"
#include "MessageReceiver.h"
#include "RemoteMediaResourceIdentifier.h"
+#include "SharedMemory.h"
#include <WebCore/PolicyChecker.h>
#include <wtf/HashMap.h>
#include <wtf/WeakPtr.h>
@@ -65,7 +66,7 @@
void responseReceived(RemoteMediaResourceIdentifier, const WebCore::ResourceResponse&, bool, CompletionHandler<void(WebCore::ShouldContinuePolicyCheck)>&&);
void redirectReceived(RemoteMediaResourceIdentifier, WebCore::ResourceRequest&&, const WebCore::ResourceResponse&, CompletionHandler<void(WebCore::ResourceRequest&&)>&&);
void dataSent(RemoteMediaResourceIdentifier, uint64_t, uint64_t);
- void dataReceived(RemoteMediaResourceIdentifier, const IPC::DataReference&);
+ void dataReceived(RemoteMediaResourceIdentifier, const SharedMemory::IPCHandle& bufferHandle);
void accessControlCheckFailed(RemoteMediaResourceIdentifier, const WebCore::ResourceError&);
void loadFailed(RemoteMediaResourceIdentifier, const WebCore::ResourceError&);
void loadFinished(RemoteMediaResourceIdentifier, const WebCore::NetworkLoadMetrics&);
Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.messages.in (285334 => 285335)
--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.messages.in 2021-11-05 04:52:41 UTC (rev 285334)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.messages.in 2021-11-05 05:06:38 UTC (rev 285335)
@@ -29,7 +29,7 @@
ResponseReceived(WebKit::RemoteMediaResourceIdentifier identifier, WebCore::ResourceResponse response, bool didPassAccessControlCheck) -> (enum:bool WebCore::ShouldContinuePolicyCheck shouldContinue) Async
RedirectReceived(WebKit::RemoteMediaResourceIdentifier identifier, WebCore::ResourceRequest request, WebCore::ResourceResponse response) -> (WebCore::ResourceRequest returnRequest) Async
DataSent(WebKit::RemoteMediaResourceIdentifier identifier, uint64_t bytesSent, uint64_t totalBytesToBeSent)
- DataReceived(WebKit::RemoteMediaResourceIdentifier identifier, IPC::DataReference data)
+ DataReceived(WebKit::RemoteMediaResourceIdentifier identifier, WebKit::SharedMemory::IPCHandle data)
AccessControlCheckFailed(WebKit::RemoteMediaResourceIdentifier identifier, WebCore::ResourceError error)
LoadFailed(WebKit::RemoteMediaResourceIdentifier identifier, WebCore::ResourceError error)
LoadFinished(WebKit::RemoteMediaResourceIdentifier identifier, WebCore::NetworkLoadMetrics metrics)
Modified: trunk/Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp (285334 => 285335)
--- trunk/Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp 2021-11-05 04:52:41 UTC (rev 285334)
+++ trunk/Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp 2021-11-05 05:06:38 UTC (rev 285335)
@@ -30,6 +30,7 @@
#include "DataReference.h"
#include "RemoteMediaResourceManagerMessages.h"
+#include "SharedMemory.h"
#include "WebCoreArgumentCoders.h"
#include <wtf/CompletionHandler.h>
@@ -73,7 +74,18 @@
void RemoteMediaResourceProxy::dataReceived(WebCore::PlatformMediaResource&, const uint8_t* data, int length)
{
- m_connection->send(Messages::RemoteMediaResourceManager::DataReceived(m_id, IPC::DataReference(data, length)), 0);
+ auto sharedMemory = SharedMemory::allocate(length);
+ if (!sharedMemory)
+ return;
+
+ auto sharedMemoryPtr = static_cast<char*>(sharedMemory->data());
+ memcpy(sharedMemoryPtr, data, length);
+
+ SharedMemory::Handle handle;
+ sharedMemory->createHandle(handle, SharedMemory::Protection::ReadOnly);
+ // Take ownership of shared memory and mark it as media-related memory.
+ handle.takeOwnershipOfMemory(MemoryLedger::Media);
+ m_connection->send(Messages::RemoteMediaResourceManager::DataReceived(m_id, SharedMemory::IPCHandle { WTFMove(handle), static_cast<uint64_t>(length) }), 0);
}
void RemoteMediaResourceProxy::accessControlCheckFailed(WebCore::PlatformMediaResource&, const WebCore::ResourceError& error)