menuconfig BR2_PACKAGE_MESA3D
	bool "mesa3d"
	depends on BR2_INSTALL_LIBSTDCPP
	depends on !BR2_STATIC_LIBS
	depends on BR2_TOOLCHAIN_HAS_SYNC_1
	depends on BR2_TOOLCHAIN_HAS_THREADS_NPTL
	select BR2_PACKAGE_EXPAT
	select BR2_PACKAGE_LIBDRM
	select BR2_PACKAGE_WAYLAND_PROTOCOLS if BR2_PACKAGE_WAYLAND
	select BR2_PACKAGE_ZLIB
	help
	  Mesa 3D, an open-source implementation of the OpenGL
	  specification.

	  http://mesa3d.org

if BR2_PACKAGE_MESA3D

# Some Gallium driver needs libelf when built with LLVM support
config BR2_PACKAGE_MESA3D_NEEDS_ELFUTILS
	bool

config BR2_PACKAGE_MESA3D_LLVM
	bool "llvm support"
	depends on BR2_PACKAGE_LLVM_ARCH_SUPPORTS
	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_4_8
	depends on BR2_TOOLCHAIN_HAS_THREADS
	depends on BR2_INSTALL_LIBSTDCPP
	depends on !BR2_TOOLCHAIN_HAS_GCC_BUG_64735 # std::shared_future
	depends on !BR2_STATIC_LIBS
	depends on BR2_USE_WCHAR # std::wstring
	select BR2_PACKAGE_LLVM

comment "llvm support needs a toolchain w/ wchar, threads, C++, gcc >= 4.8, dynamic library"
	depends on BR2_PACKAGE_LLVM_ARCH_SUPPORTS
	depends on !BR2_TOOLCHAIN_HAS_THREADS || !BR2_INSTALL_LIBSTDCPP || \
		!BR2_TOOLCHAIN_GCC_AT_LEAST_4_8 \
		|| BR2_STATIC_LIBS || !BR2_USE_WCHAR

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
	bool "OpenCL support"
	depends on BR2_PACKAGE_MESA3D_LLVM
	depends on BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600 || \
		BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI
	select BR2_PACKAGE_LLVM_RTTI
	select BR2_PACKAGE_CLANG
	select BR2_PACKAGE_LIBCLC
	select BR2_PACKAGE_HAS_LIBOPENCL

# inform the .mk file of gallium, dri or vulkan driver selection
config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	bool
	select BR2_PACKAGE_MESA3D_DRIVER

config BR2_PACKAGE_MESA3D_DRI_DRIVER
	bool
	select BR2_PACKAGE_MESA3D_DRIVER
	select BR2_PACKAGE_MESA3D_GBM if \
		!BR2_PACKAGE_MESA3D_OPENGL_GLX && \
		!BR2_PACKAGE_MESA3D_OPENGL_EGL && \
		!BR2_PACKAGE_MESA3D_OSMESA_GALLIUM
	select BR2_PACKAGE_XLIB_LIBXSHMFENCE if \
		(BR2_PACKAGE_XORG7 && BR2_TOOLCHAIN_HAS_SYNC_4)

config BR2_PACKAGE_MESA3D_VULKAN_DRIVER
	bool
	select BR2_PACKAGE_MESA3D_DRIVER

config BR2_PACKAGE_MESA3D_DRIVER
	bool

# Gallium xa state tracker.
# Quote from mesa3d meson.build: "XA state tracker requires at least
# one of the following gallium drivers: nouveau, freedreno, i915, svga.
config BR2_PACKAGE_MESA3D_NEEDS_XA
	bool

# OpenGL GLX and Gallium VDPAU both needs X11
config BR2_PACKAGE_MESA3D_NEEDS_X11
	bool
	depends on BR2_PACKAGE_XORG7
	select BR2_PACKAGE_LIBXCB
	select BR2_PACKAGE_XLIB_LIBX11
	select BR2_PACKAGE_XLIB_LIBXDAMAGE
	select BR2_PACKAGE_XLIB_LIBXEXT
	select BR2_PACKAGE_XLIB_LIBXFIXES
	select BR2_PACKAGE_XLIB_LIBXRANDR
	select BR2_PACKAGE_XLIB_LIBXXF86VM
	select BR2_PACKAGE_XORGPROTO

