Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/numtide/nix-gl-host
Run OpenGL/Cuda programs built with Nix, on all Linux distributions.
https://github.com/numtide/nix-gl-host
buildbot-numtide
Last synced: 5 days ago
JSON representation
Run OpenGL/Cuda programs built with Nix, on all Linux distributions.
- Host: GitHub
- URL: https://github.com/numtide/nix-gl-host
- Owner: numtide
- License: apache-2.0
- Created: 2022-12-05T18:09:44.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-11-21T17:53:36.000Z (about 1 month ago)
- Last Synced: 2024-12-06T23:24:47.615Z (16 days ago)
- Topics: buildbot-numtide
- Language: Python
- Homepage:
- Size: 72.3 KB
- Stars: 85
- Watchers: 11
- Forks: 17
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# NixGLHost - Nix OpenGL/Cuda wrapper
> Current status: alpha
Run OpenGL/Cuda programs built with Nix, on all[*] Linux distributions.
`*` - see the [support Matrix](#support-matrix)
# Why you may need NixGLHost?
Nix is great as a software distribution mechanism. It allows packaging a software once and distribute it securely to all Linux distributions. Because all the dependencies are bundled with the software, it doesn't suffer from incompatible Glibc version issues that other software might have.
Unfortunately while the previous statement is generally true, it breaks down when using programs depending on 3D drivers such as OpenGL or Cuda. Unlike with the Kernel, the interface to interact with the GPU is defined in the driver software, and that is dynamic depending on which host, and version of the driver is running.
This is where NixGLHost comes in handy. NixGLHost is a wrapper around your program that dynamically scans your host Linux system (Ubuntu, Fedora, etc.) and looks for the OpenGL/Cuda drivers. And then makes it available to use to to the Nix-built binary. It aims at solving this problem once and for all.
# Getting Started
There are several options to use NixglHost, and the one you choose depends on the way you want to specify the path.
## Automatic Driver Directory Detection (RECOMMENDED)
You can run `my-gl-program` and re-use your host distribution OpenGL/Cuda setup simply with:
```console
$ nixglhost my-gl-program
```When invoked like above, `nixglhost` will scan your host library path and look for the relevant driver libraries to use.
## Explicitly Pointing to the Driver Directory
If the driver libraries auto-discovery system fails on your setup, you can explicitly point to the directory containing your driver libraries using the `--driver-directory` or `-d` command line flags.
For instance:
```console
$ nixglhost -d /usr/lib/x86_64-linux-gnu my-gl-program
```## Global Library Path Export (⚠️ DISCOURAGED ⚠️)
Finally, you can also print the directories you should inject to your `LD_LIBRARY_PATH` to run an OpenGL program using the `--print-ld-library-path` or `-p` flag:
```console
$ LD_LIBRARY_PATH=$(nixglhost -p):$LD_LIBRARY_PATH my-gl-program
```⚠️ WARNING: this feature is a major footgun.
It exists and is documented because you may not have any other options in some situations. However, you should always try to keep the dependency injection as close to the program as possible.
This means that you should always prefer wrapping the dependencies to a single binary rather than globally exporting them to the global execution environment.
# Installation
## With Flakes
The `nixglhost` wrapper is exposed through the flake `defaultPackage` output.
```nix
{
description = "…";inputs = {
nix-gl-host.url = "github:numtide/nix-gl-host";
};outputs = { self, nixpkgs, nix-gl-host }: {
packages.x86_64-linux.nix-gl-host = nix-gl-host.defaultPackage.x86_64-linux;
};
}
```## Without Flakes (nix-shell)
This project's `default.nix` is a derivation you can easily `callPackage`, Nixpkgs-style. You can get the `nixglhost` wrapper through the following `shell.nix`:
``` nix
{ pkgs ? import { }, lib ? pkgs.lib }:let
nixglhost-sources = pkgs.fetchFromGitHub {
owner = "numtide";
repo = "nix-gl-host";
rev = "main";
# Replace this with the hash Nix will complain about, TOFU style.
hash = "";
};nixglhost = pkgs.callPackage "${nixglhost-sources}/default.nix" { };
in pkgs.mkShell {
buildInputs = [
nixglhost
];
}
```# State of the project
We want to work with the community to integrate this work upstream. The current version demonstrates that solving this problem is possible but before adding more platforms to it, we believe that it would be good to
## Support Matrix
Currently, this project supports the following features:
| Driver | GLX | EGL | Cuda | OpenCL |
|--------------------|--------|------|------|--------|
| Proprietary Nvidia | ✅ | ✅ | ✅ | 🚫 |
| Mesa | 🚫 | 🚫 | 🚫 | 🚫 |
| Nouveau | 🚫 | 🚫 | 🚫 | 🚫 |
| Proprietary AMD | 🚫 | 🚫 | 🚫 | 🚫 |It has been tested on the following distributions:
| Distribution | Status |
|--------------|--------|
| Ubuntu 20.04 | ✅ |
| Ubuntu 22.04 | ✅ |If you require more platforms to be supported, [get in touch with us](https://numtide.com/contact).
# Troubleshooting
## Debug Mode
You can enable the debug tracing of NixGLHost by setting the DEBUG environment variable.
```console
$ DEBUG=1 nixglhost my-gl-program
```## Known error messages
If you are seeing the following error messages, your program isn't wrapped
with `nixglhost` yet.OpenGL:
```
name of display: localhost:10.0
Error: couldn't find RGB GLX visual or fbconfig
```EGL:
```
EGLUT: failed to initialize EGL display
```# Previous Work
This works has drawn inspiration from [NixGL](https://github.com/guibou/nixGL). NixGL solves the same issue with a different approach. Instead of re-using the host GL libraries, it uses the Nixpkgs-provided ones to wrap the OpenGL program. With this approach, the graphic drivers are also distributed through Nix. The Nix closure is fully contained. It’s a safer approach as you’re less likely to stumble upon any DSO ABI incompatibility.
However, this explicit approach comes with tradeoff: you need to build one Nix closure for each graphic driver you plan to support. That also includes versions of the driver. This makes the deployment more complex: for each machine, you need to figure
out which GPU-specific Nix closure to use.How we see it, NixGL is best adapted for closed environment where the target hosts are under the author's control. NixGlHost is best adapted for open environments where the author doesn't control who is going to use their program.
## Design
See the [INTERNALS.md](INTERNALS.md) document.
# Contributing
⚠️ WARNING: we won't accept new driver contributions at this time.
The code needs to be cleaned up and rewritten before scaling to more drivers.
If you require more platforms to be supported, [get in touch with us](https://numtide.com/contact).
# Authors/Maintainers
- [Flokli](https://flokli.de/)
- [Ninjatrappeur](https://alternativebit.fr/)## Commercial support
Looking for help or customization?
Get in touch with Numtide to get a quote. We make it easy for companies to
work with Open Source projects: