Skip to content

Commit

Permalink
app-emulation/dxvk: new package, add 1.10.1 + live
Browse files Browse the repository at this point in the history
Many want to build this, but crossdev requirement made it unsuitable
for ::gentoo. Now, mingw64-toolchain is there to remedy this and so
let's add it. crossdev can still be used if USE=crossdev-mingw

Note that unlike most overlays, this intentionally does not modify
config.cpp and then installs dxvk.conf as a documentation example.
Use the intended ${PWD}/dxvk.conf or DXVK_CONFIG_FILE env var.
Paths are also different (using lib64 is not necessary and
requires workarounds), so may need to update WINEPREFIX symlinks.

Signed-off-by: Ionen Wolkens <ionen@gentoo.org>
  • Loading branch information
ionenwks committed May 8, 2022
1 parent d387487 commit 00b7912
Show file tree
Hide file tree
Showing 4 changed files with 257 additions and 0 deletions.
1 change: 1 addition & 0 deletions app-emulation/dxvk/Manifest
@@ -0,0 +1 @@
DIST dxvk-1.10.1.tar.gz 1188138 BLAKE2B e4c5c5052de3f0976581317b9e6de148735198d2545e961ed4540be8660fbba0bcd30f81a1b55f032a1e00e226993d1ab3e4017b104f2829bf37d2ee4fc4420a SHA512 8fd34d9f14a7013cdc1957f63bf60feb19748fddc1cd6ec40cf271005f636de62965efb42ddf2598dad3e37a4f59a870bf769387b2534db93451d1ea6aa65410
117 changes: 117 additions & 0 deletions app-emulation/dxvk/dxvk-1.10.1.ebuild
@@ -0,0 +1,117 @@
# Copyright 2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

MULTILIB_COMPAT=( abi_x86_{32,64} )
inherit flag-o-matic meson-multilib

if [[ ${PV} == 9999 ]]; then
inherit git-r3
EGIT_REPO_URI="https://github.com/doitsujin/dxvk.git"
else
SRC_URI="https://github.com/doitsujin/dxvk/archive/refs/tags/v${PV}.tar.gz -> ${P}.tar.gz"
KEYWORDS="-* ~amd64 ~x86"
fi

DESCRIPTION="Vulkan-based implementation of D3D9, D3D10 and D3D11 for Linux / Wine"
HOMEPAGE="https://github.com/doitsujin/dxvk/"

LICENSE="ZLIB"
SLOT="0"
IUSE="+abi_x86_32 crossdev-mingw +d3d9 +d3d10 +d3d11 debug +dxgi tests"
REQUIRED_USE="
|| ( d3d9 d3d10 d3d11 dxgi tests )
d3d10? ( d3d11 )
dxgi? ( d3d11 )"

BDEPEND="
dev-util/glslang
!crossdev-mingw? ( dev-util/mingw64-toolchain[${MULTILIB_USEDEP}] )"
# note: multilib belongs in BDEPEND due to using cross libraries from BROOT

pkg_pretend() {
if use crossdev-mingw && [[ ${MERGE_TYPE} != binary ]]; then
local mingw_gcc=$(usex x86 i686 x86_64)-w64-mingw32-gcc
if ! type -P ${mingw_gcc} >/dev/null; then
eerror "With USE=crossdev-mingw, it is necessary to setup the mingw toolchain."
eerror "For instructions, please see: https://wiki.gentoo.org/wiki/Mingw"
die "USE=crossdev-mingw is set but ${mingw_gcc} was not found"
elif use amd64 && use abi_x86_32 &&
! type -P i686-w64-mingw32-gcc >/dev/null; then
die 'USE="abi_x86_32 crossdev-mingw" is set but i686-w64-mingw32-gcc was not found'
elif [[ ! $(LC_ALL=C ${mingw_gcc} -v 2>&1) =~ "Thread model: posix" ]]; then
eerror "${PN} requires GCC to be built with --enable-threads=posix"
eerror "Please see: https://wiki.gentoo.org/wiki/Mingw#POSIX_threads_for_Windows"
die "USE=crossdev-mingw is set but ${mingw_gcc} does not use POSIX threads"
fi
fi
}

