To use hardware acceleration, you must do two thing:
-
insmodthe.kokernel module provided by the vendor.TODO: how are those inserted by default at system startup?
-
use the header and .so provided by the vendor.
That
.sowill know how to talk to the kernel module.E.g. on Ubuntu 16.04:
/usr/lib/nvidia-361/libGL.so /usr/include/nvidia-361/GL/gl.hIf you don't, most Linux distros default to the Mesa software implementation, e.g.:
/usr/include/GL/gl.h /usr/lib/x86_64-linux-gnu/libGL.soYou can observe what your executables will load with:
ldd ./executableor:
TODO how Linux distros select between both? NVIDIA ones are not in my path, only mesa.
But the NVIDIA driver is used by default when I compile. Looks like mesa does
dloadon NVIDIA libraries? Looks likedlopenis used, as strace shows several lines like;open("/usr/lib/nvidia-361/libGL.so.1", O_RDONLY|O_CLOEXEC) = 3And
lddsays that NVIDIA is used... so the loaded library is different form that compiled against. TODO why?!cat /etc/ld.so.conf.d/x86_64-linux-gnu_GL.confsays:
/usr/lib/nvidia-361 /usr/lib32/nvidia-361which explain how that is configured.
All leading hardware implementations are currently closed source, although some open source just the kernel module (and not the .so) for fear of the GPL (even though Linux said closed source kernel modules are fine).
You have NVIDIA installed, and want to compare it to Mesa CPU renderer.
- http://superuser.com/questions/106056/force-software-based-opengl-rendering
- http://unix.stackexchange.com/questions/4252/using-software-opengl-rendering-with-x
Once you have NVIDIA installed and running, to compile with software use:
gcc a.c -lGL -Wl,-rpath=/usr/lib/x86_64-linux-gnu/mesa
or run with:
LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/mesa ./a
TODO: but this fails once NVIDIA is running:
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
X Error of failed request: GLXBadContext
Major opcode of failed request: 154 (GLX)
Minor opcode of failed request: 6 (X_GLXIsDirect)
Serial number of failed request: 42
Current serial number in output stream: 41
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 154 (GLX)
Minor opcode of failed request: 24 (X_GLXCreateNewContext)
Value in failed request: 0x0
Serial number of failed request: 41
Current serial number in output stream: 42