Title: [285335] trunk/Source/WebKit
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)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to