diff mbox series

[RFC,v2,5/6] mesa: use simpler mesa-tools-native recipe as dependency for libclc

Message ID 20250721-mesa-libclc-panfrost-v2-5-f713d0858949@cherry.de
State Under Review
Headers show
Series mesa: lighten up target's libclc dependencies and fix panfrost support | expand

Commit Message

Quentin Schulz July 21, 2025, 10:33 a.m. UTC
From: Quentin Schulz <quentin.schulz@cherry.de>

libclc is required for some drivers (asahi, panfrost and intel at the
very least).
libclc brings very expensive dependencies such as llvm and clang.
Building clang and llvm for each target architecture is very expensive,
but mesa allows to depend on prebuilt host binaries (mesa-clc and
precomp-compiler). Those are built by mesa as well, but can be compiled
in mesa-native instead of mesa, making the dependency expensive but only
once regardless of the number of target architectures to build for.
Ideally the mesa-clc and precomp-compiler would only be compiled in
mesa-native if target mesa requires libclc support, however this is not
possible as a target recipe cannot impact or depend on a native recipe's
configuration. We thus have two choices, always build libclc in
mesa-native with its heavy dependencies and impact every build or force
the user to modify the mesa-native recipe in a custom layer (as a native
recipe cannot use target's OVERRIDES). The latter is unacceptable so the
former seems to be the only option. Another big downside is that
mesa-native currently builds drivers (amd, nouveau, svga) which we may
have absolutely no interest in building, increasing the build time and
possibly dependencies list).

A third choice is to spin-off the native mesa recipe with libclc support
into a new recipe without drivers and only what's necessary to build
mesa-clc and precomp-compiler binaries.
This allows to keep a "clean" mesa-native recipe for whoever needs those
drivers built-in (e.g. for testing, for qemu-native, or whatever else)
and only bring the libclc dependency when required by the target recipe.

Because libclc is now only built for the host, opencl support now needs
to explicitly bring libclc and others to build as libclc won't bring it
in the build environment anymore.

Suggested-by: Ross Burton <ross.burton@arm.com>
Signed-off-by: Quentin Schulz <quentin.schulz@cherry.de>
---
 meta/recipes-graphics/mesa/mesa-tools-native.bb | 21 +++++++++++++++++++++
 meta/recipes-graphics/mesa/mesa.inc             | 11 ++---------
 2 files changed, 23 insertions(+), 9 deletions(-)

Comments

Khem Raj July 22, 2025, 1:36 a.m. UTC | #1
On 7/21/25 3:33 AM, Quentin Schulz via lists.openembedded.org wrote:
> From: Quentin Schulz <quentin.schulz@cherry.de>
> 
> libclc is required for some drivers (asahi, panfrost and intel at the
> very least).
> libclc brings very expensive dependencies such as llvm and clang.
> Building clang and llvm for each target architecture is very expensive,
> but mesa allows to depend on prebuilt host binaries (mesa-clc and
> precomp-compiler). Those are built by mesa as well, but can be compiled
> in mesa-native instead of mesa, making the dependency expensive but only
> once regardless of the number of target architectures to build for.
> Ideally the mesa-clc and precomp-compiler would only be compiled in
> mesa-native if target mesa requires libclc support, however this is not
> possible as a target recipe cannot impact or depend on a native recipe's
> configuration. We thus have two choices, always build libclc in
> mesa-native with its heavy dependencies and impact every build or force
> the user to modify the mesa-native recipe in a custom layer (as a native
> recipe cannot use target's OVERRIDES). The latter is unacceptable so the
> former seems to be the only option. Another big downside is that
> mesa-native currently builds drivers (amd, nouveau, svga) which we may
> have absolutely no interest in building, increasing the build time and
> possibly dependencies list).
> 
> A third choice is to spin-off the native mesa recipe with libclc support
> into a new recipe without drivers and only what's necessary to build
> mesa-clc and precomp-compiler binaries.
> This allows to keep a "clean" mesa-native recipe for whoever needs those
> drivers built-in (e.g. for testing, for qemu-native, or whatever else)
> and only bring the libclc dependency when required by the target recipe.
> 
> Because libclc is now only built for the host, opencl support now needs
> to explicitly bring libclc and others to build as libclc won't bring it
> in the build environment anymore.
> 

