Title: [280731] trunk/Source
Revision
280731
Author
[email protected]
Date
2021-08-06 12:04:17 -0700 (Fri, 06 Aug 2021)

Log Message

WebKit::SampleBufferDisplayLayer needs to handle GPUProcess crash
https://bugs.webkit.org/show_bug.cgi?id=228824
<rdar://problem/81564477>

Reviewed by Eric Carlson.

Source/WebCore:

Manually tested.

* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::sampleBufferDisplayLayerStatusDidChange):
Recreate a new layer if the previous one failed.

Source/WebKit:

Make WebKit::SampleBufferDisplayLayer listen to GPUProcess connection being closed.
When that happens, notify its client that it failed.

* WebProcess/GPU/GPUProcessConnection.cpp:
* WebProcess/GPU/GPUProcessConnection.h:
* WebProcess/GPU/media/RemoteMediaPlayerManager.cpp:
* WebProcess/GPU/webrtc/SampleBufferDisplayLayer.cpp:
(WebKit::SampleBufferDisplayLayer::create):
(WebKit::SampleBufferDisplayLayer::SampleBufferDisplayLayer):
(WebKit::SampleBufferDisplayLayer::~SampleBufferDisplayLayer):
(WebKit::SampleBufferDisplayLayer::setDidFail):
(WebKit::SampleBufferDisplayLayer::gpuProcessConnectionDidClose):
* WebProcess/GPU/webrtc/SampleBufferDisplayLayer.h:
* WebProcess/GPU/webrtc/SampleBufferDisplayLayerManager.cpp:
(WebKit::SampleBufferDisplayLayerManager::createLayer):
* WebProcess/GPU/webrtc/SampleBufferDisplayLayerManager.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (280730 => 280731)


--- trunk/Source/WebCore/ChangeLog	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebCore/ChangeLog	2021-08-06 19:04:17 UTC (rev 280731)
@@ -1,3 +1,17 @@
+2021-08-06  Youenn Fablet  <[email protected]>
+
+        WebKit::SampleBufferDisplayLayer needs to handle GPUProcess crash
+        https://bugs.webkit.org/show_bug.cgi?id=228824
+        <rdar://problem/81564477>
+
+        Reviewed by Eric Carlson.
+
+        Manually tested.
+
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::sampleBufferDisplayLayerStatusDidChange):
+        Recreate a new layer if the previous one failed.
+
 2021-08-06  Andres Gonzalez  <[email protected]>
 
         Crash at WebKit::WebPage::requestTextRecognition caused by accessibility invocation.

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/SampleBufferDisplayLayer.h (280730 => 280731)


--- trunk/Source/WebCore/platform/graphics/avfoundation/SampleBufferDisplayLayer.h	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/SampleBufferDisplayLayer.h	2021-08-06 19:04:17 UTC (rev 280731)
@@ -43,7 +43,7 @@
     class Client : public CanMakeWeakPtr<Client> {
     public:
         virtual ~Client() = default;
-        virtual void sampleBufferDisplayLayerStatusDidChange(SampleBufferDisplayLayer&) = 0;
+        virtual void sampleBufferDisplayLayerStatusDidFail() = 0;
     };
 
     WEBCORE_EXPORT static std::unique_ptr<SampleBufferDisplayLayer> create(Client&);

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm (280730 => 280731)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm	2021-08-06 19:04:17 UTC (rev 280731)
@@ -207,11 +207,8 @@
 void LocalSampleBufferDisplayLayer::layerStatusDidChange()
 {
     ASSERT(isMainThread());
-    if (m_sampleBufferDisplayLayer.get().status != AVQueuedSampleBufferRenderingStatusRendering)
-        return;
-    if (!m_client)
-        return;
-    m_client->sampleBufferDisplayLayerStatusDidChange(*this);
+    if (m_client && m_sampleBufferDisplayLayer.get().status == AVQueuedSampleBufferRenderingStatusFailed)
+        m_client->sampleBufferDisplayLayerStatusDidFail();
 }
 
 void LocalSampleBufferDisplayLayer::layerErrorDidChange()

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h (280730 => 280731)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h	2021-08-06 19:04:17 UTC (rev 280731)
@@ -263,7 +263,7 @@
     std::unique_ptr<VideoLayerManagerObjC> m_videoLayerManager;
 
     // SampleBufferDisplayLayer::Client
