blob: 4901fea78593a9526cf904dde929ee22674c8ee1 [file] [log] [blame] [view]
Jon Ashburnc2972682016-02-08 15:42:01 -07001# Vulkan Loader Specification and Architecture Overview
2
3
4Goals of this document
5----------------------
6
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07007Specify necessary functions and expected behavior of interface between the
8loader library and ICDs and layers for Windows, Linux and Android based
9systems. Also describe the application visible behaviors of the loader.
Jon Ashburnc2972682016-02-08 15:42:01 -070010
11Audience
12--------
13
14Application, Vulkan driver and Vulkan layer developers.
15
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -070016Any developers interested in understanding more about loader and layer behavior
17and architecture.
Jon Ashburnc2972682016-02-08 15:42:01 -070018
19
20Loader goals
21------------
22
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -070023- Support multiple ICDs (Installable Client Drivers) to co-exist on a system
24without interfering with each other.
Jon Ashburnc2972682016-02-08 15:42:01 -070025
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -070026- Support optional modules (layers) that can be enabled by an application,
27developer or the system and have no impact when not enabled.
Jon Ashburnc2972682016-02-08 15:42:01 -070028
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -070029- Negligible performance cost for an application calling through the loader
30to an ICD entry point.
Jon Ashburnc2972682016-02-08 15:42:01 -070031
32Architectural overview of layers and loader
33-------------------------------------------
34
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -070035Vulkan is layered architecture. Layers can hook (intercept) Vulkan commands to
36achieve various functionality that a Vulkan driver (aka ICD) or loader doesn’t
37support. Functionality such as Vulkan API tracing and debugging, API usage
38validation, and other tools such as framebuffer overlays are all natural
39candidates for Vulkan layers. Layers are implemented as libraries that are
40inserted between the application and the driver.
Jon Ashburnc2972682016-02-08 15:42:01 -070041
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -070042Not only is Vulkan a layered architecture but it also supports multiple GPUs
43and their drivers. Vulkan commands called by an application may wind up calling
44into a diverse set of modules: loader, layers, and ICDs. The loader is critical
45to managing the proper dispatching of Vulkan commands to the appropriate set of
46layers and ICDs. The loader inserts layers into a call chain so they can
47intercept Vulkan commands prior to the proper ICD being called. To achieve
48proper dispatching of Vulkan command to layers and ICDs the loader uses the
49Vulkan object model.
Jon Ashburnc2972682016-02-08 15:42:01 -070050
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -070051Vulkan uses an object model to control the scope of a particular action /
52operation. The object to be acted on is always the first parameter of a Vulkan
53call and is a dispatchable object (see Vulkan specification section 2.2 Object
54Model). Under the covers, the dispatchable object handle is a pointer to a
55structure that contains a pointer to a dispatch table maintained by the loader.
56This dispatch table contains pointers to the Vulkan functions appropriate to
57that object. I.e. a VkInstance object’s dispatch table will point to Vulkan
58functions such as vkEnumeratePhysicalDevices, vkDestroyInstance,
59vkCreateInstance, etc.
Jon Ashburnc2972682016-02-08 15:42:01 -070060
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -070061Device objects have a separate dispatch table containing the appropriate
62function pointers.
Jon Ashburnc2972682016-02-08 15:42:01 -070063
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -070064These instance and device dispatch tables are constructed when the application
65calls vkCreateInstance and vkCreateDevice. At that time the application and/or
66system can specify optional layers to be included. The loader will initialize
67the specified layers to create a call chain for each Vulkan function and each
68entry of the dispatch table will point to the first element of that chain.
69Thus, the loader builds an instance call chain for each VkInstance that is
70created and a device call chain for each VkDevice that is created.
Jon Ashburnc2972682016-02-08 15:42:01 -070071
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -070072For example, the diagram below represents what happens in the call chain for
73vkCreateInstance. After initializing the chain, the loader will call into the
74first layer’s vkCreateInstance which will call the next finally terminating in
75the loader again where this function calls every ICD’s vkCreateInstance and
76saves the results. This allows every enabled layer for this chain to set up
77what it needs based on the VkInstanceCreateInfo structure from the application.
Jon Ashburnc2972682016-02-08 15:42:01 -070078
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -070079This also highlights some of the complexity the loader must manage when using
80instance chains. As shown here, the loader must aggregate information from
81multiple devices when they are present. This means that the loader has to know
82about instance level extensions to aggregate them correctly.
Jon Ashburnc2972682016-02-08 15:42:01 -070083
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -070084Device chains are created at vkCreateDevice and are generally simpler because
85they deal with only a single device and the ICD can always be the terminator of
86the chain. The below diagram also illustrates how layers (either device or
87instance) can skip intercepting any given Vulkan entry point.
Jon Ashburnc2972682016-02-08 15:42:01 -070088
89Application interface to loader
90-------------------------------
91
92In this section we’ll discuss how an application interacts with the loader.
93
94- Linking to loader library for core and WSI extension symbols.
95
96- Dynamic Vulkan command lookup & application dispatch table.
97
98- Loader library filenames for linking to different Vulkan ABI versions.
99
100- Layers
101
102- Extensions
103
104- vkGetInstanceProcAddr, vkGetDeviceProcAddr
105
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700106The loader library on Windows, Linux and Android will export all core Vulkan
107and all appropriate Window System Interface (WSI) extensions. This is done to
108make it simpler to get started with Vulkan development. When an application
109links directly to the loader library in this way, the Vulkan calls are simple
110trampoline functions that jump to the appropriate dispatch table entry for the
111object they are given.
Jon Ashburnc2972682016-02-08 15:42:01 -0700112
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700113Applications are not required to link directly to the loader library, instead
114they can use the appropriate platform specific dynamic symbol lookup on the
115loader library to initialize the application’s own dispatch table. This allows
116an application to fail gracefully if the loader cannot be found and provide the
117fastest mechanism for the application to call Vulkan functions. An application
118will only need to query (via system calls such as dlsym()) the address of
119vkGetInstanceProcAddr from the loader library. Using vkGetInstanceProcAddr the
120application can then discover the address of all instance and global functions
121and extensions, such as vkCreateInstance,
122vkEnumerateInstanceExtensionProperties and vkEnumerateInstanceLayerProperties
123in a platform independent way.
Jon Ashburnc2972682016-02-08 15:42:01 -0700124
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700125The Vulkan loader library will be distributed in various ways including Vulkan
126SDKs, OS package distributions and IHV driver packages. These details are
127beyond the scope of this document. However, the name and versioning of the
128Vulkan loader library is specified so an app can link to the correct Vulkan ABI
129library version. Vulkan versioning is such that ABI backwards compatibility is
130guaranteed for all versions with the same major number (eg 1.0 and 1.1). On
131Windows, the loader library encodes the ABI version in its name such that
132multiple ABI incompatible versions of the loader can peacefully coexist on a
133given system. The vulkan loader library key name is “vulkan-<ABI
134version>”. For example, for Vulkan version 1.X on Windows the library
135filename is vulkan-1.dll. And this library file can typically be found in the
136windows/system32 directory.
Jon Ashburnc2972682016-02-08 15:42:01 -0700137
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700138For Linux, shared libraries are versioned based on a suffix. Thus, the ABI
139number is not encoded in the base of the library filename as on Windows. On
140Linux an application wanting to link to the latest Vulkan ABI version would
141just link to the name vulkan (libvulkan.so). A specific Vulkan ABI version can
142also be linked to by applications (eg libvulkan.so.1).
Jon Ashburnc2972682016-02-08 15:42:01 -0700143
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700144Applications desiring Vulkan functionality beyond what the core API offers may
145use various layers or extensions. A layer cannot add new or modify existing
146Vulkan commands, but may offer extensions that do. A common use of layers is
147for API validation. A developer can use validation layers during application
148development, but during production the layers can be disabled by the
149application. Thus, eliminating the overhead of validating the applications
150usage of the API. Layers discovered by the loader can be reported to the
151application via vkEnumerateInstanceLayerProperties and
152vkEnumerateDeviceLayerProperties, for instance and device layers respectively.
153Instance layers are enabled at vkCreateInstance; device layers are enabled at
154vkCreateDevice. For example, the ppEnabledLayerNames array in the
155VkDeviceCreateInfo structure is used by the application to list the device
156layer names to be enabled at vkCreateDevice. At vkCreateInstance and
157vkCreateDevice, the loader will construct call chains that include the
158application specified (enabled) layers. Order is important in the
159ppEnabledLayerNames array; array element 0 is the topmost (closest to the
160application) layer inserted in the chain and the last array element is closest
161to the driver.
Jon Ashburnc2972682016-02-08 15:42:01 -0700162
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700163Developers may want to enable layers that are not enabled by the given
164application they are using. On Linux and Windows, the environment variables
165“VK\_INSTANCE\_LAYERS” and “VK\_DEVICE\_LAYERS” can be used to enable
166additional layers which are not specified (enabled) by the application at
167vkCreateInstance/vkCreateDevice. VK\_INSTANCE\_LAYERS is a colon
168(Linux)/semi-colon (Windows) separated list of layer names to enable. Order is
169relevant with the first layer in the list being the topmost layer (closest to
170the application) and the last layer in the list being the bottommost layer
171(closest to the driver).
Jon Ashburnc2972682016-02-08 15:42:01 -0700172
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700173Application specified layers and user specified layers (via environment
174variables) are aggregated and duplicates removed by the loader when enabling
175layers. Layers specified via environment variable are topmost (closest to the
176application) while layers specified by the application are bottommost.
Jon Ashburnc2972682016-02-08 15:42:01 -0700177
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700178An example of using these environment variables to activate the validation
179layer VK\_LAYER\_LUNARG\_param\_checker on Windows or Linux is as follows:
Jon Ashburnc2972682016-02-08 15:42:01 -0700180
181```
Jon Ashburncc300a22016-02-11 14:57:30 -0700182> $ export VK_INSTANCE_LAYERS=VK_LAYER_LUNARG_param_checker
Jon Ashburnc2972682016-02-08 15:42:01 -0700183
Jon Ashburncc300a22016-02-11 14:57:30 -0700184> $ export VK_DEVICE_LAYERS=VK_LAYER_LUNARG_param_checker
Jon Ashburnc2972682016-02-08 15:42:01 -0700185```
186
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700187**Note**: Many layers, including all LunarG validation layers are “global”
188(i.e. both instance and device) layers and *must* be enabled on both the
189instance and device chains to function properly. This is required for “global”
190layers regardless of which method is used to enable the layer (application or
191environment variable).
Jon Ashburnc2972682016-02-08 15:42:01 -0700192
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700193Some platforms, including Linux and Windows, support layers which are enabled
194automatically by the loader rather than explicitly by the application (or via
195environment variable). Explicit layers are those layers enabled by the
196application (or environment variable) by providing the layer name. Implicit
197layers are those layers enabled by the loader automatically. Any implicit
198layers the loader discovers on the system in the appropriate location will be
199enabled (subject to environment variable overrides described later). Discovery
200of properly installed implicit and explicit layers is described later.
201Explicitly enabling a layer that is implicitly enabled has no additional
202effect: the layer will still be enabled implicitly by the loader.
Jon Ashburnc2972682016-02-08 15:42:01 -0700203
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700204Extensions are optional functionality provided by a layer, the loader or an
205ICD. Extensions can modify the behavior of the Vulkan API and need to be
206specified and registered with Khronos.
Jon Ashburnc2972682016-02-08 15:42:01 -0700207
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700208Instance extensions can be discovered via
209vkEnumerateInstanceExtensionProperties. Device extensions can be discovered via
210vkEnumerateDeviceExtensionProperties. The loader discovers and aggregates all
211extensions from layers (both explicit and implicit), ICDs and the loader before
212reporting them to the application in vkEnumerate\*ExtensionProperties. The
213pLayerName parameter in these functions are used to select either a single
214layer or the Vulkan platform implementation. If pLayerName is NULL, extensions
215from Vulkan implementation components (including loader, implicit layers, and
216ICDs) are enumerated. If pLayerName is equal to a discovered layer module name
217then any extensions from that layer (which may be implicit or explicit) are
218enumerated. Duplicate extensions (eg an implicit layer and ICD might report
219support for the same extension) are eliminated by the loader. Extensions must
220be enabled (in vkCreateInstance or vkCreateDevice) before they can be used.
Jon Ashburnc2972682016-02-08 15:42:01 -0700221
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700222Extension command entry points should be queried via vkGetInstanceProcAddr or
223vkGetDeviceProcAddr. vkGetDeviceProcAddr can only be used to query for device
224extension or core device entry points. Device entry points include any command
225that uses a VkDevice as the first parameter or a dispatchable object that is a
226child of a VkDevice (currently this includes VkQueue and VkCommandBuffer).
227vkGetInstanceProcAddr can be used to query either device or instance extension
228entry points in addition to all core entry points.
Jon Ashburnc2972682016-02-08 15:42:01 -0700229
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700230VkGetDeviceProcAddr is particularly interesting because it will provide the
231most efficient way to call into the ICD. For example, the diagram below shows
232what could happen if the application were to use vkGetDeviceProcAddr for the
233function “vkGetDeviceQueue” and “vkDestroyDevice” but not “vkAllocateMemory”.
234The resulting function pointer (fpGetDeviceQueue) would be the ICD’s entry
235point if the loader and any enabled layers do not need to see that call. Even
236if an enabled layer intercepts the call (eg vkDestroyDevice) the loader
237trampoline code is skipped for function pointers obtained via
238vkGetDeviceProcAddr. This also means that function pointers obtained via
239vkGetDeviceProcAddr will only work with the specific VkDevice it was created
240for, using it with another device has undefined results. For extensions,
241Get\*ProcAddr will often be the only way to access extension API features.
Jon Ashburnc2972682016-02-08 15:42:01 -0700242
243
244Vulkan Installable Client Driver interface with the loader
245----------------------------------------------------------
246
247### ICD discovery
248
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700249Vulkan allows multiple drivers each with one or more devices (represented by a
250Vulkan VkPhysicalDevice object) to be used collectively. The loader is
251responsible for discovering available Vulkan ICDs on the system. Given a list
252of available ICDs, the loader can enumerate all the physical devices available
253for an application and return this information to the application. The process
254in which the loader discovers the available Installable Client Drivers (ICDs)
255on a system is platform dependent. Windows, Linux and Android ICD discovery
256details are listed below.
Jon Ashburnc2972682016-02-08 15:42:01 -0700257
258#### Windows
259
260##### Properly-Installed ICDs
261
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700262In order to find properly-installed ICDs, the Vulkan loader will scan the
263values in the following Windows registry key:
Jon Ashburnc2972682016-02-08 15:42:01 -0700264
265HKEY\_LOCAL\_MACHINE\\SOFTWARE\\Khronos\\Vulkan\\Drivers
266
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700267For each value in this key which has DWORD data set to 0, the loader opens the
268JSON format text information file (a.k.a. "manifest file") specified by the
269name of the value. Each name must be a full pathname to the text manifest file.
270The Vulkan loader will open each manifest file to obtain the name or pathname
271of an ICD shared library (".dll") file. For example:
Jon Ashburnc2972682016-02-08 15:42:01 -0700272
Jon Ashburncc300a22016-02-11 14:57:30 -0700273 ```
274 {
Jon Ashburnc2972682016-02-08 15:42:01 -0700275 "file_format_version": "1.0.0",
276 "ICD": {
277 "library_path": "path to ICD library",
Tony Barbourcd489512016-02-10 15:59:32 -0700278 "api_version": "1.0.3"
Jon Ashburnc2972682016-02-08 15:42:01 -0700279 }
280 }
Jon Ashburncc300a22016-02-11 14:57:30 -0700281 ```
Jon Ashburnc2972682016-02-08 15:42:01 -0700282
283
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700284The "library\_path" specifies either a filename, a relative pathname, or a full
285pathname to an ICD shared library file, which the loader will attempt to load
286using LoadLibrary(). If the ICD is specified via a filename, the shared library
287lives in the system's DLL search path (e.g. in the "C:\\\\Windows\\\\System32"
288folder). If the ICD is specified via a relative pathname, it is relative to the
289path of the manifest file. Relative pathnames are those that do not start with
290a drive specifier (e.g. "C:"), nor with a directory separator (i.e. the '\\'
291character), but do contain at least one directory separator.
Jon Ashburnc2972682016-02-08 15:42:01 -0700292
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700293The "file\_format\_version" specifies a major.minor.patch version number in
294case the format of the text information file changes in the future. If the same
295ICD shared library supports multiple, incompatible versions of text manifest
296file format versions, it must have multiple text info files (all of which may
297point to the same shared library).
Jon Ashburnc2972682016-02-08 15:42:01 -0700298
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700299The “api\_version” specifies the major.minor.patch version number of the Vulkan
300API that the shared library (referenced by "library\_path") was built with.
Jon Ashburnc2972682016-02-08 15:42:01 -0700301
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700302There are no rules about the name of the text information files (except the
303.json suffix).
Jon Ashburnc2972682016-02-08 15:42:01 -0700304
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700305There are no rules about the name of the ICD shared library files. For example,
306if the registry contains the following values,
Jon Ashburnc2972682016-02-08 15:42:01 -0700307
Jon Ashburncc300a22016-02-11 14:57:30 -0700308```
309[HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\Drivers\]
Jon Ashburnc2972682016-02-08 15:42:01 -0700310
Jon Ashburncc300a22016-02-11 14:57:30 -0700311"C:\vendor a\vk\_vendora.json"=dword:00000000
Jon Ashburnc2972682016-02-08 15:42:01 -0700312
Jon Ashburncc300a22016-02-11 14:57:30 -0700313"C:\windows\system32\vendorb\_vk.json"=dword:00000000
Jon Ashburnc2972682016-02-08 15:42:01 -0700314
Jon Ashburncc300a22016-02-11 14:57:30 -0700315"C:\windows\system32\vendorc\_icd.json"=dword:00000000
316```
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700317then the loader will open the following text information files, with the
318specified contents:
Jon Ashburnc2972682016-02-08 15:42:01 -0700319
Jon Ashburncc300a22016-02-11 14:57:30 -0700320| Text File Name | Text File Contents |
321|-------------------------------------|
322|vk\_vendora.json | "ICD": { "library\_path": "C:\\\\VENDORA\\\\vk\_vendora.dll", "api_version": "1.0.3" } |
323| vendorb\_vk.json | "ICD": { "library\_path": "vendorb\_vk.dll", "api_version": "1.0.3" } |
324|vendorc\_icd.json | "ICD": { "library\_path": "vedorc\_icd.dll", "api_version": "1.0.3" }|
Jon Ashburnc2972682016-02-08 15:42:01 -0700325
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700326Then the loader will open the three files mentioned in the "Text File Contents"
327column, and then try to load and use the three shared libraries indicated by
328the ICD.library\_path value.
Jon Ashburnc2972682016-02-08 15:42:01 -0700329
330##### Using Pre-Production ICDs
331
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700332IHV developers (and sometimes other developers) need to use special,
333pre-production ICDs. In some cases, a pre-production ICD may be in an
334installable package. In other cases, a pre-production ICD may simply be a
335shared library in the developer's build tree. In this latter case, we want to
336allow developers to point to such an ICD without modifying the
337properly-installed ICD(s) on their system.
Jon Ashburnc2972682016-02-08 15:42:01 -0700338
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700339This need is met with the use of the "VK\_ICD\_FILENAMES" environment variable,
340which will override the mechanism used for finding properly-installed ICDs. In
341other words, only the ICDs listed in "VK\_ICD\_FILENAMES" will be used. The
342"VK\_ICD\_FILENAMES" environment variable is a semi-colon-separated list of ICD
343text information files (aka manifest files), containing the following:
Jon Ashburnc2972682016-02-08 15:42:01 -0700344
Jon Ashburncc300a22016-02-11 14:57:30 -0700345- A full pathname (e.g. "C:\\my\_build\\my\_icd.json")
Jon Ashburnc2972682016-02-08 15:42:01 -0700346
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700347Typically, "VK\_ICD\_FILENAMES" will only contain a full pathname to one info
348file for a developer-built ICD. A semi-colon is only used if more than one ICD
349is listed.
Jon Ashburnc2972682016-02-08 15:42:01 -0700350
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700351For example, if a developer wants to refer to one ICD that they built, they
352could set the "VK\_ICD\_FILENAMES" environment variable to:
Jon Ashburnc2972682016-02-08 15:42:01 -0700353
Jon Ashburncc300a22016-02-11 14:57:30 -0700354C:\\my\_build\\my\_icd.json
Jon Ashburnc2972682016-02-08 15:42:01 -0700355
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700356If a developer wants to refer to two ICDs, one of which is a properly-installed
357ICD, they can use the full pathname of the text file:
Jon Ashburnc2972682016-02-08 15:42:01 -0700358
Jon Ashburncc300a22016-02-11 14:57:30 -0700359C:\\Windows\\System32\\vendorc\_icd.json;C:\\my\_build\\my\_icd.json
Jon Ashburnc2972682016-02-08 15:42:01 -0700360
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700361Notice the semi-colon between "C:\\Windows\\System32\\vendorc\_icd.json" and
362"C:\\my\_build\\my\_icd.json".
Jon Ashburnc2972682016-02-08 15:42:01 -0700363
364#### Linux
365
366##### Properly-Installed ICDs
367
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700368In order to find properly-installed ICDs, the Vulkan loader will scan the files
369in the following Linux directories:
Jon Ashburnc2972682016-02-08 15:42:01 -0700370
371/usr/share/vulkan/icd.d
Jon Ashburnc2972682016-02-08 15:42:01 -0700372/etc/vulkan/icd.d
373
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700374These directories will contain text information files (a.k.a. "manifest
375files"), that use a JSON format.
Jon Ashburnc2972682016-02-08 15:42:01 -0700376
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700377The Vulkan loader will open each manifest file found to obtain the name or
378pathname of an ICD shared library (".so") file. For example:
Jon Ashburnc2972682016-02-08 15:42:01 -0700379
Jon Ashburncc300a22016-02-11 14:57:30 -0700380```
381{
Jon Ashburnc2972682016-02-08 15:42:01 -0700382 "file_format_version": "1.0.0",
383 "ICD": {
384 "library_path": "path to ICD library",
Tony Barbourcd489512016-02-10 15:59:32 -0700385 "api_version": "1.0.3"
Jon Ashburnc2972682016-02-08 15:42:01 -0700386 }
387}
Jon Ashburncc300a22016-02-11 14:57:30 -0700388```
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700389The "library\_path" specifies either a filename, a relative pathname, or a full
390pathname to an ICD shared library file. If the ICD is specified via a filename,
391the loader will attempt to open that file as a shared object using dlopen(),
392and the file must be in a directory that dlopen is configured to look in (Note:
393various distributions are configured differently). A distribution is free to
394create Vulkan-specific system directories (e.g. ".../vulkan/icd"), but is not
395required to do so. If the ICD is specified via a relative pathname, it is
396relative to the path of the info file. Relative pathnames are those that do not
397start with, but do contain at least one directory separator (i.e. the '/'
398character). For example, "lib/vendora.so" and "./vendora.so" are examples of
399relative pathnames.
Jon Ashburnc2972682016-02-08 15:42:01 -0700400
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700401The "file\_format\_version" provides a major.minor.patch version number in case
402the format of the manifest file changes in the future. If the same ICD shared
403library supports multiple, incompatible versions of manifest file format
404versions, it must have multiple manifest files (all of which may point to the
405same shared library).
Jon Ashburnc2972682016-02-08 15:42:01 -0700406
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700407The “api\_version” specifies the major.minor.patch version number of the Vulkan
408API that the shared library (referenced by "library\_path") was built with.
Jon Ashburnc2972682016-02-08 15:42:01 -0700409
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700410The "/usr/share/vulkan/icd.d" directory is for ICDs that are installed from
411Linux-distribution-provided packages. The "/etc/vulkan/icd.d" directory is for
412ICDs that are installed from non-Linux-distribution-provided packages.
Jon Ashburnc2972682016-02-08 15:42:01 -0700413
414There are no rules about the name of the text files (except the .json suffix).
415
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700416There are no rules about the name of the ICD shared library files. For example,
417if the "/usr/share/vulkan/icd.d" directory contain the following files, with
418the specified contents:
Jon Ashburnc2972682016-02-08 15:42:01 -0700419
Jon Ashburncc300a22016-02-11 14:57:30 -0700420| Text File Name | Text File Contents |
421|-----------------|--------------------|
422|vk\_vendora.json | "ICD": { "library\_path": "vendora.so", "api_version": "1.0.3" } |
423| vendorb\_vk.json | "ICD": { "library\_path": "vendorb\_vulkan\_icd.so", "api_version": "1.0.3" } |
424| vendorc\_icd.json | "ICD": { "library\_path": "/usr/lib/VENDORC/icd.so", "api_version": "1.0.1" }|
Jon Ashburnc2972682016-02-08 15:42:01 -0700425
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700426then the loader will open the three files mentioned in the "Text File Contents"
427column, and then try to load and use the three shared libraries indicated by
428the ICD.library\_path value.
Jon Ashburnc2972682016-02-08 15:42:01 -0700429
430##### Using Pre-Production ICDs
431
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700432IHV developers (and sometimes other developers) need to use special,
433pre-production ICDs. In some cases, a pre-production ICD may be in an
434installable package. In other cases, a pre-production ICD may simply be a
435shared library in the developer's build tree. In this latter case, we want to
436allow developers to point to such an ICD without modifying the
437properly-installed ICD(s) on their system.
Jon Ashburnc2972682016-02-08 15:42:01 -0700438
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700439This need is met with the use of the "VK\_ICD\_FILENAMES" environment variable,
440which will override the mechanism used for finding properly-installed ICDs. In
441other words, only the ICDs listed in "VK\_ICD\_FILENAMES" will be used.
Jon Ashburnc2972682016-02-08 15:42:01 -0700442
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700443The "VK\_ICD\_FILENAMES" environment variable is a colon-separated list of ICD
444manifest files, containing the following:
Jon Ashburnc2972682016-02-08 15:42:01 -0700445
446- A filename (e.g. "libvkicd.json") in the "/usr/share/vulkan/icd.d" or "/etc/vulkan/icd.d" system directories
447
448- A full pathname (e.g. "/my\_build/my\_icd.json")
449
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700450Typically, "VK\_ICD\_FILENAMES" will only contain a full pathname to one info
451file for a developer-built ICD. A colon is only used if more than one ICD is
452listed.
Jon Ashburnc2972682016-02-08 15:42:01 -0700453
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700454For example, if a developer wants to refer to one ICD that they built, they
455could set the "VK\_ICD\_FILENAMES" environment variable to:
Jon Ashburnc2972682016-02-08 15:42:01 -0700456
457/my\_build/my\_icd.json
458
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700459If a developer wants to refer to two ICDs, one of which is a properly-installed
460ICD, they can use the name of the text file in the system directory:
Jon Ashburnc2972682016-02-08 15:42:01 -0700461
462vendorc\_vulkan.json:/my\_build/my\_icd.json
463
464Notice the colon between "vendorc\_vulkan.json" and "/my\_build/my\_icd.json".
465
466NOTE: this environment variable will be ignored for suid programs.
467
468#### Android
469
470TODO: Fill out this section
471
472
Jon Ashburncc300a22016-02-11 14:57:30 -0700473ICD interface requirements
474----------------------------------------
Jon Ashburnc2972682016-02-08 15:42:01 -0700475
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700476Generally, for all Vulkan commands issued by an application, the loader can be
477viewed as a pass through. That is, the loader generally doesn’t modified the
478commands or their parameters but simply calls the ICDs entry point for that
479command. Thus, the loader to ICD interface requirements will be specified by
480covering two areas: 1) Obtaining ICD Vulkan entry points; 2) Specifying
481requirements for a given Vulkan command(s) over and above the Vulkan
482specification requirements.
Jon Ashburnc2972682016-02-08 15:42:01 -0700483
484#### Windows and Linux
485
486##### Obtaining ICD entry points
487
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700488Currently, two methods of the loader finding ICD entry points are supported on
489Linux and Windows:
Jon Ashburnc2972682016-02-08 15:42:01 -0700490
4911) Recommended
492
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700493- vk\_icdGetInstanceProcAddr exported in the ICD library and it returns valid
494 function pointers for all the global level and instance level Vulkan commands,
495 and also vkGetDeviceProcAddr. Global level commands are those which contain no
496 dispatchable object as the first parameter, such as vkCreateInstance and
497 vkEnumerateInstanceExtensionProperties. The ICD must support querying global
498 level entry points by calling vk\_icdGetInstanceProcAddr with a NULL VkInstance
499 parameter. Instance level commands are those that have either VkInstance, or
500 VkPhysicalDevice as the first parameter dispatchable object. Both core entry
501 points and any instance extension entry points the ICD supports should be
502 available via vk\_icdGetInstanceProcAddr. Future Vulkan instance extensions may
503 define and use new instance level dispatchable objects other than VkInstance
504 and VkPhysicalDevice, in which case, extensions entry points using these newly
505 defined dispatchable oibjects must be queryable via vk\_icdGetInstanceProcAddr.
Jon Ashburnc2972682016-02-08 15:42:01 -0700506
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700507- All other Vulkan entry points must either NOT be exported from the ICD
508 library or else NOT use the official Vulkan function names if they are
509 exported. This requirement is for ICD libraries that include other
510 functionality (such as OpenGL library) and thus could be loaded by the
511 application prior to when the Vulkan loader library is loaded by the
512 application. In other words, the ICD library exported Vulkan symbols must not
513 clash with the loader's exported Vulkan symbols.
Jon Ashburnc2972682016-02-08 15:42:01 -0700514
5152) Deprecated
516
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700517- vkGetInstanceProcAddr exported in the ICD library and returns valid function
518 pointers for all the Vulkan API entrypoints.
Jon Ashburnc2972682016-02-08 15:42:01 -0700519
520- vkCreateInstance exported in the ICD library;
521
522- vkEnumerateInstanceExtensionProperties exported in the ICD library;
523
524##### Loader specific requirements for Vulkan commands
525
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700526Normally, ICDs handle object creation and destruction for various Vulkan
527objects. The WSI surface extensions for Linux and Windows
528(VK\_KHR\_win32\_surface, VK\_KHR\_xcb\_surface, VK\_KHR\_xlib\_surface,
529VK\_KHR\_mir\_surface, VK\_KHR\_wayland\_surface, and VK\_KHR\_surface) are
530handled differently. For these extensions, the VkSurfaceKHR object creation and
531destruction is handled by the loader as follows:
Jon Ashburnc2972682016-02-08 15:42:01 -0700532
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07005331. Loader handles the vkCreate\*SurfaceKHR() and vkDestroySurfaceKHR()
534 functions including creating/destroying the VkSurfaceKHR object.
Jon Ashburnc2972682016-02-08 15:42:01 -0700535
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07005362. VkSurfaceKHR objects have the underlying structure (VkIcdSurface\*) as
537 defined in include/vulkan/vk\_icd.h.
Jon Ashburnc2972682016-02-08 15:42:01 -0700538
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07005393. ICDs can cast any VkSurfaceKHR object to a pointer to the appropriate
540 VkIcdSurface\* structure.
Jon Ashburnc2972682016-02-08 15:42:01 -0700541
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07005424. VkIcdSurface\* structures include VkIcdSurfaceWin32, VkIcdSurfaceXcb,
543 VkIcdSurfaceXlib, VkIcdSurfaceMir, and VkIcdSurfaceWayland. The first field in
544 the structure is a VkIcdSurfaceBase enumerant that indicates westher the
545 surface object is Win32, Xcb, Xlib, Mir, or Wayland.
Jon Ashburnc2972682016-02-08 15:42:01 -0700546
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700547As previously covered, the loader requires dispatch tables to be accessible
548within Vulkan dispatchable objects, which include VkInstance, VkPhysicalDevice,
549VkDevice, VkQueue, and VkCommandBuffer. The specific requirements on all
550dispatchable objects created by ICDs are as follows:
Jon Ashburnc2972682016-02-08 15:42:01 -0700551
Jon Ashburncc300a22016-02-11 14:57:30 -0700552- All dispatchable objects created by an ICD can be cast to void \*\*
Jon Ashburnc2972682016-02-08 15:42:01 -0700553
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700554- The loader will replace the first entry with a pointer to the dispatch table
555 which is owned by the loader. This implies three things for ICD drivers:
Jon Ashburnc2972682016-02-08 15:42:01 -0700556
Jon Ashburncc300a22016-02-11 14:57:30 -07005571. The ICD must return a pointer for the opaque dispatchable object handle.
Jon Ashburnc2972682016-02-08 15:42:01 -0700558
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07005592. This pointer points to a regular C structure with the first entry being a
560 pointer. Note: for any C\++ ICD's that implement VK objects directly as C\++
561 classes. The C\++ compiler may put a vtable at offset zero if your class is
562 virtual. In this case use a regular C structure (see below).
Jon Ashburnc2972682016-02-08 15:42:01 -0700563
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07005643. The loader checks for a magic value (ICD\_LOADER\_MAGIC) in all the created
565 dispatchable objects, as follows (see include/vulkan/vk\_icd.h):
Jon Ashburnc2972682016-02-08 15:42:01 -0700566
567```
568
Jon Ashburncc300a22016-02-11 14:57:30 -0700569#include "vk_icd.h"
Jon Ashburnc2972682016-02-08 15:42:01 -0700570
Jon Ashburncc300a22016-02-11 14:57:30 -0700571union _VK_LOADER_DATA {
572 uintptr loadermagic;
573 void *loaderData;
574} VK_LOADER_DATA;
Jon Ashburnc2972682016-02-08 15:42:01 -0700575
Jon Ashburncc300a22016-02-11 14:57:30 -0700576vkObj alloc_icd_obj()
Jon Ashburnc2972682016-02-08 15:42:01 -0700577{
Jon Ashburncc300a22016-02-11 14:57:30 -0700578 vkObj *newObj = alloc_obj();
579 ...
580 // Initialize pointer to loader's dispatch table with ICD_LOADER_MAGIC
Jon Ashburnc2972682016-02-08 15:42:01 -0700581
Jon Ashburncc300a22016-02-11 14:57:30 -0700582 set_loader_magic_value(newObj);
583 ...
584 return newObj;
Jon Ashburnc2972682016-02-08 15:42:01 -0700585}
Jon Ashburnc2972682016-02-08 15:42:01 -0700586```
587
588Additional Notes:
589
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700590- The loader will filter out extensions requested in vkCreateInstance and
591vkCreateDevice before calling into the ICD; Filtering will be of extensions
592advertised by entities (eg layers) different from the ICD in question.
593- The loader will not call ICD for vkEnumerate\*LayerProperties() as layer
594properties are obtained from the layer libraries and layer JSON files.
595- If an ICD library wants to implement a layer it can do so by having the
596appropriate layer JSON manifest file refer to the ICD library file.
597- The loader will not call ICD for vkEnumerate\*ExtensionProperties(pLayerName
598!= NULL).
Jon Ashburnc2972682016-02-08 15:42:01 -0700599- The ICD may or may not implement a dispatch table.
600
601#### Android
602
603TODO: Fill out this section
604
605Vulkan layer interface with the loader
606--------------------------------------
607
608### Layer discovery
609
610#### Windows
611
612##### Properly-Installed Layers
613
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700614In order to find properly-installed layers, the Vulkan loader will use a
615similar mechanism as used for ICDs. Text information files (aka manifest
616files), that use a JSON format, are read in order to identify the names and
617attributes of layers and their extensions. The use of manifest files allows the
618loader to avoid loading any shared library files when the application does not
619query nor request any extensions. Layers and extensions have additional
620complexity, and so their manifest files contain more information than ICD info
621files. For example, a layer shared library file may contain multiple
622layers/extensions (perhaps even an ICD).
Jon Ashburnc2972682016-02-08 15:42:01 -0700623
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700624In order to find properly-installed layers, the Vulkan loader will scan the
625values in the following Windows registry keys:
Jon Ashburnc2972682016-02-08 15:42:01 -0700626
627HKEY\_LOCAL\_MACHINE\\SOFTWARE\\Khronos\\Vulkan\\ExplicitLayers
628
629HKEY\_LOCAL\_MACHINE\\SOFTWARE\\Khronos\\Vulkan\\ImplicitLayers
630
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700631Explicit layers are those which are enabled by an application (e.g. with the
632vkCreateInstance function), or by an environment variable (as mentioned
633previously).
Jon Ashburnc2972682016-02-08 15:42:01 -0700634
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700635Implicit layers are those which are enabled by their existence. For example,
636certain application environments (e.g. Steam or an automotive infotainment
637system) may have layers which they always want enabled for all applications
638that they start. Other implicit layers may be for all applications started on a
639given system (e.g. layers that overlay frames-per-second). Implicit layers are
640enabled automatically, whereas explicit layers must be enabled explicitly. What
641distinguishes a layer as implicit or explicit is by which registry key its
642layer information file is referenced by.
Jon Ashburnc2972682016-02-08 15:42:01 -0700643
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700644For each value in these keys which has DWORD data set to 0, the loader opens
645the JSON manifest file specified by the name of the value. Each name must be a
646full pathname to the manifest file.
Jon Ashburnc2972682016-02-08 15:42:01 -0700647
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700648The Vulkan loader will open each info file to obtain information about the
649layer, including the name or pathname of a shared library (".dll") file.
Jon Ashburnc2972682016-02-08 15:42:01 -0700650
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700651This manifest file is in the JSON format and contains the following
652information:
Jon Ashburnc2972682016-02-08 15:42:01 -0700653
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700654- (required) "file\_format\_version" - same as for ICDs, except that the format
655version can vary independently for ICDs and layers.
Jon Ashburnc2972682016-02-08 15:42:01 -0700656
657- (required) "name" - layer name
658
659- (required) "type" - which layer chains should the layer be activated on.
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700660Allowable values are "INSTANCE", "DEVICE", "GLOBAL". Global means activate on
661both device and instance chains.
Jon Ashburnc2972682016-02-08 15:42:01 -0700662
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700663- (required) "library\_path" - filename / full path / relative path to the
664library file
Jon Ashburnc2972682016-02-08 15:42:01 -0700665
666- (required) "api\_version" - same as for ICDs.
667
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700668- (required) "implementation\_version" - layer version, a single number
669increasing with backward compatible changes.
Jon Ashburnc2972682016-02-08 15:42:01 -0700670
671- (required) "description" - informative description of the layer.
672
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700673- (optional) "device\_extensions" or "instance\_extensions" - array of
674extension information as follows
Jon Ashburnc2972682016-02-08 15:42:01 -0700675
Jon Ashburncc300a22016-02-11 14:57:30 -0700676 - (required) extension "name" - Vulkan registered name
Jon Ashburnc2972682016-02-08 15:42:01 -0700677
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700678 - (required) extension "spec\_version" - extension specification version, a
679single number, increasing with backward compatible changes.
Jon Ashburnc2972682016-02-08 15:42:01 -0700680
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700681 - (required for device\_extensions with entry points) extension
682"entrypoints" - array of device extension entrypoints; not used for instance
683extensions
Jon Ashburnc2972682016-02-08 15:42:01 -0700684
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700685- (sometimes required) "functions" - mapping list of function entry points. If
686multiple layers exist within the same shared library (or if a layer is in the
687same shared library as an ICD), this must be specified to allow each layer to
688have its own vkGet\*ProcAddr entrypoints that can be found by the loader. At
689this time, only the following two functions are required:
Jon Ashburnc2972682016-02-08 15:42:01 -0700690
Jon Ashburncc300a22016-02-11 14:57:30 -0700691 - "vkGetInstanceProcAddr" name
Jon Ashburnc2972682016-02-08 15:42:01 -0700692
Jon Ashburncc300a22016-02-11 14:57:30 -0700693 - "vkGetDeviceProcAddr" name
Jon Ashburnc2972682016-02-08 15:42:01 -0700694
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700695- (optional for implicit layers) "enable\_environment" requirement(s) -
696environment variable and value required to enable an implicit layer. This
697environment variable (which should vary with each "version" of the layer, as in
698"ENABLE\_LAYER\_FOO\_1") must be set to the given value or else the implicit
699layer is not loaded. This is for application environments (e.g. Steam) which
700want to enable a layer(s) only for applications that they launch, and allows
701for applications run outside of an application environment to not get that
702implicit layer(s).
Jon Ashburnc2972682016-02-08 15:42:01 -0700703
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700704- (required for implicit layers) "disable\_environment" requirement(s) -
705environment variable and value required to disable an implicit layer. Note: in
706rare cases of an application not working with an implicit layer, the
707application can set this environment variable (before calling Vulkan functions)
708in order to "blacklist" the layer. This environment variable (which should vary
709with each "version" of the layer, as in "DISABLE\_LAYER\_FOO\_1") must be set
710(not particularly to any value). If both the "enable\_environment" and
711"disable\_environment" variables are set, the implicit layer is disabled.
Jon Ashburnc2972682016-02-08 15:42:01 -0700712
713For example:
714
Jon Ashburncc300a22016-02-11 14:57:30 -0700715```
Jon Ashburnc2972682016-02-08 15:42:01 -0700716{
Jon Ashburncc300a22016-02-11 14:57:30 -0700717"file_format_version" : "1.0.0",
718"layer": {
719 "name": "VK_LAYER_LUNARG_OverlayLayer",
720 "type": "DEVICE",
721 "library_path": "vkOverlayLayer.dll"
722 "api_version" : "1.0.3",
723 "implementation_version" : "2",
724 "description" : "LunarG HUD layer",
725 "functions": {
726 "vkGetInstanceProcAddr": "OverlayLayer_GetInstanceProcAddr",
727 "vkGetDeviceProcAddr": "OverlayLayer_GetDeviceProcAddr"
728 },
729 instance_extensions": [
730 {
731 "name": "VK_debug_report_EXT",
732 "spec_version": "1"
733 },
734 {
735 "name": "VK_VENDOR_DEBUG_X",
736 "spec_version": "3"
737 }
738 ],
739 device_extensions": [
740 {
741 "name": "VK_LUNARG_DEBUG_MARKER",
742 "spec_version": "1",
743 "entrypoints": ["vkCmdDbgMarkerBegin", "vkCmdDbgMarkerEnd"]
744 }
745 ],
746 "disable_environment": {
747 "DISABLE_LAYER_OVERLAY_1": ""
748 }
Jon Ashburnc2972682016-02-08 15:42:01 -0700749}
Jon Ashburnc2972682016-02-08 15:42:01 -0700750}
Jon Ashburncc300a22016-02-11 14:57:30 -0700751```
Jon Ashburnc2972682016-02-08 15:42:01 -0700752
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700753The "library\_path" specifies either a filename, a relative pathname, or a full
754pathname to a layer shared library (".dll") file, which the loader will attempt
755to load using LoadLibrary(). If the layer is specified via a relative pathname,
756it is relative to the path of the info file (e.g. for cases when an application
757provides a layer that is in the same folder hierarchy as the rest of the
758application files). If the layer is specified via a filename, the shared
759library lives in the system's DLL search path (e.g. in the
760"C:\\Windows\\System32" folder).
Jon Ashburnc2972682016-02-08 15:42:01 -0700761
762There are no rules about the name of the text files (except the .json suffix).
763
764There are no rules about the name of the layer shared library files.
765
766##### Using Pre-Production Layers
767
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700768As with ICDs, developers may need to use special, pre-production layers,
769without modifying the properly-installed layers. This need is met with the use
770of the "VK\_LAYER\_PATH" environment variable, which will override the
771mechanism using for finding properly-installed layers. Because many layers may
772exist on a system, this environment variable is a semi-colon-separated list of
773folders that contain layer info files. Only the folder listed in
774"VK\_LAYER\_PATH" will be scanned for info files. Each semi-colon-separated
775entry is:
Jon Ashburnc2972682016-02-08 15:42:01 -0700776
777- The full pathname of a folder containing layer info files
778
779#### Linux
780
781##### Properly-Installed Layers
782
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700783In order to find properly-installed layers, the Vulkan loader will use a
784similar mechanism as used for ICDs. Text information files, that use a JSON
785format, are read in order to identify the names and attributes of layers and
786their extensions. The use of text info files allows the loader to avoid loading
787any shared library files when the application does not query nor request any
788extensions. Layers and extensions have additional complexity, and so their info
789files contain more information than ICD info files. For example, a layer shared
790library file may contain multiple layers/extensions (perhaps even an ICD).
Jon Ashburnc2972682016-02-08 15:42:01 -0700791
792The Vulkan loader will scan the files in the following Linux directories:
793
794/usr/share/vulkan/explicit\_layer.d
Jon Ashburnc2972682016-02-08 15:42:01 -0700795/usr/share/vulkan/implicit\_layer.d
Jon Ashburnc2972682016-02-08 15:42:01 -0700796/etc/vulkan/explicit\_layer.d
Jon Ashburnc2972682016-02-08 15:42:01 -0700797/etc/vulkan/implicit\_layer.d
798
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700799Explicit layers are those which are enabled by an application (e.g. with the
800vkCreateInstance function), or by an environment variable (as mentioned
801previously). Implicit layers are those which are enabled by their existence.
802For example, certain application environments (e.g. Steam or an automotive
803infotainment system) may have layers which they always want enabled for all
804applications that they start. Other implicit layers may be for all applications
805started on a given system (e.g. layers that overlay frames-per-second).
806Implicit layers are enabled automatically, whereas explicit layers must be
807enabled explicitly. What distinguishes a layer as implicit or explicit is by
808which directory its layer information file exists in.
Jon Ashburnc2972682016-02-08 15:42:01 -0700809
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700810The "/usr/share/vulkan/\*\_layer.d" directories are for layers that are
811installed from Linux-distribution-provided packages. The
812"/etc/vulkan/\*\_layer.d" directories are for layers that are installed from
813non-Linux-distribution-provided packages.
Jon Ashburnc2972682016-02-08 15:42:01 -0700814
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700815The information file is in the JSON format and contains the following
816information:
Jon Ashburnc2972682016-02-08 15:42:01 -0700817
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700818- (required) "file\_format\_version" – same as for ICDs, except that the format
819version can vary independently for ICDs and layers.
Jon Ashburnc2972682016-02-08 15:42:01 -0700820
821- (required) "name" - layer name
822
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700823- (required) "type" - which layer chains should the layer be activated on.
824Allowable values are "INSTANCE", "DEVICE", "GLOBAL". Global means activate on
825both device and instance chains.
Jon Ashburnc2972682016-02-08 15:42:01 -0700826
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700827- (required) "library\_path" - filename / full path / relative path to the text
828file
Jon Ashburnc2972682016-02-08 15:42:01 -0700829
830- (required) "api\_version" – same as for ICDs.
831
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700832- (required) "implementation\_version" – layer version, a single number
833increasing with backward compatible changes.
Jon Ashburnc2972682016-02-08 15:42:01 -0700834
835- (required) "description" – informative decription of the layer.
836
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700837- (optional) "device\_extensions" or "instance\_extensions" - array of
838extension information as follows
Jon Ashburnc2972682016-02-08 15:42:01 -0700839
Jon Ashburncc300a22016-02-11 14:57:30 -0700840 - (required) extension "name" - Vulkan registered name
Jon Ashburnc2972682016-02-08 15:42:01 -0700841
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700842 - (required) extension "spec\_version" - extension specification version, a
843single number, increasing with backward compatible changes.
Jon Ashburnc2972682016-02-08 15:42:01 -0700844
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700845 - (required for device extensions with entry points) extension
846"entrypoints" - array of device extension entrypoints; not used for instance
847extensions
Jon Ashburnc2972682016-02-08 15:42:01 -0700848
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700849- (sometimes required) "functions" - mapping list of function entry points. If
850multiple layers exist within the same shared library (or if a layer is in the
851same shared library as an ICD), this must be specified to allow each layer to
852have its own vkGet\*ProcAddr entrypoints that can be found by the loader. At
853this time, only the following two functions are required:
Jon Ashburncc300a22016-02-11 14:57:30 -0700854 - "vkGetInstanceProcAddr" name
855 - "vkGetDeviceProcAddr" name
Jon Ashburnc2972682016-02-08 15:42:01 -0700856
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700857- (optional for implicit layers) "enable\_environment" requirement(s) -
858environment variable and value required to enable an implicit layer. This
859environment variable (which should vary with each "version" of the layer, as in
860"ENABLE\_LAYER\_FOO\_1") must be set to the given value or else the implicit
861layer is not loaded. This is for application environments (e.g. Steam) which
862want to enable a layer(s) only for applications that they launch, and allows
863for applications run outside of an application environment to not get that
864implicit layer(s).
Jon Ashburnc2972682016-02-08 15:42:01 -0700865
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700866- (required for implicit layers) "disable\_environment" requirement(s) -
867environment variable and value required to disable an implicit layer. Note: in
868rare cases of an application not working with an implicit layer, the
869application can set this environment variable (before calling Vulkan functions)
870in order to "blacklist" the layer. This environment variable (which should vary
871with each "version" of the layer, as in "DISABLE\_LAYER\_FOO\_1") must be set
872(not particularly to any value). If both the "enable\_environment" and
873"disable\_environment" variables are set, the implicit layer is disabled.
Jon Ashburnc2972682016-02-08 15:42:01 -0700874
875For example:
Jon Ashburncc300a22016-02-11 14:57:30 -0700876```
Jon Ashburnc2972682016-02-08 15:42:01 -0700877{
Jon Ashburncc300a22016-02-11 14:57:30 -0700878"file_format_version" : "1.0.0",
Jon Ashburnc2972682016-02-08 15:42:01 -0700879"layer": {
Jon Ashburncc300a22016-02-11 14:57:30 -0700880 "name": "VK_LAYER_LUNARG_OverlayLayer",
881 "type": "DEVICE",
882 "library_path": "vkOverlayLayer.dll"
883 "api_version" : "1.0.3",
884 "implementation_version" : "2",
885 "description" : "LunarG HUD layer",
886 "functions": {
887 "vkGetInstanceProcAddr": "OverlayLayer_GetInstanceProcAddr",
888 "vkGetDeviceProcAddr": "OverlayLayer_GetDeviceProcAddr"
889 },
890 instance_extensions": [
891 {
892 "name": "VK_debug_report_EXT",
893 "spec_version": "1"
894 },
895 {
896 "name": "VK_VENDOR_DEBUG_X",
897 "spec_version": "3"
898 }
899 ],
900 device_extensions": [
901 {
902 "name": "VK_LUNARG_DEBUG_MARKER",
903 "spec_version": "1",
904 "entrypoints": ["vkCmdDbgMarkerBegin", "vkCmdDbgMarkerEnd"]
905 }
906 ],
907 "disable_environment": {
908 "DISABLE_LAYER_OVERLAY_1": ""
909 }
Jon Ashburnc2972682016-02-08 15:42:01 -0700910}
Jon Ashburnc2972682016-02-08 15:42:01 -0700911}
Jon Ashburncc300a22016-02-11 14:57:30 -0700912```
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700913The "library\_path" specifies either a filename, a relative pathname, or a full
914pathname to a layer shared library (".so") file, which the loader will attempt
915to load using dlopen(). If the layer is specified via a filename, the loader
916will attempt to open that file as a shared object using dlopen(), and the file
917must be in a directory that dlopen is configured to look in (Note: various
918distributions are configured differently). A distribution is free to create
919Vulkan-specific system directories (e.g. ".../vulkan/layers"), but is not
920required to do so. If the layer is specified via a relative pathname, it is
921relative to the path of the info file (e.g. for cases when an application
922provides a layer that is in the same directory hierarchy as the rest of the
923application files).
Jon Ashburnc2972682016-02-08 15:42:01 -0700924
925There are no rules about the name of the text files (except the .json suffix).
926
927There are no rules about the name of the layer shared library files.
928
929##### Using Pre-Production Layers
930
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700931As with ICDs, developers may need to use special, pre-production layers,
932without modifying the properly-installed layers. This need is met with the use
933of the "VK\_LAYER\_PATH" environment variable, which will override the
934mechanism using for finding properly-installed layers. Because many layers may
935exist on a system, this environment variable is a colon-separated list of
936directories that contain layer info files. Only the directories listed in
937"VK\_LAYER\_PATH" will be scanned for info files. Each colon-separated entry
938is:
Jon Ashburnc2972682016-02-08 15:42:01 -0700939
940- The full pathname of a directory containing layer info files
941
942NOTE: these environment variables will be ignored for suid programs.
943
944#### Android
945
946TODO: Fill out this section
947
Jon Ashburncc300a22016-02-11 14:57:30 -0700948Layer interface requirements
949------------------------------------------------------
Jon Ashburnc2972682016-02-08 15:42:01 -0700950
951#### Architectural interface overview
952
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700953There are two key architectural features that drive the loader to layer library
954interface: 1) separate and distinct instance and device call chains, and 2)
955distributed dispatch. First these architectural features will be described and
956then the detailed interface will be specified.
Jon Ashburnc2972682016-02-08 15:42:01 -0700957
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700958Call chains are the links of calls for a given Vulkan command from layer module
959to layer module with the loader and or the ICD being the bottom most command.
960Call chains are constructed at both the instance level and the device level by
961the loader with cooperation from the layer libraries. Instance call chains are
962constructed by the loader when layers are enabled at vkCreateInstance. Device
963call chains are constructed by the loader when layers are enabled at
964CreateDevice. A layer can intercept Vulkan instance commands, device commands
965or both. For a layer to intercept instance commands, it must participate in the
966instance call chain. For a layer to intercept device commands, it must
967participate in the device chain. Layers which participate in intercepting calls
968in both the intance and device chains are called global layers.
Jon Ashburnc2972682016-02-08 15:42:01 -0700969
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700970Normally, when a layer intercepts a given Vulkan command, it will call down the
971instance or device chain as needed. The loader and all layer libraries that
972participate in a call chain cooperate to ensure the correct sequencing of calls
973from one entity to the next. This group effort for call cahin sequencing is
974hereinafter referred to as disitributed dispatch. In distributed dispatch,
975since each layer is responsible for properly calling the next entity in the
976device or instance chain, a dispatch mechanism is required for all Vulkan
977commands a layer intercepts. For Vulkan commands that are not intercepted by a
978layer, or if the layer chooses to terminate a given Vulkman command by not
979calling down the chain, then no dispatch mechanism is needed for that
980particular Vulkan command. Only for those Vulkan commands, which may be a
981subset of all Vulkan commands, that a layer intercepts is a dispatching
982mechanism by the layer needed. The loader is responsible for dispatching all
983core and instance extension Vulkan commands to the first entity in the chain.
Jon Ashburnc2972682016-02-08 15:42:01 -0700984
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700985Instance level Vulkan commands are those that have the disapatchable objects
986VkInstance, or VkPhysicalDevice as the first parameter and alos includes
987vkCreateInstance.
988Device level Vulkan commands are those that use VkDevice, VkQueue or
989VkCommandBuffer as the first parameter and also include vkCreateDevice. Future
990extensions may introduce new instance or device level dispatchable objects, so
991the above lists may be extended in the future.
Jon Ashburnc2972682016-02-08 15:42:01 -0700992
993#### Discovery of layer entrypoints
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -0700994For the layer libraries that have been discovered by the loader, their
995intercepting entry points that will participate in a device or instance call
996chain need to be available to the loader or whatever layer is before them in
997the chain. Layers having the following requirements in this area.
998- A layer intercepting instance level Vulkan commands (aka an instance level
999layer) must implement a vkGetInstanceProcAddr type of function.
1000- This vkGetInstanceProcAddr type function must be exported by the layer
1001library. The name of this function is specified in various ways: 1) the layer
1002manifest JSON file in the "functions", "vkGetInstanceProcAddr" node
1003(Linux/Windows); 2) it is named "vkGetInstanceProcAddr"; 3) it is
1004"<layerName>GetInstanceProcAddr (Android).
1005- A layer intercepting device level Vulkan commands (aka a device level layer)
1006must implement a vkGetDeviceProcAddr type of function.
1007- This vkGetDeviceProcAddr type function must be exported by the layer library.
1008The name of this function is specified in various ways: 1) the layer manifest
1009JSON file in the "functions", "vkGetDeviceProcAddr" node (Linux/Windows); 2) it
1010is named "vkGetDeviceProcAddr"; 3) it is "<layerName>GetDeviceProcAddr
1011(Android).
1012- A layer's vkGetInstanceProcAddr function (irregardless of it's name) must
1013return the local entry points for all instance level Vulkan commands it
1014intercepts. At a minimum, this includes vkGetInstanceProcAddr and
1015vkCreateInstance.
1016- A layer's vkGetDeviceProcAddr function (irregardless of it's name) must
1017return the entry points for all device level Vulkan commands it intercepts. At
1018a minimum, this includes vkGetDeviceProcAddr and vkCreateDevice.
1019- There are no requirements on the names of the intercepting functions a layer
1020implements except those listed above for vkGetInstanceProcAddr and
1021vkGetDeviceProcAddr.
1022- Currently a layer's VkGetInstanceProcAddr must be able to handle a VkInstance
1023parameter equal to NULL for
Jon Ashburnc2972682016-02-08 15:42:01 -07001024instance level commands it intercepts including vkCreateDevice.
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07001025- Currently a layer's VkGetDeviceProcAddr must be able to handle a VkDevice
1026parameter equal to NULL for device level commands it intercepts.
Jon Ashburnc2972682016-02-08 15:42:01 -07001027
1028#### Layer intercept requirements
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07001029- Layers intercept a Vulkan command by defining a C/C++ function with signature
1030identical to the Vulkan API for that command.
1031- Other than the two vkGet*ProcAddr, all other functions intercepted by a layer
1032need NOT be exported by the layer.
1033- For any Vulkan command a layer intercepts which has a non-void return value,
1034an appropriate value must be returned by the layer intercept function.
1035- The layer intercept function must call down the chain to the corresponding
1036Vulkan command in the next entity. Undefined results will occur if a layer
1037doesn't propagate calls down the chain. The two exceptions to this requirement
1038are vkGetInstanceProcAddr and vkGetDeviceProcAddr which only call down the
1039chain for Vulkan commands that they do not intercept.
1040- Layer intercept functions may insert extra calls to Vulkan commands in
1041addition to the intercept. For example, a layer intercepting vkQueueSubmit may
1042want to add a call to vkQueueWaitIdle after calling down the chain for
1043vkQueueSubmit. Any additional calls inserted by a layer must be on the same
1044chain. They should call down the chain.
Jon Ashburnc2972682016-02-08 15:42:01 -07001045
1046#### Distributed dispatching requirements
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07001047- For each entry point a layer intercepts, it must keep track of the entry
1048point residing in the next entity in the chain it will call down into. In other
1049words, the layer must have a list of pointers to functions of the appropriate
1050type to call into the next entity. This can be implemented in various ways but
1051for clarity will be referred to as a dispatch table.
1052- A layer can use the VkLayerDispatchTable structure as a device dispatch table
1053(see include/vulkan/vk_layer.h).
1054- A layer can use the VkLayerInstanceDispatchTable structure as a instance
1055dispatch table (see include/vulkan/vk_layer.h).
1056- Layers vkGetInstanceProcAddr function uses the next entity's
1057vkGetInstanceProcAddr to call down the chain for unknown (ie non-intercepted)
1058functions.
1059- Layers vkGetDeviceProcAddr function uses the next entity's
1060vkGetDeviceProcAddr to call down the chain for unknown (ie non-intercepted)
1061functions.
Jon Ashburnc2972682016-02-08 15:42:01 -07001062
1063#### Layer dispatch initialization
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07001064- A layer intializes it's instance dispatch table within it's vkCreateInstance
1065function.
1066- A layer intializes it's device dispatch table within it's vkCreateDevice
1067function.
1068- The loader passes a linked list of initialization structures to layers via
1069the "pNext" field in the VkInstanceCreateInfo and VkDeviceCreateInfo structures
1070for vkCreateInstance and VkCreateDevice respectively.
1071- The head node in this linked list is of type VkLayerInstanceCreateInfo for
1072instance and VkLayerDeviceCreateInfo for device. See file
1073include/vulkan/vk_layer.h for details.
1074- A VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO is used by the loader for the
1075"sType" field in VkLayerInstanceCreateInfo.
1076- A VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO is used by the loader for the
1077"sType" field in VkLayerDeviceCreateInfo.
1078- The "function" field indicates how the union field "u" should be interpreted
1079within VkLayer*CreateInfo. The loader will set the "function" field to
1080VK_LAYER_LINK_INFO. This indicates "u" field should be VkLayerInstanceLink or
1081VkLayerDeviceLink.
Jon Ashburnc2972682016-02-08 15:42:01 -07001082- The VkLayerInstanceLink and VkLayerDeviceLink structures are the list nodes.
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07001083- The VkLayerInstanceLink contains the next entity's vkGetInstanceProcAddr used
1084by a layer.
1085- The VkLayerDeviceLink contains the next entity's vkGetInstanceProcAddr and
1086vkGetDeviceProcAddr used by a layer.
1087- Given the above structures set up by the loader, layer must initialize their
1088dispatch table as follows:
1089 - Find the VkLayerInstanceCreateInfo/VkLayerDeviceCreateInfo structure in
1090the VkInstanceCreateInfo/VkDeviceCreateInfo structure.
Jon Ashburncc300a22016-02-11 14:57:30 -07001091 - Get the next entity's vkGet*ProcAddr from the "pLayerInfo" field.
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07001092 - For CreateInstance get the next entity's vkCreateInstance by calling the
1093"pfnNextGetInstanceProcAddr":
Jon Ashburnc2972682016-02-08 15:42:01 -07001094 pfnNextGetInstanceProcAddr(NULL, "vkCreateInstance").
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07001095 - For CreateDevice get the next entity's vkCreateDevice by calling the
1096"pfnNextGetInstanceProcAddr":
Jon Ashburnc2972682016-02-08 15:42:01 -07001097 pfnNextGetInstanceProcAddr(NULL, "vkCreateDevice").
Jon Ashburncc300a22016-02-11 14:57:30 -07001098 - Advanced the linked list to the next node: pLayerInfo = pLayerInfo->pNext.
1099 - Call down the chain either CreateDevice or CreateInstance
Courtney Goeltzenleuchtera1473762016-02-14 09:31:24 -07001100 - Initialize your layer dispatch table by calling the next entity's
1101Get*ProcAddr function once for each Vulkan command needed in your dispatch
1102table
Jon Ashburncc300a22016-02-11 14:57:30 -07001103
1104Example code for CreateInstance:
1105Example code for CreateDevice
1106#### Special Considerations
1107Wrapping versus maps.
1108create dispatchable objects
Jon Ashburnc2972682016-02-08 15:42:01 -07001109