Better yet, search for "nvidia glx" in the Google Group. This is
basically a duplicate question:
https://groups.google.com/forum/#!searchin/tigervnc-users/nvidia$20glx%7Csort:date/tigervnc-users/7HyWGmvzahc/lPHXEcRFAwAJ
Long and the short of it:
When Xvnc is built using the X.org 1.19.x source, you must do one of the
following in order for the built-in (unaccelerated) OpenGL
implementation in Xvnc to work properly:
- Use an OpenGL client other than nVidia's. You don't necessarily need
to uninstall their drivers. You could just install a build of Mesa into
a non-system directory and manipulate LD_LIBRARY_PATH to load that
version of libGL, instead of nVidia's, whenever you want to run OpenGL
applications in Xvnc, OR
- Use a newer operating system that has native libglvnd support (Fedora,
for instance, but not RHEL/CentOS-- yet), OR
- Modify the X.org source such that it enables indirect OpenGL as
needed. This requires additional X.org modifications to ensure that
indirect OpenGL functions properly in a remote display environment
(TigerVNC has none of those modifications.)
Explanation:
X.org 1.19.x disables indirect OpenGL by default, and certain timing
changes that were made since X.org 1.18.x also make it such that, if you
re-enable indirect OpenGL, it won't work properly in a VNC environment
(framebuffer updates for the OpenGL windows won't be sent.) Reverting
those timing changes makes it such that direct rendering no longer
performs well. What we do in TurboVNC, since we're using an in-tree
X.org code base, is modify the server's GLX extension such that it
detects when an indirect OpenGL context has been created and temporarily
reverts the X server timing to the X.org 1.18.x behavior until all
indirect OpenGL contexts have been destroyed.
All of those problems go away if the system is libglvnd-enabled. In
that case, the nVidia proprietary drivers can use direct rendering with
Xvnc. libglvnd communicates with the GLX extension, which (in the case
of Xvnc) reports back that it only supports Mesa, and thus libglvnd will
marshal the OpenGL calls from the application to the Mesa libGL
implementation instead of nVidia's libGL implementation. Indirect
OpenGL is only required if there is a mismatch between client (nVidia)
and server (Mesa) OpenGL implementations.