Diff
Modified: trunk/Source/WebKit/ChangeLog (275920 => 275921)
--- trunk/Source/WebKit/ChangeLog 2021-04-14 00:24:50 UTC (rev 275920)
+++ trunk/Source/WebKit/ChangeLog 2021-04-14 00:37:03 UTC (rev 275921)
@@ -1,3 +1,41 @@
+2021-04-13 Chris Dumez <cdu...@apple.com>
+
+ Stop requiring a RemoteRenderingBackend for visibility propagation views
+ https://bugs.webkit.org/show_bug.cgi?id=224513
+
+ Reviewed by Geoff Garen.
+
+ Stop requiring a RemoteRenderingBackend for visibility propagation views. This is
+ inconvenient because doing media playback in the GPUProcess does not require a
+ RemoteRenderingBackend. This was also making things difficult to exit the
+ GPUProcess on memory pressure when unused.
+
+ * GPUProcess/GPUConnectionToWebProcess.cpp:
+ (WebKit::GPUConnectionToWebProcess::createVisibilityPropagationContextForPage):
+ (WebKit::GPUConnectionToWebProcess::destroyVisibilityPropagationContextForPage):
+ * GPUProcess/GPUConnectionToWebProcess.h:
+ * GPUProcess/GPUConnectionToWebProcess.messages.in:
+ * GPUProcess/graphics/RemoteRenderingBackend.cpp:
+ (WebKit::RemoteRenderingBackend::RemoteRenderingBackend):
+ * GPUProcess/graphics/RemoteRenderingBackend.h:
+ * GPUProcess/graphics/RemoteRenderingBackendCreationParameters.h:
+ (WebKit::RemoteRenderingBackendCreationParameters::encode const):
+ (WebKit::RemoteRenderingBackendCreationParameters::decode):
+ * WebProcess/GPU/GPUProcessConnection.cpp:
+ (WebKit::GPUProcessConnection::createVisibilityPropagationContextForPage):
+ (WebKit::GPUProcessConnection::destroyVisibilityPropagationContextForPage):
+ * WebProcess/GPU/GPUProcessConnection.h:
+ * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
+ (WebKit::RemoteRenderingBackendProxy::RemoteRenderingBackendProxy):
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::m_lastNavigationWasAppBound):
+ (WebKit::WebPage::gpuProcessConnectionDidBecomeAvailable):
+ (WebKit::WebPage::~WebPage):
+ (WebKit::WebPage::updatePreferences):
+ * WebProcess/WebPage/WebPage.h:
+ * WebProcess/WebProcess.cpp:
+ (WebKit::WebProcess::ensureGPUProcessConnection):
+
2021-04-13 Jer Noble <jer.no...@apple.com>
Unreviewed build fix after r275898; remove unnecessary files from the project.
Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp (275920 => 275921)
--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp 2021-04-14 00:24:50 UTC (rev 275920)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp 2021-04-14 00:37:03 UTC (rev 275921)
@@ -35,6 +35,7 @@
#include "GPUProcessConnectionParameters.h"
#include "GPUProcessMessages.h"
#include "GPUProcessProxyMessages.h"
+#include "LayerHostingContext.h"
#include "LibWebRTCCodecsProxy.h"
#include "LibWebRTCCodecsProxyMessages.h"
#include "Logging.h"
@@ -245,6 +246,25 @@
gpuProcess().removeGPUConnectionToWebProcess(*this); // May destroy |this|.
}
+#if HAVE(VISIBILITY_PROPAGATION_VIEW)
+void GPUConnectionToWebProcess::createVisibilityPropagationContextForPage(WebPageProxyIdentifier pageProxyID, WebCore::PageIdentifier pageID, bool canShowWhileLocked)
+{
+ auto contextForVisibilityPropagation = LayerHostingContext::createForExternalHostingProcess({ canShowWhileLocked });
+ RELEASE_LOG(Process, "GPUConnectionToWebProcess::createVisibilityPropagationContextForPage: pageProxyID=%" PRIu64 ", webPageID=%" PRIu64 ", contextID=%u", pageProxyID.toUInt64(), pageID.toUInt64(), contextForVisibilityPropagation->contextID());
+ gpuProcess().send(Messages::GPUProcessProxy::DidCreateContextForVisibilityPropagation(pageProxyID, pageID, contextForVisibilityPropagation->contextID()));
+ m_visibilityPropagationContexts.add(std::make_pair(pageProxyID, pageID), WTFMove(contextForVisibilityPropagation));
+}
+
+void GPUConnectionToWebProcess::destroyVisibilityPropagationContextForPage(WebPageProxyIdentifier pageProxyID, WebCore::PageIdentifier pageID)
+{
+ RELEASE_LOG(Process, "GPUConnectionToWebProcess::destroyVisibilityPropagationContextForPage: pageProxyID=%" PRIu64 ", webPageID=%" PRIu64, pageProxyID.toUInt64(), pageID.toUInt64());
+
+ auto key = std::make_pair(pageProxyID, pageID);
+ ASSERT(m_visibilityPropagationContexts.contains(key));
+ m_visibilityPropagationContexts.remove(key);
+}
+#endif
+
Logger& GPUConnectionToWebProcess::logger()
{
if (!m_logger) {
Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h (275920 => 275921)
--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h 2021-04-14 00:24:50 UTC (rev 275920)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h 2021-04-14 00:37:03 UTC (rev 275921)
@@ -55,6 +55,7 @@
namespace WebKit {
class GPUProcess;
+class LayerHostingContext;
class LibWebRTCCodecsProxy;
class RemoteAudioDestinationManager;
class RemoteAudioHardwareListenerProxy;
@@ -175,6 +176,11 @@
void enableVP9Decoders(bool shouldEnableVP8Decoder, bool shouldEnableVP9Decoder, bool shouldEnableVP9SWDecoder);
#endif
+#if HAVE(VISIBILITY_PROPAGATION_VIEW)
+ void createVisibilityPropagationContextForPage(WebPageProxyIdentifier, WebCore::PageIdentifier, bool canShowWhileLocked);
+ void destroyVisibilityPropagationContextForPage(WebPageProxyIdentifier, WebCore::PageIdentifier);
+#endif
+
#if USE(AUDIO_SESSION)
RemoteAudioSessionProxy& audioSessionProxy();
using EnsureAudioSessionCompletion = CompletionHandler<void(const RemoteAudioSessionConfiguration&)>;
@@ -265,6 +271,10 @@
std::unique_ptr<RemoteMediaEngineConfigurationFactoryProxy> m_mediaEngineConfigurationFactoryProxy;
+#if HAVE(VISIBILITY_PROPAGATION_VIEW)
+ HashMap<std::pair<WebPageProxyIdentifier, WebCore::PageIdentifier>, std::unique_ptr<LayerHostingContext>> m_visibilityPropagationContexts;
+#endif
+
using RemoteAudioHardwareListenerMap = HashMap<RemoteAudioHardwareListenerIdentifier, std::unique_ptr<RemoteAudioHardwareListenerProxy>>;
RemoteAudioHardwareListenerMap m_remoteAudioHardwareListenerMap;
Modified: trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.messages.in (275920 => 275921)
--- trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.messages.in 2021-04-14 00:24:50 UTC (rev 275920)
+++ trunk/Source/WebKit/GPUProcess/GPUConnectionToWebProcess.messages.in 2021-04-14 00:37:03 UTC (rev 275921)
@@ -40,6 +40,10 @@
#if ENABLE(VP9)
EnableVP9Decoders(bool shouldEnableVP8Decoder, bool shouldEnableVP9Decoder, bool shouldEnableVP9SWDecoder)
#endif
+#if HAVE(VISIBILITY_PROPAGATION_VIEW)
+ CreateVisibilityPropagationContextForPage(WebKit::WebPageProxyIdentifier pageProxyID, WebCore::PageIdentifier pageID, bool canShowWhileLocked);
+ DestroyVisibilityPropagationContextForPage(WebKit::WebPageProxyIdentifier pageProxyID, WebCore::PageIdentifier pageID);
+#endif
SetMediaOverridesForTesting(struct WebKit::MediaOverridesForTesting configuration)
CreateAudioHardwareListener(WebKit::RemoteAudioHardwareListenerIdentifier identifier)
ReleaseAudioHardwareListener(WebKit::RemoteAudioHardwareListenerIdentifier identifier)
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp (275920 => 275921)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp 2021-04-14 00:24:50 UTC (rev 275920)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp 2021-04-14 00:37:03 UTC (rev 275921)
@@ -30,7 +30,6 @@
#include "DisplayListReaderHandle.h"
#include "GPUConnectionToWebProcess.h"
-#include "LayerHostingContext.h"
#include "Logging.h"
#include "PlatformRemoteImageBuffer.h"
#include "RemoteMediaPlayerManagerProxy.h"
@@ -79,14 +78,6 @@
, m_resumeDisplayListSemaphore(WTFMove(creationParameters.resumeDisplayListSemaphore))
{
ASSERT(RunLoop::isMain());
-
-#if HAVE(VISIBILITY_PROPAGATION_VIEW)
- m_contextForVisibilityPropagation = LayerHostingContext::createForExternalHostingProcess({
- creationParameters.canShowWhileLocked
- });
- RELEASE_LOG(Process, "RemoteRenderingBackend: Created context with ID %u for visibility propagation from UIProcess", m_contextForVisibilityPropagation->contextID());
- m_gpuConnectionToWebProcess->gpuProcess().send(Messages::GPUProcessProxy::DidCreateContextForVisibilityPropagation(creationParameters.pageProxyID, creationParameters.pageID, m_contextForVisibilityPropagation->contextID()));
-#endif
}
void RemoteRenderingBackend::startListeningForIPC()
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h (275920 => 275921)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h 2021-04-14 00:24:50 UTC (rev 275920)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h 2021-04-14 00:37:03 UTC (rev 275921)
@@ -58,7 +58,6 @@
class DisplayListReaderHandle;
class GPUConnectionToWebProcess;
-class LayerHostingContext;
struct RemoteRenderingBackendCreationParameters;
class RemoteRenderingBackend
@@ -163,9 +162,6 @@
IPC::Semaphore m_getImageDataSemaphore;
RefPtr<SharedMemory> m_getImageDataSharedMemory;
ScopedRenderingResourcesRequest m_renderingResourcesRequest;
-#if HAVE(VISIBILITY_PROPAGATION_VIEW)
- std::unique_ptr<LayerHostingContext> m_contextForVisibilityPropagation;
-#endif
};
} // namespace WebKit
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackendCreationParameters.h (275920 => 275921)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackendCreationParameters.h 2021-04-14 00:24:50 UTC (rev 275920)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackendCreationParameters.h 2021-04-14 00:37:03 UTC (rev 275921)
@@ -39,16 +39,10 @@
IPC::Semaphore resumeDisplayListSemaphore;
WebPageProxyIdentifier pageProxyID;
WebCore::PageIdentifier pageID;
-#if PLATFORM(IOS_FAMILY)
- bool canShowWhileLocked { false };
-#endif
void encode(IPC::Encoder& encoder) const
{
encoder << identifier << resumeDisplayListSemaphore << pageProxyID << pageID;
-#if PLATFORM(IOS_FAMILY)
- encoder << canShowWhileLocked;
-#endif
}
static Optional<RemoteRenderingBackendCreationParameters> decode(IPC::Decoder& decoder)
@@ -73,19 +67,7 @@
if (!pageID)
return WTF::nullopt;
-#if PLATFORM(IOS_FAMILY)
- Optional<bool> canShowWhileLocked;
- decoder >> canShowWhileLocked;
- if (!canShowWhileLocked)
- return WTF::nullopt;
-#endif
-
- return {{
- *identifier, WTFMove(*resumeDisplayListSemaphore), *pageProxyID, *pageID
-#if PLATFORM(IOS_FAMILY)
- , *canShowWhileLocked
-#endif
- }};
+ return {{ *identifier, WTFMove(*resumeDisplayListSemaphore), *pageProxyID, *pageID }};
}
};
Modified: trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp (275920 => 275921)
--- trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp 2021-04-14 00:24:50 UTC (rev 275920)
+++ trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp 2021-04-14 00:37:03 UTC (rev 275921)
@@ -262,6 +262,18 @@
PlatformMediaSessionManager::sharedManager().processDidReceiveRemoteControlCommand(type, argument);
}
+#if HAVE(VISIBILITY_PROPAGATION_VIEW)
+void GPUProcessConnection::createVisibilityPropagationContextForPage(WebPage& page)
+{
+ connection().send(Messages::GPUConnectionToWebProcess::CreateVisibilityPropagationContextForPage(page.webPageProxyIdentifier(), page.identifier(), page.canShowWhileLocked()), { });
+}
+
+void GPUProcessConnection::destroyVisibilityPropagationContextForPage(WebPage& page)
+{
+ connection().send(Messages::GPUConnectionToWebProcess::DestroyVisibilityPropagationContextForPage(page.webPageProxyIdentifier(), page.identifier()), { });
+}
+#endif
+
#if ENABLE(VP9)
void GPUProcessConnection::enableVP9Decoders(bool enableVP8Decoder, bool enableVP9Decoder, bool enableVP9SWDecoder)
{
Modified: trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h (275920 => 275921)
--- trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h 2021-04-14 00:24:50 UTC (rev 275920)
+++ trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h 2021-04-14 00:37:03 UTC (rev 275921)
@@ -44,6 +44,7 @@
class RemoteMediaEngineConfigurationFactory;
class RemoteMediaPlayerManager;
class RemoteLegacyCDMFactory;
+class WebPage;
struct OverrideScreenDataForTesting;
struct WebPageCreationParameters;
@@ -92,6 +93,11 @@
bool isVPSWDecoderEnabled() const { return m_enableVP9SWDecoder; }
#endif
+#if HAVE(VISIBILITY_PROPAGATION_VIEW)
+ void createVisibilityPropagationContextForPage(WebPage&);
+ void destroyVisibilityPropagationContextForPage(WebPage&);
+#endif
+
class Client : public CanMakeWeakPtr<Client> {
public:
virtual ~Client() = default;
Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp (275920 => 275921)
--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp 2021-04-14 00:24:50 UTC (rev 275920)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp 2021-04-14 00:37:03 UTC (rev 275921)
@@ -52,10 +52,7 @@
RenderingBackendIdentifier::generate(),
IPC::Semaphore { },
webPage.webPageProxyIdentifier(),
- webPage.identifier(),
-#if PLATFORM(IOS_FAMILY)
- webPage.canShowWhileLocked()
-#endif
+ webPage.identifier()
}
{
connectToGPUProcess();
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (275920 => 275921)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2021-04-14 00:24:50 UTC (rev 275920)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2021-04-14 00:37:03 UTC (rev 275921)
@@ -849,7 +849,7 @@
});
RELEASE_LOG_IF_ALLOWED(Process, "WebPage: Created context with ID %u for visibility propagation from UIProcess", m_contextForVisibilityPropagation->contextID());
send(Messages::WebPageProxy::DidCreateContextInWebProcessForVisibilityPropagation(m_contextForVisibilityPropagation->contextID()));
-#endif
+#endif // HAVE(VISIBILITY_PROPAGATION_VIEW)
#if ENABLE(IPC_TESTING_API)
m_visitedLinkTableID = parameters.visitedLinkTableID;
@@ -868,6 +868,17 @@
updateThrottleState();
}
+#if ENABLE(GPU_PROCESS)
+void WebPage::gpuProcessConnectionDidBecomeAvailable(GPUProcessConnection& gpuProcessConnection)
+{
+#if HAVE(VISIBILITY_PROPAGATION_VIEW)
+ gpuProcessConnection.createVisibilityPropagationContextForPage(*this);
+#else
+ UNUSED_PARAM(gpuProcessConnection);
+#endif
+}
+#endif
+
void WebPage::requestMediaPlaybackState(CompletionHandler<void(WebKit::MediaPlaybackState)>&& completionHandler)
{
if (!m_page->mediaPlaybackExists())
@@ -996,6 +1007,11 @@
#ifndef NDEBUG
webPageCounter.decrement();
#endif
+
+#if ENABLE(GPU_PROCESS) && HAVE(VISIBILITY_PROPAGATION_VIEW)
+ if (auto* gpuProcessConnection = WebProcess::singleton().existingGPUProcessConnection())
+ gpuProcessConnection->destroyVisibilityPropagationContextForPage(*this);
+#endif // ENABLE(GPU_PROCESS)
#if ENABLE(VIDEO_PRESENTATION_MODE)
if (m_playbackSessionManager)
@@ -3930,15 +3946,8 @@
#if ENABLE(WEBGL)
WebProcess::singleton().setUseGPUProcessForWebGL(m_shouldRenderWebGLInGPUProcess);
#endif
+#endif // ENABLE(GPU_PROCESS)
- // FIXME: This will no longer be needed once we use the GPUProcess for DOM rendering.
- // For now, it is possible to use the GPUProcess for media playback only. Because media does not
- // use the RemoteRenderingBackend, we need to force the creation of a RemoteRenderingBackend in
- // the GPUProcess so that the page gets a visibility propagation view.
- if (m_shouldPlayMediaInGPUProcess && !usingGPUProcessForDOMRendering && WebProcess::singleton().existingGPUProcessConnection())
- ensureRemoteRenderingBackendProxy();
-#endif
-
#if ENABLE(IPC_TESTING_API)
m_ipcTestingAPIEnabled = store.getBoolValueForKey(WebPreferencesKey::ipcTestingAPIEnabledKey());
#endif
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (275920 => 275921)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2021-04-14 00:24:50 UTC (rev 275920)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2021-04-14 00:37:03 UTC (rev 275921)
@@ -252,6 +252,7 @@
class DrawingArea;
class FindController;
+class GPUProcessConnection;
class GamepadData;
class GeolocationPermissionRequestManager;
class LayerHostingContext;
@@ -1403,6 +1404,7 @@
void synchronizeCORSDisablingPatternsWithNetworkProcess();
#if ENABLE(GPU_PROCESS)
+ void gpuProcessConnectionDidBecomeAvailable(GPUProcessConnection&);
RemoteRenderingBackendProxy& ensureRemoteRenderingBackendProxy();
#endif
Modified: trunk/Source/WebKit/WebProcess/WebProcess.cpp (275920 => 275921)
--- trunk/Source/WebKit/WebProcess/WebProcess.cpp 2021-04-14 00:24:50 UTC (rev 275920)
+++ trunk/Source/WebKit/WebProcess/WebProcess.cpp 2021-04-14 00:37:03 UTC (rev 275921)
@@ -757,6 +757,11 @@
ASSERT(!result.iterator->value);
result.iterator->value = WebPage::create(pageID, WTFMove(parameters));
+#if ENABLE(GPU_PROCESS)
+ if (m_gpuProcessConnection)
+ result.iterator->value->gpuProcessConnectionDidBecomeAvailable(*m_gpuProcessConnection);
+#endif
+
// Balanced by an enableTermination in removeWebPage.
disableTermination();
updateCPULimit();
@@ -1210,16 +1215,8 @@
m_gpuProcessConnection->setAuditToken(WTFMove(connectionInfo.auditToken));
#endif
- // FIXME: This will no longer be needed once we use the GPUProcess for DOM rendering.
- // For now, it is possible to use the GPUProcess for media playback only. Because media does not
- // use the RemoteRenderingBackend, we need to force the creation of a RemoteRenderingBackend in
- // the GPUProcess so that the page gets a visibility propagation view.
- RunLoop::main().dispatch([this] {
- if (m_useGPUProcessForMedia && !m_useGPUProcessForDOMRendering) {
- for (auto& page : m_pageMap.values())
- page->ensureRemoteRenderingBackendProxy();
- }
- });
+ for (auto& page : m_pageMap.values())
+ page->gpuProcessConnectionDidBecomeAvailable(*m_gpuProcessConnection);
}
return *m_gpuProcessConnection;