package/mesa3d: add RustiCL support

RustiCL is an OpenCL implementation written entirely in
RUST and integrated into Mesa3D. It enables the use of OpenCL
programs on top of existing Gallium drivers. RustiCL is a
modern and maintainable replacement for the old C-implemention
Clover.

To build Rusticl in Mesa3D, the following components are required:

  - host-rustc (Rust compiler)
  - host-rust-bindgen (for generating bindings)
  - spirv-tools
  - spirv-llvm-translator (providing libLLVMSPIRVLib.so matching the LLVM version)
  - LLVM built with libclc and -DLLVM_ENABLE_DUMP=ON
  - Mesa headers via mesa-clc-bundle-headers=enabled
  - There is a known meson bug and in order to fix it we set -Drust_std=2021, see:
    https://docs.mesa3d.org/rusticl.html#known-issues
    https://github.com/mesonbuild/meson/issues/10664

More details in the Mesa documentation:
https://docs.mesa3d.org/rusticl.html

Rusticl is the provider of OpenCL in Buildroot.
However, Mesa does not provide the `libOpenCL.so` library itself.
We therefore depend on the `opencl-icd-loader` package to
install this loader in the toolchain sysroot, so that other
OpenCL-dependent packages can build and link against it.

Without the ICD loader, only `libRustiOpenCL.so` is available and
tools like `clinfo` or `clpeak` fail.

- 'Dmesa-clc-bundle-headers=enabled' ensures that the OpenCL header
   files are bundled and available in the target. Without this,
   runtime compilation of OpenCL kernels via clpeak or clinfo fails
   with:
	fatal error: 'opencl-c-base.h' file not found

see 3619611b31

We add a Rust compiler override to Meson to use Buildroot’s
host Rust toolchain using MESA3D_MESON_EXTRA_BINARIES.
Rusticl requires Meson to invoke rustc with the correct target and linker:
    * 'rust=['$(HOST_DIR)/bin/rustc','--target=$(RUSTC_TARGET_NAME)']'
    * 'rust_ld='$(TARGET_CROSS)gcc''
Another solution was proposed to set rust and rust_ld globally in
cross-compilation.conf, we prefer to define them locally within mesa
for now to ensure precise control over the rust toolchain behavior
during the Mesa build.

see https://lore.kernel.org/buildroot/ZcOeEMfwX4XlRXO7@landeda/

Currently, we should always use RUSTICL_ENABLE= driver to use rusticl.
More information:
https://docs.mesa3d.org/envvars.html#envvar-RUSTICL_ENABLE

Signed-off-by: El Mehdi YOUNES <elmehdi.younes@smile.fr>
[Julien: add references to meson bug]
Signed-off-by: Julien Olivain <ju.o@free.fr>
This commit is contained in:
El Mehdi YOUNES
2025-06-06 09:01:51 +02:00
committed by Julien Olivain
parent d2a82364ac
commit fc7c7d74aa
2 changed files with 57 additions and 5 deletions

View File

