forked from marfrit/marfrit-packages
1dada5122b
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.
34 lines
1.4 KiB
Diff
34 lines
1.4 KiB
Diff
diff --git a/src/gui/rhi/qrhigles2.cpp b/src/gui/rhi/qrhigles2.cpp
|
|
index 5208bd4d..a2625949 100644
|
|
--- a/src/gui/rhi/qrhigles2.cpp
|
|
+++ b/src/gui/rhi/qrhigles2.cpp
|
|
@@ -1367,18 +1367,25 @@ static inline void toGlTextureFormat(QRhiTexture::Format format, const QRhiGles2
|
|
case QRhiTexture::RG8:
|
|
*glintformat = GL_RG8;
|
|
*glsizedintformat = *glintformat;
|
|
*glformat = GL_RG;
|
|
*gltype = GL_UNSIGNED_BYTE;
|
|
break;
|
|
- case QRhiTexture::RED_OR_ALPHA8:
|
|
- *glintformat = caps.coreProfile ? GL_R8 : GL_ALPHA;
|
|
+ case QRhiTexture::RED_OR_ALPHA8: {
|
|
+ // qt6-base-fourier: GL_ALPHA was removed from the valid
|
|
+ // glTexImage2D internalFormat list in OpenGL ES 3.0 (ES 3
|
|
+ // spec section 3.8.3). Pick GL_R8 + GL_RED for desktop GL
|
|
+ // Core profile and for any ES 3 or newer context; only
|
|
+ // legacy ES 2 contexts retain GL_ALPHA.
|
|
+ const bool useR8 = caps.coreProfile || (caps.gles && caps.ctxMajor >= 3);
|
|
+ *glintformat = useR8 ? GL_R8 : GL_ALPHA;
|
|
*glsizedintformat = *glintformat;
|
|
- *glformat = caps.coreProfile ? GL_RED : GL_ALPHA;
|
|
+ *glformat = useR8 ? GL_RED : GL_ALPHA;
|
|
*gltype = GL_UNSIGNED_BYTE;
|
|
break;
|
|
+ }
|
|
case QRhiTexture::RGBA16F:
|
|
*glintformat = GL_RGBA16F;
|
|
*glsizedintformat = *glintformat;
|
|
*glformat = GL_RGBA;
|
|
*gltype = GL_HALF_FLOAT;
|
|
break;
|