blob: 449f892646fc9047e99bf6d3cfc987ffd9d43bda [file] [log] [blame] [view]
Jens Owen763b76e2014-12-18 14:36:31 -07001# Layer Description and Status
Jon Ashburn6b4d70c2014-10-22 18:13:16 -06002
Jens Owen763b76e2014-12-18 14:36:31 -07003## Overview
Jon Ashburna5817d52014-11-26 13:27:04 -07004
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06005Layer libraries can be written to intercept or hook VK entrypoints for various
6debug and validation purposes. One or more VK entrypoints can be defined in your Layer
Jon Ashburn6b4d70c2014-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.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06009vkEnumerateLayer can be called to list the available layer libraries. vkGetProcAddr is
Jon Ashburn6b4d70c2014-10-22 18:13:16 -060010used internally by the Layers and ICD Loader to initialize dispatch tables. Layers are
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060011activated at vkCreateDevice time. vkCreateDevice createInfo struct is extended to allow
Jon Ashburn649d8712014-12-18 17:26:52 -070012a list of layers to be activated. Layer libraries can alternatively be LD\_PRELOADed depending
Jon Ashburna5817d52014-11-26 13:27:04 -070013upon how they are implemented.
Jon Ashburn6b4d70c2014-10-22 18:13:16 -060014
Jens Owen763b76e2014-12-18 14:36:31 -070015##Layer library example code
Jon Ashburna5817d52014-11-26 13:27:04 -070016
Jon Ashburn649d8712014-12-18 17:26:52 -070017Note that some layers are code-generated and will therefore exist in the directory (build_dir)/layers
18
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060019-include/vkLayer.h - header file for layer code.
Jens Owen763b76e2014-12-18 14:36:31 -070020
21### Templates
Jon Ashburna5817d52014-11-26 13:27:04 -070022layer/Basic.cpp (name=Basic) simple example wrapping a few entrypoints. Shows layer features:
Jens Owen763b76e2014-12-18 14:36:31 -070023- Multiple dispatch tables for supporting multiple GPUs.
24- Example layer extension function shown.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060025- Layer extension advertised by vkGetExtension().
26- vkEnumerateLayers() supports loader layer name queries and call interception
Jon Ashburn649d8712014-12-18 17:26:52 -070027- Can be LD\_PRELOADed individually
Jens Owen763b76e2014-12-18 14:36:31 -070028
29layer/Multi.cpp (name=multi1:multi2) simple example showing multiple layers per library
30
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060031(build dir)/layer/generic_layer.c (name=Generic) - auto generated example wrapping all VK entrypoints. Single global dispatch table. Can be LD\_PRELOADed.
Jens Owen763b76e2014-12-18 14:36:31 -070032
33### Print API Calls and Parameter Values
Tobin Ehlis3d5b89d2015-02-05 11:51:35 -070034(build dir)/layer/api_dump.c (name=APIDump) - print out API calls along with parameter values
Jens Owen763b76e2014-12-18 14:36:31 -070035
Tobin Ehlis3d5b89d2015-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 Owen763b76e2014-12-18 14:36:31 -070037
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060038(build dir)/layer/api\_dump\_file.c (name=APIDumpFile) - Write API calls along with parameter values to vk\_apidump.txt file.
Tobin Ehlis3d5b89d2015-02-05 11:51:35 -070039
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 Owen763b76e2014-12-18 14:36:31 -070043
44### Print Object Stats
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060045(build dir>/layer/object_track.c (name=ObjectTracker) - Print object CREATE/USE/DESTROY stats. Individually track objects by category. VK\_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 "VK\_UINT64 objTrackGetObjectCount(VK\_OBJECT\_TYPE type)" and a secondary call to return an array of those objects "VK\_RESULT objTrackGetObjects(VK\_OBJECT\_TYPE type, VK\_UINT64 objCount, OBJTRACK\_NODE* pObjNodeArray)".
Jens Owen763b76e2014-12-18 14:36:31 -070046
47### Report Draw State
Tobin Ehlis4cf98212015-04-06 09:24:42 -060048layer/draw\_state.c (name=DrawState) - DrawState reports the Descriptor Set, Pipeline State, and dynamic state at each Draw call. DrawState layer performs a number of validation checks on this state. Of primary interest is making sure that the resources bound to Descriptor Sets correctly align with the layout specified for the Set. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout.
Jens Owen763b76e2014-12-18 14:36:31 -070049
50### Track GPU Memory
Tobin Ehlis4cf98212015-04-06 09:24:42 -060051layer/mem\_tracker.c (name=MemTracker) - MemTracker functions mostly as a validation layer, attempting to ensure that memory objects are managed correctly by the application. These memory objects are bound to pipelines, objects, and command buffers, and then submitted to the GPU for work. As an example, the layer validates that the correct memory objects have been bound, and that they are specified correctly when the command buffers are submitted. Also, that only existing memory objects are referenced, and that any destroyed memory objects are not referenced. Another type of validation done is that before any memory objects are reused or destroyed, the layer ensures that the application has confirmed that they are no longer in use, and that they have been properly unbound before destruction. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout.
Jon Ashburn6b4d70c2014-10-22 18:13:16 -060052
Tobin Ehlis6e6aa1f2014-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 Ashburna5817d52014-11-26 13:27:04 -070056## Using Layers
57
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600581. Build VK loader and i965 icd driver using normal steps (cmake and make)
592. Place libVKLayer<name>.so in the same directory as your VK test or app:
Jens Owen763b76e2014-12-18 14:36:31 -070060
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060061 cp build/layer/libVKLayerBasic.so build/layer/libVKLayerGeneric.so build/tests
Jon Ashburn649d8712014-12-18 17:26:52 -070062
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060063 This is required for the Icd loader to be able to scan and enumerate your library. Alternatively, use the LIBVK\_LAYERS\_PATH environment variable to specify where the layer libraries reside.
Jens Owen763b76e2014-12-18 14:36:31 -070064
653. Specify which Layers to activate by using
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060066vkCreateDevice VK\_LAYER\_CREATE\_INFO struct or environment variable LIBVK\_LAYER\_NAMES
Jens Owen763b76e2014-12-18 14:36:31 -070067
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060068 export LIBVK\_LAYER\_NAMES=Basic:Generic
69 cd build/tests; ./vkinfo
Jon Ashburn6b4d70c2014-10-22 18:13:16 -060070
Jon Ashburna5817d52014-11-26 13:27:04 -070071## Tips for writing new layers
Jon Ashburn6b4d70c2014-10-22 18:13:16 -060072
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600731. Must implement vkGetProcAddr() (aka GPA);
742. Must have a local dispatch table to call next layer (see vkLayer.h);
753. Should implement vkEnumerateLayers() returning layer name when gpu == NULL; otherwise layer name is extracted from library filename by the Loader;
Jens Owen763b76e2014-12-18 14:36:31 -0700764. 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
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060080 via the first vkCreatDevice;
818. entrypoint names can be any name as specified by the layers vkGetProcAddr
82 implementation; exceptions are vkGetProcAddr and vkEnumerateLayers,
Jon Ashburna5817d52014-11-26 13:27:04 -070083 which must have the correct name since the Loader calls these entrypoints;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600849. entrypoint names must be exported to the dynamic loader with VK\_LAYER\_EXPORT;
8510. For LD\_PRELOAD support: a)entrypoint names should be offical vk names and
Jon Ashburna5817d52014-11-26 13:27:04 -070086 b) initialization should occur on any call with a gpu object (Loader type
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060087 initialization must be done if implementing vkInitAndEnumerateGpus).
8811. Implement vkGetExtension() if you want to advertise a layer extension
Jon Ashburna5817d52014-11-26 13:27:04 -070089 (only available after the layer is activated);
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06009012. Layer naming convention is camel case same name as in library: libVKLayer<name>.so
Jens Owen763b76e2014-12-18 14:36:31 -07009113. For multiple layers in one library should implement a separate GetProcAddr for each
Jon Ashburn79113cc2014-12-01 14:22:40 -070092 layer and export them to dynamic loader; function name is <layerName>GetProcAddr().
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060093 Main vkGetProcAddr() should also be implemented.
Jon Ashburna5817d52014-11-26 13:27:04 -070094
95## Status
96
97### Current Features
98
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060099- scanning of available Layers during vkInitAndEnumerateGpus;
100- layer names retrieved via vkEnumerateLayers();
101- vkEnumerateLayers and vkGetProcAddr supported APIs in vulkan.h, ICD loader and i965 driver;
Jens Owen763b76e2014-12-18 14:36:31 -0700102- 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;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600105- activation via vkCreateDevice extension struct in CreateInfo or via env var (LIBVK\_LAYER\_NAMES);
Jon Ashburn649d8712014-12-18 17:26:52 -0700106- layer libraries can be LD\_PRELOADed if implemented correctly;
Jon Ashburn6b4d70c2014-10-22 18:13:16 -0600107
Jon Ashburna5817d52014-11-26 13:27:04 -0700108### Current known issues
109
Tobin Ehlis3d5b89d2015-02-05 11:51:35 -0700110- Layers with multiple threads are not well tested and some layers likely to have issues. APIDump family of layers should be thread-safe.
Jens Owen763b76e2014-12-18 14:36:31 -0700111- layer libraries (except Basic) don't support multiple dispatch tables for multi-gpus;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600112- layer libraries not yet include loader init functionality for full LD\_PRELOAD of entire API including vkInitAndEnumerateGpus;
113- Since Layers aren't activated until vkCreateDevice, any calls to vkGetExtension() will not report layer extensions unless implemented in the layer;
114- layer extensions do NOT need to be enabled in vkCreateDevice to be available;
Jens Owen763b76e2014-12-18 14:36:31 -0700115- no support for apps registering layers, must be discovered via initial scan
Jon Ashburn6b4d70c2014-10-22 18:13:16 -0600116