| # Copyright 2023 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # @ECLASS: borealis-shader-cache-dlc.eclass |
| # @MAINTAINER: |
| # g/borealis-team, endlesspring@chromium.org, davidriley@chromium.org |
| # @BUGREPORTS: |
| # Please report bugs via |
| # https://issuetracker.google.com/issues/new?component=1149788 |
| # and CC endlesspring@chromium.org |
| # @VCSURL: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/HEAD/eclass/@ECLASS@ |
| # @BLURB: helper eclass for building Borealis shader cache DLC |
| # @DESCRIPTION: |
| # Shader cache cannot be crowdsourced in ChromeOS in Steam due to privacy |
| # and security reasons. Hence, we build and distribute shader cache to users |
| # via DLC. |
| |
| if [[ -z "${_ECLASS_BOREALIS_SHADER_CACHE_DLC}" ]]; then |
| |
| # Multiple inclusion protection. |
| _ECLASS_BOREALIS_SHADER_CACHE_DLC=1 |
| |
| # We use ESYSROOT (EAPI 7 onwards) to get dependency artifacts. |
| case ${EAPI} in |
| [0-6]) die "${ECLASS}: EAPI ${EAPI} not supported" ;; |
| *) ;; |
| esac |
| |
| # @ECLASS-VARIABLE: MESA_BUILD_ID |
| # @PRE_INHERIT |
| # @DESCRIPTION: |
| # Mesa GNU build ID to fetch precompiled cache for. |
| |
| # @ECLASS-VARIABLE: DEVICE_ID |
| # @PRE_INHERIT |
| # @DESCRIPTION: |
| # GPU Device ID to fetch precompiled cache for. |
| |
| if [[ -z "${MESA_BUILD_ID}" ]]; then |
| die "MESA_BUILD_ID must be defined by dlc" |
| elif [[ -z "${DEVICE_ID}" ]]; then |
| die "DEVICE_ID must be defined by dlc" |
| fi |
| |
| # @ECLASS-VARIABLE: GS_BUCKET |
| # @DESCRIPTION: |
| # GS bucket path to fetch precompiled cache from. |
| : "${GS_BUCKET:=chromeos-localmirror/distfiles/borealis/shader-cache-dlc}" |
| # @ECLASS-VARIABLE: MESA_DIR |
| # @DESCRIPTION: |
| # Directory name created by Mesa for precompiled cache. |
| : "${MESA_DIR:=mesa_shader_cache_sf}" |
| |
| inherit dlc |
| |
| # Expected DLC name format: |
| # borealis-shader-cache-<GAME_ID>-dlc-<VARIANT>-id-<SHADER_IDENTITY> |
| if [[ ! "${PN}" =~ ^borealis-shader-cache-[0-9]+-dlc-[a-z]+-id-[a-z]+$ ]]; then |
| eerror "${PN} does not match expected name format:" |
| eerror " borealis-shader-cache-<GAME_ID>-dlc-<VARIANT>-id-<SHADER_IDENTITY>" |
| die "Unexpected DLC package name format" |
| fi |
| GAME_ID="$(ver_cut 4 "${PN}")" |
| VARIANT="$(ver_cut 6 "${PN}")" |
| SHADER_IDENTITY="$(ver_cut 8 "${PN}")" |
| |
| # DLC_ID should be identity-less, so that shadercached does not have to figure |
| # out the identity (ebuild deps should distribute the right ones). |
| DLC_ID="${PN%-id*}" |
| |
| DESCRIPTION="Borealis shader cache for game ${GAME_ID}, variant ${SHADER_IDENTITY}-${VARIANT}" |
| HOMEPAGE="https://www.chromium.org/chromium-os/steam-on-chromeos/" |
| |
| RESTRICT="mirror" |
| |
| LICENSE="BSD-Google" |
| SLOT="0" |
| KEYWORDS="*" |
| |
| # It is expected that borealis_host and dlc are set as global use flags. |
| IUSE="borealis_host dlc" |
| REQUIRED_USE="borealis_host dlc" |
| |
| DEPEND="|| ( |
| media-libs/mesa-iris:= |
| media-libs/mesa-amd:= |
| )" |
| |
| RDEPEND="${DEPEND}" |
| |
| # 2GB = 2 x 512 x 512 x 4KB blocks. |
| DLC_PREALLOC_BLOCKS="$((2 * 512 * 512))" |
| |
| # Don't bother with testing all DLCs, so don't preload. |
| DLC_PRELOAD=false |
| # We have O(100) shader cache dlcs. |
| DLC_SCALED=true |
| |
| SRC_URI="gs://${GS_BUCKET}/${GAME_ID}/${GAME_ID}-${SHADER_IDENTITY}-${DEVICE_ID}-${MESA_BUILD_ID}.tar.gz" |
| S="${WORKDIR}" |
| |
| src_install() { |
| # cwd is "${S}", default src_unpack unpacked the tarball at cwd. |
| |
| # We don't need further paths inside the DLC, kabuto has packaged up |
| # the right path for us. |
| local dlc_path="$(dlc_add_path /)" |
| into "${dlc_path}" |
| insinto "${dlc_path}" |
| exeinto "${dlc_path}" |
| |
| # If the mesa hash mismatch, there is no point building the DLC since |
| # end-users won't be able to use them. Fail gracefully by creating an 'empty' |
| # dlc with dlc_build_error file. |
| local lib_dir="${ESYSROOT}/usr/$(get_libdir)" |
| # TODO(b/278626818): Reliably detect which mesa variant was built during |
| # borealis shader cache dlc builds. |
| local lib_file_name="libvulkan_radeon.so" |
| if [[ -f "${lib_dir}/libvulkan_intel.so" ]]; then |
| lib_file_name="libvulkan_intel.so" |
| fi |
| # The package's Mesa build id hash is the pinned value. |
| local pkg_mesa_build_id="${MESA_BUILD_ID}" |
| local local_mesa_build_id="$(readelf -n "${lib_dir}/${lib_file_name}" 2>/dev/null | awk '/Build ID:/{ print $NF; exit }')" |
| if [[ "${pkg_mesa_build_id}" != "${local_mesa_build_id}" ]]; then |
| # If Kabuto automation failed to build the correct shader cache, still allow |
| # the image to be built but do not include the DLC. |
| eerror "DLC Mesa hash mismatch, empty DLC created" |
| eerror " local: ${local_mesa_build_id}" |
| eerror " packaged: ${pkg_mesa_build_id}" |
| else |
| doins -r "${MESA_DIR}" |
| fi |
| |
| dlc_src_install |
| } |
| |
| fi |