From 573489db710c6fd315170a45d6c609db2e30e5e4 Mon Sep 17 00:00:00 2001 From: Omar Padron Date: Mon, 13 Jul 2020 11:32:36 -0400 Subject: 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 --- .../repos/builtin/packages/libglvnd-fe/package.py | 56 ++++++++++++++++++++++ var/spack/repos/builtin/packages/mesa/package.py | 46 ++++++++++++++---- var/spack/repos/builtin/packages/opengl/package.py | 42 ++++++++++++++-- .../repos/builtin/packages/paraview/package.py | 13 ++++- 4 files changed, 142 insertions(+), 15 deletions(-) create mode 100644 var/spack/repos/builtin/packages/libglvnd-fe/package.py (limited to 'var') diff --git a/var/spack/repos/builtin/packages/libglvnd-fe/package.py b/var/spack/repos/builtin/packages/libglvnd-fe/package.py new file mode 100644 index 0000000000..6f737a9017 --- /dev/null +++ b/var/spack/repos/builtin/packages/libglvnd-fe/package.py @@ -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) diff --git a/var/spack/repos/builtin/packages/mesa/package.py b/var/spack/repos/builtin/packages/mesa/package.py index b277a03d19..94b352d8e2 100644 --- a/var/spack/repos/builtin/packages/mesa/package.py +++ b/var/spack/repos/builtin/packages/mesa/package.py @@ -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 @@ class Mesa(AutotoolsPackage): 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')))) diff --git a/var/spack/repos/builtin/packages/opengl/package.py b/var/spack/repos/builtin/packages/opengl/package.py index 413b8e0f45..572fc04845 100644 --- a/var/spack/repos/builtin/packages/opengl/package.py +++ b/var/spack/repos/builtin/packages/opengl/package.py @@ -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 @@ class Opengl(Package): @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 diff --git a/var/spack/repos/builtin/packages/paraview/package.py b/var/spack/repos/builtin/packages/paraview/package.py index bb8b140b74..f5195dc2bb 100644 --- a/var/spack/repos/builtin/packages/paraview/package.py +++ b/var/spack/repos/builtin/packages/paraview/package.py @@ -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 @@ class Paraview(CMakePackage, CudaPackage): 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 @@ class Paraview(CMakePackage, CudaPackage): if 'darwin' in spec.architecture: cmake_args.extend([ - '-DVTK_USE_X:BOOL=OFF', '-DPARAVIEW_DO_UNIX_STYLE_INSTALLS:BOOL=ON', ]) -- cgit v1.2.3-70-g09d2