Jon Ashburn | 9d290e4 | 2014-11-26 13:27:04 -0700 | [diff] [blame] | 1 | #Layer Description and Status |
| 2 | *26 Nov 2014* |
Jon Ashburn | 183dfd0 | 2014-10-22 18:13:16 -0600 | [diff] [blame] | 3 | |
Jon Ashburn | 9d290e4 | 2014-11-26 13:27:04 -0700 | [diff] [blame] | 4 | ##Overview |
| 5 | |
Jon Ashburn | 183dfd0 | 2014-10-22 18:13:16 -0600 | [diff] [blame] | 6 | Layer libraries can be written to intercept or hook XGL entrypoints for various |
Courtney Goeltzenleuchter | 6be96bb | 2014-11-02 18:50:52 -0700 | [diff] [blame] | 7 | debug and validation purposes. One or more XGL entrypoints can be defined in your Layer |
Jon Ashburn | 183dfd0 | 2014-10-22 18:13:16 -0600 | [diff] [blame] | 8 | library. Undefined entrypoints in the Layer library will be passed to the next Layer which |
| 9 | may be the driver. Multiple layer libraries can be chained (actually a hierarchy) together. |
Tobin Ehlis | 475bebe | 2014-10-23 08:44:44 -0600 | [diff] [blame] | 10 | xglEnumerateLayer can be called to list the available layer libraries. xglGetProcAddr is |
Jon Ashburn | 183dfd0 | 2014-10-22 18:13:16 -0600 | [diff] [blame] | 11 | used internally by the Layers and ICD Loader to initialize dispatch tables. Layers are |
| 12 | activated at xglCreateDevice time. xglCreateDevice createInfo struct is extended to allow |
Jon Ashburn | 9d290e4 | 2014-11-26 13:27:04 -0700 | [diff] [blame] | 13 | a list of layers to be activated. Layer libraries can alternatively be LD_PRELOADed depending |
| 14 | upon how they are implemented. |
Jon Ashburn | 183dfd0 | 2014-10-22 18:13:16 -0600 | [diff] [blame] | 15 | |
Jon Ashburn | 9d290e4 | 2014-11-26 13:27:04 -0700 | [diff] [blame] | 16 | ## Layer library example code |
| 17 | |
Jon Ashburn | a0b85eb | 2014-10-23 10:59:23 -0600 | [diff] [blame] | 18 | include/xglLayer.h - header file for layer code |
Jon Ashburn | 9d290e4 | 2014-11-26 13:27:04 -0700 | [diff] [blame] | 19 | layer/Basic.cpp (name=Basic) simple example wrapping a few entrypoints. Shows layer features: |
| 20 | - Multiple dispatch tables for supporting multiple GPUs. |
| 21 | - Example layer extension function shown. |
| 22 | - Layer extension advertised by xglGetExtension(). |
| 23 | - xglEnumerateLayers() supports loader layer name queries and call interception |
| 24 | - Can be LD_PRELOADed individually |
| 25 | <build dir>/layer/generic_layer.c (name=Generic) - auto generated example wrapping all XGL entrypoints. |
Jon Ashburn | a0b85eb | 2014-10-23 10:59:23 -0600 | [diff] [blame] | 26 | Single global dispatch table. Can be LD_PRELOADed. |
Tobin Ehlis | 475bebe | 2014-10-23 08:44:44 -0600 | [diff] [blame] | 27 | <build dir>/layer/api_dump.c - print out API calls along with parameter values |
| 28 | <build dir>/layer/object_track.c - Print object CREATE/USE/DESTROY stats |
Jon Ashburn | 183dfd0 | 2014-10-22 18:13:16 -0600 | [diff] [blame] | 29 | |
Jon Ashburn | 9d290e4 | 2014-11-26 13:27:04 -0700 | [diff] [blame] | 30 | ## Using Layers |
| 31 | |
Jon Ashburn | a0b85eb | 2014-10-23 10:59:23 -0600 | [diff] [blame] | 32 | 1) Build XGL loader and i965 icd driver using normal steps (cmake and make) |
Jon Ashburn | a0b85eb | 2014-10-23 10:59:23 -0600 | [diff] [blame] | 33 | 2) Place libXGLLayer<name>.so in the same directory as your XGL test or app: |
Jon Ashburn | 9d290e4 | 2014-11-26 13:27:04 -0700 | [diff] [blame] | 34 | cp build/layer/libXGLLayerBasic.so build/layer/libXGLLayerGeneric.so build/tests |
Jon Ashburn | a0b85eb | 2014-10-23 10:59:23 -0600 | [diff] [blame] | 35 | This is required for the Icd loader to be able to scan and enumerate your library. |
Jon Ashburn | 9d290e4 | 2014-11-26 13:27:04 -0700 | [diff] [blame] | 36 | 3) Specify which Layers to activate by using xglCreateDevice XGL_LAYER_CREATE_INFO struct or environment variable LIBXGL_LAYER_NAMES |
| 37 | export LIBXGL_LAYER_NAMES=Basic:Generic; |
Jon Ashburn | 183dfd0 | 2014-10-22 18:13:16 -0600 | [diff] [blame] | 38 | cd build/tests; ./xglinfo |
| 39 | |
Jon Ashburn | 9d290e4 | 2014-11-26 13:27:04 -0700 | [diff] [blame] | 40 | ## Tips for writing new layers |
Jon Ashburn | 183dfd0 | 2014-10-22 18:13:16 -0600 | [diff] [blame] | 41 | |
Jon Ashburn | 9d290e4 | 2014-11-26 13:27:04 -0700 | [diff] [blame] | 42 | 1) Must implement xglGetProcAddr() (aka GPA); |
| 43 | 2) Must have a local dispatch table to call next layer (see xglLayer.h); |
| 44 | 3) Should implement xglEnumerateLayers() returning layer name when gpu == NULL; |
| 45 | otherwise layer name is extracted from library filename by the Loader; |
| 46 | 4) gpu objects must be unwrapped (gpu->nextObject) when passed to next layer; |
| 47 | 5) next layers GPA can be found in the wrapped gpu object; |
| 48 | 6) Loader calls a layer's GPA first so initialization should occur here; |
| 49 | 7) all entrypoints can be wrapped but only will be called after layer is activated |
| 50 | via the first xglCreatDevice; |
| 51 | 8) entrypoint names can be any name as specified by the layers xglGetProcAddr |
| 52 | implementation; exceptions are xglGetProcAddr and xglEnumerateLayers, |
| 53 | which must have the correct name since the Loader calls these entrypoints; |
| 54 | 9) entrypoint names must be exported to the dynamic loader with XGL_LAYER_EXPORT; |
| 55 | 10) For LD_PRELOAD support: a)entrypoint names should be offical xgl names and |
| 56 | b) initialization should occur on any call with a gpu object (Loader type |
| 57 | initialization must be done if implementing xglInitAndEnumerateGpus). |
| 58 | 11) Implement xglGetExtension() if you want to advertise a layer extension |
| 59 | (only available after the layer is activated); |
| 60 | 12) Layer naming convention is camel case same name as in library: libXGLLayer<name>.so |
| 61 | |
| 62 | ## Status |
| 63 | |
| 64 | ### Current Features |
| 65 | |
| 66 | -scanning of available Layers during xglInitAndEnumerateGpus; |
| 67 | -layer names retrieved via xglEnumerateLayers(); |
| 68 | -xglEnumerateLayers and xglGetProcAddr supported APIs in xgl.h, ICD loader and i965 driver; |
| 69 | -multiple layers in a hierarchy supported; |
| 70 | -layer enumeration supported per GPU; |
Jon Ashburn | a0b85eb | 2014-10-23 10:59:23 -0600 | [diff] [blame] | 71 | -layers activated per gpu and per icd driver: separate dispatch table and layer library |
Jon Ashburn | 9d290e4 | 2014-11-26 13:27:04 -0700 | [diff] [blame] | 72 | list in loader for each gpu or icd driver; |
Jon Ashburn | 183dfd0 | 2014-10-22 18:13:16 -0600 | [diff] [blame] | 73 | -activation via xglCreateDevice extension struct in CreateInfo or via env var |
Jon Ashburn | 9d290e4 | 2014-11-26 13:27:04 -0700 | [diff] [blame] | 74 | (LIBXGL_LAYER_NAMES); |
| 75 | -layer libraries can be LD_PRELOADed if implemented correctly; |
Jon Ashburn | 183dfd0 | 2014-10-22 18:13:16 -0600 | [diff] [blame] | 76 | |
Jon Ashburn | 9d290e4 | 2014-11-26 13:27:04 -0700 | [diff] [blame] | 77 | ### Current known issues |
| 78 | |
| 79 | -layer libraries (except Basic) don't support multiple dispatch tables for multi-gpus; |
Tobin Ehlis | 475bebe | 2014-10-23 08:44:44 -0600 | [diff] [blame] | 80 | -layer libraries not yet include loader init functionality for full LD_PRELOAD of |
Jon Ashburn | 9d290e4 | 2014-11-26 13:27:04 -0700 | [diff] [blame] | 81 | entire API including xglInitAndEnumerateGpus; |
| 82 | -Since Layers aren't activated until xglCreateDevice, any calls to xglGetExtension() |
| 83 | will not report layer extensions unless implemented in the layer; |
| 84 | -layer extensions do NOT need to be enabled in xglCreateDevice to be available; |
Jon Ashburn | 183dfd0 | 2014-10-22 18:13:16 -0600 | [diff] [blame] | 85 | -no support for apps registering layers, must be discovered via initial scan |
Jon Ashburn | 183dfd0 | 2014-10-22 18:13:16 -0600 | [diff] [blame] | 86 | |