Title: [293015] trunk/Source/WebKit
Revision
293015
Author
[email protected]
Date
2022-04-19 05:32:02 -0700 (Tue, 19 Apr 2022)

Log Message

[GTK][WPE][GPUProcess] Add RemoteGraphicsContextGLGBM, RemoteGraphicsContextGLProxyGBM
https://bugs.webkit.org/show_bug.cgi?id=239348

Reviewed by Carlos Garcia Campos.

Provide RemoteGraphicsContextGL and RemoteGraphicsContextGLProxy
implementations guarded by and based on USE(LIBGBM) functionality,
usable by the GTK and WPE ports when jointly enabled with ANGLE
backing of WebGL execution.

RemoteGraphicsContextGLGBM is the GPUProcess-side GL executor.
Internally it spawns a GraphicsContextGLGBM instance, and once invoked,
the PrepareForDisplay() IPC message returns the reply with the DMABuf
object that was used as the rendering backing in that context instance.

RemoteGraphicsContextGLProxyGBM is the WebProcess-side counterpart.
Besides relaying the prepare-for-display request, it also manages the
GraphicsLayerContentsDisplayDelegate object which handles presenting
DMABuf objects arriving from the GPUProcess. That delegate is of the
NicosiaDisplayDelegate type, a slim class also handling a
Nicosia::ContentLayer object through which any arriving DMABuf is
presented in the TextureMapper tree.

* GPUProcess/graphics/RemoteGraphicsContextGL.cpp:
* GPUProcess/graphics/RemoteGraphicsContextGL.h:
* GPUProcess/graphics/RemoteGraphicsContextGL.messages.in:
* GPUProcess/graphics/RemoteGraphicsContextGLGBM.cpp: Added.
(WebKit::RemoteGraphicsContextGLGBM::RemoteGraphicsContextGLGBM):
(WebKit::RemoteGraphicsContextGLGBM::platformWorkQueueInitialize):
(WebKit::RemoteGraphicsContextGLGBM::prepareForDisplay):
(WebKit::RemoteGraphicsContextGL::create):
* SourcesGTK.txt:
* SourcesWPE.txt:
* WebProcess/GPU/graphics/gbm/RemoteGraphicsContextGLProxyGBM.cpp: Added.
(WebKit::NicosiaDisplayDelegate::NicosiaDisplayDelegate):
(WebKit::NicosiaDisplayDelegate::~NicosiaDisplayDelegate):
(WebKit::NicosiaDisplayDelegate::platformLayer const):
(WebKit::NicosiaDisplayDelegate::swapBuffersIfNeeded):
(WebKit::RemoteGraphicsContextGLProxyGBM::RemoteGraphicsContextGLProxyGBM):
(WebKit::RemoteGraphicsContextGLProxyGBM::layerContentsDisplayDelegate):
(WebKit::RemoteGraphicsContextGLProxyGBM::prepareForDisplay):
(WebKit::RemoteGraphicsContextGLProxy::create):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (293014 => 293015)


