# Forked from Alpine Linux to provide latest git builds, useful for bleeding
# edge driver support
#
# Any new drivers should be upstreamed to Alpine Linux once they appear in a
# new Mesa stable release
pkgname=mesa-git
pkgver=0_git20200323
pkgrel=0
_commit="41412cc4b74e0b4b16f09df8c716adc57df851d7"
pkgdesc="Mesa DRI OpenGL library (Git)"
url="https://www.mesa3d.org"
arch="all"
license="MIT SGI-B-2.0 BSL-1.0"
subpackages="
	$pkgname-dev
	$pkgname-dri-classic:_dri
	$pkgname-dri-gallium:_dri
	$pkgname-va-gallium:_va
	$pkgname-vdpau-gallium:_vdpau
	$pkgname-glapi $pkgname-egl $pkgname-gl $pkgname-gles
	$pkgname-xatracker $pkgname-osmesa $pkgname-gbm
	$pkgname-vulkan-ati:_vulkan
	$pkgname-dri-ati:_dri_deprecated
	$pkgname-dri-nouveau:_dri_deprecated
	"
_llvmver=9
depends_dev="
	libdrm-dev
	libxext-dev
	libxdamage-dev
	libxcb-dev
	libxshmfence-dev
	"
# FIXME: Remove glslang when pmbootstrap can handle the conditional makedepends below
makedepends="
	$depends_dev
	bison
	eudev-dev
	expat-dev
	findutils
	flex
	gettext
	glslang
	elfutils-dev
	libtool
	libxfixes-dev
	libva-dev
	libvdpau-dev
	libx11-dev
	libxrandr-dev
	libxt-dev
	libxvmc-dev
	libxxf86vm-dev
	llvm$_llvmver-dev
	makedepend
	meson
	py3-mako
	py3-libxml2
	python3
	talloc-dev
	wayland-dev
	wayland-protocols
	xorgproto
	zlib-dev
	"
source="
	$pkgname-$_commit.tar.gz::https://gitlab.freedesktop.org/mesa/mesa/-/archive/$_commit.tar.gz
	adjust-cache-deflate-buffer.patch
	musl-fix-includes.patch
	add-use-elf-tls.patch
	time-fix.patch
	"
provides="mesa"
replaces="mesa-dricore mesa"
builddir="$srcdir/mesa-$_commit"
pcprefix="mesa-git"

if [ "$CARCH" = x86 ]; then
	# Bug upstream that needs to be fixed
	options="$options textrels"
fi

_dri_driverdir=/usr/lib/xorg/modules/dri
_dri_drivers="r100,r200,nouveau"
_gallium_drivers="r300,r600,radeonsi,nouveau,swrast,virgl"
_gallium_provides="
	$pkgname-dri-swrast=$pkgver-r$pkgrel
	$pkgname-dri-virtio=$pkgver-r$pkgrel
	"
_vulkan_drivers="amd"
_arch_opts=""
_vulkan_overlay_layer=false
case "$CARCH" in
x86*)
	_dri_drivers="${_dri_drivers},i915,i965"
	_gallium_drivers="${_gallium_drivers},svga,iris"
	_vulkan_drivers="${_vulkan_drivers},intel"
	_vulkan_overlay_layer=true
	makedepends="$makedepends glslang"
	subpackages="$subpackages \
			$pkgname-dri-intel:_dri_deprecated \
			$pkgname-vulkan-intel:_vulkan \
			$pkgname-vulkan-layer:_vulkan_layer"
	_gallium_provides="$_gallium_provides $pkgname-dri-vmwgfx=$pkgver-r$pkgrel"
	_arch_opts="-Ddri3=true"
	case "$CARCH" in
	x86)
		_arch_opts="$_arch_opts -Dglx-read-only-text=true -Dasm=false";;
	esac
	;;
armhf|armv7|aarch64)
	_gallium_drivers="${_gallium_drivers},vc4,v3d,freedreno,kmsro,lima,panfrost,etnaviv,tegra"
	_gallium_provides="$_gallium_provides
		$pkgname-dri-vc4=$pkgver-r$pkgrel
		$pkgname-dri-v3d=$pkgver-r$pkgrel
		$pkgname-dri-freedreno=$pkgver-r$pkgrel
		$pkgname-dri-kmsro=$pkgver-r$pkgrel
		$pkgname-dri-lima=$pkgver-r$pkgrel
		$pkgname-dri-panfrost=$pkgver-r$pkgrel
		$pkgname-dri-etnaviv=$pkgver-r$pkgrel
		$pkgname-dri-tegra=$pkgver-r$pkgrel
		"
	;;
esac

