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;