--- trunk/Source/WebKit/ChangeLog	2022-04-19 11:42:49 UTC (rev 293014)
+++ trunk/Source/WebKit/ChangeLog	2022-04-19 12:32:02 UTC (rev 293015)
@@ -1,3 +1,48 @@
+2022-04-19  Zan Dobersek  <[email protected]>
+
+        [GTK][WPE][GPUProcess] Add RemoteGraphicsContextGLGBM, RemoteGraphicsContextGLProxyGBM
+        https://bugs.webkit.org/show_bug.cgi?id=239348
+
+        Reviewed by Carlos Garcia Campos.
+
+        Provide RemoteGraphicsContextGL and RemoteGraphicsContextGLProxy
+        implementations guarded by and based on USE(LIBGBM) functionality,
+        usable by the GTK and WPE ports when jointly enabled with ANGLE
+        backing of WebGL execution.
+
+        RemoteGraphicsContextGLGBM is the GPUProcess-side GL executor.
+        Internally it spawns a GraphicsContextGLGBM instance, and once invoked,
+        the PrepareForDisplay() IPC message returns the reply with the DMABuf
+        object that was used as the rendering backing in that context instance.
+
+        RemoteGraphicsContextGLProxyGBM is the WebProcess-side counterpart.
+        Besides relaying the prepare-for-display request, it also manages the
+        GraphicsLayerContentsDisplayDelegate object which handles presenting
+        DMABuf objects arriving from the GPUProcess. That delegate is of the
+        NicosiaDisplayDelegate type, a slim class also handling a
+        Nicosia::ContentLayer object through which any arriving DMABuf is
+        presented in the TextureMapper tree.
+
+        * GPUProcess/graphics/RemoteGraphicsContextGL.cpp:
+        * GPUProcess/graphics/RemoteGraphicsContextGL.h:
+        * GPUProcess/graphics/RemoteGraphicsContextGL.messages.in:
+        * GPUProcess/graphics/RemoteGraphicsContextGLGBM.cpp: Added.
+        (WebKit::RemoteGraphicsContextGLGBM::RemoteGraphicsContextGLGBM):
+        (WebKit::RemoteGraphicsContextGLGBM::platformWorkQueueInitialize):
+        (WebKit::RemoteGraphicsContextGLGBM::prepareForDisplay):
+        (WebKit::RemoteGraphicsContextGL::create):
+        * SourcesGTK.txt:
+        * SourcesWPE.txt:
+        * WebProcess/GPU/graphics/gbm/RemoteGraphicsContextGLProxyGBM.cpp: Added.
+        (WebKit::NicosiaDisplayDelegate::NicosiaDisplayDelegate):
+        (WebKit::NicosiaDisplayDelegate::~NicosiaDisplayDelegate):
+        (WebKit::NicosiaDisplayDelegate::platformLayer const):
+        (WebKit::NicosiaDisplayDelegate::swapBuffersIfNeeded):
+        (WebKit::RemoteGraphicsContextGLProxyGBM::RemoteGraphicsContextGLProxyGBM):
+        (WebKit::RemoteGraphicsContextGLProxyGBM::layerContentsDisplayDelegate):
+        (WebKit::RemoteGraphicsContextGLProxyGBM::prepareForDisplay):
+        (WebKit::RemoteGraphicsContextGLProxy::create):
+
 2022-04-18  Per Arne Vollan  <[email protected]>
 
         Block system calls in the Network process

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.cpp (293014 => 293015)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.cpp	2022-04-19 11:42:49 UTC (rev 293014)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.cpp	2022-04-19 12:32:02 UTC (rev 293015)
@@ -53,7 +53,7 @@
     return instance.get();
 }
 
-#if !PLATFORM(COCOA) && !PLATFORM(WIN)
+#if !PLATFORM(COCOA) && !PLATFORM(WIN) && !USE(LIBGBM)
 Ref<RemoteGraphicsContextGL> RemoteGraphicsContextGL::create(GPUConnectionToWebProcess& gpuConnectionToWebProcess, GraphicsContextGLAttributes&& attributes, GraphicsContextGLIdentifier graphicsContextGLIdentifier, RemoteRenderingBackend& renderingBackend, IPC::StreamConnectionBuffer&& stream)
 {
     ASSERT_NOT_REACHED();
@@ -162,7 +162,7 @@
         forceContextLost();
 }
 
