pkgbase=lib32-mesa
pkgname=(
  lib32-mesa
  lib32-vulkan-intel
  lib32-vulkan-nouveau
  lib32-vulkan-radeon
  lib32-vulkan-virtio
  lib32-vulkan-mesa-layers
  lib32-vulkan-mesa-implicit-layers
)
pkgver=26.1.0
_pkgver=${pkgver/[a-z]/-&}
pkgrel=1
epoch=1
pkgdesc="Open-source OpenGL drivers - 32-bit"
url="https://gitlab.freedesktop.org/mesa/mesa"
arch=(x86_64)
license=("MIT AND BSD-3-Clause AND SGI-B-2.0")
makedepends=(
  lib32-clang
  lib32-directx-headers
  lib32-expat
  lib32-gcc-libs
  lib32-glibc
  lib32-libdisplay-info
  lib32-libdrm
  lib32-libelf
  lib32-libglvnd
  lib32-libpng
  lib32-libva
  lib32-libx11
  lib32-libxcb
  lib32-libxext
  lib32-libxml2
  lib32-libxrandr
  lib32-libxshmfence
  lib32-libxxf86vm
  lib32-llvm
  lib32-llvm-libs
  lib32-lm_sensors
  lib32-rust-libs
  lib32-spirv-llvm-translator
  lib32-spirv-tools
  lib32-systemd
  lib32-vulkan-icd-loader
  lib32-wayland
  lib32-xcb-util-keysyms
  lib32-zlib
  lib32-zstd

  # shared between mesa and lib32-mesa
  cbindgen
  clang
  cmake
  elfutils
  glslang
  libclc
  meson
  python-mako
  python-packaging
  python-ply
  python-pycparser
  python-yaml
  rust-bindgen
  wayland-protocols
  xorgproto
)
options=(
  # GCC 14 LTO causes segfault in LLVM under si_llvm_optimize_module
  # https://gitlab.freedesktop.org/mesa/mesa/-/issues/11140
  #
  # In general, upstream considers LTO to be broken until explicit notice.
  !lto
)
source=("${pkgname}::git+${url}.git#branch=main")

# Rust crates for NVK, used as Meson subprojects
declare -A _crates=(
  bitflags         2.9.1
  cfg-if           1.0.0
  equivalent       1.0.1
  errno            0.3.12
  hashbrown        0.14.1
  indexmap         2.2.6
  libc             0.2.171
  log              0.4.27
  once_cell        1.8.0
  paste            1.0.14
  pest             2.8.0
  pest_derive      2.8.0
  pest_generator   2.8.0
  pest_meta        2.8.0
  proc-macro2      1.0.86
  quote            1.0.35
  remain           0.2.12
  roxmltree        0.20.0
  rustc-hash       2.1.1
  rustix           1.1.2
  syn              2.0.87
  thiserror        2.0.11
  thiserror-impl   2.0.11
  ucd-trie         0.1.6
  unicode-ident    1.0.12
  windows-link     0.2.0
  windows-sys      0.61.1
  zerocopy         0.8.13
  zerocopy-derive  0.8.13
)

# Used to generate the above table
_gencrates() {
  grep '^source_url' subprojects/*-rs.wrap | \
    sed -r 's|.*crates/([^/]+)/([0-9.]+)/download|\1 \2|' | \
    column -t -S 2 | sed 's/^/  /'
}

for _crate in "${!_crates[@]}"; do
  _ver="${_crates[$_crate]}"
  source+=(
    "$_crate-$_ver.tar.gz::https://crates.io/api/v1/crates/$_crate/$_ver/download"
  )
done

# https://docs.mesa3d.org/relnotes.html
sha256sums=('SKIP')

prepare() {
  cd lib32-mesa

  local src
  for src in "${source[@]}"; do
    src="${src%%::*}"
    src="${src##*/}"
    src="${src%.zst}"
    [[ $src = *.patch ]] || continue
    echo "Applying patch $src..."
    patch -Np1 < "../$src"
  done
}

