Upgrade to 2.41.3
This commit is contained in:
parent
37202f93bb
commit
c88765bc1c
1
.gitignore
vendored
1
.gitignore
vendored
@ -17,3 +17,4 @@
|
||||
/webkitgtk-2.40.0.tar.xz.asc
|
||||
/webkitgtk-2.41.1.tar.xz.asc
|
||||
/webkitgtk-2.41.2.tar.xz.asc
|
||||
/webkitgtk-2.41.3.tar.xz.asc
|
||||
|
18
build.patch
18
build.patch
@ -1,18 +0,0 @@
|
||||
diff --git a/Source/WebKit/UIProcess/gtk/AcceleratedBackingStoreDMABuf.cpp b/Source/WebKit/UIProcess/gtk/AcceleratedBackingStoreDMABuf.cpp
|
||||
index c0640f19156a..3ed329cc9a86 100644
|
||||
--- a/Source/WebKit/UIProcess/gtk/AcceleratedBackingStoreDMABuf.cpp
|
||||
+++ b/Source/WebKit/UIProcess/gtk/AcceleratedBackingStoreDMABuf.cpp
|
||||
@@ -121,10 +121,10 @@ AcceleratedBackingStoreDMABuf::Texture::Texture(GdkGLContext* glContext, const U
|
||||
Vector<EGLAttrib> attributes = {
|
||||
EGL_WIDTH, m_size.width(),
|
||||
EGL_HEIGHT, m_size.height(),
|
||||
- EGL_LINUX_DRM_FOURCC_EXT, format,
|
||||
+ EGL_LINUX_DRM_FOURCC_EXT, static_cast<EGLAttrib>(format),
|
||||
EGL_DMA_BUF_PLANE0_FD_EXT, fd.value(),
|
||||
- EGL_DMA_BUF_PLANE0_OFFSET_EXT, offset,
|
||||
- EGL_DMA_BUF_PLANE0_PITCH_EXT, stride,
|
||||
+ EGL_DMA_BUF_PLANE0_OFFSET_EXT, static_cast<EGLAttrib>(offset),
|
||||
+ EGL_DMA_BUF_PLANE0_PITCH_EXT, static_cast<EGLAttrib>(stride),
|
||||
};
|
||||
if (modifier != uint64_t(WebCore::DMABufFormat::Modifier::Invalid) && display.eglExtensions().EXT_image_dma_buf_import_modifiers) {
|
||||
std::array<EGLAttrib, 4> modifierAttributes {
|
@ -1,871 +0,0 @@
|
||||
From b835f528fa750ecddf79de8a9aea3900a0d169c8 Mon Sep 17 00:00:00 2001
|
||||
From: Carlos Garcia Campos <cgarcia@igalia.com>
|
||||
Date: Fri, 14 Apr 2023 06:08:42 -0700
|
||||
Subject: [PATCH] [GTK][WPE] Show DRM device and render node files when
|
||||
available in webkit://gpu https://bugs.webkit.org/show_bug.cgi?id=255445
|
||||
|
||||
Reviewed by Adrian Perez de Castro.
|
||||
|
||||
* Source/WebKit/UIProcess/API/glib/WebKitProtocolHandler.cpp:
|
||||
(WebKit::WebKitProtocolHandler::handleGPU):
|
||||
|
||||
Canonical link: https://commits.webkit.org/262958@main
|
||||
---
|
||||
.../API/glib/WebKitProtocolHandler.cpp | 22 ++++++++++++++++++-
|
||||
1 file changed, 21 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Source/WebKit/UIProcess/API/glib/WebKitProtocolHandler.cpp b/Source/WebKit/UIProcess/API/glib/WebKitProtocolHandler.cpp
|
||||
index 167cb28bf97a..b629cc6536bf 100644
|
||||
--- a/Source/WebKit/UIProcess/API/glib/WebKitProtocolHandler.cpp
|
||||
+++ b/Source/WebKit/UIProcess/API/glib/WebKitProtocolHandler.cpp
|
||||
@@ -58,6 +58,9 @@
|
||||
|
||||
#if USE(GBM)
|
||||
#include "AcceleratedBackingStoreDMABuf.h"
|
||||
+#ifndef EGL_DRM_RENDER_NODE_FILE_EXT
|
||||
+#define EGL_DRM_RENDER_NODE_FILE_EXT 0x3377
|
||||
+#endif
|
||||
#endif
|
||||
|
||||
#if PLATFORM(X11)
|
||||
@@ -278,6 +281,24 @@ void WebKitProtocolHandler::handleGPU(WebKitURISchemeRequest* request)
|
||||
addTableRow(hardwareAccelerationObject, "GL_VERSION"_s, makeString(reinterpret_cast<const char*>(glGetString(GL_VERSION))));
|
||||
addTableRow(hardwareAccelerationObject, "GL_SHADING_LANGUAGE_VERSION"_s, makeString(reinterpret_cast<const char*>(glGetString(GL_SHADING_LANGUAGE_VERSION))));
|
||||
|
||||
+ auto eglDisplay = PlatformDisplay::sharedDisplay().eglDisplay();
|
||||
+#if USE(GBM)
|
||||
+ if (GLContext::isExtensionSupported(eglQueryString(nullptr, EGL_EXTENSIONS), "EGL_EXT_device_query")) {
|
||||
+ EGLDeviceEXT eglDevice;
|
||||
+ if (eglQueryDisplayAttribEXT(eglDisplay, EGL_DEVICE_EXT, reinterpret_cast<EGLAttrib*>(&eglDevice))) {
|
||||
+ const char* deviceExtensions = eglQueryDeviceStringEXT(eglDevice, EGL_EXTENSIONS);
|
||||
+ if (GLContext::isExtensionSupported(deviceExtensions, "EGL_EXT_device_drm")) {
|
||||
+ if (const char* deviceFile = eglQueryDeviceStringEXT(eglDevice, EGL_DRM_DEVICE_FILE_EXT))
|
||||
+ addTableRow(hardwareAccelerationObject, "DRM Device"_s, makeString(deviceFile));
|
||||
+ }
|
||||
+ if (GLContext::isExtensionSupported(deviceExtensions, "EGL_EXT_device_drm_render_node")) {
|
||||
+ if (const char* renderNode = eglQueryDeviceStringEXT(eglDevice, EGL_DRM_RENDER_NODE_FILE_EXT))
|
||||
+ addTableRow(hardwareAccelerationObject, "DRM Render Node"_s, makeString(renderNode));
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
#if USE(OPENGL_ES)
|
||||
addTableRow(hardwareAccelerationObject, "GL_EXTENSIONS"_s, makeString(reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS))));
|
||||
#else
|
||||
@@ -292,7 +313,6 @@ void WebKitProtocolHandler::handleGPU(WebKitURISchemeRequest* request)
|
||||
addTableRow(hardwareAccelerationObject, "GL_EXTENSIONS"_s, extensionsBuilder.toString());
|
||||
#endif
|
||||
|
||||
- auto eglDisplay = PlatformDisplay::sharedDisplay().eglDisplay();
|
||||
addTableRow(hardwareAccelerationObject, "EGL_VERSION"_s, makeString(eglQueryString(eglDisplay, EGL_VERSION)));
|
||||
addTableRow(hardwareAccelerationObject, "EGL_VENDOR"_s, makeString(eglQueryString(eglDisplay, EGL_VENDOR)));
|
||||
addTableRow(hardwareAccelerationObject, "EGL_EXTENSIONS"_s, makeString(eglQueryString(nullptr, EGL_EXTENSIONS), ' ', eglQueryString(eglDisplay, EGL_EXTENSIONS)));
|
||||
|
||||
From d67f30551d7cbf5ec8bdd6d7fed92862db326110 Mon Sep 17 00:00:00 2001
|
||||
From: Carlos Garcia Campos <cgarcia@igalia.com>
|
||||
Date: Mon, 17 Apr 2023 13:17:54 +0200
|
||||
Subject: [PATCH] [GTK] Minibrowser does not render any content
|
||||
https://bugs.webkit.org/show_bug.cgi?id=254807
|
||||
|
||||
Reviewed by NOBODY (OOPS!).
|
||||
|
||||
This happens in systems with multiple GPUs enabled. The problem is that
|
||||
we might end up using a different GPU than the one used by the
|
||||
application in the UI process. This is because both GBMDevice and mesa
|
||||
surfaceless platform use always the first device having a render node
|
||||
returned by drmGetDevices2(). To make sure we use the right GPU
|
||||
everywhere we need to get the GPU in used by the UI process and send it
|
||||
to the web process. Mesa surfaceless platform doesn't allow to chang the
|
||||
device, so we need to use GBM platform that receives the device as the
|
||||
native display when initializing the EGL display. Surfaceless platform
|
||||
is still used for swrast, because GBM requires a GPU device.
|
||||
|
||||
* Source/WebCore/PlatformGTK.cmake:
|
||||
* Source/WebCore/SourcesGTK.txt:
|
||||
* Source/WebCore/platform/graphics/PlatformDisplay.cpp:
|
||||
(WebCore::PlatformDisplay::~PlatformDisplay):
|
||||
(WebCore::PlatformDisplay::eglDevice):
|
||||
(WebCore::PlatformDisplay::drmDeviceFile):
|
||||
(WebCore::drmRenderNodeFromPrimaryDeviceFile):
|
||||
(WebCore::PlatformDisplay::drmRenderNodeFile):
|
||||
(WebCore::PlatformDisplay::gbmDevice):
|
||||
* Source/WebCore/platform/graphics/PlatformDisplay.h:
|
||||
* Source/WebCore/platform/graphics/egl/GLContext.cpp:
|
||||
(WebCore::GLContext::getEGLConfig):
|
||||
(WebCore::GLContext::createWindowContext):
|
||||
(WebCore::GLContext::create):
|
||||
(WebCore::GLContext::createSharing):
|
||||
* Source/WebCore/platform/graphics/egl/PlatformDisplaySurfaceless.cpp: Renamed from Source/WebCore/platform/graphics/egl/PlatformDisplayHeadless.cpp.
|
||||
* Source/WebCore/platform/graphics/egl/PlatformDisplaySurfaceless.h: Renamed from Source/WebCore/platform/graphics/egl/PlatformDisplayHeadless.h.
|
||||
* Source/WebCore/platform/graphics/gbm/PlatformDisplayGBM.cpp: Added.
|
||||
(WebCore::PlatformDisplayGBM::create):
|
||||
(WebCore::PlatformDisplayGBM::PlatformDisplayGBM):
|
||||
(WebCore::PlatformDisplayGBM::~PlatformDisplayGBM):
|
||||
* Source/WebCore/platform/graphics/gbm/PlatformDisplayGBM.h: Added.
|
||||
* Source/WebKit/Shared/WebProcessCreationParameters.cpp:
|
||||
(WebKit::WebProcessCreationParameters::encode const):
|
||||
(WebKit::WebProcessCreationParameters::decode):
|
||||
* Source/WebKit/Shared/WebProcessCreationParameters.h:
|
||||
* Source/WebKit/UIProcess/API/glib/WebKitProtocolHandler.cpp:
|
||||
(WebKit::WebKitProtocolHandler::handleGPU):
|
||||
* Source/WebKit/UIProcess/glib/WebProcessPoolGLib.cpp:
|
||||
(WebKit::WebProcessPool::platformInitializeWebProcess):
|
||||
* Source/WebKit/UIProcess/gtk/AcceleratedBackingStoreDMABuf.cpp:
|
||||
(WebKit::AcceleratedBackingStoreDMABuf::Surface::Surface):
|
||||
* Source/WebKit/WebProcess/WebPage/AcceleratedSurface.cpp:
|
||||
(WebKit::AcceleratedSurface::create):
|
||||
* Source/WebKit/WebProcess/WebPage/gtk/AcceleratedSurfaceDMABuf.cpp:
|
||||
(WebKit::AcceleratedSurfaceDMABuf::AcceleratedSurfaceDMABuf):
|
||||
(WebKit::AcceleratedSurfaceDMABuf::RenderTargetEGLImage::create):
|
||||
* Source/WebKit/WebProcess/glib/WebProcessGLib.cpp:
|
||||
(WebKit::WebProcess::platformInitializeWebProcess):
|
||||
---
|
||||
Source/WebCore/PlatformGTK.cmake | 4 +-
|
||||
Source/WebCore/SourcesGTK.txt | 3 +-
|
||||
.../platform/graphics/PlatformDisplay.cpp | 117 ++++++++++++++++++
|
||||
.../platform/graphics/PlatformDisplay.h | 30 ++++-
|
||||
.../platform/graphics/egl/GLContext.cpp | 19 ++-
|
||||
...ess.cpp => PlatformDisplaySurfaceless.cpp} | 10 +-
|
||||
...eadless.h => PlatformDisplaySurfaceless.h} | 10 +-
|
||||
.../graphics/gbm/PlatformDisplayGBM.cpp | 81 ++++++++++++
|
||||
.../graphics/gbm/PlatformDisplayGBM.h | 46 +++++++
|
||||
.../Shared/WebProcessCreationParameters.cpp | 6 +
|
||||
.../Shared/WebProcessCreationParameters.h | 1 +
|
||||
.../API/glib/WebKitProtocolHandler.cpp | 25 ++--
|
||||
.../UIProcess/glib/WebProcessPoolGLib.cpp | 4 +-
|
||||
.../gtk/AcceleratedBackingStoreDMABuf.cpp | 8 +-
|
||||
.../WebProcess/WebPage/AcceleratedSurface.cpp | 3 +-
|
||||
.../WebPage/gtk/AcceleratedSurfaceDMABuf.cpp | 10 +-
|
||||
.../WebKit/WebProcess/glib/WebProcessGLib.cpp | 15 ++-
|
||||
17 files changed, 341 insertions(+), 51 deletions(-)
|
||||
rename Source/WebCore/platform/graphics/egl/{PlatformDisplayHeadless.cpp => PlatformDisplaySurfaceless.cpp} (86%)
|
||||
rename Source/WebCore/platform/graphics/egl/{PlatformDisplayHeadless.h => PlatformDisplaySurfaceless.h} (83%)
|
||||
create mode 100644 Source/WebCore/platform/graphics/gbm/PlatformDisplayGBM.cpp
|
||||
create mode 100644 Source/WebCore/platform/graphics/gbm/PlatformDisplayGBM.h
|
||||
|
||||
diff --git a/Source/WebCore/PlatformGTK.cmake b/Source/WebCore/PlatformGTK.cmake
|
||||
index 27b04aee02d4..76c08982c9b6 100644
|
||||
--- a/Source/WebCore/PlatformGTK.cmake
|
||||
+++ b/Source/WebCore/PlatformGTK.cmake
|
||||
@@ -47,7 +47,9 @@ list(APPEND WebCore_PRIVATE_FRAMEWORK_HEADERS
|
||||
|
||||
platform/glib/ApplicationGLib.h
|
||||
|
||||
- platform/graphics/egl/PlatformDisplayHeadless.h
|
||||
+ platform/graphics/egl/PlatformDisplaySurfaceless.h
|
||||
+
|
||||
+ platform/graphics/gbm/PlatformDisplayGBM.h
|
||||
|
||||
platform/graphics/gtk/GdkCairoUtilities.h
|
||||
|
||||
diff --git a/Source/WebCore/SourcesGTK.txt b/Source/WebCore/SourcesGTK.txt
|
||||
index 2042f2d6a177..58a73bf31a5b 100644
|
||||
--- a/Source/WebCore/SourcesGTK.txt
|
||||
+++ b/Source/WebCore/SourcesGTK.txt
|
||||
@@ -74,7 +74,7 @@ platform/graphics/egl/GLContext.cpp @no-unify
|
||||
platform/graphics/egl/GLContextLibWPE.cpp @no-unify
|
||||
platform/graphics/egl/GLContextWayland.cpp @no-unify
|
||||
platform/graphics/egl/GLContextX11.cpp @no-unify
|
||||
-platform/graphics/egl/PlatformDisplayHeadless.cpp
|
||||
+platform/graphics/egl/PlatformDisplaySurfaceless.cpp
|
||||
|
||||
platform/graphics/gbm/GBMBufferSwapchain.cpp
|
||||
platform/graphics/gbm/GBMDevice.cpp
|
||||
@@ -82,6 +82,7 @@ platform/graphics/gbm/GraphicsContextGLANGLELinux.cpp
|
||||
platform/graphics/gbm/GraphicsContextGLFallback.cpp
|
||||
platform/graphics/gbm/GraphicsContextGLGBM.cpp
|
||||
platform/graphics/gbm/GraphicsContextGLGBMTextureMapper.cpp
|
||||
+platform/graphics/gbm/PlatformDisplayGBM.cpp
|
||||
|
||||
platform/graphics/gtk/ColorGtk.cpp
|
||||
platform/graphics/gtk/DisplayRefreshMonitorGtk.cpp
|
||||
diff --git a/Source/WebCore/platform/graphics/PlatformDisplay.cpp b/Source/WebCore/platform/graphics/PlatformDisplay.cpp
|
||||
index e5a48c9c0b52..cdd10a7d1351 100644
|
||||
--- a/Source/WebCore/platform/graphics/PlatformDisplay.cpp
|
||||
+++ b/Source/WebCore/platform/graphics/PlatformDisplay.cpp
|
||||
@@ -80,6 +80,18 @@
|
||||
#include <wtf/NeverDestroyed.h>
|
||||
#endif
|
||||
|
||||
+#if USE(EGL) && USE(GBM)
|
||||
+#include <fcntl.h>
|
||||
+#include <gbm.h>
|
||||
+#include <unistd.h>
|
||||
+#include <wtf/SafeStrerror.h>
|
||||
+#include <wtf/StdLibExtras.h>
|
||||
+#include <xf86drm.h>
|
||||
+#ifndef EGL_DRM_RENDER_NODE_FILE_EXT
|
||||
+#define EGL_DRM_RENDER_NODE_FILE_EXT 0x3377
|
||||
+#endif
|
||||
+#endif
|
||||
+
|
||||
#if USE(ATSPI)
|
||||
#include <wtf/glib/GUniquePtr.h>
|
||||
#endif
|
||||
@@ -221,6 +233,10 @@ PlatformDisplay::~PlatformDisplay()
|
||||
#if PLATFORM(GTK)
|
||||
if (m_sharedDisplay)
|
||||
g_signal_handlers_disconnect_by_data(m_sharedDisplay.get(), this);
|
||||
+#endif
|
||||
+#if USE(EGL) && USE(GBM)
|
||||
+ if (m_gbm.device.has_value() && m_gbm.device.value())
|
||||
+ gbm_device_destroy(m_gbm.device.value());
|
||||
#endif
|
||||
if (s_sharedDisplayForCompositing == this)
|
||||
s_sharedDisplayForCompositing = nullptr;
|
||||
@@ -402,6 +418,107 @@ bool PlatformDisplay::destroyEGLImage(EGLImage image) const
|
||||
#endif
|
||||
}
|
||||
|
||||
+#if USE(GBM)
|
||||
+EGLDeviceEXT PlatformDisplay::eglDevice()
|
||||
+{
|
||||
+ if (!GLContext::isExtensionSupported(eglQueryString(nullptr, EGL_EXTENSIONS), "EGL_EXT_device_query"))
|
||||
+ return nullptr;
|
||||
+
|
||||
+ if (!m_eglDisplayInitialized)
|
||||
+ const_cast<PlatformDisplay*>(this)->initializeEGLDisplay();
|
||||
+
|
||||
+ EGLDeviceEXT eglDevice;
|
||||
+ if (eglQueryDisplayAttribEXT(m_eglDisplay, EGL_DEVICE_EXT, reinterpret_cast<EGLAttrib*>(&eglDevice)))
|
||||
+ return eglDevice;
|
||||
+
|
||||
+ return nullptr;
|
||||
+}
|
||||
+
|
||||
+const String& PlatformDisplay::drmDeviceFile()
|
||||
+{
|
||||
+ if (!m_drmDeviceFile.has_value()) {
|
||||
+ if (EGLDeviceEXT device = eglDevice()) {
|
||||
+ if (GLContext::isExtensionSupported(eglQueryDeviceStringEXT(device, EGL_EXTENSIONS), "EGL_EXT_device_drm")) {
|
||||
+ m_drmDeviceFile = String::fromUTF8(eglQueryDeviceStringEXT(device, EGL_DRM_DEVICE_FILE_EXT));
|
||||
+ return m_drmDeviceFile.value();
|
||||
+ }
|
||||
+ }
|
||||
+ m_drmDeviceFile = String();
|
||||
+ }
|
||||
+
|
||||
+ return m_drmDeviceFile.value();
|
||||
+}
|
||||
+
|
||||
+static String drmRenderNodeFromPrimaryDeviceFile(const String& primaryDeviceFile)
|
||||
+{
|
||||
+ if (primaryDeviceFile.isEmpty())
|
||||
+ return { };
|
||||
+
|
||||
+ drmDevicePtr devices[64];
|
||||
+ memset(devices, 0, sizeof(devices));
|
||||
+
|
||||
+ int numDevices = drmGetDevices2(0, devices, std::size(devices));
|
||||
+ if (numDevices <= 0)
|
||||
+ return { };
|
||||
+
|
||||
+ String renderNodeDeviceFile;
|
||||
+ for (int i = 0; i < numDevices; ++i) {
|
||||
+ drmDevice* device = devices[i];
|
||||
+ if (!(device->available_nodes & (1 << DRM_NODE_PRIMARY | 1 << DRM_NODE_RENDER)))
|
||||
+ continue;
|
||||
+
|
||||
+ if (String::fromUTF8(device->nodes[DRM_NODE_PRIMARY]) == primaryDeviceFile) {
|
||||
+ renderNodeDeviceFile = String::fromUTF8(device->nodes[DRM_NODE_RENDER]);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ drmFreeDevices(devices, numDevices);
|
||||
+
|
||||
+ return renderNodeDeviceFile;
|
||||
+}
|
||||
+
|
||||
+const String& PlatformDisplay::drmRenderNodeFile()
|
||||
+{
|
||||
+ if (!m_drmRenderNodeFile.has_value()) {
|
||||
+ if (EGLDeviceEXT device = eglDevice()) {
|
||||
+ if (GLContext::isExtensionSupported(eglQueryDeviceStringEXT(device, EGL_EXTENSIONS), "EGL_EXT_device_drm_render_node")) {
|
||||
+ m_drmRenderNodeFile = String::fromUTF8(eglQueryDeviceStringEXT(device, EGL_DRM_RENDER_NODE_FILE_EXT));
|
||||
+ return m_drmRenderNodeFile.value();
|
||||
+ }
|
||||
+
|
||||
+ // If EGL_EXT_device_drm_render_node is not present, try to get the render node using DRM API.
|
||||
+ m_drmRenderNodeFile = drmRenderNodeFromPrimaryDeviceFile(drmDeviceFile());
|
||||
+ } else
|
||||
+ m_drmRenderNodeFile = String();
|
||||
+ }
|
||||
+
|
||||
+ return m_drmRenderNodeFile.value();
|
||||
+}
|
||||
+
|
||||
+struct gbm_device* PlatformDisplay::gbmDevice()
|
||||
+{
|
||||
+ if (!m_gbm.device.has_value()) {
|
||||
+ const char* envDeviceFile = getenv("WEBKIT_WEB_RENDER_DEVICE_FILE");
|
||||
+ String deviceFile = envDeviceFile && *envDeviceFile ? String::fromUTF8(envDeviceFile) : drmRenderNodeFile();
|
||||
+ if (!deviceFile.isEmpty()) {
|
||||
+ m_gbm.deviceFD = UnixFileDescriptor { open(deviceFile.utf8().data(), O_RDWR | O_CLOEXEC), UnixFileDescriptor::Adopt };
|
||||
+ if (m_gbm.deviceFD) {
|
||||
+ m_gbm.device = gbm_create_device(m_gbm.deviceFD.value());
|
||||
+ if (m_gbm.device.value())
|
||||
+ return m_gbm.device.value();
|
||||
+
|
||||
+ WTFLogAlways("Failed to create GBM device for render device: %s: %s", deviceFile.utf8().data(), safeStrerror(errno).data());
|
||||
+ m_gbm.deviceFD = { };
|
||||
+ } else
|
||||
+ WTFLogAlways("Failed to open DRM render device %s: %s", deviceFile.utf8().data(), safeStrerror(errno).data());
|
||||
+ }
|
||||
+ m_gbm.device = nullptr;
|
||||
+ }
|
||||
+
|
||||
+ return m_gbm.device.value();
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
#endif // USE(EGL)
|
||||
|
||||
#if USE(LCMS)
|
||||
diff --git a/Source/WebCore/platform/graphics/PlatformDisplay.h b/Source/WebCore/platform/graphics/PlatformDisplay.h
|
||||
index 28b5e9dfbfda..db3a51de0512 100644
|
||||
--- a/Source/WebCore/platform/graphics/PlatformDisplay.h
|
||||
+++ b/Source/WebCore/platform/graphics/PlatformDisplay.h
|
||||
@@ -36,6 +36,11 @@ typedef void *EGLContext;
|
||||
typedef void *EGLDisplay;
|
||||
typedef void *EGLImage;
|
||||
typedef unsigned EGLenum;
|
||||
+#if USE(GBM)
|
||||
+#include <wtf/unix/UnixFileDescriptor.h>
|
||||
+typedef void *EGLDeviceEXT;
|
||||
+struct gbm_device;
|
||||
+#endif
|
||||
#endif
|
||||
|
||||
#if PLATFORM(GTK)
|
||||
@@ -80,7 +85,10 @@ class PlatformDisplay {
|
||||
WPE,
|
||||
#endif
|
||||
#if USE(EGL)
|
||||
- Headless,
|
||||
+ Surfaceless,
|
||||
+#if USE(GBM)
|
||||
+ GBM,
|
||||
+#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -105,6 +113,11 @@ class PlatformDisplay {
|
||||
|
||||
EGLImage createEGLImage(EGLContext, EGLenum target, EGLClientBuffer, const Vector<EGLAttrib>&) const;
|
||||
bool destroyEGLImage(EGLImage) const;
|
||||
+#if USE(GBM)
|
||||
+ const String& drmDeviceFile();
|
||||
+ const String& drmRenderNodeFile();
|
||||
+ struct gbm_device* gbmDevice();
|
||||
+#endif
|
||||
#endif
|
||||
|
||||
#if ENABLE(VIDEO) && USE(GSTREAMER_GL)
|
||||
@@ -138,10 +151,16 @@ class PlatformDisplay {
|
||||
virtual void initializeEGLDisplay();
|
||||
|
||||
EGLDisplay m_eglDisplay;
|
||||
-#endif
|
||||
-
|
||||
-#if USE(EGL)
|
||||
std::unique_ptr<GLContext> m_sharingGLContext;
|
||||
+
|
||||
+#if USE(GBM)
|
||||
+ std::optional<String> m_drmDeviceFile;
|
||||
+ std::optional<String> m_drmRenderNodeFile;
|
||||
+ struct {
|
||||
+ WTF::UnixFileDescriptor deviceFD;
|
||||
+ std::optional<struct gbm_device*> device;
|
||||
+ } m_gbm;
|
||||
+#endif
|
||||
#endif
|
||||
|
||||
#if USE(LCMS)
|
||||
@@ -159,6 +178,9 @@ class PlatformDisplay {
|
||||
|
||||
#if USE(EGL)
|
||||
void terminateEGLDisplay();
|
||||
+#if USE(GBM)
|
||||
+ EGLDeviceEXT eglDevice();
|
||||
+#endif
|
||||
|
||||
bool m_eglDisplayInitialized { false };
|
||||
int m_eglMajorVersion { 0 };
|
||||
diff --git a/Source/WebCore/platform/graphics/egl/GLContext.cpp b/Source/WebCore/platform/graphics/egl/GLContext.cpp
|
||||
index 35b29618a291..9ce78bd920e7 100644
|
||||
--- a/Source/WebCore/platform/graphics/egl/GLContext.cpp
|
||||
+++ b/Source/WebCore/platform/graphics/egl/GLContext.cpp
|
||||
@@ -146,7 +146,7 @@ bool GLContext::getEGLConfig(PlatformDisplay& platformDisplay, EGLConfig* config
|
||||
|
||||
switch (surfaceType) {
|
||||
case GLContext::Surfaceless:
|
||||
- if (platformDisplay.type() == PlatformDisplay::Type::Headless)
|
||||
+ if (platformDisplay.type() == PlatformDisplay::Type::Surfaceless)
|
||||
attributeList[13] = EGL_PBUFFER_BIT;
|
||||
else
|
||||
attributeList[13] = EGL_WINDOW_BIT;
|
||||
@@ -270,7 +270,10 @@ std::unique_ptr<GLContext> GLContext::createWindowContext(GLNativeWindowType win
|
||||
surface = createWindowSurfaceWPE(display, config, window);
|
||||
break;
|
||||
#endif // USE(WPE_RENDERER)
|
||||
- case PlatformDisplay::Type::Headless:
|
||||
+#if USE(GBM)
|
||||
+ case PlatformDisplay::Type::GBM:
|
||||
+#endif
|
||||
+ case PlatformDisplay::Type::Surfaceless:
|
||||
RELEASE_ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
@@ -359,7 +362,7 @@ std::unique_ptr<GLContext> GLContext::create(GLNativeWindowType window, Platform
|
||||
}
|
||||
|
||||
EGLContext eglSharingContext = platformDisplay.sharingGLContext() ? static_cast<GLContext*>(platformDisplay.sharingGLContext())->m_context : EGL_NO_CONTEXT;
|
||||
- if (platformDisplay.type() == PlatformDisplay::Type::Headless) {
|
||||
+ if (platformDisplay.type() == PlatformDisplay::Type::Surfaceless) {
|
||||
auto context = createSurfacelessContext(platformDisplay, eglSharingContext);
|
||||
if (!context)
|
||||
WTFLogAlways("Could not create EGL surfaceless context: %s.", lastErrorString());
|
||||
@@ -386,7 +389,10 @@ std::unique_ptr<GLContext> GLContext::create(GLNativeWindowType window, Platform
|
||||
context = createWPEContext(platformDisplay, eglSharingContext);
|
||||
break;
|
||||
#endif
|
||||
- case PlatformDisplay::Type::Headless:
|
||||
+#if USE(GBM)
|
||||
+ case PlatformDisplay::Type::GBM:
|
||||
+#endif
|
||||
+ case PlatformDisplay::Type::Surfaceless:
|
||||
RELEASE_ASSERT_NOT_REACHED();
|
||||
}
|
||||
}
|
||||
@@ -443,7 +449,10 @@ std::unique_ptr<GLContext> GLContext::createSharing(PlatformDisplay& platformDis
|
||||
context = createWPEContext(platformDisplay);
|
||||
break;
|
||||
#endif
|
||||
- case PlatformDisplay::Type::Headless:
|
||||
+#if USE(GBM)
|
||||
+ case PlatformDisplay::Type::GBM:
|
||||
+#endif
|
||||
+ case PlatformDisplay::Type::Surfaceless:
|
||||
break;
|
||||
}
|
||||
}
|
||||
diff --git a/Source/WebCore/platform/graphics/egl/PlatformDisplayHeadless.cpp b/Source/WebCore/platform/graphics/egl/PlatformDisplaySurfaceless.cpp
|
||||
similarity index 86%
|
||||
rename from Source/WebCore/platform/graphics/egl/PlatformDisplayHeadless.cpp
|
||||
rename to Source/WebCore/platform/graphics/egl/PlatformDisplaySurfaceless.cpp
|
||||
index 62ca6526c82c..bc2af43534da 100644
|
||||
--- a/Source/WebCore/platform/graphics/egl/PlatformDisplayHeadless.cpp
|
||||
+++ b/Source/WebCore/platform/graphics/egl/PlatformDisplaySurfaceless.cpp
|
||||
@@ -24,7 +24,7 @@
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
-#include "PlatformDisplayHeadless.h"
|
||||
+#include "PlatformDisplaySurfaceless.h"
|
||||
|
||||
#if USE(EGL)
|
||||
#include "GLContext.h"
|
||||
@@ -32,12 +32,12 @@
|
||||
|
||||
namespace WebCore {
|
||||
|
||||
-std::unique_ptr<PlatformDisplayHeadless> PlatformDisplayHeadless::create()
|
||||
+std::unique_ptr<PlatformDisplaySurfaceless> PlatformDisplaySurfaceless::create()
|
||||
{
|
||||
- return std::unique_ptr<PlatformDisplayHeadless>(new PlatformDisplayHeadless());
|
||||
+ return std::unique_ptr<PlatformDisplaySurfaceless>(new PlatformDisplaySurfaceless());
|
||||
}
|
||||
|
||||
-PlatformDisplayHeadless::PlatformDisplayHeadless()
|
||||
+PlatformDisplaySurfaceless::PlatformDisplaySurfaceless()
|
||||
{
|
||||
#if PLATFORM(GTK)
|
||||
PlatformDisplay::setSharedDisplayForCompositing(*this);
|
||||
@@ -52,7 +52,7 @@ PlatformDisplayHeadless::PlatformDisplayHeadless()
|
||||
PlatformDisplay::initializeEGLDisplay();
|
||||
}
|
||||
|
||||
-PlatformDisplayHeadless::~PlatformDisplayHeadless()
|
||||
+PlatformDisplaySurfaceless::~PlatformDisplaySurfaceless()
|
||||
{
|
||||
}
|
||||
|
||||
diff --git a/Source/WebCore/platform/graphics/egl/PlatformDisplayHeadless.h b/Source/WebCore/platform/graphics/egl/PlatformDisplaySurfaceless.h
|
||||
similarity index 83%
|
||||
rename from Source/WebCore/platform/graphics/egl/PlatformDisplayHeadless.h
|
||||
rename to Source/WebCore/platform/graphics/egl/PlatformDisplaySurfaceless.h
|
||||
index 189dd71fc92f..920fb252c026 100644
|
||||
--- a/Source/WebCore/platform/graphics/egl/PlatformDisplayHeadless.h
|
||||
+++ b/Source/WebCore/platform/graphics/egl/PlatformDisplaySurfaceless.h
|
||||
@@ -30,15 +30,15 @@
|
||||
|
||||
namespace WebCore {
|
||||
|
||||
-class PlatformDisplayHeadless final : public PlatformDisplay {
|
||||
+class PlatformDisplaySurfaceless final : public PlatformDisplay {
|
||||
public:
|
||||
- static std::unique_ptr<PlatformDisplayHeadless> create();
|
||||
+ static std::unique_ptr<PlatformDisplaySurfaceless> create();
|
||||
|
||||
- virtual ~PlatformDisplayHeadless();
|
||||
+ virtual ~PlatformDisplaySurfaceless();
|
||||
private:
|
||||
- PlatformDisplayHeadless();
|
||||
+ PlatformDisplaySurfaceless();
|
||||
|
||||
- Type type() const override { return PlatformDisplay::Type::Headless; }
|
||||
+ Type type() const override { return PlatformDisplay::Type::Surfaceless; }
|
||||
};
|
||||
|
||||
} // namespace WebCore
|
||||
diff --git a/Source/WebCore/platform/graphics/gbm/PlatformDisplayGBM.cpp b/Source/WebCore/platform/graphics/gbm/PlatformDisplayGBM.cpp
|
||||
new file mode 100644
|
||||
index 000000000000..8bccfa61d057
|
||||
--- /dev/null
|
||||
+++ b/Source/WebCore/platform/graphics/gbm/PlatformDisplayGBM.cpp
|
||||
@@ -0,0 +1,81 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2023 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 COMPUTER, INC. ``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 COMPUTER, INC. OR
|
||||
+ * 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 "PlatformDisplayGBM.h"
|
||||
+
|
||||
+#if USE(EGL) && USE(GBM)
|
||||
+#include "GLContext.h"
|
||||
+#include <epoxy/egl.h>
|
||||
+#include <fcntl.h>
|
||||
+#include <gbm.h>
|
||||
+#include <unistd.h>
|
||||
+#include <wtf/SafeStrerror.h>
|
||||
+#include <wtf/StdLibExtras.h>
|
||||
+#include <wtf/unix/UnixFileDescriptor.h>
|
||||
+
|
||||
+namespace WebCore {
|
||||
+
|
||||
+std::unique_ptr<PlatformDisplayGBM> PlatformDisplayGBM::create(const String& deviceFile)
|
||||
+{
|
||||
+ auto fd = UnixFileDescriptor { open(deviceFile.utf8().data(), O_RDWR | O_CLOEXEC), UnixFileDescriptor::Adopt };
|
||||
+ if (!fd) {
|
||||
+ WTFLogAlways("Failed to open DRM render device %s: %s", deviceFile.utf8().data(), safeStrerror(errno).data());
|
||||
+ return nullptr;
|
||||
+ }
|
||||
+
|
||||
+ auto* device = gbm_create_device(fd.value());
|
||||
+ if (!device) {
|
||||
+ WTFLogAlways("Failed to create GBM device for render device: %s: %s", deviceFile.utf8().data(), safeStrerror(errno).data());
|
||||
+ return nullptr;
|
||||
+ }
|
||||
+
|
||||
+ return std::unique_ptr<PlatformDisplayGBM>(new PlatformDisplayGBM(WTFMove(fd), device));
|
||||
+}
|
||||
+
|
||||
+PlatformDisplayGBM::PlatformDisplayGBM(UnixFileDescriptor&& fd, struct gbm_device* device)
|
||||
+{
|
||||
+#if PLATFORM(GTK)
|
||||
+ PlatformDisplay::setSharedDisplayForCompositing(*this);
|
||||
+#endif
|
||||
+
|
||||
+ m_gbm = { WTFMove(fd), device };
|
||||
+
|
||||
+ const char* extensions = eglQueryString(nullptr, EGL_EXTENSIONS);
|
||||
+ if (GLContext::isExtensionSupported(extensions, "EGL_EXT_platform_base"))
|
||||
+ m_eglDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_KHR, m_gbm.device.value(), nullptr);
|
||||
+ else if (GLContext::isExtensionSupported(extensions, "EGL_KHR_platform_base"))
|
||||
+ m_eglDisplay = eglGetPlatformDisplay(EGL_PLATFORM_GBM_KHR, m_gbm.device.value(), nullptr);
|
||||
+
|
||||
+ PlatformDisplay::initializeEGLDisplay();
|
||||
+}
|
||||
+
|
||||
+PlatformDisplayGBM::~PlatformDisplayGBM()
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+} // namespace WebCore
|
||||
+
|
||||
+#endif // USE(EGL) && USE(GBM)
|
||||
diff --git a/Source/WebCore/platform/graphics/gbm/PlatformDisplayGBM.h b/Source/WebCore/platform/graphics/gbm/PlatformDisplayGBM.h
|
||||
new file mode 100644
|
||||
index 000000000000..e0a0049f4c6b
|
||||
--- /dev/null
|
||||
+++ b/Source/WebCore/platform/graphics/gbm/PlatformDisplayGBM.h
|
||||
@@ -0,0 +1,46 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2023 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 COMPUTER, INC. ``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 COMPUTER, INC. OR
|
||||
+ * 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.
|
||||
+ */
|
||||
+
|
||||
+#pragma once
|
||||
+
|
||||
+#if USE(EGL) && USE(GBM)
|
||||
+#include "PlatformDisplay.h"
|
||||
+
|
||||
+namespace WebCore {
|
||||
+
|
||||
+class PlatformDisplayGBM final : public PlatformDisplay {
|
||||
+public:
|
||||
+ static std::unique_ptr<PlatformDisplayGBM> create(const String&);
|
||||
+
|
||||
+ virtual ~PlatformDisplayGBM();
|
||||
+private:
|
||||
+ PlatformDisplayGBM(UnixFileDescriptor&&, struct gbm_device*);
|
||||
+
|
||||
+ Type type() const override { return PlatformDisplay::Type::GBM; }
|
||||
+};
|
||||
+
|
||||
+} // namespace WebCore
|
||||
+
|
||||
+#endif // USE(EGL) && USE(GBM)
|
||||
diff --git a/Source/WebKit/Shared/WebProcessCreationParameters.cpp b/Source/WebKit/Shared/WebProcessCreationParameters.cpp
|
||||
index 36c4a3a77906..aea41beabf8e 100644
|
||||
--- a/Source/WebKit/Shared/WebProcessCreationParameters.cpp
|
||||
+++ b/Source/WebKit/Shared/WebProcessCreationParameters.cpp
|
||||
@@ -188,6 +188,7 @@ void WebProcessCreationParameters::encode(IPC::Encoder& encoder) const
|
||||
|
||||
#if PLATFORM(GTK)
|
||||
encoder << useDMABufSurfaceForCompositing;
|
||||
+ encoder << renderDeviceFile;
|
||||
encoder << useSystemAppearanceForScrollbars;
|
||||
encoder << gtkSettings;
|
||||
#endif
|
||||
@@ -526,6 +527,11 @@ bool WebProcessCreationParameters::decode(IPC::Decoder& decoder, WebProcessCreat
|
||||
if (!useDMABufSurfaceForCompositing)
|
||||
return false;
|
||||
parameters.useDMABufSurfaceForCompositing = WTFMove(*useDMABufSurfaceForCompositing);
|
||||
+ std::optional<String> renderDeviceFile;
|
||||
+ decoder >> renderDeviceFile;
|
||||
+ if (!renderDeviceFile)
|
||||
+ return false;
|
||||
+ parameters.renderDeviceFile = WTFMove(*renderDeviceFile);
|
||||
std::optional<bool> useSystemAppearanceForScrollbars;
|
||||
decoder >> useSystemAppearanceForScrollbars;
|
||||
if (!useSystemAppearanceForScrollbars)
|
||||
diff --git a/Source/WebKit/Shared/WebProcessCreationParameters.h b/Source/WebKit/Shared/WebProcessCreationParameters.h
|
||||
index b3d9560fba26..a8d59c1bcb8f 100644
|
||||
--- a/Source/WebKit/Shared/WebProcessCreationParameters.h
|
||||
+++ b/Source/WebKit/Shared/WebProcessCreationParameters.h
|
||||
@@ -229,6 +229,7 @@ struct WebProcessCreationParameters {
|
||||
|
||||
#if PLATFORM(GTK)
|
||||
bool useDMABufSurfaceForCompositing { false };
|
||||
+ String renderDeviceFile;
|
||||
bool useSystemAppearanceForScrollbars { false };
|
||||
GtkSettingsState gtkSettings;
|
||||
#endif
|
||||
diff --git a/Source/WebKit/UIProcess/API/glib/WebKitProtocolHandler.cpp b/Source/WebKit/UIProcess/API/glib/WebKitProtocolHandler.cpp
|
||||
index b629cc6536bf..0750e0b544c9 100644
|
||||
--- a/Source/WebKit/UIProcess/API/glib/WebKitProtocolHandler.cpp
|
||||
+++ b/Source/WebKit/UIProcess/API/glib/WebKitProtocolHandler.cpp
|
||||
@@ -58,9 +58,6 @@
|
||||
|
||||
#if USE(GBM)
|
||||
#include "AcceleratedBackingStoreDMABuf.h"
|
||||
-#ifndef EGL_DRM_RENDER_NODE_FILE_EXT
|
||||
-#define EGL_DRM_RENDER_NODE_FILE_EXT 0x3377
|
||||
-#endif
|
||||
#endif
|
||||
|
||||
#if PLATFORM(X11)
|
||||
@@ -281,22 +278,13 @@ void WebKitProtocolHandler::handleGPU(WebKitURISchemeRequest* request)
|
||||
addTableRow(hardwareAccelerationObject, "GL_VERSION"_s, makeString(reinterpret_cast<const char*>(glGetString(GL_VERSION))));
|
||||
addTableRow(hardwareAccelerationObject, "GL_SHADING_LANGUAGE_VERSION"_s, makeString(reinterpret_cast<const char*>(glGetString(GL_SHADING_LANGUAGE_VERSION))));
|
||||
|
||||
- auto eglDisplay = PlatformDisplay::sharedDisplay().eglDisplay();
|
||||
#if USE(GBM)
|
||||
- if (GLContext::isExtensionSupported(eglQueryString(nullptr, EGL_EXTENSIONS), "EGL_EXT_device_query")) {
|
||||
- EGLDeviceEXT eglDevice;
|
||||
- if (eglQueryDisplayAttribEXT(eglDisplay, EGL_DEVICE_EXT, reinterpret_cast<EGLAttrib*>(&eglDevice))) {
|
||||
- const char* deviceExtensions = eglQueryDeviceStringEXT(eglDevice, EGL_EXTENSIONS);
|
||||
- if (GLContext::isExtensionSupported(deviceExtensions, "EGL_EXT_device_drm")) {
|
||||
- if (const char* deviceFile = eglQueryDeviceStringEXT(eglDevice, EGL_DRM_DEVICE_FILE_EXT))
|
||||
- addTableRow(hardwareAccelerationObject, "DRM Device"_s, makeString(deviceFile));
|
||||
- }
|
||||
- if (GLContext::isExtensionSupported(deviceExtensions, "EGL_EXT_device_drm_render_node")) {
|
||||
- if (const char* renderNode = eglQueryDeviceStringEXT(eglDevice, EGL_DRM_RENDER_NODE_FILE_EXT))
|
||||
- addTableRow(hardwareAccelerationObject, "DRM Render Node"_s, makeString(renderNode));
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
+ auto deviceFile = PlatformDisplay::sharedDisplay().drmDeviceFile();
|
||||
+ if (!deviceFile.isEmpty())
|
||||
+ addTableRow(hardwareAccelerationObject, "DRM Device"_s, deviceFile);
|
||||
+ auto renderNode = PlatformDisplay::sharedDisplay().drmRenderNodeFile();
|
||||
+ if (!renderNode.isEmpty())
|
||||
+ addTableRow(hardwareAccelerationObject, "DRM Render Node"_s, renderNode);
|
||||
#endif
|
||||
|
||||
#if USE(OPENGL_ES)
|
||||
@@ -313,6 +301,7 @@ void WebKitProtocolHandler::handleGPU(WebKitURISchemeRequest* request)
|
||||
addTableRow(hardwareAccelerationObject, "GL_EXTENSIONS"_s, extensionsBuilder.toString());
|
||||
#endif
|
||||
|
||||
+ auto eglDisplay = PlatformDisplay::sharedDisplay().eglDisplay();
|
||||
addTableRow(hardwareAccelerationObject, "EGL_VERSION"_s, makeString(eglQueryString(eglDisplay, EGL_VERSION)));
|
||||
addTableRow(hardwareAccelerationObject, "EGL_VENDOR"_s, makeString(eglQueryString(eglDisplay, EGL_VENDOR)));
|
||||
addTableRow(hardwareAccelerationObject, "EGL_EXTENSIONS"_s, makeString(eglQueryString(nullptr, EGL_EXTENSIONS), ' ', eglQueryString(eglDisplay, EGL_EXTENSIONS)));
|
||||
diff --git a/Source/WebKit/UIProcess/glib/WebProcessPoolGLib.cpp b/Source/WebKit/UIProcess/glib/WebProcessPoolGLib.cpp
|
||||
index 82feb4b26719..5abe94e29ad4 100644
|
||||
--- a/Source/WebKit/UIProcess/glib/WebProcessPoolGLib.cpp
|
||||
+++ b/Source/WebKit/UIProcess/glib/WebProcessPoolGLib.cpp
|
||||
@@ -87,8 +87,10 @@ void WebProcessPool::platformInitializeWebProcess(const WebProcessProxy& process
|
||||
#endif
|
||||
|
||||
#if PLATFORM(GTK) && USE(GBM)
|
||||
- if (AcceleratedBackingStoreDMABuf::checkRequirements())
|
||||
+ if (AcceleratedBackingStoreDMABuf::checkRequirements()) {
|
||||
parameters.useDMABufSurfaceForCompositing = true;
|
||||
+ parameters.renderDeviceFile = WebCore::PlatformDisplay::sharedDisplay().drmRenderNodeFile();
|
||||
+ }
|
||||
#endif
|
||||
|
||||
#if PLATFORM(WAYLAND)
|
||||
diff --git a/Source/WebKit/UIProcess/gtk/AcceleratedBackingStoreDMABuf.cpp b/Source/WebKit/UIProcess/gtk/AcceleratedBackingStoreDMABuf.cpp
|
||||
index 3ed329cc9a86..bbdc911b0de2 100644
|
||||
--- a/Source/WebKit/UIProcess/gtk/AcceleratedBackingStoreDMABuf.cpp
|
||||
+++ b/Source/WebKit/UIProcess/gtk/AcceleratedBackingStoreDMABuf.cpp
|
||||
@@ -33,7 +33,6 @@
|
||||
#include "WebPageProxy.h"
|
||||
#include "WebProcessProxy.h"
|
||||
#include <WebCore/DMABufFormat.h>
|
||||
-#include <WebCore/GBMDevice.h>
|
||||
#include <WebCore/GLContext.h>
|
||||
#include <WebCore/IntRect.h>
|
||||
#include <WebCore/PlatformDisplay.h>
|
||||
@@ -219,7 +218,12 @@ void AcceleratedBackingStoreDMABuf::Texture::paint(GtkWidget* widget, cairo_t* c
|
||||
AcceleratedBackingStoreDMABuf::Surface::Surface(const UnixFileDescriptor& backFD, const UnixFileDescriptor& frontFD, const WebCore::IntSize& size, uint32_t format, uint32_t offset, uint32_t stride, float deviceScaleFactor)
|
||||
: RenderSource(size, deviceScaleFactor)
|
||||
{
|
||||
- auto* device = WebCore::GBMDevice::singleton().device();
|
||||
+ auto* device = WebCore::PlatformDisplay::sharedDisplay().gbmDevice();
|
||||
+ if (!device) {
|
||||
+ WTFLogAlways("Failed to get GBM device");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
struct gbm_import_fd_data fdData = { backFD.value(), static_cast<uint32_t>(m_size.width()), static_cast<uint32_t>(m_size.height()), stride, format };
|
||||
m_backBuffer = gbm_bo_import(device, GBM_BO_IMPORT_FD, &fdData, GBM_BO_USE_RENDERING);
|
||||
if (!m_backBuffer) {
|
||||
diff --git a/Source/WebKit/WebProcess/WebPage/AcceleratedSurface.cpp b/Source/WebKit/WebProcess/WebPage/AcceleratedSurface.cpp
|
||||
index 27f65723f70a..09cb12bb800f 100644
|
||||
--- a/Source/WebKit/WebProcess/WebPage/AcceleratedSurface.cpp
|
||||
+++ b/Source/WebKit/WebProcess/WebPage/AcceleratedSurface.cpp
|
||||
@@ -47,7 +47,8 @@ using namespace WebCore;
|
||||
std::unique_ptr<AcceleratedSurface> AcceleratedSurface::create(WebPage& webPage, Client& client)
|
||||
{
|
||||
#if USE(GBM)
|
||||
- if (PlatformDisplay::sharedDisplayForCompositing().type() == PlatformDisplay::Type::Headless)
|
||||
+ if (PlatformDisplay::sharedDisplayForCompositing().type() == PlatformDisplay::Type::GBM
|
||||
+ || PlatformDisplay::sharedDisplayForCompositing().type() == PlatformDisplay::Type::Surfaceless)
|
||||
return AcceleratedSurfaceDMABuf::create(webPage, client);
|
||||
#endif
|
||||
#if PLATFORM(WAYLAND)
|
||||
diff --git a/Source/WebKit/WebProcess/WebPage/gtk/AcceleratedSurfaceDMABuf.cpp b/Source/WebKit/WebProcess/WebPage/gtk/AcceleratedSurfaceDMABuf.cpp
|
||||
index 14a8631f3ed6..0300ea0b4436 100644
|
||||
--- a/Source/WebKit/WebProcess/WebPage/gtk/AcceleratedSurfaceDMABuf.cpp
|
||||
+++ b/Source/WebKit/WebProcess/WebPage/gtk/AcceleratedSurfaceDMABuf.cpp
|
||||
@@ -32,7 +32,6 @@
|
||||
#include "WebPage.h"
|
||||
#include "WebProcess.h"
|
||||
#include <WebCore/DMABufFormat.h>
|
||||
-#include <WebCore/GBMDevice.h>
|
||||
#include <WebCore/PlatformDisplay.h>
|
||||
#include <array>
|
||||
#include <epoxy/egl.h>
|
||||
@@ -48,7 +47,7 @@ std::unique_ptr<AcceleratedSurfaceDMABuf> AcceleratedSurfaceDMABuf::create(WebPa
|
||||
|
||||
AcceleratedSurfaceDMABuf::AcceleratedSurfaceDMABuf(WebPage& webPage, Client& client)
|
||||
: AcceleratedSurface(webPage, client)
|
||||
- , m_isSoftwareRast(!WebCore::PlatformDisplay::sharedDisplayForCompositing().eglExtensions().EXT_image_dma_buf_import)
|
||||
+ , m_isSoftwareRast(WebCore::PlatformDisplay::sharedDisplayForCompositing().type() == WebCore::PlatformDisplay::Type::Surfaceless)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -101,7 +100,12 @@ std::unique_ptr<AcceleratedSurfaceDMABuf::RenderTarget> AcceleratedSurfaceDMABuf
|
||||
|
||||
auto& display = WebCore::PlatformDisplay::sharedDisplayForCompositing();
|
||||
auto createImage = [&]() -> std::pair<UnixFileDescriptor, EGLImage> {
|
||||
- auto* bo = gbm_bo_create(WebCore::GBMDevice::singleton().device(), size.width(), size.height(), uint32_t(WebCore::DMABufFormat::FourCC::ARGB8888), 0);
|
||||
+ auto* device = display.gbmDevice();
|
||||
+ if (!device) {
|
||||
+ WTFLogAlways("Failed to create GBM buffer of size %dx%d: no GBM device found", size.width(), size.height());
|
||||
+ return { };
|
||||
+ }
|
||||
+ auto* bo = gbm_bo_create(device, size.width(), size.height(), uint32_t(WebCore::DMABufFormat::FourCC::ARGB8888), 0);
|
||||
if (!bo) {
|
||||
WTFLogAlways("Failed to create GBM buffer of size %dx%d: %s", size.width(), size.height(), safeStrerror(errno).data());
|
||||
return { };
|
||||
diff --git a/Source/WebKit/WebProcess/glib/WebProcessGLib.cpp b/Source/WebKit/WebProcess/glib/WebProcessGLib.cpp
|
||||
index 0b6108e29669..8a31082be1e5 100644
|
||||
--- a/Source/WebKit/WebProcess/glib/WebProcessGLib.cpp
|
||||
+++ b/Source/WebKit/WebProcess/glib/WebProcessGLib.cpp
|
||||
@@ -48,8 +48,9 @@
|
||||
#include <wpe/wpe.h>
|
||||
#endif
|
||||
|
||||
-#if PLATFORM(GTK) && USE(EGL)
|
||||
-#include <WebCore/PlatformDisplayHeadless.h>
|
||||
+#if PLATFORM(GTK) && USE(GBM)
|
||||
+#include <WebCore/PlatformDisplayGBM.h>
|
||||
+#include <WebCore/PlatformDisplaySurfaceless.h>
|
||||
#endif
|
||||
|
||||
#if PLATFORM(GTK) && !USE(GTK4)
|
||||
@@ -123,9 +124,13 @@ void WebProcess::platformInitializeWebProcess(WebProcessCreationParameters& para
|
||||
}
|
||||
#endif
|
||||
|
||||
-#if PLATFORM(GTK) && USE(EGL)
|
||||
- if (parameters.useDMABufSurfaceForCompositing)
|
||||
- m_displayForCompositing = WebCore::PlatformDisplayHeadless::create();
|
||||
+#if PLATFORM(GTK) && USE(GBM)
|
||||
+ if (parameters.useDMABufSurfaceForCompositing) {
|
||||
+ if (!parameters.renderDeviceFile.isEmpty())
|
||||
+ m_displayForCompositing = WebCore::PlatformDisplayGBM::create(parameters.renderDeviceFile);
|
||||
+ else
|
||||
+ m_displayForCompositing = WebCore::PlatformDisplaySurfaceless::create();
|
||||
+ }
|
||||
#endif
|
||||
|
||||
#if PLATFORM(WAYLAND)
|
51
font-crashes.patch
Normal file
51
font-crashes.patch
Normal file
@ -0,0 +1,51 @@
|
||||
From 3b166862b8341d3361e3d804c31aacacb27a85dd Mon Sep 17 00:00:00 2001
|
||||
From: Vitaly Dyachkov <vitaly@igalia.com>
|
||||
Date: Fri, 21 Apr 2023 15:54:04 +0200
|
||||
Subject: [PATCH] [WPE][GTK] Do not deref CreationData's buffer when Cairo font
|
||||
is destroyed. https://bugs.webkit.org/show_bug.cgi?id=255785
|
||||
|
||||
Reviewed by NOBODY (OOPS!).
|
||||
|
||||
Since 263084@main `FontCustomPlatformData` takes
|
||||
`FontPlatformData::CreationData` instead of `FragmentedSharedBuffer`.
|
||||
The buffer is now a reference counted field of
|
||||
`FontPlatformData::CreationData` struct and will be automatically
|
||||
dereferenced when `FontCustomPlatformData` is destroyed.
|
||||
It is an error to manually dereference it using Cairo font destroy
|
||||
function.
|
||||
|
||||
* Source/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp:
|
||||
(WebCore::FontCustomPlatformData::FontCustomPlatformData):
|
||||
(WebCore::releaseCustomFontData): Deleted.
|
||||
---
|
||||
.../freetype/FontCustomPlatformDataFreeType.cpp | 10 ----------
|
||||
1 file changed, 10 deletions(-)
|
||||
|
||||
diff --git a/Source/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp b/Source/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp
|
||||
index e7857fe1818f..38daa2b7ff24 100644
|
||||
--- a/Source/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp
|
||||
+++ b/Source/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp
|
||||
@@ -38,11 +38,6 @@
|
||||
|
||||
namespace WebCore {
|
||||
|
||||
-static void releaseCustomFontData(void* data)
|
||||
-{
|
||||
- static_cast<FragmentedSharedBuffer*>(data)->deref();
|
||||
-}
|
||||
-
|
||||
static cairo_user_data_key_t freeTypeFaceKey;
|
||||
|
||||
FontCustomPlatformData::FontCustomPlatformData(FT_Face freeTypeFace, FontPlatformData::CreationData&& data)
|
||||
@@ -50,11 +45,6 @@ FontCustomPlatformData::FontCustomPlatformData(FT_Face freeTypeFace, FontPlatfor
|
||||
, creationData(WTFMove(data))
|
||||
, m_renderingResourceIdentifier(RenderingResourceIdentifier::generate())
|
||||
{
|
||||
- static cairo_user_data_key_t bufferKey;
|
||||
- auto buffer = creationData.fontFaceData;
|
||||
- cairo_font_face_set_user_data(m_fontFace.get(), &bufferKey, &buffer,
|
||||
- static_cast<cairo_destroy_func_t>(releaseCustomFontData));
|
||||
-
|
||||
// Cairo doesn't do FreeType reference counting, so we need to ensure that when
|
||||
// this cairo_font_face_t is destroyed, it cleans up the FreeType face as well.
|
||||
cairo_font_face_set_user_data(m_fontFace.get(), &freeTypeFaceKey, freeTypeFace,
|
4
sources
4
sources
@ -1,2 +1,2 @@
|
||||
SHA512 (webkitgtk-2.41.2.tar.xz) = de1f8b6c33265d0b76dc26ce69ce06055dedd658ad8388f9ddbf016a8a8410b4adda187dcf009b69d2c72116ae8a6b629e973c49968affa09343e8b860d24516
|
||||
SHA512 (webkitgtk-2.41.2.tar.xz.asc) = 1d03a1e103211193ec0aad81f813c183171797bc8988418f6db7e4a70993ac2c55edecb5ea65e804bf93c5cdea8dcc424487fded28715f96ceca84c9798320df
|
||||
SHA512 (webkitgtk-2.41.3.tar.xz) = ae80e919b809e2598ea9f9829288b48625a6a3baef9dcc083c372c4b26b0d8bb448adb46e22786a0c639871cd9a77cf06edf9dafa5697430c7dcc3ca976cf834
|
||||
SHA512 (webkitgtk-2.41.3.tar.xz.asc) = a742d64098a7415dbfdf1b941756bb53940f1f057aba74808096c5c1664cb2cbadb4b97d4b6d1c6cebd5c69002fe3897ada7099b0912f334f8ddd8027136aa84
|
||||
|
@ -1,49 +0,0 @@
|
||||
From 496b2994ce4193222fc140eebde4a610e945790e Mon Sep 17 00:00:00 2001
|
||||
From: Michael Catanzaro <mcatanzaro@redhat.com>
|
||||
Date: Mon, 17 Apr 2023 11:03:43 -0500
|
||||
Subject: [PATCH] REGRESSION(262860@main): [GTK] icons broken, rendering errors
|
||||
on reddit.com and many other websites, flickering on cnn.com
|
||||
https://bugs.webkit.org/show_bug.cgi?id=255488
|
||||
|
||||
Reviewed by NOBODY (OOPS!).
|
||||
|
||||
The second parameter to cairo_scaled_font_text_extents() must be a
|
||||
NUL-terminated UTF-8 string.
|
||||
|
||||
* Source/WebCore/platform/graphics/freetype/SimpleFontDataFreeType.cpp:
|
||||
(WebCore::heightOfCharacter):
|
||||
(WebCore::Font::platformInit):
|
||||
---
|
||||
.../graphics/freetype/SimpleFontDataFreeType.cpp | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/Source/WebCore/platform/graphics/freetype/SimpleFontDataFreeType.cpp b/Source/WebCore/platform/graphics/freetype/SimpleFontDataFreeType.cpp
|
||||
index fa58a247fa32..7cf29fc9ca89 100644
|
||||
--- a/Source/WebCore/platform/graphics/freetype/SimpleFontDataFreeType.cpp
|
||||
+++ b/Source/WebCore/platform/graphics/freetype/SimpleFontDataFreeType.cpp
|
||||
@@ -96,10 +96,11 @@ static std::optional<unsigned> fontUnitsPerEm(FT_Face freeTypeFace)
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
-static float heightOfCharacter(cairo_scaled_font_t* scaledFont, const char character, FontOrientation orientation)
|
||||
+static float heightOfCharacter(cairo_scaled_font_t* scaledFont, const char* character, FontOrientation orientation)
|
||||
{
|
||||
+ ASSERT(strlen(character) == 1);
|
||||
cairo_text_extents_t textExtents;
|
||||
- cairo_scaled_font_text_extents(scaledFont, &character, &textExtents);
|
||||
+ cairo_scaled_font_text_extents(scaledFont, character, &textExtents);
|
||||
return narrowPrecisionToFloat(orientation == FontOrientation::Horizontal ? textExtents.height : textExtents.width);
|
||||
}
|
||||
|
||||
@@ -158,9 +159,9 @@ void Font::platformInit()
|
||||
// We approximate capHeight and xHeight from cairo_text_extents_t unless
|
||||
// FreeType returns them above. This approach is less precise than using FreeType.
|
||||
if (!capHeight.has_value() || !capHeight.value())
|
||||
- capHeight = heightOfCharacter(m_platformData.scaledFont(), 'T', platformData().orientation());
|
||||
+ capHeight = heightOfCharacter(m_platformData.scaledFont(), "T", platformData().orientation());
|
||||
if (!xHeight.has_value() || !xHeight.value())
|
||||
- xHeight = heightOfCharacter(m_platformData.scaledFont(), 'x', platformData().orientation());
|
||||
+ xHeight = heightOfCharacter(m_platformData.scaledFont(), "x", platformData().orientation());
|
||||
|
||||
m_fontMetrics.setAscent(ascent);
|
||||
m_fontMetrics.setDescent(descent);
|
@ -16,7 +16,7 @@
|
||||
%bcond_without docs
|
||||
|
||||
Name: webkitgtk
|
||||
Version: 2.41.2
|
||||
Version: 2.41.3
|
||||
Release: %autorelease
|
||||
Summary: GTK web content engine library
|
||||
|
||||
@ -29,15 +29,8 @@ Source1: https://webkitgtk.org/releases/webkitgtk-%{version}.tar.xz.asc
|
||||
# $ gpg --export --export-options export-minimal D7FCF61CF9A2DEAB31D81BD3F3D322D0EC4582C3 5AA3BC334FD7E3369E7C77B291C559DBE4C9123B > webkitgtk-keys.gpg
|
||||
Source2: webkitgtk-keys.gpg
|
||||
|
||||
# https://bugs.webkit.org/show_bug.cgi?id=255460
|
||||
Patch0: build.patch
|
||||
|
||||
# https://github.com/WebKit/WebKit/pull/12806
|
||||
Patch1: text-extents.patch
|
||||
|
||||
# https://github.com/WebKit/WebKit/pull/12736
|
||||
# https://github.com/WebKit/WebKit/pull/12791
|
||||
Patch2: fix-multi-gpus.patch
|
||||
# https://github.com/WebKit/WebKit/pull/13029
|
||||
Patch0: font-crashes.patch
|
||||
|
||||
BuildRequires: bison
|
||||
BuildRequires: bubblewrap
|
||||
|
Loading…
Reference in New Issue
Block a user