-    void sampleBufferDisplayLayerStatusDidChange(SampleBufferDisplayLayer&) final;
+    void sampleBufferDisplayLayerStatusDidFail() final;
 
     RetainPtr<WebRootSampleBufferBoundsChangeListener> m_boundsChangeListener;
 

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (280730 => 280731)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm	2021-08-06 19:04:17 UTC (rev 280731)
@@ -336,8 +336,10 @@
     return nullptr;
 }
 
-void MediaPlayerPrivateMediaStreamAVFObjC::sampleBufferDisplayLayerStatusDidChange(SampleBufferDisplayLayer&)
+void MediaPlayerPrivateMediaStreamAVFObjC::sampleBufferDisplayLayerStatusDidFail()
 {
+    destroyLayers();
+    updateLayersAsNeeded();
 }
 
 void MediaPlayerPrivateMediaStreamAVFObjC::applicationDidBecomeActive()

Modified: trunk/Source/WebKit/ChangeLog (280730 => 280731)


--- trunk/Source/WebKit/ChangeLog	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebKit/ChangeLog	2021-08-06 19:04:17 UTC (rev 280731)
@@ -1,3 +1,28 @@
+2021-08-06  Youenn Fablet  <[email protected]>
+
+        WebKit::SampleBufferDisplayLayer needs to handle GPUProcess crash
+        https://bugs.webkit.org/show_bug.cgi?id=228824
+        <rdar://problem/81564477>
+
+        Reviewed by Eric Carlson.
+
+        Make WebKit::SampleBufferDisplayLayer listen to GPUProcess connection being closed.
+        When that happens, notify its client that it failed.
+
+        * WebProcess/GPU/GPUProcessConnection.cpp:
+        * WebProcess/GPU/GPUProcessConnection.h:
+        * WebProcess/GPU/media/RemoteMediaPlayerManager.cpp:
+        * WebProcess/GPU/webrtc/SampleBufferDisplayLayer.cpp:
+        (WebKit::SampleBufferDisplayLayer::create):
+        (WebKit::SampleBufferDisplayLayer::SampleBufferDisplayLayer):
+        (WebKit::SampleBufferDisplayLayer::~SampleBufferDisplayLayer):
+        (WebKit::SampleBufferDisplayLayer::setDidFail):
+        (WebKit::SampleBufferDisplayLayer::gpuProcessConnectionDidClose):
+        * WebProcess/GPU/webrtc/SampleBufferDisplayLayer.h:
+        * WebProcess/GPU/webrtc/SampleBufferDisplayLayerManager.cpp:
+        (WebKit::SampleBufferDisplayLayerManager::createLayer):
+        * WebProcess/GPU/webrtc/SampleBufferDisplayLayerManager.h:
+
 2021-08-06  Peng Liu  <[email protected]>
 
         [macOS] Clean up Feature Flags related code

Modified: trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.cpp (280730 => 280731)


--- trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.cpp	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.cpp	2021-08-06 19:04:17 UTC (rev 280731)
@@ -142,7 +142,7 @@
     return m_connection.ptr();
 }
 
-void RemoteSampleBufferDisplayLayer::sampleBufferDisplayLayerStatusDidChange(WebCore::SampleBufferDisplayLayer&)
+void RemoteSampleBufferDisplayLayer::sampleBufferDisplayLayerStatusDidFail()
 {
     send(Messages::SampleBufferDisplayLayer::SetDidFail { m_sampleBufferDisplayLayer->didFail() });
 }

Modified: trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.h (280730 => 280731)


--- trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.h	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.h	2021-08-06 19:04:17 UTC (rev 280731)
@@ -80,7 +80,7 @@
     uint64_t messageSenderDestinationID() const final { return m_identifier.toUInt64(); }
 
     // WebCore::SampleBufferDisplayLayer::Client
-    void sampleBufferDisplayLayerStatusDidChange(WebCore::SampleBufferDisplayLayer&) final;
+    void sampleBufferDisplayLayerStatusDidFail() final;
 
     SampleBufferDisplayLayerIdentifier m_identifier;
     Ref<IPC::Connection> m_connection;

Modified: trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp (280730 => 280731)


--- trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp	2021-08-06 19:04:17 UTC (rev 280731)
@@ -43,6 +43,7 @@
 #include "RemoteMediaEngineConfigurationFactory.h"
 #include "RemoteMediaPlayerManager.h"
 #include "RemoteRemoteCommandListenerMessages.h"
+#include "SampleBufferDisplayLayerManager.h"
 #include "SampleBufferDisplayLayerMessages.h"
 #include "SourceBufferPrivateRemoteMessages.h"
 #include "WebCoreArgumentCoders.h"

Modified: trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h (280730 => 280731)


--- trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h	2021-08-06 19:04:17 UTC (rev 280731)
@@ -31,7 +31,6 @@
 #include "Connection.h"
 #include "MediaOverridesForTesting.h"
 #include "MessageReceiverMap.h"
-#include "SampleBufferDisplayLayerManager.h"
 #include "SharedMemory.h"
 #include <WebCore/AudioSession.h>
 #include <WebCore/PlatformMediaSession.h>
@@ -52,6 +51,7 @@
 
 class RemoteAudioSourceProviderManager;
 class RemoteMediaPlayerManager;
+class SampleBufferDisplayLayerManager;
 class WebPage;
 struct OverrideScreenDataForTesting;
 struct WebPageCreationParameters;

Modified: trunk/Source/WebKit/WebProcess/GPU/media/RemoteMediaPlayerManager.cpp (280730 => 280731)


--- trunk/Source/WebKit/WebProcess/GPU/media/RemoteMediaPlayerManager.cpp	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebKit/WebProcess/GPU/media/RemoteMediaPlayerManager.cpp	2021-08-06 19:04:17 UTC (rev 280731)
@@ -33,6 +33,7 @@
 #include "RemoteMediaPlayerMIMETypeCache.h"
 #include "RemoteMediaPlayerManagerProxyMessages.h"
 #include "RemoteMediaPlayerProxyConfiguration.h"
+#include "SampleBufferDisplayLayerManager.h"
 #include "WebProcess.h"
 #include "WebProcessCreationParameters.h"
 #include <WebCore/MediaPlayer.h>

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayer.cpp (280730 => 280731)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayer.cpp	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayer.cpp	2021-08-06 19:04:17 UTC (rev 280731)
@@ -42,12 +42,12 @@
 namespace WebKit {
 using namespace WebCore;
 
-std::unique_ptr<SampleBufferDisplayLayer> SampleBufferDisplayLayer::create(SampleBufferDisplayLayerManager& manager, Client& client)
+std::unique_ptr<SampleBufferDisplayLayer> SampleBufferDisplayLayer::create(SampleBufferDisplayLayerManager& manager, WebCore::SampleBufferDisplayLayer::Client& client)
 {
     return std::unique_ptr<SampleBufferDisplayLayer>(new SampleBufferDisplayLayer(manager, client));
 }
 
-SampleBufferDisplayLayer::SampleBufferDisplayLayer(SampleBufferDisplayLayerManager& manager, Client& client)
+SampleBufferDisplayLayer::SampleBufferDisplayLayer(SampleBufferDisplayLayerManager& manager, WebCore::SampleBufferDisplayLayer::Client& client)
     : WebCore::SampleBufferDisplayLayer(client)
     , m_manager(makeWeakPtr(manager))
     , m_connection(WebProcess::singleton().ensureGPUProcessConnection().connection())
@@ -54,6 +54,7 @@
     , m_identifier(SampleBufferDisplayLayerIdentifier::generate())
 {
     manager.addLayer(*this);
+    WebProcess::singleton().ensureGPUProcessConnection().addClient(*this);
 }
 
 void SampleBufferDisplayLayer::initialize(bool hideRootLayer, IntSize size, CompletionHandler<void(bool)>&& callback)
@@ -77,6 +78,7 @@
 
 SampleBufferDisplayLayer::~SampleBufferDisplayLayer()
 {
+    WebProcess::singleton().ensureGPUProcessConnection().removeClient(*this);
     m_connection->send(Messages::RemoteSampleBufferDisplayLayerManager::ReleaseLayer { m_identifier }, 0);
     if (m_manager)
         m_manager->removeLayer(*this);
@@ -147,6 +149,13 @@
     m_didFail = value;
 }
 
+void SampleBufferDisplayLayer::gpuProcessConnectionDidClose(GPUProcessConnection&)
+{
+    m_didFail = true;
+    if (m_client)
+        m_client->sampleBufferDisplayLayerStatusDidFail();
 }
 
+}
+
 #endif

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayer.h (280730 => 280731)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayer.h	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayer.h	2021-08-06 19:04:17 UTC (rev 280731)
@@ -27,6 +27,7 @@
 
 #if PLATFORM(COCOA) && ENABLE(GPU_PROCESS) && ENABLE(MEDIA_STREAM)
 
