blob: 8123ab707b026eb37a70d88fc7e4fd277eb63e88 [file] [log] [blame] [view]
Jens Owen8b5ed542014-12-18 14:36:31 -07001# Layer Description and Status
Jon Ashburn183dfd02014-10-22 18:13:16 -06002
Jens Owen8b5ed542014-12-18 14:36:31 -07003## Overview
Jon Ashburn9d290e42014-11-26 13:27:04 -07004
Jon Ashburn183dfd02014-10-22 18:13:16 -06005Layer libraries can be written to intercept or hook XGL entrypoints for various
Courtney Goeltzenleuchter6be96bb2014-11-02 18:50:52 -07006debug and validation purposes. One or more XGL entrypoints can be defined in your Layer
Jon Ashburn183dfd02014-10-22 18:13:16 -06007library. Undefined entrypoints in the Layer library will be passed to the next Layer which
8may be the driver. Multiple layer libraries can be chained (actually a hierarchy) together.
Tobin Ehlis475bebe2014-10-23 08:44:44 -06009xglEnumerateLayer can be called to list the available layer libraries. xglGetProcAddr is
Jon Ashburn183dfd02014-10-22 18:13:16 -060010used internally by the Layers and ICD Loader to initialize dispatch tables. Layers are
11activated at xglCreateDevice time. xglCreateDevice createInfo struct is extended to allow
Jon Ashburnde3630c2014-12-18 17:26:52 -070012a list of layers to be activated. Layer libraries can alternatively be LD\_PRELOADed depending
Jon Ashburn9d290e42014-11-26 13:27:04 -070013upon how they are implemented.
Jon Ashburn183dfd02014-10-22 18:13:16 -060014
Jens Owen8b5ed542014-12-18 14:36:31 -070015##Layer library example code
Jon Ashburn9d290e42014-11-26 13:27:04 -070016
Jon Ashburnde3630c2014-12-18 17:26:52 -070017Note that some layers are code-generated and will therefore exist in the directory (build_dir)/layers
18
19-include/xglLayer.h - header file for layer code.
Jens Owen8b5ed542014-12-18 14:36:31 -070020
21### Templates
Jon Ashburn9d290e42014-11-26 13:27:04 -070022layer/Basic.cpp (name=Basic) simple example wrapping a few entrypoints. Shows layer features:
Jens Owen8b5ed542014-12-18 14:36:31 -070023- Multiple dispatch tables for supporting multiple GPUs.
24- Example layer extension function shown.
25- Layer extension advertised by xglGetExtension().
26- xglEnumerateLayers() supports loader layer name queries and call interception
Jon Ashburnde3630c2014-12-18 17:26:52 -070027- Can be LD\_PRELOADed individually
Jens Owen8b5ed542014-12-18 14:36:31 -070028
29layer/Multi.cpp (name=multi1:multi2) simple example showing multiple layers per library
30
Jon Ashburnde3630c2014-12-18 17:26:52 -070031(build dir)/layer/generic_layer.c (name=Generic) - auto generated example wrapping all XGL entrypoints. Single global dispatch table. Can be LD\_PRELOADed.
Jens Owen8b5ed542014-12-18 14:36:31 -070032
33### Print API Calls and Parameter Values
Tobin Ehlis7302c352015-02-05 11:51:35 -070034(build dir)/layer/api_dump.c (name=APIDump) - print out API calls along with parameter values
Jens Owen8b5ed542014-12-18 14:36:31 -070035
Tobin Ehlis7302c352015-02-05 11:51:35 -070036(build dir)/layer/api_dump.cpp (name=APIDumpCpp) - same as above but uses c++ strings and i/o streams
Jens Owen8b5ed542014-12-18 14:36:31 -070037
Tobin Ehlis7302c352015-02-05 11:51:35 -070038(build dir)/layer/api\_dump\_file.c (name=APIDumpFile) - Write API calls along with parameter values to xgl\_apidump.txt file.
39
40(build dir)/layer/api\_dump\_no\_addr.c (name=APIDumpNoAddr) - print out API calls along with parameter values but replace any variable addresses with the static string "addr".
41
42(build dir)/layer/api\_dump\_no\_addr.cpp (name=APIDumpNoAddrCpp) - same as above but uses c++ strings and i/o streams
Jens Owen8b5ed542014-12-18 14:36:31 -070043
44### Print Object Stats
Tobin Ehlis7302c352015-02-05 11:51:35 -070045(build dir>/layer/object_track.c (name=ObjectTracker) - Print object CREATE/USE/DESTROY stats. Individually track objects by category. XGL\_OBJECT\_TYPE enum defined in object_track.h. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout. Provides custom interface to query number of live objects of given type "XGL\_UINT64 objTrackGetObjectCount(XGL\_OBJECT\_TYPE type)" and a secondary call to return an array of those objects "XGL\_RESULT objTrackGetObjects(XGL\_OBJECT\_TYPE type, XGL\_UINT64 objCount, OBJTRACK\_NODE* pObjNodeArray)".
Jens Owen8b5ed542014-12-18 14:36:31 -070046
47### Report Draw State
Tobin Ehlis7302c352015-02-05 11:51:35 -070048layer/draw\_state.c (name=DrawState) - NOTE: This layer is currently non-functional due to a number of changes in xgl.h. When updated, it will report the Descriptor Set, Pipeline State, and dynamic state at each Draw call. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout.
Jens Owen8b5ed542014-12-18 14:36:31 -070049
50### Track GPU Memory
Tobin Ehlis7302c352015-02-05 11:51:35 -070051layer/mem\_tracker.c (name=MemTracker) - NOTE: This layer is currently non-functional due to a number of changes in xgl.h. When updated, it will track GPU Memory and any binding it has to objects and/or Cmd Buffers. Report issues with freeing memory, memory dependencies on Cmd Buffers, and any memory leaks at DestroyDevice time. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout.
Jon Ashburn183dfd02014-10-22 18:13:16 -060052
Tobin Ehlis27c2d822014-12-18 10:32:57 -070053### Check parameters
54<build dir>/layer/param_checker.c (name=ParamChecker) - Check the input parameters to API calls for validity. Currently this only checks ENUM params directly passed to API calls and ENUMs embedded in struct params. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout.
55
Jon Ashburn9d290e42014-11-26 13:27:04 -070056## Using Layers
57
Jens Owen8b5ed542014-12-18 14:36:31 -0700581. Build XGL loader and i965 icd driver using normal steps (cmake and make)
592. Place libXGLLayer<name>.so in the same directory as your XGL test or app:
60
61 cp build/layer/libXGLLayerBasic.so build/layer/libXGLLayerGeneric.so build/tests
Jon Ashburnde3630c2014-12-18 17:26:52 -070062
63 This is required for the Icd loader to be able to scan and enumerate your library. Alternatively, use the LIBXGL\_LAYERS\_PATH environment variable to specify where the layer libraries reside.
Jens Owen8b5ed542014-12-18 14:36:31 -070064
653. Specify which Layers to activate by using
Jon Ashburnde3630c2014-12-18 17:26:52 -070066xglCreateDevice XGL\_LAYER\_CREATE\_INFO struct or environment variable LIBXGL\_LAYER\_NAMES
Jens Owen8b5ed542014-12-18 14:36:31 -070067
Tobin Ehlis7302c352015-02-05 11:51:35 -070068 export LIBXGL\_LAYER\_NAMES=Basic:Generic
Jens Owen8b5ed542014-12-18 14:36:31 -070069 cd build/tests; ./xglinfo
Jon Ashburn183dfd02014-10-22 18:13:16 -060070
Jon Ashburn9d290e42014-11-26 13:27:04 -070071## Tips for writing new layers
Jon Ashburn183dfd02014-10-22 18:13:16 -060072
Jens Owen8b5ed542014-12-18 14:36:31 -0700731. Must implement xglGetProcAddr() (aka GPA);
742. Must have a local dispatch table to call next layer (see xglLayer.h);
753. Should implement xglEnumerateLayers() returning layer name when gpu == NULL; otherwise layer name is extracted from library filename by the Loader;
764. gpu objects must be unwrapped (gpu->nextObject) when passed to next layer;
775. next layers GPA can be found in the wrapped gpu object;
786. Loader calls a layer's GPA first so initialization should occur here;
797. all entrypoints can be wrapped but only will be called after layer is activated
Jon Ashburn9d290e42014-11-26 13:27:04 -070080 via the first xglCreatDevice;
Jens Owen8b5ed542014-12-18 14:36:31 -0700818. entrypoint names can be any name as specified by the layers xglGetProcAddr
Jon Ashburn9d290e42014-11-26 13:27:04 -070082 implementation; exceptions are xglGetProcAddr and xglEnumerateLayers,
83 which must have the correct name since the Loader calls these entrypoints;
Jon Ashburnde3630c2014-12-18 17:26:52 -0700849. entrypoint names must be exported to the dynamic loader with XGL\_LAYER\_EXPORT;
8510. For LD\_PRELOAD support: a)entrypoint names should be offical xgl names and
Jon Ashburn9d290e42014-11-26 13:27:04 -070086 b) initialization should occur on any call with a gpu object (Loader type
87 initialization must be done if implementing xglInitAndEnumerateGpus).
Jens Owen8b5ed542014-12-18 14:36:31 -07008811. Implement xglGetExtension() if you want to advertise a layer extension
Jon Ashburn9d290e42014-11-26 13:27:04 -070089 (only available after the layer is activated);
Jens Owen8b5ed542014-12-18 14:36:31 -07009012. Layer naming convention is camel case same name as in library: libXGLLayer<name>.so
9113. For multiple layers in one library should implement a separate GetProcAddr for each
Jon Ashburn8d8dad02014-12-01 14:22:40 -070092 layer and export them to dynamic loader; function name is <layerName>GetProcAddr().
93 Main xglGetProcAddr() should also be implemented.
Jon Ashburn9d290e42014-11-26 13:27:04 -070094
95## Status
96
97### Current Features
98
Jens Owen8b5ed542014-12-18 14:36:31 -070099- scanning of available Layers during xglInitAndEnumerateGpus;
100- layer names retrieved via xglEnumerateLayers();
101- xglEnumerateLayers and xglGetProcAddr supported APIs in xgl.h, ICD loader and i965 driver;
102- multiple layers in a hierarchy supported;
103- layer enumeration supported per GPU;
104- layers activated per gpu and per icd driver: separate dispatch table and layer library list in loader for each gpu or icd driver;
Jon Ashburnde3630c2014-12-18 17:26:52 -0700105- activation via xglCreateDevice extension struct in CreateInfo or via env var (LIBXGL\_LAYER\_NAMES);
106- layer libraries can be LD\_PRELOADed if implemented correctly;
Jon Ashburn183dfd02014-10-22 18:13:16 -0600107
Jon Ashburn9d290e42014-11-26 13:27:04 -0700108### Current known issues
109
Tobin Ehlis7302c352015-02-05 11:51:35 -0700110- DrawState and MemTracker layers are both non-functional due to updates to xgl.h. Work is ongoing to bring these layers up to latest header.
111- Layers with multiple threads are not well tested and some layers likely to have issues. APIDump family of layers should be thread-safe.
Jens Owen8b5ed542014-12-18 14:36:31 -0700112- layer libraries (except Basic) don't support multiple dispatch tables for multi-gpus;
Jon Ashburnde3630c2014-12-18 17:26:52 -0700113- layer libraries not yet include loader init functionality for full LD\_PRELOAD of entire API including xglInitAndEnumerateGpus;
Jens Owen8b5ed542014-12-18 14:36:31 -0700114- Since Layers aren't activated until xglCreateDevice, any calls to xglGetExtension() will not report layer extensions unless implemented in the layer;
115- layer extensions do NOT need to be enabled in xglCreateDevice to be available;
116- no support for apps registering layers, must be discovered via initial scan
Jon Ashburn183dfd02014-10-22 18:13:16 -0600117