# Maintainer: Markus Fritsche <mfritsche@reauktion.de>
# Upstream maintainer: Antonio Rojas <arojas@archlinux.org>
# Upstream contributor: Andrea Scarpino <andrea@archlinux.org>
#
# qt6-base-fourier — Qt 6 base with the GL_TEXTURE_*_OPENGL_ES_3 fix
# unlocked. Adds three small runtime checks so that
# QOpenGLTextureGlyphCache, QRhiGles2 (RED_OR_ALPHA8 path) and
# QOpenGLTextureUploader (Format_Alpha8 / Format_Grayscale8) pick
# GL_R8 instead of GL_ALPHA when the live OpenGL context advertises
# ES 3.x or newer. Without those patches Qt 6 emits
# `glTexImage2D(internalFormat=GL_ALPHA)` on Mali-class GLES3
# hardware (mesa panfrost / panthor) — every call returns
# GL_INVALID_VALUE, every dependent glTexSubImage2D errors at level
# 0, and KWin's compositor frame-callback path stalls so badly that
# every Wayland video client deadlocks. Discovered while validating
# chromium-fourier patch 3/3 (NV12 zero-copy) on ohm (PineTab2 /
# RK3566 / hantro mainline) and the chrome+VLC+mpv stalls turned out
# to share a Qt root cause. See ../chromium-fourier/KWIN_PIVOT.md
# for the diagnosis story and the upstream-targetable patch set.

# pkgbase stays as qt6-base so $_pkgfn (= ${pkgbase/6-/} = "qtbase")
# resolves correctly. The "-fourier" suffix lives only in the
# directory name and the commit history; epoch=1 gives our local
# build strict precedence over upstream pkgrel=2 until upstream lands
# the GL_R8/ES3 fix and we can drop the epoch.
pkgbase=qt6-base
pkgname=(qt6-base-fourier
         qt6-xcb-private-headers-fourier)
_pkgver=6.11.0
pkgver=${_pkgver/-/}
pkgrel=3
epoch=1
arch=(aarch64 x86_64)
url='https://www.qt.io'
license=(GPL-3.0-only
         LGPL-3.0-only
         LicenseRef-Qt-Commercial
         Qt-GPL-exception-1.0)
pkgdesc='A cross-platform application and UI framework'
depends=(brotli
         dbus
         double-conversion
         fontconfig
         freetype2
         gcc-libs
         glib2
         glibc
         harfbuzz
         icu
         krb5
         libb2
         libcups
         libdrm
         libgl
         libice
         libinput
         libjpeg-turbo
         libpng
         libproxy
         libsm
         liburing
         libx11
         libxcb
         libxkbcommon
         libxkbcommon-x11
         md4c
         mesa
         mtdev
         openssl
         pcre2
         shared-mime-info
         sqlite
         systemd-libs
         tslib
         wayland
         xcb-util-cursor
         xcb-util-image
         xcb-util-keysyms
         xcb-util-renderutil
         xcb-util-wm
         xdg-utils
         zlib
         zstd)
makedepends=(alsa-lib
             cmake
             cups
             freetds
             git
             gst-plugins-base-libs
             gtk3
             jemalloc
             libfbclient
             libpulse
             mariadb-libs
             ninja
             postgresql
             renderdoc
             unixodbc
             vulkan-headers
             xmlstarlet)
optdepends=('freetds: MS SQL driver'
            'gdk-pixbuf2: GTK platform plugin'
            'gtk3: GTK platform plugin'
            'libfbclient: Firebird/iBase driver'
            'mariadb-libs: MariaDB driver'
            'pango: GTK platform plugin'
            'perl: for syncqt'
            'postgresql-libs: PostgreSQL driver'
            'unixodbc: ODBC driver')
groups=(qt6)
_pkgfn=qtbase
source=(git+https://code.qt.io/qt/$_pkgfn#tag=v$_pkgver
        qt6-base-cflags.patch
        qt6-base-nostrip.patch
        0001-qopengltextureglyphcache-pick-GL_R8-on-ES3.patch
        0002-qrhigles2-RED_OR_ALPHA8-pick-GL_R8-on-ES3.patch
        0003-qopengltextureuploader-pick-GL_R8-on-ES3.patch)
