1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
Revert upstream change https://code.qt.io/cgit/qt/qtwebengine.git/commit/?id=ddcd30454aa6338d898c9d20c8feb48f36632e16
It causes rendering issues with Mesa 25.2, see https://bugreports.qt.io/browse/QTBUG-139424
Forwaded: not-needed
---
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;
|