If you have a library that implements a consistent API on top of various card-specific kernel APIs, it is not a big step to implement this same API on top of other userspace APIs as well.
LibGGI, in addition to using (multiple) kernel drivers, can also work on top of
On Linux, all of these targets are available without recompilation, using dynamic loading. The same binary runs on all supported display 'targets' -- support for new targets not present at time of compilation can usually be added without recompiling the application or LibGGI.