# Copyright 2022-2026 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 EAPI=8 PYTHON_COMPAT=( python3_{12..15} ) PYTHON_REQ_USE="ssl" inherit linux-info optfeature python-single-r1 systemd xdg # waydroid commit the NVIDIA patch is applied against _WAYDROID_SHA="a33a5c0b31d89d6ce687381104b30aff4dd2d330" DESCRIPTION="Waydroid with full NVIDIA GPU acceleration via Mesa Venus/vtest" HOMEPAGE="https://github.com/Shiro836/waydroid-nvidia" SRC_URI=" https://github.com/Shiro836/waydroid-nvidia/archive/refs/tags/v${PV}.tar.gz -> ${P}.tar.gz https://github.com/waydroid/waydroid/archive/${_WAYDROID_SHA}.tar.gz -> waydroid-${_WAYDROID_SHA:0:8}.tar.gz https://github.com/Shiro836/waydroid-nvidia/releases/download/v${PV}/waydroid-nvidia-host-x86_64-v${PV}.tar.zst -> ${P}-host-x86_64.tar.zst https://github.com/Shiro836/waydroid-nvidia/releases/download/v${PV}/waydroid-nvidia-guest-android-x86_64-v${PV}.tar.zst -> ${P}-guest-android.tar.zst https://github.com/Shiro836/waydroid-nvidia/releases/download/v${PV}/waydroid-nvidia-guest-prebuilts-v${PV}.tar.zst -> ${P}-guest-prebuilts.tar.zst " S="${WORKDIR}/${PN}-${PV}" LICENSE="GPL-3+" SLOT="0" KEYWORDS="amd64" REQUIRED_USE="${PYTHON_REQUIRED_USE}" IUSE="apparmor" # Conflicts: provides the same waydroid binary (patched for NVIDIA) RDEPEND="${PYTHON_DEPS} !app-containers/waydroid app-containers/lxc[apparmor?,seccomp] dev-libs/expat x11-libs/libdrm media-libs/libepoxy media-libs/mesa media-libs/vulkan-loader net-firewall/nftables net-dns/dnsmasq[dhcp] sys-devel/binutils sys-apps/dbus sys-auth/polkit virtual/notification-daemon x11-libs/gtk+:3[introspection,wayland] x11-libs/libX11 x11-themes/hicolor-icon-theme $(python_gen_cond_dep ' dev-python/dbus-python[${PYTHON_USEDEP}] >=dev-python/gbinder-1.3.0[${PYTHON_USEDEP}] dev-python/pygobject[${PYTHON_USEDEP}] ') || ( media-video/pipewire[sound-server] media-sound/pulseaudio-daemon ) " BDEPEND="app-arch/zstd" # Pre-built host (virglrenderer) and guest (Android Mesa/ANGLE/HWC) binaries RESTRICT="strip" QA_PREBUILT=" usr/lib/waydroid-nvidia/virgl_test_server usr/lib/waydroid-nvidia/virgl_render_server usr/lib/waydroid-nvidia/libvirglrenderer.so.1 usr/lib/waydroid-nvidia/guest/* " CONFIG_CHECK=" ~ANDROID_BINDER_IPC ~ANDROID_BINDERFS ~MEMFD_CREATE ~NETFILTER_XT_TARGET_MASQUERADE ~NETFILTER_XT_NAT ~PSI ~!PSI_DEFAULT_DISABLED ~NF_TABLES ~NF_TABLES_INET ~NF_TABLES_NETDEV ~NFT_NUMGEN ~NFT_NAT ~NFT_TUNNEL ~NFT_QUOTA ~NFT_SOCKET ~NF_FLOW_TABLE ~NFT_BRIDGE_META ~NFT_BRIDGE_REJECT ~UDMABUF " ERROR_UDMABUF="CONFIG_UDMABUF: needed for /dev/udmabuf — the Venus gralloc allocates CPU-mappable buffers through it" pkg_setup() { linux-info_pkg_setup python-single-r1_pkg_setup } src_unpack() { unpack "${P}.tar.gz" unpack "waydroid-${_WAYDROID_SHA:0:8}.tar.gz" mkdir -p "${WORKDIR}/host" "${WORKDIR}/guest" || die # Android-relative paths in the tarballs require explicit extraction dirs tar -C "${WORKDIR}/host" -xf "${DISTDIR}/${P}-host-x86_64.tar.zst" || die tar -C "${WORKDIR}/guest" -xf "${DISTDIR}/${P}-guest-android.tar.zst" || die tar -C "${WORKDIR}/guest" -xf "${DISTDIR}/${P}-guest-prebuilts.tar.zst" || die } src_prepare() { local waydroid_src="${WORKDIR}/waydroid-${_WAYDROID_SHA}" pushd "${waydroid_src}" > /dev/null || die eapply "${S}/patches/waydroid/0001-nvidia-integration.patch" if ! use apparmor; then # https://github.com/waydroid/waydroid/issues/652 sed -e '/^lxc\.apparmor\.profile =/d' \ -i data/configs/config_3 || die fi popd > /dev/null || die default } src_install() { local waydroid_src="${WORKDIR}/waydroid-${_WAYDROID_SHA}" local pkg_aur="${S}/packaging/aur/waydroid-nvidia-bin" # 1. Patched waydroid (same layout as app-containers/waydroid) pushd "${waydroid_src}" > /dev/null || die python_fix_shebang waydroid.py local mymakeargs=( DESTDIR="${D}" PREFIX="${EPREFIX}"/usr SYSD_DIR="$(systemd_get_systemunitdir)" USE_NFTABLES=1 USE_SYSTEMD=1 ) emake "${mymakeargs[@]}" install install_apparmor popd > /dev/null || die newinitd "${FILESDIR}/waydroid.initd" waydroid # 2. Host Venus renderer (private libdir; wd-venus.service sets LD_LIBRARY_PATH) exeinto /usr/lib/waydroid-nvidia doexe "${WORKDIR}"/host/virgl_test_server "${WORKDIR}"/host/virgl_render_server \ "${WORKDIR}"/host/libvirglrenderer.so.1 # 3. Guest driver stack — preserve Android-relative lib/lib64 paths local guest_libs=( vendor/lib/hw/vulkan.virtio.so vendor/lib/egl/libEGL_angle.so vendor/lib/egl/libGLESv1_CM_angle.so vendor/lib/egl/libGLESv2_angle.so vendor/lib64/hw/vulkan.virtio.so vendor/lib64/egl/libEGL_angle.so vendor/lib64/egl/libGLESv1_CM_angle.so vendor/lib64/egl/libGLESv2_angle.so vendor/lib64/libgbm_mesa_wrapper.so vendor/lib64/hw/hwcomposer.waydroid.so ) local rel for rel in "${guest_libs[@]}"; do insinto "/usr/lib/waydroid-nvidia/guest/${rel%/*}" doins "${WORKDIR}/guest/${rel}" done exeinto /usr/lib/waydroid-nvidia/guest/system/bin doexe "${WORKDIR}"/guest/system/bin/surfaceflinger # 4. Host integration systemd_douserunit "${pkg_aur}/wd-venus.service" dobin "${pkg_aur}/waydroid-nvidia-setup" insinto /usr/lib/udev/rules.d newins "${pkg_aur}/waydroid-nvidia.rules" 70-waydroid-nvidia.rules } pkg_postinst() { xdg_pkg_postinst elog "After installation:" elog " 1. Initialize waydroid: waydroid init" elog " 2. Run the NVIDIA setup: sudo waydroid-nvidia-setup" elog " 3. Enable the container: rc-service waydroid start" elog " 4. Start the Venus server: systemctl --user enable --now wd-venus" elog " 5. Start the session: waydroid session start" elog elog "Requirements: nvidia-open kernel modules + nvidia_drm.modeset=1" elog "See https://github.com/Shiro836/waydroid-nvidia for full documentation" elog if use apparmor; then ewarn "Check the known issues for apparmor:" ewarn "https://docs.waydro.id/debugging/known-issues" fi optfeature "clipboard support" "dev-python/pyclip[wayland]" optfeature "NVIDIA proprietary driver (required for GPU acceleration)" "x11-drivers/nvidia-drivers" } pkg_config() { "${EROOT}"/usr/bin/waydroid init }