@@ -50,19 +50,43 @@ comment "llvm support needs a toolchain not affected by GCC bug 64735"
depends on BR2_PACKAGE_LLVM_ARCH_SUPPORTS
depends on BR2_TOOLCHAIN_HAS_GCC_BUG_64735
# clang and libclc dependencies are satisfied by
# BR2_PACKAGE_MESA3D_LLVM
config BR2_PACKAGE_MESA3D_OPENCL
menuconfig BR2_PACKAGE_MESA3D_OPENCL
bool "OpenCL support"
depends on BR2_PACKAGE_MESA3D_LLVM
depends on BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600 || \
BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST || \
BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI || \
BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS
BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS || \
BR2_PACKAGE_HOST_RUSTC_TARGET_ARCH_SUPPORTS && \
BR2_PACKAGE_MESA3D_RUSTICL_SUPPORTED_DRIVER
select BR2_PACKAGE_LLVM_RTTI
select BR2_PACKAGE_CLANG
select BR2_PACKAGE_LIBCLC
select BR2_PACKAGE_HAS_LIBOPENCL
if BR2_PACKAGE_MESA3D_OPENCL
# libclc dependency is satisfied by
# BR2_PACKAGE_MESA3D_LLVM
config BR2_PACKAGE_MESA3D_RUSTICL
bool "RustiCL"
depends on BR2_PACKAGE_HOST_RUSTC_TARGET_ARCH_SUPPORTS
depends on BR2_PACKAGE_MESA3D_RUSTICL_SUPPORTED_DRIVER
select BR2_PACKAGE_HOST_RUSTC
select BR2_PACKAGE_LLVM_DUMP
select BR2_PACKAGE_SPIRV_TOOLS
select BR2_PACKAGE_SPIRV_LLVM_TRANSLATOR
select BR2_PACKAGE_OPENCL_ICD_LOADER
help
RustiCL is an OpenCL implementation written in Rust.
By default, devices are disabled in RustiCL. If you want
to enable a device, you need to set the environment variable
RUSTICL_ENABLE to the driver you are using.
https://docs.mesa3d.org/envvars.html#envvar-RUSTICL_ENABLE
endif # BR2_PACKAGE_MESA3D_OPENCL
config BR2_PACKAGE_MESA3D_RUSTICL_SUPPORTED_DRIVER
bool
# inform the .mk file of gallium or vulkan driver selection
config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
@@ -139,6 +163,7 @@ config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS
depends on BR2_PACKAGE_MESA3D_LLVM
select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
select BR2_PACKAGE_MESA3D_NEEDS_PRECOMP_COMPILER
select BR2_PACKAGE_MESA3D_RUSTICL_SUPPORTED_DRIVER
help
Mesa driver for iris-based Intel GPUs.
@@ -157,6 +182,7 @@ config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_LLVMPIPE
bool "Gallium llvmpipe driver"
depends on BR2_PACKAGE_MESA3D_LLVM
select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
select BR2_PACKAGE_MESA3D_RUSTICL_SUPPORTED_DRIVER
help
This is a llvm opengl implementation using the Gallium3D
infrastructure.
@@ -170,6 +196,7 @@ config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_NOUVEAU
select BR2_PACKAGE_LIBDRM_NOUVEAU
select BR2_PACKAGE_MESA3D_NEEDS_XA
select BR2_PACKAGE_LLVM_RTTI if BR2_PACKAGE_MESA3D_LLVM
select BR2_PACKAGE_MESA3D_RUSTICL_SUPPORTED_DRIVER
help
Supports all Nvidia GPUs.
@@ -179,6 +206,7 @@ config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST
depends on BR2_PACKAGE_MESA3D_LLVM
select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
select BR2_PACKAGE_MESA3D_NEEDS_PRECOMP_COMPILER
select BR2_PACKAGE_MESA3D_RUSTICL_SUPPORTED_DRIVER
help
Mesa driver for ARM Mali Midgard and Bifrost GPUs.
@@ -229,6 +257,7 @@ config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI
select BR2_PACKAGE_LLVM_AMDGPU
select BR2_PACKAGE_ELFUTILS
select BR2_PACKAGE_MESA3D_NEEDS_ELFUTILS
select BR2_PACKAGE_MESA3D_RUSTICL_SUPPORTED_DRIVER
help
Driver for ATI/AMD Radeon HD7000/HD8000/Rx200 GPUs.

View File

@@ -30,7 +30,6 @@ MESA3D_DEPENDENCIES = \
zlib
MESA3D_CONF_OPTS = \
-Dgallium-rusticl=false \
-Dmicrosoft-clc=disabled
ifeq ($(BR2_PACKAGE_MESA3D_DRIVER)$(BR2_PACKAGE_XORG7),yy)
@@ -56,6 +55,30 @@ MESA3D_PROVIDES += libopencl
MESA3D_DEPENDENCIES += clang libclc
endif
ifeq ($(BR2_PACKAGE_MESA3D_RUSTICL),y)
MESA3D_DEPENDENCIES += \
host-rustc \
host-rust-bindgen \
spirv-tools \
spirv-llvm-translator \
opencl-icd-loader
# rust_std is defined here to workaround a known meson bug. See:
# https://docs.mesa3d.org/rusticl.html#known-issues
# https://github.com/mesonbuild/meson/issues/10664
MESA3D_CONF_OPTS += \
-Dgallium-rusticl=true \
-Drust_std=2021 \
-Dmesa-clc-bundle-headers=enabled
MESA3D_MESON_EXTRA_BINARIES += \
rust=['$(HOST_DIR)/bin/rustc','--target=$(RUSTC_TARGET_NAME)'] \
rust_ld='$(TARGET_CROSS)gcc'
else
MESA3D_CONF_OPTS += -Dgallium-rusticl=false
endif
ifeq ($(BR2_PACKAGE_MESA3D_NEEDS_ELFUTILS),y)
MESA3D_DEPENDENCIES += elfutils
endif