1SUMMARY = "A free implementation of the OpenGL API"
2DESCRIPTION = "Mesa is an open-source implementation of the OpenGL specification - \
3a system for rendering interactive 3D graphics.  \
4A variety of device drivers allows Mesa to be used in many different environments \
5ranging from software emulation to complete hardware acceleration for modern GPUs. \
6Mesa is used as part of the overall Direct Rendering Infrastructure and X.org \
7environment."
8
9HOMEPAGE = "http://mesa3d.org"
10BUGTRACKER = "https://bugs.freedesktop.org"
11SECTION = "x11"
12LICENSE = "MIT"
13LIC_FILES_CHKSUM = "file://docs/license.rst;md5=63779ec98d78d823a9dc533a0735ef10"
14
15PE = "2"
16
17SRC_URI = "https://mesa.freedesktop.org/archive/mesa-${PV}.tar.xz \
18           file://0001-meson.build-check-for-all-linux-host_os-combinations.patch \
19           file://0001-meson-misdetects-64bit-atomics-on-mips-clang.patch \
20           file://0001-gallium-Fix-build-with-llvm-17.patch \
21"
22
23SRC_URI[sha256sum] = "f387192b08c471c545590dd12230a2a343244804b5fe866fec6aea02eab57613"
24
25UPSTREAM_CHECK_GITTAGREGEX = "mesa-(?P<pver>\d+(\.\d+)+)"
26
27#because we cannot rely on the fact that all apps will use pkgconfig,
28#make eglplatform.h independent of MESA_EGL_NO_X11_HEADER
29do_install:append() {
30  # sed can't find EGL/eglplatform.h as it doesn't get installed when glvnd enabled.
31  # So, check if EGL/eglplatform.h exists before running sed.
32  if ${@bb.utils.contains('PACKAGECONFIG', 'egl', 'true', 'false', d)} && [ -f ${D}${includedir}/EGL/eglplatform.h ]; then
33      sed -i -e 's/^#elif defined(__unix__) && defined(EGL_NO_X11)$/#elif defined(__unix__) \&\& defined(EGL_NO_X11) || ${@bb.utils.contains('PACKAGECONFIG', 'x11', '0', '1', d)}/' ${D}${includedir}/EGL/eglplatform.h
34  fi
35}
36
37DEPENDS = "expat makedepend-native flex-native bison-native libxml2-native zlib chrpath-replacement-native python3-mako-native gettext-native"
38DEPENDS:append:class-target = " ${@bb.utils.contains('PACKAGECONFIG', 'opencl', 'mesa-native', '', d)}"
39EXTRANATIVEPATH += "chrpath-native"
40PROVIDES = " \
41    ${@bb.utils.contains('PACKAGECONFIG', 'opengl', 'virtual/libgl', '', d)} \
42    ${@bb.utils.contains('PACKAGECONFIG', 'glvnd', 'virtual/libglx', '', d)} \
43    ${@bb.utils.contains('PACKAGECONFIG', 'gles', 'virtual/libgles1 virtual/libgles2 virtual/libgles3', '', d)} \
44    ${@bb.utils.contains('PACKAGECONFIG', 'egl', 'virtual/egl', '', d)} \
45    ${@bb.utils.contains('PACKAGECONFIG', 'gbm', 'virtual/libgbm', '', d)} \
46    virtual/mesa \
47    "
48
49inherit meson pkgconfig python3native gettext features_check
50
51BBCLASSEXTEND = "native nativesdk"
52
53ANY_OF_DISTRO_FEATURES = "opengl vulkan"
54
55PLATFORMS ??= "${@bb.utils.filter('PACKAGECONFIG', 'x11 wayland', d)}"
56
57# set the MESA_BUILD_TYPE to either 'release' (default) or 'debug'
58# by default the upstream mesa sources build a debug release
59# here we assume the user will want a release build by default
60MESA_BUILD_TYPE ?= "release"
61def check_buildtype(d):
62    _buildtype = d.getVar('MESA_BUILD_TYPE')
63    if _buildtype not in ['release', 'debug']:
64        bb.fatal("unknown build type (%s), please set MESA_BUILD_TYPE to either 'release' or 'debug'" % _buildtype)
65    if _buildtype == 'debug':
66        return 'debugoptimized'
67    return 'plain'
68MESON_BUILDTYPE = "${@check_buildtype(d)}"
69
70EXTRA_OEMESON = " \
71    -Dshared-glapi=enabled \
72    -Dglx-read-only-text=true \
73    -Dplatforms='${@",".join("${PLATFORMS}".split())}' \
74"
75
76EXTRA_OEMESON:append:class-target = " ${@bb.utils.contains('PACKAGECONFIG', 'opencl', '-Dintel-clc=system', '', d)}"
77EXTRA_OEMESON:append:class-native = " ${@bb.utils.contains('PACKAGECONFIG', 'opencl', '-Dintel-clc=enabled', '', d)}"
78
79def strip_comma(s):
80    return s.strip(',')
81
82PACKAGECONFIG = " \
83	gallium \
84	video-codecs \
85	${@bb.utils.filter('DISTRO_FEATURES', 'x11 vulkan wayland', d)} \
86	${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'opengl egl gles gbm virgl', '', d)} \
87	${@bb.utils.contains('DISTRO_FEATURES', 'x11 opengl', 'dri3', '', d)} \
88	${@bb.utils.contains('DISTRO_FEATURES', 'x11 vulkan', 'dri3', '', d)} \
89	${@bb.utils.contains('DISTRO_FEATURES', 'vulkan', 'zink', '', d)} \
90"
91
92PACKAGECONFIG:append:class-native = "gallium-llvm r600"
93
94# "gbm" requires "opengl"
95PACKAGECONFIG[gbm] = "-Dgbm=enabled,-Dgbm=disabled"
96
97X11_DEPS = "xorgproto virtual/libx11 libxext libxxf86vm libxdamage libxfixes xrandr"
98# "x11" requires "opengl"
99PACKAGECONFIG[x11] = ",-Dglx=disabled,${X11_DEPS}"
100PACKAGECONFIG[wayland] = ",,wayland-native wayland libdrm wayland-protocols"
101
102PACKAGECONFIG[dri3] = "-Ddri3=enabled, -Ddri3=disabled, xorgproto libxshmfence"
103
104# Vulkan drivers need dri3 enabled
105# amd could be enabled as well but requires gallium-llvm with llvm >= 3.9
106VULKAN_DRIVERS = ""
107VULKAN_DRIVERS:append:x86 = ",intel,amd"
108VULKAN_DRIVERS:append:x86-64 = ",intel,amd"
109# i686 is a 32 bit override for mesa-native
110VULKAN_DRIVERS:append:i686 = ",intel,amd"
111VULKAN_DRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'freedreno', ',freedreno', '', d)}"
112VULKAN_DRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'broadcom', ',broadcom', '', d)}"
113VULKAN_DRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'gallium-llvm', ',swrast', '', d)}"
114PACKAGECONFIG[vulkan] = "-Dvulkan-drivers=${@strip_comma('${VULKAN_DRIVERS}')}, -Dvulkan-drivers='',glslang-native vulkan-loader vulkan-headers"
115
116# mesa development and testing tools support, per driver
117TOOLS = ""
118TOOLS_DEPS = ""
119TOOLS:append = "${@bb.utils.contains('PACKAGECONFIG', 'etnaviv', ',etnaviv', '', d)}"
120TOOLS:append = "${@bb.utils.contains('PACKAGECONFIG', 'freedreno', ',freedreno', '', d)}"
121TOOLS:append = "${@bb.utils.contains('PACKAGECONFIG', 'lima', ',lima', '', d)}"
122TOOLS:append = "${@bb.utils.contains('PACKAGECONFIG', 'panfrost', ',panfrost', '', d)}"
123
124# dependencies for tools.
125TOOLS_DEPS:append = "${@bb.utils.contains('PACKAGECONFIG', 'freedreno', ' ncurses libxml2 ', '', d)}"
126
127# the fdperf tool requires libconfig (a part of meta-oe) so it needs special
128# treatment in addition to the usual 'freedreno tools'.
129PACKAGECONFIG[freedreno-fdperf] = ",,libconfig"
130
131PACKAGECONFIG[tools] = "-Dtools=${@strip_comma('${TOOLS}')}, -Dtools='', ${TOOLS_DEPS}"
132
133PACKAGECONFIG[opengl] = "-Dopengl=true, -Dopengl=false"
134PACKAGECONFIG[glvnd] = "-Dglvnd=true, -Dglvnd=false, libglvnd"
135
136# "gles" requires "opengl"
137PACKAGECONFIG[gles] = "-Dgles1=enabled -Dgles2=enabled, -Dgles1=disabled -Dgles2=disabled"
138
139# "egl" requires "opengl"
140PACKAGECONFIG[egl] = "-Degl=enabled, -Degl=disabled"
141
142# "opencl" requires libclc from meta-clang and spirv-tools from OE-Core
143OPENCL_NATIVE = "${@bb.utils.contains('PACKAGECONFIG', 'freedreno', '-Dopencl-native=true', '', d)}"
144PACKAGECONFIG[opencl] = "-Dgallium-opencl=icd -Dopencl-spirv=true ${OPENCL_NATIVE},-Dgallium-opencl=disabled -Dopencl-spirv=false,libclc spirv-tools python3-ply-native"
145
146PACKAGECONFIG[broadcom] = ""
147PACKAGECONFIG[etnaviv] = ""
148PACKAGECONFIG[freedreno] = ""
149PACKAGECONFIG[kmsro] = ""
150PACKAGECONFIG[vc4] = ""
151PACKAGECONFIG[v3d] = ""
152PACKAGECONFIG[zink] = ""
153
154GALLIUMDRIVERS = "swrast"
155# gallium swrast was found to crash Xorg on startup in x32 qemu
156GALLIUMDRIVERS:x86-x32 = ""
157GALLIUMDRIVERS:append:x86 = ",i915,iris,crocus"
158GALLIUMDRIVERS:append:x86-64 = ",i915,iris,crocus"
159# i686 is a 32 bit override for mesa-native
160GALLIUMDRIVERS:append:i686 = ",i915,iris,crocus"
161
162GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'etnaviv', ',etnaviv', '', d)}"
163GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'freedreno', ',freedreno', '', d)}"
164GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'kmsro', ',kmsro', '', d)}"
165GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'vc4', ',vc4', '', d)}"
166GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'v3d', ',v3d', '', d)}"
167GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'zink', ',zink', '', d)}"
168
169# radeonsi requires LLVM
170GALLIUMDRIVERS_RADEONSI = "${@bb.utils.contains('PACKAGECONFIG', 'r600', ',radeonsi', '', d)}"
171GALLIUMDRIVERS_LLVM = ",r300,nouveau${GALLIUMDRIVERS_RADEONSI}"
172GALLIUMDRIVERS_LLVM:append:x86 = ",svga"
173GALLIUMDRIVERS_LLVM:append:x86-64 = ",svga"
174# i686 is a 32 bit override for mesa-native
175GALLIUMDRIVERS_LLVM:append:i686 = ",svga"
176
177PACKAGECONFIG[r600] = ""
178PACKAGECONFIG[virgl] = ""
179
180GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'gallium-llvm', '${GALLIUMDRIVERS_LLVM}', '', d)}"
181GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'r600', ',r600', '', d)}"
182GALLIUMDRIVERS:append = "${@bb.utils.contains('PACKAGECONFIG', 'virgl', ',virgl', '', d)}"
183
184PACKAGECONFIG[gallium] = "-Dgallium-drivers=${@strip_comma('${GALLIUMDRIVERS}')}, -Dgallium-drivers='', libdrm"
185PACKAGECONFIG[gallium-llvm] = "-Dllvm=enabled -Dshared-llvm=enabled, -Dllvm=disabled, llvm llvm-native elfutils"
186PACKAGECONFIG[xa]  = "-Dgallium-xa=enabled, -Dgallium-xa=disabled"
187PACKAGECONFIG[va] = "-Dgallium-va=enabled,-Dgallium-va=disabled,libva-initial"
188PACKAGECONFIG[vdpau] = "-Dgallium-vdpau=enabled,-Dgallium-vdpau=disabled,libvdpau"
189
190PACKAGECONFIG[lima] = ""
191GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'lima', ',lima', '', d)}"
192
193PACKAGECONFIG[panfrost] = ""
194GALLIUMDRIVERS:append ="${@bb.utils.contains('PACKAGECONFIG', 'panfrost', ',panfrost', '', d)}"
195
196PACKAGECONFIG[vulkan-beta] = "-Dvulkan-beta=true,-Dvulkan-beta=false"
197
198PACKAGECONFIG[osmesa] = "-Dosmesa=true,-Dosmesa=false"
199
200PACKAGECONFIG[perfetto] = "-Dperfetto=true,-Dperfetto=false,libperfetto"
201
202PACKAGECONFIG[unwind] = "-Dlibunwind=enabled,-Dlibunwind=disabled,libunwind"
203
204PACKAGECONFIG[lmsensors] = "-Dlmsensors=enabled,-Dlmsensors=disabled,lmsensors"
205
206VIDEO_CODECS ?= "${@bb.utils.contains('LICENSE_FLAGS_ACCEPTED', 'commercial', 'all', 'all_free', d)}"
207PACKAGECONFIG[video-codecs] = "-Dvideo-codecs=${VIDEO_CODECS}, -Dvideo-codecs=''"
208
209# llvmpipe is slow if compiled with -fomit-frame-pointer (e.g. -O2)
210FULL_OPTIMIZATION:append = " -fno-omit-frame-pointer"
211
212CFLAGS:append:armv5 = " -DMISSING_64BIT_ATOMICS"
213CFLAGS:append:armv6 = " -DMISSING_64BIT_ATOMICS"
214
215# Remove the mesa dependency on mesa-dev, as mesa is empty
216DEV_PKG_DEPENDENCY = ""
217
218# Khronos documentation says that include/GLES2/gl2ext.h can be used for
219# OpenGL ES 3 specification as well as for OpenGL ES 2.
220# There can be applications including GLES2/gl2ext.h instead of GLES3/gl3ext.h
221# meaning we should probably bring in GLES2/gl2ext.h if someone asks for
222# development package of libgles3.
223RDEPENDS:libgles3-mesa-dev += "libgles2-mesa-dev"
224
225RDEPENDS:libopencl-mesa += "${@bb.utils.contains('PACKAGECONFIG', 'opencl', 'libclc spirv-tools', '', d)}"
226
227PACKAGES =+ "libegl-mesa libegl-mesa-dev \
228             libosmesa libosmesa-dev \
229             libgl-mesa libgl-mesa-dev \
230             libglx-mesa libglx-mesa-dev \
231             libglapi libglapi-dev \
232             libgbm libgbm-dev \
233             libgles1-mesa libgles1-mesa-dev \
234             libgles2-mesa libgles2-mesa-dev \
235             libgles3-mesa libgles3-mesa-dev \
236             libopencl-mesa libopencl-mesa-dev \
237             libxatracker libxatracker-dev \
238             mesa-megadriver mesa-vulkan-drivers \
239             mesa-vdpau-drivers mesa-tools \
240            "
241
242do_install:append () {
243    # Drivers never need libtool .la files
244    rm -f ${D}${libdir}/dri/*.la
245    rm -f ${D}${libdir}/egl/*.la
246    rm -f ${D}${libdir}/gallium-pipe/*.la
247    rm -f ${D}${libdir}/gbm/*.la
248
249    # libwayland-egl has been moved to wayland 1.15+
250    rm -f ${D}${libdir}/libwayland-egl*
251    rm -f ${D}${libdir}/pkgconfig/wayland-egl.pc
252}
253
254do_install:append:class-native () {
255    if ${@bb.utils.contains('PACKAGECONFIG', 'opencl', 'true', 'false', d)}; then
256        install -d ${D}${bindir}
257        install -m0755 ${B}/src/intel/compiler/intel_clc ${D}${bindir}
258    fi
259}
260
261# For the packages that make up the OpenGL interfaces, inject variables so that
262# they don't get Debian-renamed (which would remove the -mesa suffix), and
263# RPROVIDEs/RCONFLICTs on the generic libgl name.
264python __anonymous() {
265    pkgconfig = (d.getVar('PACKAGECONFIG') or "").split()
266    suffix = ""
267    if "-native" in d.getVar("PN"):
268        suffix = "-native"
269    for p in (("egl", "libegl", "libegl1"),
270              ("opengl", "libgl", "libgl1"),
271              ("glvnd", "libglx",),
272              ("gles", "libgles1", "libglesv1-cm1"),
273              ("gles", "libgles2", "libglesv2-2"),
274              ("gles", "libgles3",),
275              ("opencl", "libopencl",)):
276        if not p[0] in pkgconfig:
277            continue
278        mlprefix = d.getVar("MLPREFIX")
279        fullp = mlprefix + p[1] + "-mesa" + suffix
280        mlprefix = d.getVar("MLPREFIX")
281        pkgs = " " + " ".join(mlprefix + x + suffix for x in p[1:])
282        d.setVar("DEBIAN_NOAUTONAME:" + fullp, "1")
283        d.appendVar("RREPLACES:" + fullp, pkgs)
284        d.appendVar("RPROVIDES:" + fullp, pkgs)
285        d.appendVar("RCONFLICTS:" + fullp, pkgs)
286
287        d.appendVar("RRECOMMENDS:" + fullp, " ${MLPREFIX}mesa-megadriver" + suffix)
288
289        # For -dev, the first element is both the Debian and original name
290        fullp = mlprefix + p[1] + "-mesa-dev" + suffix
291        pkgs = " " + mlprefix + p[1] + "-dev" + suffix
292        d.setVar("DEBIAN_NOAUTONAME:" + fullp, "1")
293        d.appendVar("RREPLACES:" + fullp, pkgs)
294        d.appendVar("RPROVIDES:" + fullp, pkgs)
295        d.appendVar("RCONFLICTS:" + fullp, pkgs)
296}
297
298python mesa_populate_packages() {
299    pkgs = ['mesa', 'mesa-dev', 'mesa-dbg']
300    for pkg in pkgs:
301        d.setVar("RPROVIDES:%s" % pkg, pkg.replace("mesa", "mesa-dri", 1))
302        d.setVar("RCONFLICTS:%s" % pkg, pkg.replace("mesa", "mesa-dri", 1))
303        d.setVar("RREPLACES:%s" % pkg, pkg.replace("mesa", "mesa-dri", 1))
304
305    import re
306    dri_drivers_root = oe.path.join(d.getVar('PKGD'), d.getVar('libdir'), "dri")
307    if os.path.isdir(dri_drivers_root):
308        dri_pkgs = sorted(os.listdir(dri_drivers_root))
309        lib_name = d.expand("${MLPREFIX}mesa-megadriver")
310        for p in dri_pkgs:
311            m = re.match(r'^(.*)_dri\.so$', p)
312            if m:
313                pkg_name = " ${MLPREFIX}mesa-driver-%s" % legitimize_package_name(m.group(1))
314                d.appendVar("RPROVIDES:%s" % lib_name, pkg_name)
315                d.appendVar("RCONFLICTS:%s" % lib_name, pkg_name)
316                d.appendVar("RREPLACES:%s" % lib_name, pkg_name)
317
318    pipe_drivers_root = os.path.join(d.getVar('libdir'), "gallium-pipe")
319    do_split_packages(d, pipe_drivers_root, r'^pipe_(.*)\.so$', 'mesa-driver-pipe-%s', 'Mesa %s pipe driver', extra_depends='')
320}
321
322PACKAGESPLITFUNCS =+ "mesa_populate_packages"
323
324PACKAGES_DYNAMIC += "^mesa-driver-.*"
325PACKAGES_DYNAMIC:class-native = "^mesa-driver-.*-native"
326
327FILES:mesa-megadriver = "${libdir}/dri/* ${datadir}/drirc.d"
328FILES:mesa-vulkan-drivers = "${libdir}/libvulkan_*.so ${datadir}/vulkan"
329FILES:${PN}-vdpau-drivers = "${libdir}/vdpau/*.so.*"
330FILES:libegl-mesa = "${libdir}/libEGL*.so.* ${datadir}/glvnd/egl_vendor.d"
331FILES:libgbm = "${libdir}/libgbm.so.*"
332FILES:libgles1-mesa = "${libdir}/libGLESv1*.so.*"
333FILES:libgles2-mesa = "${libdir}/libGLESv2.so.*"
334FILES:libgl-mesa = "${libdir}/libGL.so.*"
335FILES:libglx-mesa = "${libdir}/libGLX*.so.*"
336FILES:libopencl-mesa = "${libdir}/libMesaOpenCL.so.* ${libdir}/gallium-pipe/*.so ${sysconfdir}/OpenCL/vendors/mesa.icd"
337FILES:libglapi = "${libdir}/libglapi.so.*"
338FILES:libosmesa = "${libdir}/libOSMesa.so.*"
339FILES:libxatracker = "${libdir}/libxatracker.so.*"
340
341FILES:${PN}-dev = "${libdir}/pkgconfig/dri.pc ${includedir}/vulkan ${libdir}/vdpau/*.so"
342FILES:libegl-mesa-dev = "${libdir}/libEGL*.* ${includedir}/EGL ${includedir}/KHR ${libdir}/pkgconfig/egl.pc"
343FILES:libgbm-dev = "${libdir}/libgbm.* ${libdir}/pkgconfig/gbm.pc ${includedir}/gbm.h"
344FILES:libgl-mesa-dev = "${libdir}/libGL.* ${includedir}/GL ${libdir}/pkgconfig/gl.pc"
345FILES:libglx-mesa-dev = "${libdir}/libGLX*.*"
346FILES:libglapi-dev = "${libdir}/libglapi.*"
347FILES:libgles1-mesa-dev = "${libdir}/libGLESv1*.* ${includedir}/GLES ${libdir}/pkgconfig/glesv1*.pc"
348FILES:libgles2-mesa-dev = "${libdir}/libGLESv2.* ${includedir}/GLES2 ${libdir}/pkgconfig/glesv2.pc"
349FILES:libgles3-mesa-dev = "${includedir}/GLES3"
350FILES:libopencl-mesa-dev = "${libdir}/libMesaOpenCL.so"
351FILES:libosmesa-dev = "${libdir}/libOSMesa.* ${includedir}/GL/osmesa.h ${libdir}/pkgconfig/osmesa.pc"
352FILES:libxatracker-dev = "${libdir}/libxatracker.so ${libdir}/libxatracker.la \
353                          ${includedir}/xa_tracker.h ${includedir}/xa_composite.h ${includedir}/xa_context.h \
354                          ${libdir}/pkgconfig/xatracker.pc"
355# catch all to get all the tools and data
356FILES:${PN}-tools = "${bindir} ${datadir}"
357ALLOW_EMPTY:${PN}-tools = "1"
358
359# Fix upgrade path from mesa to mesa-megadriver
360RREPLACES:mesa-megadriver = "mesa"
361RCONFLICTS:mesa-megadriver = "mesa"
362RPROVIDES:mesa-megadriver = "mesa"
363