src_prepare() {
default

sed -i "/^basedir=/s|=.*|=${EPREFIX}/usr/lib/dxvk|" setup_dxvk.sh || die

use crossdev-mingw || PATH=${BROOT}/usr/lib/mingw64-toolchain/bin:${PATH}

# AVX has a history of causing issues with this package, disable for safety
# https://github.com/Tk-Glitch/PKGBUILDS/issues/515
append-flags -mno-avx

if [[ ${CHOST} != *-mingw* ]]; then
unset AR CC CXX RC STRIP # likely unusable unless CHOST is mingw
CHOST_amd64=x86_64-w64-mingw32
CHOST_x86=i686-w64-mingw32
CHOST=$(usex x86 ${CHOST_x86} ${CHOST_amd64})
strip-unsupported-flags
fi
}

multilib_src_configure() {
# multilib's ${CHOST_amd64}-gcc -m32 is unusable with crossdev,
# unset again so meson eclass will set ${CHOST}-gcc + others
use crossdev-mingw && unset AR CC CXX RC STRIP

local emesonargs=(
--prefix="${EPREFIX}"/usr/lib/dxvk
--{bin,lib}dir=x$((${ABI#x}==86?32:64))

$(meson_use {,enable_}d3d9)
$(meson_use {,enable_}d3d10)
$(meson_use {,enable_}d3d11)
$(meson_use {,enable_}dxgi)

# tests need wine, working vulkan, and some would hang, but can
# still install for whomever wants to test if dxvk is working
$(meson_use {,enable_}tests)

# portage won't strip .dll and it's ~150MB -> 22MB
$(usev !debug --strip)
)

meson_src_configure
}

multilib_src_install_all() {
dobin setup_dxvk.sh
dodoc README.md dxvk.conf

find "${ED}" -type f -name '*.a' -delete || die
}

pkg_postinst() {
if [[ ! ${REPLACING_VERSIONS} ]]; then
elog "To enable dxvk on a wine prefix, can run the following command:"
elog " WINEPREFIX=/path/to/prefix setup_dxvk.sh install --symlink"
elog "See ${EROOT}/usr/share/doc/${PF}/README.md* for details."
fi

# don't keep wine-*[vulkan] in RDEPEND to keep freedom of what will be used
# with (e.g. custom wine or even copy to real Windows), but give a warning
local wine
for wine in app-emulation/wine-{vanilla,staging}; do
has_version ${wine} && ! has_version ${wine}[vulkan] &&
ewarn "${wine} was not built with USE=vulkan, ${PN} will not be usable with it"
done
}
117 changes: 117 additions & 0 deletions app-emulation/dxvk/dxvk-9999.ebuild
@@ -0,0 +1,117 @@
# Copyright 2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

MULTILIB_COMPAT=( abi_x86_{32,64} )
inherit flag-o-matic meson-multilib

if [[ ${PV} == 9999 ]]; then
inherit git-r3
EGIT_REPO_URI="https://github.com/doitsujin/dxvk.git"
else
SRC_URI="https://github.com/doitsujin/dxvk/archive/refs/tags/v${PV}.tar.gz -> ${P}.tar.gz"
KEYWORDS="-* ~amd64 ~x86"
fi

DESCRIPTION="Vulkan-based implementation of D3D9, D3D10 and D3D11 for Linux / Wine"
HOMEPAGE="https://github.com/doitsujin/dxvk/"

LICENSE="ZLIB"
SLOT="0"
IUSE="+abi_x86_32 crossdev-mingw +d3d9 +d3d10 +d3d11 debug +dxgi tests"
REQUIRED_USE="
|| ( d3d9 d3d10 d3d11 dxgi tests )
d3d10? ( d3d11 )
dxgi? ( d3d11 )"

BDEPEND="
dev-util/glslang
!crossdev-mingw? ( dev-util/mingw64-toolchain[${MULTILIB_USEDEP}] )"
# note: multilib belongs in BDEPEND due to using cross libraries from BROOT

pkg_pretend() {
if use crossdev-mingw && [[ ${MERGE_TYPE} != binary ]]; then
local mingw_gcc=$(usex x86 i686 x86_64)-w64-mingw32-gcc
if ! type -P ${mingw_gcc} >/dev/null; then
eerror "With USE=crossdev-mingw, it is necessary to setup the mingw toolchain."
eerror "For instructions, please see: https://wiki.gentoo.org/wiki/Mingw"
die "USE=crossdev-mingw is set but ${mingw_gcc} was not found"
elif use amd64 && use abi_x86_32 &&
! type -P i686-w64-mingw32-gcc >/dev/null; then
die 'USE="abi_x86_32 crossdev-mingw" is set but i686-w64-mingw32-gcc was not found'
elif [[ ! $(LC_ALL=C ${mingw_gcc} -v 2>&1) =~ "Thread model: posix" ]]; then
eerror "${PN} requires GCC to be built with --enable-threads=posix"
eerror "Please see: https://wiki.gentoo.org/wiki/Mingw#POSIX_threads_for_Windows"
die "USE=crossdev-mingw is set but ${mingw_gcc} does not use POSIX threads"
fi
fi
}

src_prepare() {
default

sed -i "/^basedir=/s|=.*|=${EPREFIX}/usr/lib/dxvk|" setup_dxvk.sh || die

use crossdev-mingw || PATH=${BROOT}/usr/lib/mingw64-toolchain/bin:${PATH}

# AVX has a history of causing issues with this package, disable for safety
# https://github.com/Tk-Glitch/PKGBUILDS/issues/515
append-flags -mno-avx

if [[ ${CHOST} != *-mingw* ]]; then
unset AR CC CXX RC STRIP # likely unusable unless CHOST is mingw
CHOST_amd64=x86_64-w64-mingw32
CHOST_x86=i686-w64-mingw32
CHOST=$(usex x86 ${CHOST_x86} ${CHOST_amd64})
strip-unsupported-flags
fi
}

multilib_src_configure() {
# multilib's ${CHOST_amd64}-gcc -m32 is unusable with crossdev,
# unset again so meson eclass will set ${CHOST}-gcc + others
use crossdev-mingw && unset AR CC CXX RC STRIP

local emesonargs=(
--prefix="${EPREFIX}"/usr/lib/dxvk
--{bin,lib}dir=x$((${ABI#x}==86?32:64))

$(meson_use {,enable_}d3d9)
$(meson_use {,enable_}d3d10)
$(meson_use {,enable_}d3d11)
$(meson_use {,enable_}dxgi)

# tests need wine, working vulkan, and some would hang, but can
# still install for whomever wants to test if dxvk is working
$(meson_use {,enable_}tests)

# portage won't strip .dll and it's ~150MB -> 22MB
$(usev !debug --strip)
)

meson_src_configure
}

multilib_src_install_all() {
dobin setup_dxvk.sh
dodoc README.md dxvk.conf

find "${ED}" -type f -name '*.a' -delete || die
}

pkg_postinst() {
if [[ ! ${REPLACING_VERSIONS} ]]; then
elog "To enable dxvk on a wine prefix, can run the following command:"
elog " WINEPREFIX=/path/to/prefix setup_dxvk.sh install --symlink"
elog "See ${EROOT}/usr/share/doc/${PF}/README.md* for details."
fi

# don't keep wine-*[vulkan] in RDEPEND to keep freedom of what will be used
# with (e.g. custom wine or even copy to real Windows), but give a warning
local wine
for wine in app-emulation/wine-{vanilla,staging}; do
has_version ${wine} && ! has_version ${wine}[vulkan] &&
ewarn "${wine} was not built with USE=vulkan, ${PN} will not be usable with it"
done
}
22 changes: 22 additions & 0 deletions app-emulation/dxvk/metadata.xml
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<maintainer type="person">
<email>ionen@gentoo.org</email>
<name>Ionen Wolkens</name>
</maintainer>
<use>
<flag name="crossdev-mingw">
Use <pkg>sys-devel/crossdev</pkg> for the toolchain rather than
<pkg>dev-util/mingw64-toolchain</pkg> (requires manual setting up)
</flag>
<flag name="d3d9">Enable support for DirectX 9 (d3d9.dll)</flag>
<flag name="d3d10">Enable support for DirectX 10 (d3d10.dll)</flag>
<flag name="d3d11">Enable support for DirectX 11 (d3d11.dll)</flag>
<flag name="dxgi">Enable support for the DirectX Graphics Infrastructure (dxgi.dll)</flag>
<flag name="tests">Install test executables</flag>
</use>
<upstream>
<remote-id type="github">doitsujin/dxvk</remote-id>
</upstream>
</pkgmetadata>

0 comments on commit 00b7912

Please sign in to comment.