libclc from clang ( native ) should be enough to use, we then do
not need target clang versions, since we are cross compiling 
clang-native would be happy to use libclc-native backend for OpenCL and that
would be all, we need to configure clang-native with AMDGPU and NVPTX
targets of course.

> Suggested-by: Ross Burton <ross.burton@arm.com>
> Signed-off-by: Quentin Schulz <quentin.schulz@cherry.de>
> ---
>   meta/recipes-graphics/mesa/mesa-tools-native.bb | 21 +++++++++++++++++++++
>   meta/recipes-graphics/mesa/mesa.inc             | 11 ++---------
>   2 files changed, 23 insertions(+), 9 deletions(-)
> 
> diff --git a/meta/recipes-graphics/mesa/mesa-tools-native.bb b/meta/recipes-graphics/mesa/mesa-tools-native.bb
> new file mode 100644
> index 0000000000000000000000000000000000000000..5f7c3a2dc2338e328e0e30b93c263f6c87b61eaa
> --- /dev/null
> +++ b/meta/recipes-graphics/mesa/mesa-tools-native.bb
> @@ -0,0 +1,21 @@
> +require mesa.inc
> +inherit native
> +
> +SUMMARY += " (tools only)"
> +
> +S = "${UNPACKDIR}/mesa-${PV}"
> +
> +PACKAGECONFIG = "tools asahi intel panfrost"
> +# llvm required for libclc
> +PACKAGECONFIG += "gallium-llvm"
> +# Doesn't compile without wayland-scanner if PLATFORMS has wayland in, and,
> +# doesn't compile at all if PLATFORMS is empty so add x11 and wayland
> +# to PACKAGECONFIG like in mesa.inc
> +PACKAGECONFIG += "${@bb.utils.filter('DISTRO_FEATURES', 'x11 wayland', d)}"
> +
> +DEPENDS += "libclc-native spirv-tools-native spirv-llvm-translator-native"
> +
> +EXTRA_OEMESON += " \
> +    -Dmesa-clc=enabled -Dinstall-mesa-clc=true -Dmesa-clc-bundle-headers=enabled \
> +    -Dprecomp-compiler=enabled -Dinstall-precomp-compiler=true \
> +"
> diff --git a/meta/recipes-graphics/mesa/mesa.inc b/meta/recipes-graphics/mesa/mesa.inc
> index 5295b70fc9b4bb9570d86333f9229aef9114d93d..0fdb6d19655a06b645c6ac8815dfc62fa7e0c9eb 100644
> --- a/meta/recipes-graphics/mesa/mesa.inc
> +++ b/meta/recipes-graphics/mesa/mesa.inc
> @@ -126,7 +126,7 @@ PACKAGECONFIG[egl] = "-Degl=enabled, -Degl=disabled"
>   
>   # "opencl" also requires libclc and gallium-llvm to be present in PKGCONFIG!
>   # Be sure to enable them both for the target and for the native build.
> -PACKAGECONFIG[opencl] = "-Dgallium-rusticl=true, -Dgallium-rusticl=false, bindgen-cli-native"
> +PACKAGECONFIG[opencl] = "-Dgallium-rusticl=true, -Dgallium-rusticl=false, bindgen-cli-native libclc spirv-tools spirv-llvm-translator"
>   
>   PACKAGECONFIG[broadcom] = ""
>   PACKAGECONFIG[etnaviv] = ",,python3-pycparser-native"
> @@ -165,16 +165,9 @@ GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'gallium-llvm', '
>   GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'amd', ',r600', '', d)}"
>   GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'virgl', ',virgl', '', d)}"
>   
> -MESA_CLC = "system"
> -MESA_CLC:class-native = "enabled"
> -INSTALL_MESA_CLC = "false"
> -INSTALL_MESA_CLC:class-native = "true"
> -MESA_NATIVE = "mesa-native"
> -MESA_NATIVE:class-native = ""
> -
>   PACKAGECONFIG[gallium] = "-Dgallium-drivers=${@strip_comma('${GALLIUMDRIVERS}')}, -Dgallium-drivers='', libdrm"
>   PACKAGECONFIG[gallium-llvm] = "-Dllvm=enabled -Dshared-llvm=enabled, -Dllvm=disabled, llvm llvm-native elfutils"
> -PACKAGECONFIG[libclc] = "-Dmesa-clc=${MESA_CLC} -Dinstall-mesa-clc=${INSTALL_MESA_CLC} -Dmesa-clc-bundle-headers=enabled,,libclc spirv-tools spirv-llvm-translator ${MESA_NATIVE}"
> +PACKAGECONFIG[libclc] = "-Dmesa-clc=system -Dprecomp-compiler=system,,mesa-tools-native"
>   PACKAGECONFIG[va] = "-Dgallium-va=enabled,-Dgallium-va=disabled,libva-initial"
>   PACKAGECONFIG[vdpau] = "-Dgallium-vdpau=enabled,-Dgallium-vdpau=disabled,libvdpau"
>   
> 
> 
> 
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#220678): https://lists.openembedded.org/g/openembedded-core/message/220678
> Mute This Topic: https://lists.openembedded.org/mt/114265791/1997914
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [raj.khem@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Dmitry Baryshkov July 22, 2025, 8 a.m. UTC | #2
On Mon, Jul 21, 2025 at 06:36:32PM -0700, Khem Raj wrote:
> 
> 
> On 7/21/25 3:33 AM, Quentin Schulz via lists.openembedded.org wrote:
> > From: Quentin Schulz <quentin.schulz@cherry.de>
> > 
> > libclc is required for some drivers (asahi, panfrost and intel at the
> > very least).
> > libclc brings very expensive dependencies such as llvm and clang.
> > Building clang and llvm for each target architecture is very expensive,
> > but mesa allows to depend on prebuilt host binaries (mesa-clc and
> > precomp-compiler). Those are built by mesa as well, but can be compiled
> > in mesa-native instead of mesa, making the dependency expensive but only
> > once regardless of the number of target architectures to build for.
> > Ideally the mesa-clc and precomp-compiler would only be compiled in
> > mesa-native if target mesa requires libclc support, however this is not
> > possible as a target recipe cannot impact or depend on a native recipe's
> > configuration. We thus have two choices, always build libclc in
> > mesa-native with its heavy dependencies and impact every build or force
> > the user to modify the mesa-native recipe in a custom layer (as a native
> > recipe cannot use target's OVERRIDES). The latter is unacceptable so the
> > former seems to be the only option. Another big downside is that
> > mesa-native currently builds drivers (amd, nouveau, svga) which we may
> > have absolutely no interest in building, increasing the build time and
> > possibly dependencies list).
> > 
> > A third choice is to spin-off the native mesa recipe with libclc support
> > into a new recipe without drivers and only what's necessary to build
> > mesa-clc and precomp-compiler binaries.
> > This allows to keep a "clean" mesa-native recipe for whoever needs those
> > drivers built-in (e.g. for testing, for qemu-native, or whatever else)
> > and only bring the libclc dependency when required by the target recipe.
> > 
> > Because libclc is now only built for the host, opencl support now needs
> > to explicitly bring libclc and others to build as libclc won't bring it
> > in the build environment anymore.
> > 
> 
> libclc from clang ( native ) should be enough to use, we then do
> not need target clang versions, since we are cross compiling clang-native
> would be happy to use libclc-native backend for OpenCL and that
> would be all, we need to configure clang-native with AMDGPU and NVPTX
> targets of course.

RustiCL needs target libLLVM and target libLLVMSPIRVLib, so it doesn't
make sense to hack it to use target clang, but libclc-native. Overall I
think this patch makes sense as is.

> 
> > Suggested-by: Ross Burton <ross.burton@arm.com>
> > Signed-off-by: Quentin Schulz <quentin.schulz@cherry.de>
> > ---
> >   meta/recipes-graphics/mesa/mesa-tools-native.bb | 21 +++++++++++++++++++++
> >   meta/recipes-graphics/mesa/mesa.inc             | 11 ++---------
> >   2 files changed, 23 insertions(+), 9 deletions(-)
> > 
> > diff --git a/meta/recipes-graphics/mesa/mesa-tools-native.bb b/meta/recipes-graphics/mesa/mesa-tools-native.bb
> > new file mode 100644
> > index 0000000000000000000000000000000000000000..5f7c3a2dc2338e328e0e30b93c263f6c87b61eaa
> > --- /dev/null
> > +++ b/meta/recipes-graphics/mesa/mesa-tools-native.bb
> > @@ -0,0 +1,21 @@
> > +require mesa.inc
> > +inherit native
> > +
> > +SUMMARY += " (tools only)"
> > +
> > +S = "${UNPACKDIR}/mesa-${PV}"
> > +
> > +PACKAGECONFIG = "tools asahi intel panfrost"
> > +# llvm required for libclc
> > +PACKAGECONFIG += "gallium-llvm"
> > +# Doesn't compile without wayland-scanner if PLATFORMS has wayland in, and,
> > +# doesn't compile at all if PLATFORMS is empty so add x11 and wayland
> > +# to PACKAGECONFIG like in mesa.inc
> > +PACKAGECONFIG += "${@bb.utils.filter('DISTRO_FEATURES', 'x11 wayland', d)}"
> > +
> > +DEPENDS += "libclc-native spirv-tools-native spirv-llvm-translator-native"
> > +
> > +EXTRA_OEMESON += " \
> > +    -Dmesa-clc=enabled -Dinstall-mesa-clc=true -Dmesa-clc-bundle-headers=enabled \
> > +    -Dprecomp-compiler=enabled -Dinstall-precomp-compiler=true \
> > +"
> > diff --git a/meta/recipes-graphics/mesa/mesa.inc b/meta/recipes-graphics/mesa/mesa.inc
> > index 5295b70fc9b4bb9570d86333f9229aef9114d93d..0fdb6d19655a06b645c6ac8815dfc62fa7e0c9eb 100644
> > --- a/meta/recipes-graphics/mesa/mesa.inc
> > +++ b/meta/recipes-graphics/mesa/mesa.inc
> > @@ -126,7 +126,7 @@ PACKAGECONFIG[egl] = "-Degl=enabled, -Degl=disabled"
> >   # "opencl" also requires libclc and gallium-llvm to be present in PKGCONFIG!

This is no longer true. With these changes it requires only gallium-llvm,
libclc PACKAGECONFIG is no longer required.

> >   # Be sure to enable them both for the target and for the native build.
> > -PACKAGECONFIG[opencl] = "-Dgallium-rusticl=true, -Dgallium-rusticl=false, bindgen-cli-native"
> > +PACKAGECONFIG[opencl] = "-Dgallium-rusticl=true, -Dgallium-rusticl=false, bindgen-cli-native libclc spirv-tools spirv-llvm-translator"
> >   PACKAGECONFIG[broadcom] = ""
> >   PACKAGECONFIG[etnaviv] = ",,python3-pycparser-native"
> > @@ -165,16 +165,9 @@ GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'gallium-llvm', '
> >   GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'amd', ',r600', '', d)}"
> >   GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'virgl', ',virgl', '', d)}"
> > -MESA_CLC = "system"
> > -MESA_CLC:class-native = "enabled"
> > -INSTALL_MESA_CLC = "false"
> > -INSTALL_MESA_CLC:class-native = "true"
> > -MESA_NATIVE = "mesa-native"
> > -MESA_NATIVE:class-native = ""
> > -
> >   PACKAGECONFIG[gallium] = "-Dgallium-drivers=${@strip_comma('${GALLIUMDRIVERS}')}, -Dgallium-drivers='', libdrm"
> >   PACKAGECONFIG[gallium-llvm] = "-Dllvm=enabled -Dshared-llvm=enabled, -Dllvm=disabled, llvm llvm-native elfutils"
> > -PACKAGECONFIG[libclc] = "-Dmesa-clc=${MESA_CLC} -Dinstall-mesa-clc=${INSTALL_MESA_CLC} -Dmesa-clc-bundle-headers=enabled,,libclc spirv-tools spirv-llvm-translator ${MESA_NATIVE}"
> > +PACKAGECONFIG[libclc] = "-Dmesa-clc=system -Dprecomp-compiler=system,,mesa-tools-native"
> >   PACKAGECONFIG[va] = "-Dgallium-va=enabled,-Dgallium-va=disabled,libva-initial"
> >   PACKAGECONFIG[vdpau] = "-Dgallium-vdpau=enabled,-Dgallium-vdpau=disabled,libvdpau"
> > 
> > 
> > 
> > -=-=-=-=-=-=-=-=-=-=-=-
> > Links: You receive all messages sent to this group.
> > View/Reply Online (#220678): https://lists.openembedded.org/g/openembedded-core/message/220678
> > Mute This Topic: https://lists.openembedded.org/mt/114265791/1997914
> > Group Owner: openembedded-core+owner@lists.openembedded.org
> > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [raj.khem@gmail.com]
> > -=-=-=-=-=-=-=-=-=-=-=-
> > 
> 
>
diff mbox series

Patch

diff --git a/meta/recipes-graphics/mesa/mesa-tools-native.bb b/meta/recipes-graphics/mesa/mesa-tools-native.bb
new file mode 100644
index 0000000000000000000000000000000000000000..5f7c3a2dc2338e328e0e30b93c263f6c87b61eaa
--- /dev/null
+++ b/meta/recipes-graphics/mesa/mesa-tools-native.bb
@@ -0,0 +1,21 @@ 
+require mesa.inc
+inherit native
+
+SUMMARY += " (tools only)"
+
+S = "${UNPACKDIR}/mesa-${PV}"
+
+PACKAGECONFIG = "tools asahi intel panfrost"
+# llvm required for libclc
+PACKAGECONFIG += "gallium-llvm"
+# Doesn't compile without wayland-scanner if PLATFORMS has wayland in, and,
+# doesn't compile at all if PLATFORMS is empty so add x11 and wayland
+# to PACKAGECONFIG like in mesa.inc
+PACKAGECONFIG += "${@bb.utils.filter('DISTRO_FEATURES', 'x11 wayland', d)}"
+
+DEPENDS += "libclc-native spirv-tools-native spirv-llvm-translator-native"
+
+EXTRA_OEMESON += " \
+    -Dmesa-clc=enabled -Dinstall-mesa-clc=true -Dmesa-clc-bundle-headers=enabled \
+    -Dprecomp-compiler=enabled -Dinstall-precomp-compiler=true \
+"
diff --git a/meta/recipes-graphics/mesa/mesa.inc b/meta/recipes-graphics/mesa/mesa.inc
index 5295b70fc9b4bb9570d86333f9229aef9114d93d..0fdb6d19655a06b645c6ac8815dfc62fa7e0c9eb 100644
--- a/meta/recipes-graphics/mesa/mesa.inc
+++ b/meta/recipes-graphics/mesa/mesa.inc
@@ -126,7 +126,7 @@  PACKAGECONFIG[egl] = "-Degl=enabled, -Degl=disabled"
 
 # "opencl" also requires libclc and gallium-llvm to be present in PKGCONFIG!
 # Be sure to enable them both for the target and for the native build.
-PACKAGECONFIG[opencl] = "-Dgallium-rusticl=true, -Dgallium-rusticl=false, bindgen-cli-native"
+PACKAGECONFIG[opencl] = "-Dgallium-rusticl=true, -Dgallium-rusticl=false, bindgen-cli-native libclc spirv-tools spirv-llvm-translator"
 
 PACKAGECONFIG[broadcom] = ""
 PACKAGECONFIG[etnaviv] = ",,python3-pycparser-native"
@@ -165,16 +165,9 @@  GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'gallium-llvm', '
 GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'amd', ',r600', '', d)}"
 GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'virgl', ',virgl', '', d)}"
 
