forked from unom/punktfunk
124 lines
7.5 KiB
Bash
124 lines
7.5 KiB
Bash
# Maintainer: unom <packages@unom.io>
|
|
#
|
|
# gamescope + punktfunk's `pipewire-hdr` patches, installed as `punktfunk-gamescope`.
|
|
#
|
|
# Standalone on purpose (its own pkgbase, not part of ../arch/PKGBUILD): it is an OPTIONAL
|
|
# companion — punktfunk works without it, just SDR on the gamescope backend — and it is a C++
|
|
# meson build with a completely different dependency set from the Rust workspace. Installing it
|
|
# does not touch the distro's own `gamescope`; the host resolves `PUNKTFUNK_GAMESCOPE_BIN` >
|
|
# `punktfunk-gamescope` > `gamescope`, so the mere presence of this package is what enables HDR.
|
|
#
|
|
# makepkg -si
|
|
#
|
|
# See ../README.md (packaging/gamescope/README.md) for what the patches do and why.
|
|
pkgname=punktfunk-gamescope
|
|
# `_gsver` is the upstream gamescope this is built from; `pkgrel` moves when only our patches do.
|
|
# `_gsrev` MUST name the same commit as GAMESCOPE_REV in build-punktfunk-gamescope.sh — makepkg
|
|
# needs it statically here, so it is the one thing that cannot be shared; build() asserts it.
|
|
# The `.pfhdrN` suffix is the patch-set revision the binary stamps into its banner (see README.md);
|
|
# bump it with the marker so pacman sees a new version when only our patches moved.
|
|
_gsver=3.16.25
|
|
_gsrev=5fb8dce4a09d0a68d097b9faf9513782106bc843
|
|
pkgver="${_gsver}.pfhdr7"
|
|
# 2: patch 0006 (never destroy the Vulkan device/output at exit). No capability moved, so the
|
|
# `.pfhdrN` level deliberately stays put — see README.md.
|
|
# 3: pin moved 8c676c39 -> 5fb8dce4 (3.16.25-1 -> 3.16.25-11), which brings upstream's own
|
|
# `vulkan_get_rgb10_capture_format()` — the XBGR2101010 fallback for devices with no linear-tiled
|
|
# A2R10G10B10 storage (every NVIDIA). That fixes the NV12/P010 capture intermediate and AVIF
|
|
# screenshots, which are upstream's paths, not ours. Patch 0001 additionally now offers
|
|
# `xBGR_210LE` BEFORE `xRGB_210LE` so a third-party consumer cannot pick the one NVIDIA fills
|
|
# byte-reversed. Still no capability the host probes for, so `.pfhdrN` stays at 4.
|
|
#
|
|
# pfhdr5 / rel 1: patch 0007 fixes the PipeWire `pw_buffer->user_data` use-after-free that aborted
|
|
# a session on every capture renegotiation — i.e. on every client connect, since the host sets the
|
|
# session to the client's mode. This one DOES move `.pfhdrN`, even though it adds no capability:
|
|
# every deployed pfhdr4 binary crash-loops, so an operator has to be able to tell them apart.
|
|
#
|
|
# pfhdr6 / rel 1: patch 0008 honors GAMESCOPE_NO_FOCUS — a mapped-but-unpainted window carrying it
|
|
# (Bazzite's hhd-ui crash-looping under a headless takeover) used to WIN focus selection and turn
|
|
# the composite (and the stream) black while every health signal stayed green. No capability the
|
|
# host probes for, but a field box's banner has to distinguish a build that can lose its composite
|
|
# this way from one that cannot.
|
|
#
|
|
# pfhdr7 / rel 1: patch 0009 (reported + written by luxus, punktfunk-overlay#9) moves capture-buffer
|
|
# destruction off the PipeWire thread: remove_buffer used to drop the last CVulkanTexture ref there,
|
|
# racing steamcompmgr's vulkan_screenshot on the same device — a SIGSEGV precisely in the linger
|
|
# window, so a kept display was dead and reconnect lost the game session. No capability the host
|
|
# probes for, but "reconnect lost my game" triage has to read the difference off the banner.
|
|
pkgrel=1
|
|
pkgdesc="gamescope with 10-bit BT.2020/PQ PipeWire capture, for punktfunk HDR streaming"
|
|
arch=('x86_64' 'aarch64')
|
|
url="https://git.unom.io/unom/punktfunk"
|
|
license=('BSD-2-Clause')
|
|
# NOT a `provides`/`conflicts` of gamescope: this ships a differently-named binary and is meant to
|
|
# sit BESIDE the distro package (a Steam Deck's gaming session keeps using its own gamescope).
|
|
optdepends=('punktfunk-host: the streaming host that uses it')
|
|
# Mirrors Arch's own `gamescope` package. Keep in step with it when that one moves — this builds
|
|
# the same tree, so a dependency it grows is one this needs too.
|
|
depends=('glslang' 'libcap' 'libdrm' 'libinput' 'libx11' 'libxcomposite' 'libxdamage'
|
|
'libxext' 'libxkbcommon' 'libxmu' 'libxrender' 'libxres' 'libxtst' 'libxxf86vm'
|
|
'libavif' 'libdecor' 'hwdata' 'luajit' 'pipewire' 'seatd' 'sdl2-compat'
|
|
'vulkan-icd-loader' 'wayland' 'xcb-util-errors' 'xcb-util-wm' 'xorg-xwayland')
|
|
makedepends=('git' 'meson' 'ninja' 'cmake' 'glm' 'vulkan-headers' 'wayland-protocols'
|
|
'benchmark' 'libxcursor')
|
|
# Only the upstream tree is a `source=`. The patches are NOT listed: they are applied by the shared
|
|
# build script out of `patches/` beside this file, which is what keeps this package from drifting
|
|
# from the sysext / by-hand builds (a stale filename here used to mean a silently different binary).
|
|
# The submodules are pinned by the rev, so the git source is reproducible; `#commit=` makes makepkg
|
|
# check it out and `--recurse-submodules` pulls wlroots/vkroots/libliftoff/… with it.
|
|
source=("git+https://github.com/ValveSoftware/gamescope.git#commit=${_gsrev}")
|
|
# SKIP: the commit hash above IS the integrity check.
|
|
sha256sums=('SKIP')
|
|
options=('!lto' '!debug')
|
|
install="${pkgname}.install"
|
|
|
|
prepare() {
|
|
cd gamescope
|
|
git submodule update --init --recursive --depth 1
|
|
}
|
|
|
|
build() {
|
|
# ONE recipe. The patch set, the meson options and — load-bearing for a package — the
|
|
# `force_fallback_for` that keeps wlroots STATIC all live in the shared script. Arch has
|
|
# `wlroots` in its repos, so a plain `arch-meson` here would link it shared and ship a
|
|
# punktfunk-gamescope that dies with `libwlroots-0.19.so: cannot open shared object file` on
|
|
# every machine that installs the package but not that dev library.
|
|
#
|
|
# `$startdir` is this file's directory: the package is built from the punktfunk checkout
|
|
# (`makepkg -si` in packaging/gamescope), which is the only documented way to build it.
|
|
grep -q "^GAMESCOPE_REV=\"${_gsrev}\"" "${startdir}/build-punktfunk-gamescope.sh" || {
|
|
echo "PKGBUILD _gsrev drifted from GAMESCOPE_REV in build-punktfunk-gamescope.sh" >&2
|
|
return 1
|
|
}
|
|
bash "${startdir}/build-punktfunk-gamescope.sh" \
|
|
--srcdir "${srcdir}/gamescope" \
|
|
--destdir "${srcdir}/stage" \
|
|
--prefix /usr \
|
|
--jobs "$(nproc)"
|
|
# The marker is the host's whole HDR detection (`gamescope_patch_level`) — a build that lost the
|
|
# stamp would install a package that promises nothing and says so nowhere.
|
|
"${srcdir}/stage/usr/bin/punktfunk-gamescope" --version 2>&1 | grep -q '+pfhdr' || {
|
|
echo "built binary carries no +pfhdr marker" >&2
|
|
return 1
|
|
}
|
|
}
|
|
|
|
package() {
|
|
# The compositor, under our own name: a full `meson install` would also lay down
|
|
# gamescopectl / gamescopereaper / gamescopestream, colliding file-for-file with the distro's
|
|
# `gamescope` package. The host only ever execs the compositor.
|
|
install -Dm755 "${srcdir}/stage/usr/bin/punktfunk-gamescope" \
|
|
"${pkgdir}/usr/bin/punktfunk-gamescope"
|
|
|
|
# ...and the WSI layer built beside it. NOT a collision: the build script renamed the layer and
|
|
# rehomed it under /usr/lib/punktfunk, so it sits alongside the distro's rather than over it, and
|
|
# the host enables whichever it means to per session. Without this file no game in a punktfunk
|
|
# gamescope session can get an HDR10 swapchain at all — that layer is the only route to one.
|
|
install -Dm755 "${srcdir}/stage/usr/lib/punktfunk/libVkLayer_PUNKTFUNK_gamescope_wsi.so" \
|
|
"${pkgdir}/usr/lib/punktfunk/libVkLayer_PUNKTFUNK_gamescope_wsi.so"
|
|
install -Dm644 "${srcdir}/stage/usr/lib/punktfunk/vulkan/implicit_layer.d/punktfunk_gamescope_wsi.json" \
|
|
"${pkgdir}/usr/lib/punktfunk/vulkan/implicit_layer.d/punktfunk_gamescope_wsi.json"
|
|
|
|
install -Dm644 gamescope/LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
|
|
}
|