build() {
	export CFLAGS="$CFLAGS -D_XOPEN_SOURCE=700"
	export PATH=/usr/lib/llvm${_llvmver}/bin:$PATH
	meson \
		--prefix=/usr \
		--sysconfdir=/etc \
		--mandir=/usr/share/man \
		--localstatedir=/var \
		--buildtype=debugoptimized \
		-Ddri-drivers-path=$_dri_driverdir \
		-Dgallium-drivers=$_gallium_drivers \
		-Ddri-drivers=$_dri_drivers \
		-Dvulkan-drivers=$_vulkan_drivers \
		-Dvulkan-overlay-layer=$_vulkan_overlay_layer \
		-Dplatforms=x11,drm,wayland \
		-Dllvm=true \
		-Dshared-llvm=true \
		-Dshared-glapi=true \
		-Dgbm=true \
		-Dglx=dri \
		-Dopengl=true \
		-Dosmesa=gallium \
		-Dgles1=false \
		-Dgles2=true \
		-Degl=true \
		-Dgallium-xa=true \
		-Dgallium-vdpau=true \
		-Dgallium-va=true \
		-Dgallium-xvmc=false \
		-Dglx-use-tls=false \
		-Dgallium-nine=false \
		-Db_ndebug=true \
		$_arch_opts \
		. output
	# parallel build workaround
	ninja -C output src/compiler/nir/nir_intrinsics.h src/git_sha1.h

	ninja -C output
}

package() {
	DESTDIR="$pkgdir" ninja -C output install

	# Make abuild's version check happy (#386)
	sed -i s/-devel//g "$pkgdir"/usr/lib/pkgconfig/*.pc
}

dev() {
	provides="mesa-dev"
	replaces="mesa-dev"
	default_dev
}

egl() {
	pkgdesc="Mesa libEGL runtime libraries"
	depends="$pkgname"
	replaces="mesa-egl"
	provides="mesa-egl"

	install -d "$subpkgdir"/usr/lib
	mv "$pkgdir"/usr/lib/libEGL.so* "$subpkgdir"/usr/lib/
}

gl() {
	pkgdesc="Mesa libGL runtime libraries"
	depends="$pkgname"
	replaces="mesa-gl"
	provides="mesa-gl"

	install -d "$subpkgdir"/usr/lib
	mv "$pkgdir"/usr/lib/libGL.so* "$subpkgdir"/usr/lib/
}

glapi() {
	pkgdesc="Mesa shared glapi"
	depends="$pkgname"
	replaces="mesa-gles mesa-glapi"
	provides="mesa-glapi"

	install -d "$subpkgdir"/usr/lib
	mv "$pkgdir"/usr/lib/libglapi.so.* "$subpkgdir"/usr/lib/
}

gles() {
	pkgdesc="Mesa libGLESv2 runtime libraries"
	depends="$pkgname"
	replaces="mesa-gles"
	provides="mesa-gles"

	install -d "$subpkgdir"/usr/lib
	mv "$pkgdir"/usr/lib/libGLES*.so* "$subpkgdir"/usr/lib/
}

xatracker() {
	pkgdesc="Mesa XA state tracker for vmware"
	depends="$pkgname"
	replaces="mesa-xatracker"
	provides="mesa-xatracker"

	install -d "$subpkgdir"/usr/lib
	mv "$pkgdir"/usr/lib/libxatracker*.so.* "$subpkgdir"/usr/lib/
}

osmesa() {
	pkgdesc="Mesa offscreen rendering libraries"
	depends="$pkgname"
	replaces="mesa-osmesa"
	provides="mesa-osmesa"

	install -d "$subpkgdir"/usr/lib
	mv "$pkgdir"/usr/lib/libOSMesa.so.* "$subpkgdir"/usr/lib/
}

gbm() {
	pkgdesc="Mesa gbm library"
	depends="$pkgname"
	replaces="mesa-gbm"
	provides="mesa-gbm"

	install -d "$subpkgdir"/usr/lib
	mv "$pkgdir"/usr/lib/libgbm.so.* "$subpkgdir"/usr/lib/
}

# Move links referencing the same file to the subpackage.
# Usage: _mv_links <base directory> <example>
# where <example> is one of the libraries covered by the megadriver.
# The example is used to find other links that point to the same file.
_mv_links() {
	install -d "$subpkgdir"/$1
	find -L "$pkgdir"/$1 -samefile "$pkgdir"/$1/$2 -print0 \
		| xargs -0 -I{} mv {} "$subpkgdir"/$1/
}

_mv_vulkan() {
	local i
	install -d "$subpkgdir"/usr/lib
	install -d "$subpkgdir"/usr/share/vulkan/icd.d
	for i in "$@"; do
		mv "$pkgdir"/usr/lib/libvulkan_$i.so "$subpkgdir"/usr/lib/
		mv "$pkgdir"/usr/share/vulkan/icd.d/${i}* "$subpkgdir"/usr/share/vulkan/icd.d/
	done
}