build() {
  local meson_options=(
    --cross-file lib32
    -D amdgpu-virtio=true
    -D intel-virtio-experimental=true
    -D android-libbacktrace=disabled
    -D b_ndebug=true
    -D gallium-drivers=all
    -D gallium-extra-hud=true
    -D gallium-mediafoundation=disabled
    -D gallium-rusticl-enable-drivers=asahi,freedreno,radeonsi
    -D gallium-rusticl=true
    -D gles1=disabled
    -D html-docs=disabled
    -D intel-rt=disabled
    -D libunwind=disabled
    -D microsoft-clc=disabled
    -D sysprof=false
    -D valgrind=disabled
    -D video-codecs=all
    -D vulkan-drivers=all
    -D vulkan-layers=device-select,intel-nullhw,overlay,screenshot,anti-lag,vram-report-limit
    -D vulkan-manifest-per-architecture=false
  )

  # Build only minimal debug info to reduce size
  CFLAGS+=" -g1"
  CXXFLAGS+=" -g1"

  # Inject subproject packages
  export MESON_PACKAGE_CACHE_DIR="$srcdir"

  arch-meson lib32-mesa build "${meson_options[@]}"
  meson compile -C build
}

_pick() {
  local p="$1" f d; shift
  for f; do
    d="$srcdir/$p/${f#$pkgdir/}"
    mkdir -p "$(dirname "$d")"
    mv -v "$f" "$d"
    rmdir -p --ignore-fail-on-non-empty "$(dirname "$f")"
  done
}

package_lib32-mesa() {
  depends=(
    lib32-expat
    lib32-gcc-libs
    lib32-glibc
    lib32-libdrm
    lib32-libelf
    lib32-libglvnd
    lib32-libx11
    lib32-libxcb
    lib32-libxext
    lib32-libxshmfence
    lib32-libxxf86vm
    lib32-llvm-libs
    lib32-lm_sensors
    lib32-spirv-tools
    lib32-wayland
    lib32-zlib
    lib32-zstd

    mesa
  )
  optdepends=("opengl-man-pages: for the OpenGL API man pages")
  provides=(
    "lib32-libva-mesa-driver=$epoch:$pkgver-$pkgrel"
    "lib32-mesa-libgl=$epoch:$pkgver-$pkgrel"
    lib32-libva-driver
    lib32-opengl-driver
  )
  conflicts=(
    'lib32-libva-mesa-driver<1:24.2.7-1'
    'lib32-mesa-libgl<17.0.1-2'
  )
  replaces=(
    'lib32-libva-mesa-driver<1:24.2.7-1'
    'lib32-mesa-libgl<17.0.1-2'
  )

  meson install -C build --destdir "$pkgdir" --no-rebuild

  (
    local libdir=usr/lib32

    cd "$pkgdir"

    _pick vkintel $libdir/libvulkan_intel{,_hasvk}.so

    _pick vknvidia $libdir/libvulkan_nouveau.so

    _pick vkradeon $libdir/libvulkan_radeon.so

    _pick vkvirtio $libdir/libvulkan_virtio.so

    _pick vkdevice $libdir/libVkLayer_MESA_anti_lag.so
    _pick vkdevice $libdir/libVkLayer_MESA_device_select.so

    _pick vklayer $libdir/libVkLayer_*.so

    rm -rv etc usr/{bin,include,share}

    # indirect rendering
    ln -sr $libdir/libGLX_{mesa,indirect}.so.0
  )

  install -Dm644 lib32-mesa/docs/license.rst -t "$pkgdir/usr/share/licenses/$pkgname"
}