comment "Gallium drivers"

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_ETNAVIV
	bool "Gallium Etnaviv driver"
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_ETNAVIV
	help
	  Mesa driver for Vivante GPUs.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_FREEDRENO
	bool "Gallium freedreno driver"
	depends on BR2_arm || BR2_aarch64 || BR2_aarch64_be # libdrm-freedreno
	# libdrm's freedreno option depends on LIBDRM_HAS_ATOMIC. Propagating
	# that dependency here causes a circular dependency that Kconfig
	# can't see is just spurious. However, that dependency is about
	# the toolchain having sync4 primitives, which is always a given
	# for arm/aarch64.
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_FREEDRENO
	help
	  Mesa driver for Freedreno GPUs.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_I915
	bool "Gallium i915 driver"
	depends on BR2_i386 || BR2_x86_64
	depends on !BR2_PACKAGE_MESA3D_DRI_DRIVER_I915
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_INTEL
	help
	  Support for i915-based Intel GPUs.

comment "Gallium i915: Only one i915 provider can be built"
	depends on BR2_i386 || BR2_x86_64
	depends on BR2_PACKAGE_MESA3D_DRI_DRIVER_I915

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_IRIS
	bool "Gallium iris driver"
	depends on BR2_i386 || BR2_x86_64
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	help
	  Mesa driver for iris-based Intel GPUs.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_LIMA
	bool "Gallium lima driver"
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	help
	  Mesa driver for ARM Mali Utgard GPUs.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_NOUVEAU
	bool "Gallium nouveau driver"
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_NOUVEAU
	select BR2_PACKAGE_MESA3D_NEEDS_XA
	select BR2_PACKAGE_LLVM_RTTI if BR2_PACKAGE_MESA3D_LLVM
	help
	  Supports all Nvidia GPUs.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST
	bool "Gallium panfrost driver"
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	help
	  Mesa driver for ARM Mali Midgard and Bifrost GPUs.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R300
	bool "Gallium Radeon R300 driver"
	depends on BR2_i386 || BR2_x86_64
	# lbdrm's radeon option depends on LIBDRM_HAS_ATOMIC. Propagating
	# that dependency here causes a circular dependency that Kconfig
	# can't see is just spurious. However, that dependency is about
	# the toolchain having sync4 primitives, which is always a given
	# for x86.
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_RADEON
	help
	  Driver for ATI/AMD Radeon R300/R400/R500 GPUs.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600
	bool "Gallium Radeon R600 driver"
	depends on BR2_i386 || BR2_x86_64
	depends on !BR2_PACKAGE_MESA3D_LLVM || \
		(BR2_PACKAGE_MESA3D_LLVM && (BR2_TOOLCHAIN_USES_UCLIBC || \
			BR2_TOOLCHAIN_USES_GLIBC)) # elfutils
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_RADEON
	select BR2_PACKAGE_LLVM_AMDGPU if BR2_PACKAGE_MESA3D_LLVM
	select BR2_PACKAGE_ELFUTILS if BR2_PACKAGE_MESA3D_LLVM
	select BR2_PACKAGE_MESA3D_NEEDS_ELFUTILS if BR2_PACKAGE_MESA3D_LLVM
	help
	  Driver for ATI/AMD Radeon R600/R700/HD5000/HD6000 GPUs.

# R600 needs libelf when Mesa3D is built with LLVM support
# musl is not currently compatible with elfutils
comment "R600 driver needs a uClibc or glibc toolchain when llvm is enabled"
	depends on BR2_PACKAGE_MESA3D_LLVM
	depends on !(BR2_TOOLCHAIN_USES_UCLIBC || BR2_TOOLCHAIN_USES_GLIBC)

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI
	bool "Gallium Radeon SI driver"
	depends on BR2_USE_MMU # libdrm
	depends on BR2_i386 || BR2_x86_64
	depends on BR2_PACKAGE_MESA3D_LLVM
	depends on BR2_TOOLCHAIN_USES_UCLIBC || BR2_TOOLCHAIN_USES_GLIBC # elfutils
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_AMDGPU
	select BR2_PACKAGE_LIBDRM_RADEON
	select BR2_PACKAGE_LLVM_AMDGPU
	select BR2_PACKAGE_ELFUTILS
	select BR2_PACKAGE_MESA3D_NEEDS_ELFUTILS
	help
	  Driver for ATI/AMD Radeon HD7000/HD8000/Rx200 GPUs.

