Jon Ashburn | 8c51936 | 2015-01-06 10:33:36 -0700 | [diff] [blame] | 1 | # Loader Description |
| 2 | |
| 3 | ## Overview |
| 4 | The Loader implements the main XGL library: libXGL.so on Linux. It handles |
| 5 | layer management and driver management. Loader driver management includes |
Courtney Goeltzenleuchter | ba7133b | 2015-02-10 18:40:14 -0700 | [diff] [blame^] | 6 | finding driver librairies and loading them. Additionally, the loader dispatches |
Jon Ashburn | 8c51936 | 2015-01-06 10:33:36 -0700 | [diff] [blame] | 7 | the API calls to the correct driver based on the GPU selected by the app. The |
Courtney Goeltzenleuchter | ba7133b | 2015-02-10 18:40:14 -0700 | [diff] [blame^] | 8 | loader fully supports multi-gpu operation. |
Jon Ashburn | 8c51936 | 2015-01-06 10:33:36 -0700 | [diff] [blame] | 9 | |
| 10 | Loader layer management includes finding layer libraries and activating them |
| 11 | as requested. Loader correctly sets up layer and its own dispatch tables to |
| 12 | support multiple layers activated. Each active layer can intercept a subset of |
| 13 | the full API entrypoints. A layer which doesn't intercept a given entrypoint |
| 14 | will be skipped for that entrypoint. The loader supports layers that operate |
| 15 | on multiple GPUs. |
| 16 | |
| 17 | ## Environment Variables |
| 18 | LIBXGL\_DRIVERS\_PATH directory for loader to search for ICD driver libraries to open |
Courtney Goeltzenleuchter | c507e3d | 2015-01-07 09:24:45 -0700 | [diff] [blame] | 19 | |
| 20 | LIBXGL\_LAYERS\_PATH directory for loader to search for layer libraries that may get activated and used at xglCreateDevice() time. |
| 21 | |
| 22 | LIBXGL\_LAYER\_NAMES colon separate list of layer names to be activated. Example, |
Jon Ashburn | 8c51936 | 2015-01-06 10:33:36 -0700 | [diff] [blame] | 23 | LIBXGL\_LAYER\_NAMES=MemTracker:DrawState |
| 24 | |
| 25 | ## Interface to driver (ICD) |
Jon Ashburn | 117a0d4 | 2015-02-11 12:40:00 -0700 | [diff] [blame] | 26 | - xglEnumerateGpus exported |
| 27 | - xglCreateInstance exported |
| 28 | - xglDestroyInstance exported |
Jon Ashburn | 8c51936 | 2015-01-06 10:33:36 -0700 | [diff] [blame] | 29 | - xglGetProcAddr exported and returns valid function pointers for all the XGL API entrypoints |
Courtney Goeltzenleuchter | ba7133b | 2015-02-10 18:40:14 -0700 | [diff] [blame^] | 30 | - all objects created by ICD can be cast to (XGL\_LAYER\_DISPATCH\_TABLE \*\*) |
Jon Ashburn | 8c51936 | 2015-01-06 10:33:36 -0700 | [diff] [blame] | 31 | where the loader will replace the first entry with a pointer to the dispatch table which is |
Courtney Goeltzenleuchter | ba7133b | 2015-02-10 18:40:14 -0700 | [diff] [blame^] | 32 | owned by the loader. This implies three things for ICD drivers: |
Courtney Goeltzenleuchter | c507e3d | 2015-01-07 09:24:45 -0700 | [diff] [blame] | 33 | 1. the ICD must return a pointer for the opaque object handle |
Jon Ashburn | 117a0d4 | 2015-02-11 12:40:00 -0700 | [diff] [blame] | 34 | 2. this pointer points to a regular C structure with the first entry being a pointer. |
| 35 | Note: for any C++ ICD's that implement XGL objects directly as C++ classes. |
Courtney Goeltzenleuchter | ba7133b | 2015-02-10 18:40:14 -0700 | [diff] [blame^] | 36 | The C++ compiler may put a vtable at offset zero if your class is virtual. |
| 37 | In this case use a regular C structure as follows for your C++ objects: |
Jon Ashburn | 117a0d4 | 2015-02-11 12:40:00 -0700 | [diff] [blame] | 38 | ``` |
Courtney Goeltzenleuchter | ba7133b | 2015-02-10 18:40:14 -0700 | [diff] [blame^] | 39 | #include "xglIcd.h" |
Jon Ashburn | 117a0d4 | 2015-02-11 12:40:00 -0700 | [diff] [blame] | 40 | struct { |
Courtney Goeltzenleuchter | ba7133b | 2015-02-10 18:40:14 -0700 | [diff] [blame^] | 41 | XGL_LOADER_DATA *reservedForLoader; |
Jon Ashburn | 117a0d4 | 2015-02-11 12:40:00 -0700 | [diff] [blame] | 42 | myObjectClass myObj; |
| 43 | } xglObj; |
| 44 | ``` |
Courtney Goeltzenleuchter | ba7133b | 2015-02-10 18:40:14 -0700 | [diff] [blame^] | 45 | 3. the reservedForLoader.loaderMagic member must be initialized with ICD\_LOADER\_MAGIC |
Courtney Goeltzenleuchter | c507e3d | 2015-01-07 09:24:45 -0700 | [diff] [blame] | 46 | - the ICD may or may not implement a dispatch table |
Jon Ashburn | 117a0d4 | 2015-02-11 12:40:00 -0700 | [diff] [blame] | 47 | - ICD entrypoints can be named anything including the offcial xgl name such as xglCreateDevice(). However, beware of interposing by dynamic OS library loaders if the offical names are used. On Linux, if offical names are used, the ICD library must be linked with -Bsymbolic |
Courtney Goeltzenleuchter | c507e3d | 2015-01-07 09:24:45 -0700 | [diff] [blame] | 48 | |