File QtWebEngine_6.9.2_QTBUG-139424.patch of Package qt6-webengine
Revert upstream change https://code.qt.io/cgit/qt/qtwebengine.git/commit/?id=ddcd30454aa6338d898c9d20c8feb48f36632e16
which causes rendering issues with Mesa 25.2
https://bugreports.qt.io/browse/QTBUG-139424
https://bugzilla.opensuse.org/1249354
diff --git b/src/core/ozone/egl_helper.cpp a/src/core/ozone/egl_helper.cpp
index 1ed679d2390d..d12280f2be45 100644
--- b/src/core/ozone/egl_helper.cpp
+++ a/src/core/ozone/egl_helper.cpp
@@ -58,14 +58,90 @@ static const char *getEGLErrorString(uint32_t error)
QT_BEGIN_NAMESPACE
+class ScopedGLContext
+{
+public:
+ ScopedGLContext(QOffscreenSurface *surface, EGLHelper::EGLFunctions *eglFun)
+ : m_context(new QOpenGLContext()), m_eglFun(eglFun)
+ {
+ if ((m_previousEGLContext = m_eglFun->eglGetCurrentContext())) {
+ m_previousEGLDrawSurface = m_eglFun->eglGetCurrentSurface(EGL_DRAW);
+ m_previousEGLReadSurface = m_eglFun->eglGetCurrentSurface(EGL_READ);
+ m_previousEGLDisplay = m_eglFun->eglGetCurrentDisplay();
+ }
+
+ if (!m_context->create()) {
+ qWarning("Failed to create OpenGL context.");
+ return;
+ }
+
+ Q_ASSERT(surface->isValid());
+ if (!m_context->makeCurrent(surface)) {
+ qWarning("Failed to make OpenGL context current.");
+ return;
+ }
+ }
+
+ ~ScopedGLContext()
+ {
+ if (!m_textures.empty()) {
+ auto *glFun = m_context->functions();
+ glFun->glDeleteTextures(m_textures.size(), m_textures.data());
+ }
+
+ if (m_previousEGLContext) {
+ // Make sure the scoped context is not current when restoring the previous
+ // EGL context otherwise the QOpenGLContext destructor resets the restored
+ // current context.
+ m_context->doneCurrent();
+
+ m_eglFun->eglMakeCurrent(m_previousEGLDisplay, m_previousEGLDrawSurface,
+ m_previousEGLReadSurface, m_previousEGLContext);
+ if (m_eglFun->eglGetError() != EGL_SUCCESS)
+ qWarning("Failed to restore EGL context.");
+ }
+ }
+
+ bool isValid() const { return m_context->isValid() && (m_context->surface() != nullptr); }
+
+ EGLContext eglContext() const
+ {
+ QNativeInterface::QEGLContext *nativeInterface =
+ m_context->nativeInterface<QNativeInterface::QEGLContext>();
+ return nativeInterface->nativeContext();
+ }
+
+ uint createTexture(int width, int height)
+ {
+ auto *glFun = m_context->functions();
+
+ uint glTexture;
+ glFun->glGenTextures(1, &glTexture);
+ glFun->glBindTexture(GL_TEXTURE_2D, glTexture);
+ glFun->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ NULL);
+ glFun->glBindTexture(GL_TEXTURE_2D, 0);
+
+ m_textures.push_back(glTexture);
+ return glTexture;
+ }
+
+private:
+ QScopedPointer<QOpenGLContext> m_context;
+ EGLHelper::EGLFunctions *m_eglFun;
+ EGLContext m_previousEGLContext = nullptr;
+ EGLSurface m_previousEGLDrawSurface = nullptr;
+ EGLSurface m_previousEGLReadSurface = nullptr;
+ EGLDisplay m_previousEGLDisplay = nullptr;
+ std::vector<uint> m_textures;
+};
+
EGLHelper::EGLFunctions::EGLFunctions()
{
QOpenGLContext *context = OzoneUtilQt::getQOpenGLContext();
eglCreateImage =
reinterpret_cast<PFNEGLCREATEIMAGEPROC>(context->getProcAddress("eglCreateImage"));
- eglCreateDRMImageMESA = reinterpret_cast<PFNEGLCREATEDRMIMAGEMESAPROC>(
- context->getProcAddress("eglCreateDRMImageMESA"));
eglDestroyImage =
reinterpret_cast<PFNEGLDESTROYIMAGEPROC>(context->getProcAddress("eglDestroyImage"));
eglExportDMABUFImageMESA = reinterpret_cast<PFNEGLEXPORTDMABUFIMAGEMESAPROC>(
@@ -122,7 +198,6 @@ EGLHelper::EGLHelper()
const char *displayExtensions = m_functions->eglQueryString(m_eglDisplay, EGL_EXTENSIONS);
m_isDmaBufSupported = strstr(displayExtensions, "EGL_EXT_image_dma_buf_import")
&& strstr(displayExtensions, "EGL_EXT_image_dma_buf_import_modifiers")
- && strstr(displayExtensions, "EGL_MESA_drm_image")
&& strstr(displayExtensions, "EGL_MESA_image_dma_buf_export");
}
@@ -143,17 +218,19 @@ void EGLHelper::queryDmaBuf(const int width, const int height, int *fd, int *str
if (!m_isDmaBufSupported)
return;
- // clang-format off
- EGLint attribs[] = {
- EGL_WIDTH, width,
- EGL_HEIGHT, height,
- EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA,
- EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SHARE_MESA,
- EGL_NONE
- };
- // clang-format on
+ ScopedGLContext context(m_offscreenSurface.get(), m_functions.get());
+ if (!context.isValid())
+ return;
- EGLImage eglImage = m_functions->eglCreateDRMImageMESA(m_eglDisplay, attribs);
+ EGLContext eglContext = context.eglContext();
+ if (!eglContext) {
+ qWarning("EGL: No EGLContext.");
+ return;
+ }
+
+ uint64_t textureId = context.createTexture(width, height);
+ EGLImage eglImage = m_functions->eglCreateImage(m_eglDisplay, eglContext, EGL_GL_TEXTURE_2D,
+ (EGLClientBuffer)textureId, NULL);
if (eglImage == EGL_NO_IMAGE) {
qWarning("EGL: Failed to create EGLImage: %s", getLastEGLErrorString());
return;
diff --git b/src/core/ozone/egl_helper.h a/src/core/ozone/egl_helper.h
index 7594e1f84699..a1a1aa0d667e 100644
--- b/src/core/ozone/egl_helper.h
+++ a/src/core/ozone/egl_helper.h
@@ -11,7 +11,6 @@
#include <EGL/eglext.h>
#undef eglCreateImage
-#undef eglCreateDRMImageMESA
#undef eglDestroyImage
#undef eglExportDMABUFImageMESA
#undef eglExportDMABUFImageQueryMESA
@@ -34,7 +33,6 @@ public:
EGLFunctions();
PFNEGLCREATEIMAGEPROC eglCreateImage;
- PFNEGLCREATEDRMIMAGEMESAPROC eglCreateDRMImageMESA;
PFNEGLDESTROYIMAGEPROC eglDestroyImage;
PFNEGLEXPORTDMABUFIMAGEMESAPROC eglExportDMABUFImageMESA;
PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC eglExportDMABUFImageQueryMESA;