-#if !PLATFORM(COCOA) && !PLATFORM(WIN)
+#if !PLATFORM(COCOA) && !PLATFORM(WIN) && !USE(LIBGBM)
 void RemoteGraphicsContextGL::prepareForDisplay(CompletionHandler<void()>&& completionHandler)
 {
     assertIsCurrent(workQueue());

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.h (293014 => 293015)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.h	2022-04-19 11:42:49 UTC (rev 293014)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.h	2022-04-19 12:32:02 UTC (rev 293015)
@@ -41,6 +41,8 @@
 
 #if PLATFORM(COCOA)
 #include <WebCore/GraphicsContextGLCocoa.h>
+#elif USE(LIBGBM)
+#include <WebCore/GraphicsContextGLGBM.h>
 #else
 #include <WebCore/GraphicsContextGLTextureMapperANGLE.h>
 #endif
@@ -111,6 +113,8 @@
     virtual void prepareForDisplay(CompletionHandler<void(WTF::MachSendRight&&)>&&) = 0;
 #elif USE(GRAPHICS_LAYER_WC)
     virtual void prepareForDisplay(CompletionHandler<void(std::optional<WCContentBufferIdentifier>)>&&) = 0;
+#elif USE(LIBGBM)
+    virtual void prepareForDisplay(CompletionHandler<void(WebCore::DMABufObject&&)>&&) = 0;
 #else
     void prepareForDisplay(CompletionHandler<void()>&&);
 #endif
@@ -140,6 +144,8 @@
     RefPtr<IPC::StreamServerConnection> m_streamConnection;
 #if PLATFORM(COCOA)
     using GCGLContext = WebCore::GraphicsContextGLCocoa;
+#elif USE(LIBGBM)
+    using GCGLContext = WebCore::GraphicsContextGLGBM;
 #else
     using GCGLContext = WebCore::GraphicsContextGLTextureMapperANGLE;
 #endif

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.messages.in (293014 => 293015)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.messages.in	2022-04-19 11:42:49 UTC (rev 293014)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.messages.in	2022-04-19 12:32:02 UTC (rev 293015)
@@ -32,7 +32,10 @@
 #if USE(GRAPHICS_LAYER_WC)
     void PrepareForDisplay() -> (std::optional<WebKit::WCContentBufferIdentifier> contentBuffer) Synchronous
 #endif
-#if !PLATFORM(COCOA) && !USE(GRAPHICS_LAYER_WC)
+#if USE(LIBGBM)
+    void PrepareForDisplay() -> (WebCore::DMABufObject dmabufObject) Synchronous NotStreamEncodableReply
+#endif
+#if !PLATFORM(COCOA) && !USE(GRAPHICS_LAYER_WC) && !USE(LIBGBM)
     void PrepareForDisplay() -> () Synchronous
 #endif
     void EnsureExtensionEnabled(String extension)

Added: trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGLGBM.cpp (0 => 293015)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGLGBM.cpp	                        (rev 0)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGLGBM.cpp	2022-04-19 12:32:02 UTC (rev 293015)
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2022 Metrological Group B.V.
+ * Copyright (C) 2022 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "RemoteGraphicsContextGL.h"
+
+#if ENABLE(GPU_PROCESS) && ENABLE(WEBGL) && USE(LIBGBM)
+
+namespace WebKit {
+
+class RemoteGraphicsContextGLGBM final : public RemoteGraphicsContextGL {
+public:
+    RemoteGraphicsContextGLGBM(GPUConnectionToWebProcess&, GraphicsContextGLIdentifier, RemoteRenderingBackend&, IPC::StreamConnectionBuffer&&);
+
+private:
+    void platformWorkQueueInitialize(WebCore::GraphicsContextGLAttributes&&) final;
+    void prepareForDisplay(CompletionHandler<void(WebCore::DMABufObject&&)>&&) final;
+};
+
+RemoteGraphicsContextGLGBM::RemoteGraphicsContextGLGBM(GPUConnectionToWebProcess& connection, GraphicsContextGLIdentifier identifier, RemoteRenderingBackend& renderingBackend, IPC::StreamConnectionBuffer&& stream)
+    : RemoteGraphicsContextGL(connection, identifier, renderingBackend, WTFMove(stream))
+{ }
+
+void RemoteGraphicsContextGLGBM::platformWorkQueueInitialize(WebCore::GraphicsContextGLAttributes&& attributes)
+{
+    assertIsCurrent(workQueue());
+    m_context = WebCore::GraphicsContextGLGBM::create(WTFMove(attributes));
+}
+
+void RemoteGraphicsContextGLGBM::prepareForDisplay(CompletionHandler<void(WebCore::DMABufObject&&)>&& completionHandler)
+{
+    assertIsCurrent(workQueue());
+    m_context->prepareForDisplay();
+
+    WebCore::DMABufObject dmabufObject(0);
+    auto& swapchain = m_context->swapchain();
+    if (swapchain.displayBO) {
+        uintptr_t handle = reinterpret_cast<uintptr_t>(swapchain.swapchain.get()) + swapchain.displayBO->handle();
+        dmabufObject = swapchain.displayBO->createDMABufObject(handle);
+        swapchain.displayBO = nullptr;
+    }
+
+    completionHandler(WTFMove(dmabufObject));
+}
+
+Ref<RemoteGraphicsContextGL> RemoteGraphicsContextGL::create(GPUConnectionToWebProcess& connection, WebCore::GraphicsContextGLAttributes&& attributes, GraphicsContextGLIdentifier identifier, RemoteRenderingBackend& renderingBackend, IPC::StreamConnectionBuffer&& stream)
+{
+    auto instance = adoptRef(*new RemoteGraphicsContextGLGBM(connection, identifier, renderingBackend, WTFMove(stream)));
+    instance->initialize(WTFMove(attributes));
+    return instance;
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(GPU_PROCESS) && ENABLE(WEBGL) && USE(LIBGBM)

Modified: trunk/Source/WebKit/SourcesGTK.txt (293014 => 293015)


--- trunk/Source/WebKit/SourcesGTK.txt	2022-04-19 11:42:49 UTC (rev 293014)
+++ trunk/Source/WebKit/SourcesGTK.txt	2022-04-19 12:32:02 UTC (rev 293015)
@@ -24,6 +24,8 @@
 GPUProcess/glib/GPUProcessGLib.cpp
 GPUProcess/glib/GPUProcessMainGLib.cpp
 
+GPUProcess/graphics/RemoteGraphicsContextGLGBM.cpp
+
 GPUProcess/media/RemoteAudioDestinationManager.cpp
 
 GPUProcess/media/gstreamer/RemoteMediaPlayerProxyGStreamer.cpp
@@ -282,6 +284,8 @@
 UIProcess/soup/WebCookieManagerProxySoup.cpp
 UIProcess/soup/WebProcessPoolSoup.cpp
 
+WebProcess/GPU/graphics/gbm/RemoteGraphicsContextGLProxyGBM.cpp
+
 WebProcess/GPU/media/gstreamer/VideoLayerRemoteGStreamer.cpp
 
 WebProcess/InjectedBundle/API/glib/DOM/DOMObjectCache.cpp @no-unify

Modified: trunk/Source/WebKit/SourcesWPE.txt (293014 => 293015)


--- trunk/Source/WebKit/SourcesWPE.txt	2022-04-19 11:42:49 UTC (rev 293014)
+++ trunk/Source/WebKit/SourcesWPE.txt	2022-04-19 12:32:02 UTC (rev 293015)
@@ -24,6 +24,8 @@
 GPUProcess/glib/GPUProcessGLib.cpp
 GPUProcess/glib/GPUProcessMainGLib.cpp
 
+GPUProcess/graphics/RemoteGraphicsContextGLGBM.cpp
+
 GPUProcess/media/RemoteAudioDestinationManager.cpp
 
 GPUProcess/media/gstreamer/RemoteMediaPlayerProxyGStreamer.cpp
@@ -229,6 +231,8 @@
 
 UIProcess/wpe/WebPageProxyWPE.cpp
 
+WebProcess/GPU/graphics/gbm/RemoteGraphicsContextGLProxyGBM.cpp
+
 WebProcess/GPU/media/gstreamer/VideoLayerRemoteGStreamer.cpp
 
 WebProcess/InjectedBundle/API/glib/DOM/DOMObjectCache.cpp @no-unify

Added: trunk/Source/WebKit/WebProcess/GPU/graphics/gbm/RemoteGraphicsContextGLProxyGBM.cpp (0 => 293015)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/gbm/RemoteGraphicsContextGLProxyGBM.cpp	                        (rev 0)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/gbm/RemoteGraphicsContextGLProxyGBM.cpp	2022-04-19 12:32:02 UTC (rev 293015)
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2022 Metrological Group B.V.
+ * Copyright (C) 2022 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "RemoteGraphicsContextGLProxy.h"
+
+#if ENABLE(GPU_PROCESS) && ENABLE(WEBGL) && USE(LIBGBM)
+
+// This is a standalone check of additional requirements in this implementation,
+// avoiding having to place an overwhelming amount of build guards over the rest of the code.
+#if !USE(NICOSIA) || !USE(TEXTURE_MAPPER_DMABUF)
+#error RemoteGraphicsContextGLProxyGBM implementation also depends on USE_NICOSIA and USE_TEXTURE_MAPPER_DMABUF
+#endif
+
+#include "WebProcess.h"
+#include <WebCore/DMABufObject.h>
+#include <WebCore/GraphicsLayerContentsDisplayDelegate.h>
+#include <WebCore/NicosiaContentLayerTextureMapperImpl.h>
+#include <WebCore/TextureMapperPlatformLayerProxyDMABuf.h>
+
+namespace WebKit {
+
+class NicosiaDisplayDelegate final : public WebCore::GraphicsLayerContentsDisplayDelegate, public Nicosia::ContentLayerTextureMapperImpl::Client {
+public:
+    explicit NicosiaDisplayDelegate(bool isOpaque);
+    virtual ~NicosiaDisplayDelegate();
+
+    void present(WebCore::DMABufObject&& dmabufObject)
+    {
+        m_pending = WTFMove(dmabufObject);
+    }
+
+private:
+    // WebCore::GraphicsLayerContentsDisplayDelegate
+    Nicosia::PlatformLayer* platformLayer() const final;
+
+    // Nicosia::ContentLayerTextureMapperImpl::Client
+    void swapBuffersIfNeeded() final;
+
+    bool m_isOpaque { false };
+    RefPtr<Nicosia::ContentLayer> m_contentLayer;
+    WebCore::DMABufObject m_pending { WebCore::DMABufObject(0) };
+};
+
+NicosiaDisplayDelegate::NicosiaDisplayDelegate(bool isOpaque)
+    : m_isOpaque(isOpaque)
+{
+    m_contentLayer = Nicosia::ContentLayer::create(Nicosia::ContentLayerTextureMapperImpl::createFactory(*this, adoptRef(*new WebCore::TextureMapperPlatformLayerProxyDMABuf)));
+}
+
+NicosiaDisplayDelegate::~NicosiaDisplayDelegate()
+{ }
+
+Nicosia::PlatformLayer* NicosiaDisplayDelegate::platformLayer() const
+{
+    return m_contentLayer.get();
+}
+
+void NicosiaDisplayDelegate::swapBuffersIfNeeded()
+{
+    auto& proxy = downcast<Nicosia::ContentLayerTextureMapperImpl>(m_contentLayer->impl()).proxy();
+    ASSERT(is<WebCore::TextureMapperPlatformLayerProxyDMABuf>(proxy));
+
+    if (!!m_pending.handle) {
+        Locker locker { proxy.lock() };
+
+        WebCore::TextureMapperGL::Flags flags = WebCore::TextureMapperGL::ShouldFlipTexture;
+        if (!m_isOpaque)
+            flags |= WebCore::TextureMapperGL::ShouldBlend;
+
+        downcast<WebCore::TextureMapperPlatformLayerProxyDMABuf>(proxy).pushDMABuf(WTFMove(m_pending),
+            [](auto&& object) { return object; }, flags);
+    }
+    m_pending = WebCore::DMABufObject(0);
+}
+
+class RemoteGraphicsContextGLProxyGBM final : public RemoteGraphicsContextGLProxy {
+public:
+    RemoteGraphicsContextGLProxyGBM(GPUProcessConnection&, const WebCore::GraphicsContextGLAttributes&, RenderingBackendIdentifier);
+    virtual ~RemoteGraphicsContextGLProxyGBM() = default;
+
+private:
+    // WebCore::GraphicsContextGL
+    RefPtr<WebCore::GraphicsLayerContentsDisplayDelegate> layerContentsDisplayDelegate() final;
+    void prepareForDisplay() final;
+
+    Ref<NicosiaDisplayDelegate> m_layerContentsDisplayDelegate;
+};
+
+RemoteGraphicsContextGLProxyGBM::RemoteGraphicsContextGLProxyGBM(GPUProcessConnection& processConnection, const WebCore::GraphicsContextGLAttributes& attributes, RenderingBackendIdentifier renderingBackend)
+    : RemoteGraphicsContextGLProxy(processConnection, attributes, renderingBackend)
+    , m_layerContentsDisplayDelegate(adoptRef(*new NicosiaDisplayDelegate(!attributes.alpha)))
+{ }
+
+RefPtr<WebCore::GraphicsLayerContentsDisplayDelegate> RemoteGraphicsContextGLProxyGBM::layerContentsDisplayDelegate()
+{
+    return m_layerContentsDisplayDelegate.copyRef();
+}
+
+void RemoteGraphicsContextGLProxyGBM::prepareForDisplay()
+{
+    if (isContextLost())
+        return;
+
+    WebCore::DMABufObject dmabufObject(0);
+    auto sendResult = sendSync(Messages::RemoteGraphicsContextGL::PrepareForDisplay(), Messages::RemoteGraphicsContextGL::PrepareForDisplay::Reply(dmabufObject));
+    if (!sendResult) {
+        markContextLost();
+        return;
+    }
+
+    m_layerContentsDisplayDelegate->present(WTFMove(dmabufObject));
+    markLayerComposited();
+}
+
+RefPtr<RemoteGraphicsContextGLProxy> RemoteGraphicsContextGLProxy::create(const WebCore::GraphicsContextGLAttributes& attributes, RenderingBackendIdentifier renderingBackend)
+{
+    return adoptRef(new RemoteGraphicsContextGLProxyGBM(WebProcess::singleton().ensureGPUProcessConnection(), attributes, renderingBackend));
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(GPU_PROCESS) && ENABLE(WEBGL) && USE(LIBGBM)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to