# Radeon SI needs libelf
# musl is not currently compatible with elfutils
comment "Radeon SI driver needs a uClibc or glibc toolchain"
	depends on BR2_USE_MMU
	depends on BR2_PACKAGE_MESA3D_LLVM
	depends on !(BR2_TOOLCHAIN_USES_UCLIBC || BR2_TOOLCHAIN_USES_GLIBC)

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SVGA
	bool "Gallium vmware svga driver"
	depends on BR2_i386 || BR2_x86_64
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_VMWGFX
	select BR2_PACKAGE_MESA3D_NEEDS_XA
	help
	  This is a virtual GPU driver for VMWare virtual machines.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SWRAST
	bool "Gallium swrast driver"
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	help
	  This is a software opengl implementation using the Gallium3D
	  infrastructure.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_TEGRA
	bool "Gallium tegra driver"
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_NOUVEAU
	select BR2_PACKAGE_LIBDRM_NOUVEAU
	select BR2_PACKAGE_MESA3D_NEEDS_XA
	help
	  Adds support for Nvidia Tegra GPUs, requires nouveau.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_V3D
	bool "Gallium v3d driver"
	depends on (BR2_arm && BR2_ARM_CPU_HAS_NEON) || BR2_aarch64
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_VC4
	select BR2_PACKAGE_MESA3D_OPENGL_EGL
	help
	  Driver for Broadcom VC6 (rpi4) GPUs (needs vc4).

	  It requires a kernel 4.18+ with DRM V3D support enabled:

	  - CONFIG_DRM_V3D
	  - CONFIG_DRM_VC4

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VC4
	bool "Gallium vc4 driver"
	depends on BR2_arm || BR2_aarch64
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_LIBDRM_VC4
	select BR2_PACKAGE_MESA3D_OPENGL_EGL
	help
	  Driver for Broadcom VC4 (rpi2/3) GPUs.
	  It requires a vanilla 4.5+ kernel with drm vc4 (open) support.

config BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_VIRGL
	bool "Gallium virgl driver"
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER
	select BR2_PACKAGE_MESA3D_OPENGL_EGL
	help
	  virgl is the 3D acceleration backend for the virtio-gpu
	  shipping with qemu.

config BR2_PACKAGE_MESA3D_VDPAU
	bool "Gallium VDPAU state tracker"
	depends on BR2_PACKAGE_XORG7
	depends on BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_NOUVEAU \
		|| BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R300 \
		|| BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600 \
		|| BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI
	select BR2_PACKAGE_MESA3D_NEEDS_X11
	select BR2_PACKAGE_LIBVDPAU
	help
	  VDPAU state tracker (needs r300, r600, radeonsi or nouveau
	  gallium drivers).

comment "Gallium VDPAU state tracker needs X.org and gallium drivers r300, r600, radeonsi or nouveau"
	depends on !BR2_PACKAGE_XORG7 || \
		!(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_NOUVEAU \
		|| BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R300 \
		|| BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600 \
		|| BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_RADEONSI)

config BR2_PACKAGE_MESA3D_XVMC
	bool "Gallium XvMC state tracker"
	depends on BR2_i386 || BR2_x86_64
	depends on BR2_PACKAGE_XORG7
	depends on BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_NOUVEAU \
		|| BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600
	select BR2_PACKAGE_MESA3D_NEEDS_X11
	select BR2_PACKAGE_XLIB_LIBXV
	select BR2_PACKAGE_XLIB_LIBXVMC
	help
	  XvMC state tracker (needs r600 or nouveau gallium drivers).

comment "Gallium XvMC state tracker needs X.org and gallium drivers r600 or nouveau"
	depends on BR2_i386 || BR2_x86_64
	depends on !BR2_PACKAGE_XORG7 || \
		!(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_NOUVEAU \
		|| BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_R600)

comment "DRI drivers"

config BR2_PACKAGE_MESA3D_DRI_DRIVER_I915
	bool "DRI i915 driver"
	depends on BR2_i386 || BR2_x86_64
	select BR2_PACKAGE_MESA3D_DRI_DRIVER
	select BR2_PACKAGE_LIBDRM_INTEL
	help
	  Support for i915-based Intel GPUs.

config BR2_PACKAGE_MESA3D_DRI_DRIVER_I965
	bool "DRI i965 driver"
	depends on BR2_i386 || BR2_x86_64
	depends on BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_17 # memfd.h
	select BR2_PACKAGE_MESA3D_DRI_DRIVER
	select BR2_PACKAGE_LIBDRM_INTEL
	help
	  Support for i965-based Intel GPUs.

comment "DRI i965 driver needs a toolchain w/ headers >= 3.17"
	depends on BR2_i386 || BR2_x86_64
	depends on !BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_17

config BR2_PACKAGE_MESA3D_DRI_DRIVER_NOUVEAU
	bool "DRI nouveau driver"
	select BR2_PACKAGE_MESA3D_DRI_DRIVER
	select BR2_PACKAGE_LIBDRM_NOUVEAU
	help
	  Support for Nvidia-based GPUs.

config BR2_PACKAGE_MESA3D_DRI_DRIVER_RADEON
	bool "DRI radeon r100 driver"
	depends on BR2_i386 || BR2_x86_64
	# libdrm's radeon option depends on LIBDRM_HAS_ATOMIC. Propagating
	# that dependency here causes a circular dependency that Kconfig
	# can't see is just spurious. However, that dependency is about
	# the toolchain having sync4 primitives, which is always a given
	# for i386 and x86_64.
	select BR2_PACKAGE_MESA3D_DRI_DRIVER
	select BR2_PACKAGE_LIBDRM_RADEON
	help
	  Legacy Radeon driver for R100 series GPUs.

