forked from marfrit/marfrit-packages
qt6-base-fourier: GL_ALPHA → GL_R8 on OpenGL ES 3.x
Three small runtime checks in qtbase 6.11.0: 1. src/opengl/qopengltextureglyphcache.cpp createTextureData() and load_glyph_image_to_texture() — the `#else` branch (active when qtbase is built with QT_CONFIG(opengles2), every aarch64 distro) hard-codes GL_ALPHA without checking the runtime context's ES version. Replace with `useR8 = ctx->format().majorVersion() >= 3` so ES 3+ contexts get GL_R8 + GL_RED. 2. src/gui/rhi/qrhigles2.cpp toGlTextureFormat() RED_OR_ALPHA8 case — gated only on caps.coreProfile. Extend with `caps.gles && caps.ctxMajor >= 3`. 3. src/opengl/qopengltextureuploader.cpp Format_Alpha8 and Format_Grayscale8 cases — short-circuit on `context->isOpenGLES()` before reaching the swizzle fallback. Restrict to ES 2 only so ES 3+ falls through to the existing TextureSwizzle path. Discovered while validating chromium-fourier patch 3/3 (NV12 EXTERNAL_OES) on ohm. The chrome stall, VLC vout init failure and mpv "could not initialize video chain" all share this Qt 6 root cause: every Qt application running on Mali / panfrost / panthor under a KWin Wayland session emits glTexImage2D(GL_ALPHA) on every text-glyph cache upload, mesa returns GL_INVALID_VALUE, the compositor's frame-callback path stalls, and every wayland video client deadlocks behind it. PKGBUILD inherits from extra/qt6-base 6.11.0-2 with arch+=aarch64, epoch=1 to dominate Arch's pkgrel until upstream lands the fix. qt6-base-cflags.patch and qt6-base-nostrip.patch carried verbatim from upstream packaging. KWIN_PIVOT.md (in chromium-fourier/) carries the full diagnosis thread.
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
diff --git a/src/opengl/qopengltextureuploader.cpp b/src/opengl/qopengltextureuploader.cpp
|
||||
index 3dca0a43..5d650523 100644
|
||||
--- a/src/opengl/qopengltextureuploader.cpp
|
||||
+++ b/src/opengl/qopengltextureuploader.cpp
|
||||
@@ -246,17 +246,24 @@ qsizetype QOpenGLTextureUploader::textureImage(GLenum target, const QImage &imag
|
||||
// Always needs conversion
|
||||
break;
|
||||
} else if (options & UseRedForAlphaAndLuminanceBindOption) {
|
||||
externalFormat = internalFormat = GL_RED;
|
||||
pixelType = GL_UNSIGNED_BYTE;
|
||||
targetFormat = image.format();
|
||||
- } else if (context->isOpenGLES() || context->format().profile() != QSurfaceFormat::CoreProfile) {
|
||||
+ } else if ((context->isOpenGLES() && context->format().majorVersion() < 3)
|
||||
+ || (!context->isOpenGLES() && context->format().profile() != QSurfaceFormat::CoreProfile
|
||||
+ && !funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle))) {
|
||||
+ // qt6-base-fourier: only true ES 2 (or pre-3.3 desktop
|
||||
+ // compat without the swizzle extension) reaches the
|
||||
+ // GL_ALPHA fallback. ES 3+ falls through to the swizzle
|
||||
+ // path below — TextureSwizzle is core in ES 3.0.
|
||||
externalFormat = internalFormat = GL_ALPHA;
|
||||
pixelType = GL_UNSIGNED_BYTE;
|
||||
targetFormat = image.format();
|
||||
- } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
|
||||
+ } else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)
|
||||
+ || (context->isOpenGLES() && context->format().majorVersion() >= 3)) {
|
||||
funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_ALPHA);
|
||||
funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_ZERO);
|
||||
funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_ZERO);
|
||||
funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ZERO);
|
||||
externalFormat = internalFormat = GL_RED;
|
||||
pixelType = GL_UNSIGNED_BYTE;
|
||||
@@ -268,13 +275,18 @@ qsizetype QOpenGLTextureUploader::textureImage(GLenum target, const QImage &imag
|
||||
// Always needs conversion
|
||||
break;
|
||||
} else if (options & UseRedForAlphaAndLuminanceBindOption) {
|
||||
externalFormat = internalFormat = GL_RED;
|
||||
pixelType = GL_UNSIGNED_BYTE;
|
||||
targetFormat = image.format();
|
||||
- } else if (context->isOpenGLES() || context->format().profile() != QSurfaceFormat::CoreProfile) {
|
||||
+ } else if ((context->isOpenGLES() && context->format().majorVersion() < 3)
|
||||
+ || (!context->isOpenGLES() && context->format().profile() != QSurfaceFormat::CoreProfile
|
||||
+ && !funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle))) {
|
||||
+ // qt6-base-fourier: same reasoning as the Format_Alpha8
|
||||
+ // branch above — GL_LUMINANCE is also gone from ES 3
|
||||
+ // glTexImage2D internalFormats.
|
||||
externalFormat = internalFormat = GL_LUMINANCE;
|
||||
pixelType = GL_UNSIGNED_BYTE;
|
||||
targetFormat = image.format();
|
||||
} else if (funcs->hasOpenGLExtension(QOpenGLExtensions::TextureSwizzle)) {
|
||||
funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
|
||||
funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
|
||||
Reference in New Issue
Block a user