Add libglvnd packages/Add EGL support (#14572)

* add new package: "libglvnd-frontend"

* add +glvnd variant to opengl package

* add +glvnd variant to mesa package

* add +egl variant to paraview package

* add libglvnd-frontend entries to default packages config

* fix style

* add default providers for glvnd virtuals

add default providers for glvnd-gl, glvnd-glx, and glvnd-egl

* WIP: rough start to external OpenGL documentation

* rename libglvnd-frontend package and backend virtual dependencies

* update documentation

* fix ligvnd-be-* typos

* fix libglvnd-fe package class name

* fix doc parse error
This commit is contained in:
Omar Padron
2020-07-13 11:32:36 -04:00
committed by GitHub
parent 9c42f246ed
commit 573489db71
6 changed files with 242 additions and 17 deletions

View File

@@ -0,0 +1,56 @@
# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack import *
class LibglvndFe(BundlePackage):
"""The GL Vendor-Neutral Dispatch library (Frontend Dummy Package)
libglvnd is a vendor-neutral dispatch layer for arbitrating OpenGL API
calls between multiple vendors. It allows multiple drivers from different
vendors to coexist on the same filesystem, and determines which vendor to
dispatch each API call to at runtime.
Both GLX and EGL are supported, in any combination with OpenGL and OpenGL
ES."""
homepage = "https://github.com/NVIDIA/libglvnd"
version('1.1.1', sha256='71918ed1261e4eece18c0b74b50dc62c0237b8d526e83277ef078554544720b9')
variant('glx', default=False, description='Provide GLX API')
variant('egl', default=False, description='Provide EGL API')
depends_on('libglvnd')
depends_on('libglvnd-be-gl')
depends_on('libglvnd-be-glx', when='+glx')
depends_on('libglvnd-be-egl', when='+egl')
provides('gl')
provides('glx', when='+glx')
provides('egl', when='+egl')
@property
def gl_libs(self):
return find_libraries('libOpenGL',
root=self.spec['libglvnd'].prefix,
shared=True,
recursive=True)
@property
def glx_libs(self):
return find_libraries('libGLX',
root=self.spec['libglvnd'].prefix,
shared=True,
recursive=True)
@property
def egl_libs(self):
return find_libraries('libEGL',
root=self.spec['libglvnd'].prefix,
shared=True,
recursive=True)

View File

@@ -65,9 +65,13 @@ class Mesa(AutotoolsPackage):
variant('opengles', default=False, description="Enable OpenGL ES support.")
# Provides
provides('gl@4.5', when='+opengl')
provides('glx@1.4', when='+glx')
# provides('egl@1.5', when='+egl')
provides('gl@4.5', when='+opengl ~glvnd')
provides('glx@1.4', when='+glx ~glvnd')
# provides('egl@1.5', when='+egl ~glvnd')
provides('libglvnd-be-gl', when='+glvnd')
provides('libglvnd-be-glx', when='+glvnd +glx')
# provides('libglvnd-be-egl', when='+glvnd +egl')
# Variant dependencies
depends_on('llvm@6:', when='+llvm')
@@ -179,10 +183,32 @@ def configure_args(self):
return args
@property
def libs(self):
for dir in ['lib64', 'lib']:
libs = find_libraries(['libGL', 'libOSMesa'],
join_path(self.prefix, dir),
shared=True, recursive=False)
if libs:
return libs
def gl_libs(self):
result = LibraryList(())
if '~glvnd' in self.spec:
result.extend(find_libraries('libGL',
root=self.spec.prefix,
shared='+shared' in self.spec,
recursive=True))
return result
@property
def glx_libs(self):
result = LibraryList(())
if '~glvnd' in self.spec:
result.extend(find_libraries('libGLX',
root=self.spec.prefix,
shared='+shared' in self.spec,
recursive=True))
return result
def setup_run_environment(self, env):
if '+glx +glvnd' in self.spec:
env.set('__GLX_VENDOR_LIBRARY_NAME', 'mesa')
if '+egl +glvnd' in self.spec:
env.set('__EGL_VENDOR_LIBRARY_FILENAMES', ':'.join((
os.path.join(self.spec.prefix, 'share', 'glvnd',
'egl_vendor.d', '50_mesa.json'))))

View File

@@ -13,7 +13,14 @@ class Opengl(Package):
homepage = "https://www.opengl.org/"
provides('gl')
variant('glvnd',
default=False,
description="Expose Graphics APIs through libglvnd")
variant('glx', default=True, description="Enable GLX API.")
variant('egl', default=False, description="Enable EGL API.")
provides('gl', when='~glvnd')
provides('gl@:4.5', when='@4.5:')
provides('gl@:4.4', when='@4.4:')
provides('gl@:4.3', when='@4.3:')
@@ -33,7 +40,19 @@ class Opengl(Package):
provides('gl@:1.0', when='@1.0:')
if sys.platform != 'darwin':
provides('glx@1.4')
provides('glx@1.4', when='~glvnd +glx')
# NOTE: This package should have a dependency on libglvnd, but because it
# is exclusively provided externally the dependency is never traversed.
# depends_on('libglvnd', when='+glvnd') # don't uncomment this
provides('libglvnd-be-gl', when='+glvnd')
provides('libglvnd-be-glx', when='+glvnd +glx')
provides('libglvnd-be-egl', when='+glvnd +egl')
provides('egl@1.5', when='~glvnd +egl')
depends_on('libglvnd', when='+glvnd')
# Override the fetcher method to throw a useful error message;
# fixes GitHub issue (#7061) in which this package threw a
@@ -80,8 +99,25 @@ def fetcher(self):
@property
def libs(self):
result = LibraryList(())
# "libs" provided by glvnd; this package sets the environment variables
# so that glvnd, in turn, loads this package's libraries at run-time.
if '+glvnd' in self.spec:
return result
for dir in ['lib64', 'lib']:
libs = find_libraries('libGL', join_path(self.prefix, dir),
shared=True, recursive=False)
if libs:
return libs
result.extend(libs)
break
if '+egl' in self.spec:
for dir in ['lib64', 'lib']:
libs = find_libraries('libEGL', join_path(self.prefix, dir),
shared=True, recursive=False)
if libs:
result.extend(libs)
break
return result

View File

@@ -49,6 +49,7 @@ class Paraview(CMakePackage, CudaPackage):
description='Builds a shared version of the library')
variant('kits', default=True,
description='Use module kits')
variant('egl', default=False, description="Enable EGL")
conflicts('+python', when='+python3')
conflicts('+python', when='@5.6:')
@@ -58,6 +59,9 @@ class Paraview(CMakePackage, CudaPackage):
# See commit: https://gitlab.kitware.com/paraview/paraview/-/commit/798d328c
conflicts('~opengl2', when='@5.5:')
conflicts('+egl', when='+osmesa')
conflicts('+egl', when='+qt')
# Workaround for
# adding the following to your packages.yaml
# packages:
@@ -89,6 +93,10 @@ class Paraview(CMakePackage, CudaPackage):
depends_on('mesa+osmesa', when='+osmesa')
depends_on('gl@3.2:', when='+opengl2')
depends_on('gl@1.2:', when='~opengl2')
depends_on('glx', when='~osmesa platform=linux')
depends_on('egl', when='+egl')
depends_on('libxt', when='~osmesa platform=linux')
conflicts('+qt', when='+osmesa')
@@ -208,7 +216,9 @@ def nvariant_bool(feature):
cmake_args = [
'-DPARAVIEW_BUILD_QT_GUI:BOOL=%s' % variant_bool('+qt'),
'-DVTK_OPENGL_HAS_OSMESA:BOOL=%s' % variant_bool('+osmesa'),
'-DVTK_USE_X:BOOL=%s' % nvariant_bool('+osmesa'),
'-DVTK_OPENGL_HAS_EGL:BOOL=%s' % variant_bool('+egl'),
('-DVTK_USE_X:BOOL=%s' %
variant_bool('~osmesa ~egl platform=linux')),
'-DVTK_RENDERING_BACKEND:STRING=%s' % rendering,
'-DPARAVIEW_INSTALL_DEVELOPMENT_FILES:BOOL=%s' % includes,
'-DBUILD_TESTING:BOOL=OFF',
@@ -272,7 +282,6 @@ def nvariant_bool(feature):
if 'darwin' in spec.architecture:
cmake_args.extend([
'-DVTK_USE_X:BOOL=OFF',
'-DPARAVIEW_DO_UNIX_STYLE_INSTALLS:BOOL=ON',
])