package_lib32-vulkan-intel() {
  pkgdesc="Open-source Vulkan driver for Intel GPUs - 32-bit"
  depends=(
    lib32-expat
    lib32-gcc-libs
    lib32-glibc
    lib32-libdisplay-info
    lib32-libdrm
    lib32-libx11
    lib32-libxcb
    lib32-libxshmfence
    lib32-spirv-tools
    lib32-systemd
    lib32-vulkan-icd-loader
    lib32-vulkan-mesa-implicit-layers
    lib32-wayland
    lib32-xcb-util-keysyms
    lib32-zlib
    lib32-zstd

    vulkan-intel
  )
  optdepends=("lib32-vulkan-mesa-layers: additional vulkan layers")
  provides=(lib32-vulkan-driver)

  mv vkintel/* "$pkgdir"

  install -Dm644 lib32-mesa/docs/license.rst -t "$pkgdir/usr/share/licenses/$pkgname"
}

package_lib32-vulkan-nouveau() {
  pkgdesc="Open-source Vulkan driver for Nvidia GPUs - 32-bit"
  depends=(
    lib32-expat
    lib32-gcc-libs
    lib32-glibc
    lib32-libdisplay-info
    lib32-libdrm
    lib32-libx11
    lib32-libxcb
    lib32-libxshmfence
    lib32-spirv-tools
    lib32-systemd
    lib32-vulkan-icd-loader
    lib32-vulkan-mesa-implicit-layers
    lib32-wayland
    lib32-xcb-util-keysyms
    lib32-zlib
    lib32-zstd

    vulkan-nouveau
  )
  optdepends=("lib32-vulkan-mesa-layers: additional vulkan layers")
  provides=(lib32-vulkan-driver)

  mv vknvidia/* "$pkgdir"

  install -Dm644 lib32-mesa/docs/license.rst -t "$pkgdir/usr/share/licenses/$pkgname"
}

package_lib32-vulkan-radeon() {
  pkgdesc="Open-source Vulkan driver for AMD GPUs - 32-bit"
  depends=(
    lib32-expat
    lib32-gcc-libs
    lib32-glibc
    lib32-libdisplay-info
    lib32-libdrm
    lib32-libelf
    lib32-libx11
    lib32-libxcb
    lib32-libxshmfence
    lib32-llvm-libs
    lib32-spirv-tools
    lib32-systemd
    lib32-vulkan-icd-loader
    lib32-vulkan-mesa-implicit-layers
    lib32-wayland
    lib32-xcb-util-keysyms
    lib32-zlib
    lib32-zstd

    vulkan-radeon
  )
  optdepends=("lib32-vulkan-mesa-layers: additional vulkan layers")
  provides=(lib32-vulkan-driver)
  replaces=('lib32-amdvlk<=2025.Q2.1-1')

  mv vkradeon/* "$pkgdir"

  install -Dm644 lib32-mesa/docs/license.rst -t "$pkgdir/usr/share/licenses/$pkgname"
}

package_lib32-vulkan-virtio() {
  pkgdesc="Open-source Vulkan driver for Virtio-GPU (Venus) - 32-bit"
  depends=(
    lib32-expat
    lib32-gcc-libs
    lib32-glibc
    lib32-libdisplay-info
    lib32-libdrm
    lib32-libx11
    lib32-libxcb
    lib32-libxshmfence
    lib32-systemd
    lib32-vulkan-icd-loader
    lib32-vulkan-mesa-implicit-layers
    lib32-wayland
    lib32-xcb-util-keysyms
    lib32-zlib
    lib32-zstd

    vulkan-virtio
  )
  optdepends=("lib32-vulkan-mesa-layers: additional vulkan layers")
  provides=(lib32-vulkan-driver)

  mv vkvirtio/* "$pkgdir"

  install -Dm644 lib32-mesa/docs/license.rst -t "$pkgdir/usr/share/licenses/$pkgname"
}

package_lib32-vulkan-mesa-layers() {
  pkgdesc="Mesa's explicit Vulkan layers - 32-bit"
  depends=(
    lib32-gcc-libs
    lib32-glibc
    lib32-libpng

    vulkan-mesa-layers
  )
  conflicts=(lib32-vulkan-mesa-layer)
  replaces=(lib32-vulkan-mesa-layer)

  mv vklayer/* "$pkgdir"

  install -Dm644 lib32-mesa/docs/license.rst -t "$pkgdir/usr/share/licenses/$pkgname"
}

package_lib32-vulkan-mesa-implicit-layers() {
  pkgdesc="Mesa's implicit Vulkan layers - 32-bit"
  depends=(
    lib32-gcc-libs
    lib32-glibc
    lib32-libdrm
    lib32-libxcb
    lib32-wayland

    vulkan-mesa-implicit-layers
  )
  conflicts=(lib32-vulkan-mesa-device-select)
  replaces=(lib32-vulkan-mesa-device-select)

  mv vkdevice/* "$pkgdir"

  install -Dm644 lib32-mesa/docs/license.rst -t "$pkgdir/usr/share/licenses/$pkgname"
}

# vim:set sw=2 sts=-1 et:
