Title: [285336] branches/safari-612-branch/Source/WebKit
Revision
285336
Author
[email protected]
Date
2021-11-04 22:14:22 -0700 (Thu, 04 Nov 2021)

Log Message

Cherry-pick r285335. rdar://problem/85045948

    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.

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@285335 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Diff

Modified: branches/safari-612-branch/Source/WebKit/ChangeLog (285335 => 285336)


--- branches/safari-612-branch/Source/WebKit/ChangeLog	2021-11-05 05:06:38 UTC (rev 285335)
+++ branches/safari-612-branch/Source/WebKit/ChangeLog	2021-11-05 05:14:22 UTC (rev 285336)
@@ -1,5 +1,70 @@
 2021-11-04  Russell Epstein  <[email protected]>
 
+        Cherry-pick r285335. rdar://problem/85045948
+
+    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.
+    
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@285335 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    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  Russell Epstein  <[email protected]>
+
         Cherry-pick r285239. rdar://problem/80991209
 
     Apply patch. rdar://problem/84982191

Modified: branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResource.cpp (285335 => 285336)


--- branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResource.cpp	2021-11-05 05:06:38 UTC (rev 285335)
+++ branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResource.cpp	2021-11-05 05:14:22 UTC (rev 285336)
@@ -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: branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResource.h (285335 => 285336)


--- branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResource.h	2021-11-05 05:06:38 UTC (rev 285335)
+++ branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResource.h	2021-11-05 05:14:22 UTC (rev 285336)
@@ -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: branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.cpp (285335 => 285336)


--- branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.cpp	2021-11-05 05:06:38 UTC (rev 285335)
+++ branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.cpp	2021-11-05 05:14:22 UTC (rev 285336)
@@ -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: branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.h (285335 => 285336)


--- branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.h	2021-11-05 05:06:38 UTC (rev 285335)
+++ branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.h	2021-11-05 05:14:22 UTC (rev 285336)
@@ -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: branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.messages.in (285335 => 285336)


--- branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.messages.in	2021-11-05 05:06:38 UTC (rev 285335)
+++ branches/safari-612-branch/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.messages.in	2021-11-05 05:14:22 UTC (rev 285336)
@@ -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: branches/safari-612-branch/Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp (285335 => 285336)


--- branches/safari-612-branch/Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp	2021-11-05 05:06:38 UTC (rev 285335)
+++ branches/safari-612-branch/Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp	2021-11-05 05:14:22 UTC (rev 285336)
@@ -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