diff options
| author | Jens Owen <Jens@LunarG.com> | 2014-12-18 14:36:31 -0700 |
|---|---|---|
| committer | Courtney Goeltzenleuchter <courtney@LunarG.com> | 2014-12-19 17:59:39 -0700 |
| commit | 6a7fee4714f61c8880cd7dc99d592ca09bb4b861 (patch) | |
| tree | 0d9cde067978b2fe22c22ced0af444b32703732a | |
| parent | 899519096a86782c824522ca51dcf29ff5e8df61 (diff) | |
| download | usermoji-6a7fee4714f61c8880cd7dc99d592ca09bb4b861.tar.xz | |
Update README.md
Updated introduction to reference upcoming work around alpha header and GDC demos
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | layers/README.md | 120 |
2 files changed, 67 insertions, 57 deletions
@@ -15,8 +15,8 @@ New with XGL in an extensible layered architecture that enables significant inno - Customized interactive debugging and validation layers will be available together with first drivers
The components here are being shared with the Khronos community to provide
-early insights into the specification of XGL and to assists those doing
-prototyping at this point.
+insights into the specification as we approach an alpha header, and to assists those doing
+demos for GDC.
The following components are available:
- XGL Library and header files, which include:
diff --git a/layers/README.md b/layers/README.md index cbd40b9c..9091dcd6 100644 --- a/layers/README.md +++ b/layers/README.md @@ -1,7 +1,6 @@ -#Layer Description and Status -*27 Nov 2014* +# Layer Description and Status -##Overview +## Overview Layer libraries can be written to intercept or hook XGL entrypoints for various debug and validation purposes. One or more XGL entrypoints can be defined in your Layer @@ -13,58 +12,73 @@ activated at xglCreateDevice time. xglCreateDevice createInfo struct is extended a list of layers to be activated. Layer libraries can alternatively be LD_PRELOADed depending upon how they are implemented. -## Layer library example code +##Layer library example code -Note that some layers are code-generated and will therefore exist in the <build dir> -include/xglLayer.h - header file for layer code +Note that some layers are code-generated and will therefore exist in the <build dir> include/xglLayer.h - header file for layer code. + +### Templates layer/Basic.cpp (name=Basic) simple example wrapping a few entrypoints. Shows layer features: - - Multiple dispatch tables for supporting multiple GPUs. - - Example layer extension function shown. - - Layer extension advertised by xglGetExtension(). - - xglEnumerateLayers() supports loader layer name queries and call interception - - Can be LD_PRELOADed individually -layer/Multi.cpp (name=multi1:multi2) simple example showing multiple layers per library -<build dir>/layer/generic_layer.c (name=Generic) - auto generated example wrapping all XGL entrypoints. - Single global dispatch table. Can be LD_PRELOADed. +- Multiple dispatch tables for supporting multiple GPUs. +- Example layer extension function shown. +- Layer extension advertised by xglGetExtension(). +- xglEnumerateLayers() supports loader layer name queries and call interception +- Can be LD_PRELOADed individually + +layer/Multi.cpp (name=multi1:multi2) simple example showing multiple layers per library + +<build dir>/layer/generic_layer.c (name=Generic) - auto generated example wrapping all XGL entrypoints. Single global dispatch table. Can be LD_PRELOADed. + +### Print API Calls and Parameter Values <build dir>/layer/api_dump.c - print out API calls along with parameter values + <build dir>/layer/api_dump_file.c - Write API calls along with parameter values to xgl_apidump.txt file. + <build dir>/layer/api_dump_no_addr.c - print out API calls along with parameter values but replace any variable addresses with the static string "addr". -<build dir>/layer/object_track.c - 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)". -layer/draw_state.c - 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. -layer/mem_tracker.c - 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. + +### Print Object Stats +<build dir>/layer/object_track.c - 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)". + +### Report Draw State +layer/draw_state.c - 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. + +### Track GPU Memory +layer/mem_tracker.c - 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. ## Using Layers -1) Build XGL loader and i965 icd driver using normal steps (cmake and make) -2) Place libXGLLayer<name>.so in the same directory as your XGL test or app: - cp build/layer/libXGLLayerBasic.so build/layer/libXGLLayerGeneric.so build/tests -This is required for the Icd loader to be able to scan and enumerate your library. -3) Specify which Layers to activate by using xglCreateDevice XGL_LAYER_CREATE_INFO struct or environment variable LIBXGL_LAYER_NAMES - export LIBXGL_LAYER_NAMES=Basic:Generic; - cd build/tests; ./xglinfo +1. Build XGL loader and i965 icd driver using normal steps (cmake and make) +2. Place libXGLLayer<name>.so in the same directory as your XGL test or app: + + cp build/layer/libXGLLayerBasic.so build/layer/libXGLLayerGeneric.so build/tests + This is required for the Icd loader to be able to scan and enumerate your library. + +3. Specify which Layers to activate by using +xglCreateDevice XGL_LAYER_CREATE_INFO struct or environment variable LIBXGL_LAYER_NAMES + + export LIBXGL_LAYER_NAMES=Basic:Generic; + cd build/tests; ./xglinfo ## Tips for writing new layers -1) Must implement xglGetProcAddr() (aka GPA); -2) Must have a local dispatch table to call next layer (see xglLayer.h); -3) Should implement xglEnumerateLayers() returning layer name when gpu == NULL; - otherwise layer name is extracted from library filename by the Loader; -4) gpu objects must be unwrapped (gpu->nextObject) when passed to next layer; -5) next layers GPA can be found in the wrapped gpu object; -6) Loader calls a layer's GPA first so initialization should occur here; -7) all entrypoints can be wrapped but only will be called after layer is activated +1. Must implement xglGetProcAddr() (aka GPA); +2. Must have a local dispatch table to call next layer (see xglLayer.h); +3. Should implement xglEnumerateLayers() returning layer name when gpu == NULL; otherwise layer name is extracted from library filename by the Loader; +4. gpu objects must be unwrapped (gpu->nextObject) when passed to next layer; +5. next layers GPA can be found in the wrapped gpu object; +6. Loader calls a layer's GPA first so initialization should occur here; +7. all entrypoints can be wrapped but only will be called after layer is activated via the first xglCreatDevice; -8) entrypoint names can be any name as specified by the layers xglGetProcAddr +8. entrypoint names can be any name as specified by the layers xglGetProcAddr implementation; exceptions are xglGetProcAddr and xglEnumerateLayers, which must have the correct name since the Loader calls these entrypoints; -9) entrypoint names must be exported to the dynamic loader with XGL_LAYER_EXPORT; -10) For LD_PRELOAD support: a)entrypoint names should be offical xgl names and +9. entrypoint names must be exported to the dynamic loader with XGL_LAYER_EXPORT; +10. For LD_PRELOAD support: a)entrypoint names should be offical xgl names and b) initialization should occur on any call with a gpu object (Loader type initialization must be done if implementing xglInitAndEnumerateGpus). -11) Implement xglGetExtension() if you want to advertise a layer extension +11. Implement xglGetExtension() if you want to advertise a layer extension (only available after the layer is activated); -12) Layer naming convention is camel case same name as in library: libXGLLayer<name>.so -13) For multiple layers in one library should implement a separate GetProcAddr for each +12. Layer naming convention is camel case same name as in library: libXGLLayer<name>.so +13. For multiple layers in one library should implement a separate GetProcAddr for each layer and export them to dynamic loader; function name is <layerName>GetProcAddr(). Main xglGetProcAddr() should also be implemented. @@ -72,24 +86,20 @@ This is required for the Icd loader to be able to scan and enumerate your librar ### Current Features --scanning of available Layers during xglInitAndEnumerateGpus; --layer names retrieved via xglEnumerateLayers(); --xglEnumerateLayers and xglGetProcAddr supported APIs in xgl.h, ICD loader and i965 driver; --multiple layers in a hierarchy supported; --layer enumeration supported per GPU; --layers activated per gpu and per icd driver: separate dispatch table and layer library - list in loader for each gpu or icd driver; --activation via xglCreateDevice extension struct in CreateInfo or via env var - (LIBXGL_LAYER_NAMES); --layer libraries can be LD_PRELOADed if implemented correctly; +- scanning of available Layers during xglInitAndEnumerateGpus; +- layer names retrieved via xglEnumerateLayers(); +- xglEnumerateLayers and xglGetProcAddr supported APIs in xgl.h, ICD loader and i965 driver; +- multiple layers in a hierarchy supported; +- layer enumeration supported per GPU; +- layers activated per gpu and per icd driver: separate dispatch table and layer library list in loader for each gpu or icd driver; +- activation via xglCreateDevice extension struct in CreateInfo or via env var (LIBXGL_LAYER_NAMES); +- layer libraries can be LD_PRELOADed if implemented correctly; ### Current known issues --layer libraries (except Basic) don't support multiple dispatch tables for multi-gpus; --layer libraries not yet include loader init functionality for full LD_PRELOAD of - entire API including xglInitAndEnumerateGpus; --Since Layers aren't activated until xglCreateDevice, any calls to xglGetExtension() - will not report layer extensions unless implemented in the layer; --layer extensions do NOT need to be enabled in xglCreateDevice to be available; --no support for apps registering layers, must be discovered via initial scan +- layer libraries (except Basic) don't support multiple dispatch tables for multi-gpus; +- layer libraries not yet include loader init functionality for full LD_PRELOAD of entire API including xglInitAndEnumerateGpus; +- Since Layers aren't activated until xglCreateDevice, any calls to xglGetExtension() will not report layer extensions unless implemented in the layer; +- layer extensions do NOT need to be enabled in xglCreateDevice to be available; +- no support for apps registering layers, must be discovered via initial scan |