-MESA_CLC = "system"
-MESA_CLC:class-native = "enabled"
-INSTALL_MESA_CLC = "false"
-INSTALL_MESA_CLC:class-native = "true"
-MESA_NATIVE = "mesa-native"
-MESA_NATIVE:class-native = ""
-
 PACKAGECONFIG[gallium] = "-Dgallium-drivers=${@strip_comma('${GALLIUMDRIVERS}')}, -Dgallium-drivers='', libdrm"
 PACKAGECONFIG[gallium-llvm] = "-Dllvm=enabled -Dshared-llvm=enabled, -Dllvm=disabled, llvm llvm-native elfutils"
-PACKAGECONFIG[libclc] = "-Dmesa-clc=${MESA_CLC} -Dinstall-mesa-clc=${INSTALL_MESA_CLC} -Dmesa-clc-bundle-headers=enabled,,libclc spirv-tools spirv-llvm-translator ${MESA_NATIVE}"
+PACKAGECONFIG[libclc] = "-Dmesa-clc=system -Dprecomp-compiler=system,,mesa-tools-native"
 PACKAGECONFIG[va] = "-Dgallium-va=enabled,-Dgallium-va=disabled,libva-initial"
 PACKAGECONFIG[vdpau] = "-Dgallium-vdpau=enabled,-Dgallium-vdpau=disabled,libvdpau"