# Mesa uses "megadrivers" where multiple drivers are linked into one shared
# library. This library is then hard-linked to separate files (one for each driver).
# Each subpackage contains one megadriver so that all the hard-links are preserved.

_dri() {
	local n=${subpkgname##*-dri-}
	pkgdesc="Mesa $n DRI drivers (Git)"

	# List all relevant subpackages to avoid conflicts with main mesa package.
	depends="$pkgname $pkgname-gl $pkgname-glapi $pkgname-gles $pkgname-egl $pkgname-gbm"
	provides="mesa-dri-$n"
	replaces="mesa-dri-$n"

	case $n in
	classic)
		# libmesa_dri_drivers.so
		_mv_links $_dri_driverdir radeon_dri.so ;;
	gallium)
		# libgallium_dri.so
		_mv_links $_dri_driverdir swrast_dri.so
		provides="$provides $_gallium_provides"
		;;
	esac
}

# Compatibility packages for upgrading from the old (driver-specific) subpackages
_dri_deprecated() {
	local n=${subpkgname##*-dri-}
	pkgdesc="Mesa DRI drivers for $n (DEPRECATED, Git)"
	depends="$pkgname-dri-classic $pkgname-dri-gallium"
	provides="mesa-dri-$n"
	replaces="mesa-dri-$n"

	case $n in
	ati|nouveau)
		depends="$depends $pkgname-va-gallium $pkgname-vdpau-gallium" ;;
	esac

	mkdir "$subpkgdir"
}

_va() {
	local n=${subpkgname##*-va-}
	pkgdesc="Mesa $n VAAPI drivers (Git)"
	depends="$pkgname libva"
	provides="mesa-va-$n"
	replaces="mesa-va-$n"

	case $n in
	gallium)
		# libgallium_drv_video.so
		_mv_links /usr/lib/dri radeonsi_drv_video.so ;;
	esac
}

_vdpau() {
	local n=${subpkgname##*-vdpau-}
	pkgdesc="Mesa $n VDPAU drivers (Git)"
	depends="$pkgname libvdpau"
	provides="mesa-vdpau-$n"
	replaces="mesa-vdpau-$n"

	case $n in
	gallium)
		# libvdpau_gallium.so.1.0.0
		_mv_links /usr/lib/vdpau libvdpau_radeonsi.so.1.0.0 ;;
	esac
}

_vulkan() {
	local n=${subpkgname##*-vulkan-}
	pkgdesc="Mesa Vulkan API driver for $n (Git)"
	depends="$pkgname"
	replaces="mesa-vulkan-$n"
	provides="mesa-vulkan-$n"

	case $n in
	ati)
		_mv_vulkan radeon ;;
	intel)
		_mv_vulkan intel ;;
	esac
}

_vulkan_layer() {
	pkgdesc="Vulkan overlay layer to display information about the application"
	depends="$pkgname"
	replaces="mesa-vulkan-layer"
	provides="mesa-vulkan-layer"

	mkdir -p "$subpkgdir"/usr/share/vulkan "$subpkgdir"/usr/lib
	mv "$pkgdir"/usr/share/vulkan/explicit_layer.d "$subpkgdir"/usr/share/vulkan
	mv "$pkgdir"/usr/lib/libVkLayer_MESA_overlay.so "$subpkgdir"/usr/lib
}

sha512sums="3fb6f5894f4ba0460c29b4d0d6855e660572908d7829e5a43edf702d5997df8498bb766e7bcb2829572113b29792e4cde2750bba402ccfb09de32dd174937719  mesa-git-41412cc4b74e0b4b16f09df8c716adc57df851d7.tar.gz
cdf22d2da3328e116c379264886bd01fd3ad5cc45fe03dc6fd97bdc4794502598ee195c0b9d975fa264d6ac31c6fa108c0535c91800ecf4fcabfd308e53074cc  adjust-cache-deflate-buffer.patch
cf849044d6cc7d2af4ff015208fb09d70bf9660538699797da21bda2ecb7c1892d312af83d05116afd826708d9caafb1d05a13f09139c558aea6fee931e3eee7  musl-fix-includes.patch
9aa207a38d538abbd8e7a7210e3081508563e85e8c27b2269b8f40fd62d9fc6fee0cb2f573a0e62c42f8ba0fb85740459b761f009d5991cfd9813d7614541908  add-use-elf-tls.patch
6a42ef5d60ccad7e39dee7b3a09b8a884548ce65af3fb17cd1bbd453cee0df7b367968b179e4b54fbc606b29753a1bab74f8c6136b1efaf4cfb9f084d9e76c66  time-fix.patch"