comment "Vulkan drivers"

config BR2_PACKAGE_MESA3D_VULKAN_DRIVER_INTEL
	bool "Vulkan Intel driver"
	depends on BR2_i386 || BR2_x86_64
	depends on BR2_TOOLCHAIN_HAS_SYNC_4 # libxshmfence
	depends on BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_17 # memfd.h
	depends on BR2_TOOLCHAIN_USES_GLIBC # ifunc, static_assert
	depends on BR2_PACKAGE_XORG7 # xorgproto
	select BR2_PACKAGE_MESA3D_VULKAN_DRIVER
	select BR2_PACKAGE_XORGPROTO
	select BR2_PACKAGE_XLIB_LIBXSHMFENCE
	help
	  Vulkan driver for Intel hardware from Ivy Bridge onward.

comment "intel vulkan depends on X.org and needs a glibc toolchain w/ headers >= 3.17"
	depends on BR2_i386 || BR2_x86_64
	depends on BR2_TOOLCHAIN_HAS_SYNC_4
	depends on !BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_17 || \
		!BR2_TOOLCHAIN_USES_GLIBC || !BR2_PACKAGE_XORG7

comment "Off-screen Rendering"

config BR2_PACKAGE_MESA3D_OSMESA_GALLIUM
	bool "OSMesa (Gallium) library"
	select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_SWRAST
	help
	  The OSMesa API provides functions for off-screen rendering.

if BR2_PACKAGE_MESA3D_DRIVER

comment "OpenGL API Support"

config BR2_PACKAGE_MESA3D_GBM
	bool "gbm"
	depends on BR2_PACKAGE_MESA3D_DRI_DRIVER \
		|| (BR2_PACKAGE_MESA3D_GALLIUM_DRIVER && BR2_PACKAGE_MESA3D_OPENGL_EGL)
	help
	  Enable Generic Buffer Management (gbm)

comment "gbm support needs a dri driver or a gallium driver w/ EGL support."
	depends on !BR2_PACKAGE_MESA3D_DRI_DRIVER \
		&& !(BR2_PACKAGE_MESA3D_GALLIUM_DRIVER && BR2_PACKAGE_MESA3D_OPENGL_EGL)

config BR2_PACKAGE_MESA3D_OPENGL_GLX
	bool "OpenGL GLX"
	depends on BR2_PACKAGE_XORG7
	select BR2_PACKAGE_HAS_LIBGL
	select BR2_PACKAGE_MESA3D_NEEDS_X11
	help
	  Enable GLX graphic acceleration (OpenGL + X11).

comment "OpenGL GLX support needs X11"
	depends on !BR2_PACKAGE_XORG7

config BR2_PACKAGE_MESA3D_OPENGL_EGL
	bool "OpenGL EGL"
	select BR2_PACKAGE_HAS_LIBEGL
	select BR2_PACKAGE_HAS_LIBEGL_WAYLAND
	select BR2_PACKAGE_MESA3D_GBM
	help
	  Use the Khronos EGL APIs. EGL is a window manager for OpenGL
	  applications similar to GLX, for X, and WGL, for Windows.

config BR2_PACKAGE_MESA3D_OPENGL_ES
	bool "OpenGL ES"
	select BR2_PACKAGE_HAS_LIBGLES
	help
	  Use the Khronos OpenGL ES APIs. This is commonly used on
	  embedded systems and represents a subset of the OpenGL API.

endif # BR2_PACKAGE_MESA3D_DRIVER

config BR2_PACKAGE_PROVIDES_LIBGL
	default "mesa3d" if BR2_PACKAGE_MESA3D_OPENGL_GLX

config BR2_PACKAGE_PROVIDES_LIBEGL
	default "mesa3d" if BR2_PACKAGE_MESA3D_OPENGL_EGL

config BR2_PACKAGE_PROVIDES_LIBGLES
	default "mesa3d" if BR2_PACKAGE_MESA3D_OPENGL_ES

config BR2_PACKAGE_PROVIDES_LIBOPENCL
	default "mesa3d" if BR2_PACKAGE_MESA3D_OPENCL

endif # BR2_PACKAGE_MESA3D

comment "mesa3d needs a toolchain w/ C++, NPTL, dynamic library"
	depends on !BR2_INSTALL_LIBSTDCPP || !BR2_TOOLCHAIN_HAS_THREADS_NPTL || \
		BR2_STATIC_LIBS
	depends on BR2_TOOLCHAIN_HAS_SYNC_1