+#include "GPUProcessConnection.h"
 #include "MessageReceiver.h"
 #include "SampleBufferDisplayLayerIdentifier.h"
 #include <WebCore/SampleBufferDisplayLayer.h>
@@ -36,9 +37,9 @@
 
 class SampleBufferDisplayLayerManager;
 
-class SampleBufferDisplayLayer final : public WebCore::SampleBufferDisplayLayer, public IPC::MessageReceiver {
+class SampleBufferDisplayLayer final : public WebCore::SampleBufferDisplayLayer, public IPC::MessageReceiver, public GPUProcessConnection::Client {
 public:
-    static std::unique_ptr<SampleBufferDisplayLayer> create(SampleBufferDisplayLayerManager&, Client&);
+    static std::unique_ptr<SampleBufferDisplayLayer> create(SampleBufferDisplayLayerManager&, WebCore::SampleBufferDisplayLayer::Client&);
     ~SampleBufferDisplayLayer();
 
     SampleBufferDisplayLayerIdentifier identifier() const { return m_identifier; }
@@ -45,8 +46,11 @@
 
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
 
+    using GPUProcessConnection::Client::weakPtrFactory;
+    using WeakValueType = GPUProcessConnection::Client::WeakValueType;
+
 private:
-    SampleBufferDisplayLayer(SampleBufferDisplayLayerManager&, Client&);
+    SampleBufferDisplayLayer(SampleBufferDisplayLayerManager&, WebCore::SampleBufferDisplayLayer::Client&);
 
     // WebCore::SampleBufferDisplayLayer
     void initialize(bool hideRootLayer, WebCore::IntSize, CompletionHandler<void(bool)>&&) final;
@@ -65,6 +69,9 @@
     void clearEnqueuedSamples() final;
     PlatformLayer* rootLayer() final;
 
+    // GPUProcessConnection::Client
+    void gpuProcessConnectionDidClose(GPUProcessConnection&) final;
+
     void setDidFail(bool);
 
     WeakPtr<SampleBufferDisplayLayerManager> m_manager;

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayerManager.cpp (280730 => 280731)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayerManager.cpp	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayerManager.cpp	2021-08-06 19:04:17 UTC (rev 280731)
@@ -40,7 +40,7 @@
         layer->didReceiveMessage(connection, decoder);
 }
 
-std::unique_ptr<WebCore::SampleBufferDisplayLayer> SampleBufferDisplayLayerManager::createLayer(SampleBufferDisplayLayer::Client& client)
+std::unique_ptr<WebCore::SampleBufferDisplayLayer> SampleBufferDisplayLayerManager::createLayer(WebCore::SampleBufferDisplayLayer::Client& client)
 {
     auto layer = SampleBufferDisplayLayer::create(*this, client);
     if (!layer)

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayerManager.h (280730 => 280731)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayerManager.h	2021-08-06 19:02:32 UTC (rev 280730)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayerManager.h	2021-08-06 19:04:17 UTC (rev 280731)
@@ -42,7 +42,7 @@
     void removeLayer(SampleBufferDisplayLayer&);
 
     void didReceiveLayerMessage(IPC::Connection&, IPC::Decoder&);
-    std::unique_ptr<WebCore::SampleBufferDisplayLayer> createLayer(SampleBufferDisplayLayer::Client&);
+    std::unique_ptr<WebCore::SampleBufferDisplayLayer> createLayer(WebCore::SampleBufferDisplayLayer::Client&);
 
 private:
     HashMap<SampleBufferDisplayLayerIdentifier, WeakPtr<SampleBufferDisplayLayer>> m_layers;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to