sha256sums=('2223c075e95d86f8dbf6395b025a74d996c418f094453c903290e3c2663fbed2'
            '5411edbe215c24b30448fac69bd0ba7c882f545e8cf05027b2b6e2227abc5e78'
            '4b93f6a79039e676a56f9d6990a324a64a36f143916065973ded89adc621e094'
            'SKIP'
            'SKIP'
            'SKIP')

prepare() {
  patch -d $_pkgfn -p1 < qt6-base-cflags.patch # Use system CFLAGS
  patch -d $_pkgfn -p1 < qt6-base-nostrip.patch # Don't strip binaries with qmake

  # cherry-pick needs git author identity; git-cli refuses without it.
  git -C $_pkgfn -c user.email=fourier@build -c user.name='qt6-base-fourier build' \
      cherry-pick -n 8b54513cdcf62047376a5d27d784ad68a8f235bf # Fix qdbus crashes

  # qt6-base-fourier — three small runtime-checks that pick GL_R8 over
  # GL_ALPHA when the live GL context is ES 3 or newer. See the
  # individual patch headers for per-site diagnosis. The
  # chromium-fourier KWIN_PIVOT.md writeup carries the discovery thread.
  patch -d $_pkgfn -p1 < 0001-qopengltextureglyphcache-pick-GL_R8-on-ES3.patch
  patch -d $_pkgfn -p1 < 0002-qrhigles2-RED_OR_ALPHA8-pick-GL_R8-on-ES3.patch
  patch -d $_pkgfn -p1 < 0003-qopengltextureuploader-pick-GL_R8-on-ES3.patch
}

build() {
  # Set no_direct_extern_access based on architecture
  if [[ $CARCH == "aarch64" || $CARCH == "riscv64" ]]; then
    _no_direct_extern_access=OFF
  else
    _no_direct_extern_access=ON
  fi

  cmake -B build -S $_pkgfn -G Ninja \
    -DCMAKE_INSTALL_PREFIX=/usr \
    -DCMAKE_BUILD_TYPE=RelWithDebInfo \
    -DINSTALL_BINDIR=lib/qt6/bin \
    -DINSTALL_PUBLICBINDIR=bin \
    -DINSTALL_LIBEXECDIR=lib/qt6 \
    -DINSTALL_DOCDIR=share/doc/qt6 \
    -DINSTALL_ARCHDATADIR=lib/qt6 \
    -DINSTALL_DATADIR=share/qt6 \
    -DINSTALL_INCLUDEDIR=include/qt6 \
    -DINSTALL_MKSPECSDIR=lib/qt6/mkspecs \
    -DINSTALL_EXAMPLESDIR=share/doc/qt6/examples \
    -DFEATURE_journald=ON \
    -DFEATURE_libproxy=ON \
    -DFEATURE_openssl_linked=ON \
    -DFEATURE_system_sqlite=ON \
    -DFEATURE_system_xcb_xinput=ON \
    -DFEATURE_no_direct_extern_access=$_no_direct_extern_access \
    -DFEATURE_sql_ibase=OFF \
    -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON \
    -DCMAKE_MESSAGE_LOG_LEVEL=STATUS
  cmake --build build
}

package_qt6-base-fourier() {
  pkgdesc='A cross-platform application and UI framework'
  provides=(qt6-base)
  conflicts=(qt6-base)
  replaces=(qt6-base)
  depends+=(qt6-translations)
  DESTDIR="$pkgdir" cmake --install build

  install -Dm644 $_pkgfn/LICENSES/* -t "$pkgdir"/usr/share/licenses/$pkgbase
}

package_qt6-xcb-private-headers-fourier() {
  pkgdesc='Private headers for Qt6 Xcb'
  provides=(qt6-xcb-private-headers)
  conflicts=(qt6-xcb-private-headers)
  replaces=(qt6-xcb-private-headers)

  depends=("qt6-base-fourier=$pkgver")
  optdepends=()
  groups=()

  cd $_pkgfn
  install -d -m755 "$pkgdir"/usr/include/qt6xcb-private/gl_integrations
  cp -r src/plugins/platforms/xcb/*.h "$pkgdir"/usr/include/qt6xcb-private/
  cp -r src/plugins/platforms/xcb/gl_integrations/*.h "$pkgdir"/usr/include/qt6xcb-private/gl_integrations/
}
