﻿This is a specification for how the Vulkan loader should identify Vulkan
installable client drivers (ICDs) on MS Windows.  This is designed for
production installation of Vulkan ICDs and layers.  The design is shown first
for ICDs, and then the variation for layers will be discussed.


1. Installable Client Drivers:


1.1. Properly-Installed ICDs

In order to find properly-installed ICDs, the Vulkan loader will scan the
values in the following Windows registry key:

HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\Drivers

For each value in this key which has DWORD data set to 0, the loader opens the
text information file (a.k.a. "manifest file"), that uses a JSON format (NOTE:
The JSON in this version of the specification is for illustration purposes, and
isn’t completely valid yet), specified by the name of the value.  Each name
must be a full pathname to the text info file.  The Vulkan loader will open
each info file to obtain the name or pathname of an ICD shared library (“.dll”)
file.  For example:

{
    “file_format_version” : “1.0.0”,
    "ICD": {
        "library_path": "path to ICD library",
        “abi_versions” : “1.0.0”
    }
}

The “library_path” specifies either a filename, a relative pathname, or a full
pathname to an ICD shared library file, which the loader will attempt to load
using LoadLibrary().  If the ICD is specified via a filename, the shared
library lives in the system’s DLL search path (e.g. in the
“C:\\Windows\\System32” folder).  If the ICD is specified via a relative
pathname, it is relative to the path of the info file.

The “file_format_version” specifies a major.minor.patch version number in case
the format of the text information file changes in the future.  If the same ICD
shared library supports multiple, incompatible versions of text info file
format versions, it must have multiple text info files (all of which may point
to the same shared library).

The “abi_versions” specifies a colon-separated list of major.minor.patch
version numbers of the Vulkan ABI that the shared library (referenced by
“library_path”) support.

There are no rules about the name of the text information files (except the
.json suffix).  There are no rules about the name of the ICD shared library
files.  For example, if the registry contains the following values:

	[HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\Drivers]
		"c:\\vendor a\\vk_vendora.json"=dword:00000000
		"c:\\windows\\system32\\vendorb_vk.json"=dword:00000000
		"c:\\windows\\system32\\vendorc_icd.json"=dword:00000000

then the loader will open the following text information files, with the
specified contents:

    Text File Name    Text File Contents
    --------------------------------------------------------------------------
    vk_vendora.json   { "ICD": { "library_path": "C:\\VENDORA\\vk_vendora.dll" }}
    vendorb_vk.json   { "ICD": { "library_path": “vendorb_vk.dll" }}
    vendorc_icd.json  { "ICD": { "library_path": "vedorc_icd.dll" }}

then the loader will open the three files mentioned in the “Text File Contents”
column, and then try to load and use the three shared libraries mentioned
indicated by the ICD.library_path value.


1.2. Using Pre-Production ICDs

IHV developers (and sometimes other developers) need to use special,
pre-production ICDs.  In some cases, a pre-production ICD may be in an
installable package.  In other cases, a pre-production ICD may simply be a
shared library in the developer’s build tree.  In this latter case, we want to
allow developers to point to such an ICD without modifying the
properly-installed ICD(s) on their system.

This need is met with the use of the “VK_ICD_FILENAMES” environment variable,
which will override the mechanism used for finding properly-installed ICDs.  In
other words, only the ICDs listed in “VK_ICD_FILENAMES” will be used.

The “VK_ICD_FILENAMES” environment variable is a semi-colon-separated list of
ICD text information files, containing the following:

- A full pathname (e.g. “C:\\my_build\\my_icd.json”)

Typically, “VK_ICD_FILENAMES” will only contain a full pathname to one info
file for a developer-built ICD.  A semi-colon is only used if more than one ICD
is listed.

For example, if a developer wants to refer to one ICD that they built, they
could set the “VK_ICD_FILENAMES” environment variable to:

        C:\\my_build\\my_icd.json

If a developer wants to refer to two ICDs, one of which is a properly-installed
ICD, they can use the full pathname of the text file:

        C:\\Windows\\System32\\vendorc_icd.json;C:\\my_build\\my_icd.json

Notice the semi-colon between “C:\\Windows\\System32\\vendorc_icd.json” and
“C:\\my_build\\my_icd.json”.


2. Layers:


2.1. Properly-Installed Layers

In order to find properly-installed layers, the Vulkan loader will use a
similar mechanism as used for ICDs.  Text information files, that use a JSON
format, are read in order to identify the names and attributes of layers and
their extensions.  The use of text info files allows the loader to avoid
loading any shared library files when the application does not query nor
request any extensions.  Layers and extensions have additional complexity, and
so their info files contain more information than ICD info files.  For example,
a layer shared library file may contain multiple layers/extensions (perhaps
even an ICD).

In order to find properly-installed ICDs, the Vulkan loader will scan the
values in the following Windows registry keys:

HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers
HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ImplicitLayers

Explicit layers are those which are enabled by an application (e.g. with the
vkCreateInstance function), or by an environment variable (see below).
Implicit layers are those which are enabled by their existence.  For example,
certain application environments (e.g. Steam or an automotive infotainment
system) may have layers which they always want enabled for all applications
that they start.  Other implicit layers may be for all applications started
on a given system (e.g. layers that overlay frames-per-second).  Implicit
layers are enabled automatically, whereas explicit
layers must be enabled explicitly.  What distinguishes a layer as implicit or
explicit is by which registry key its layer information file is referenced by.

The information file is in the JSON format and contains the following
information:

- (required) “file_format_version” – same as for ICDs, except that the format
  version can vary independently for ICDs and layers.
- (required) "name" - layer name
- (required) "type" - which layer chains should the layer be activated on.
  Allowable values are "INSTANCE", "DEVICE", "GLOBAL".  Global means activate
  on both device and instance chains.
- (required) “library_path” - filename / full path / relative path to the text
  file
- (required) “abi_versions” – same as for ICDs.
- (required) “implementation_version” – layer code version.
- (required) “description” – informative decription of the layer.
- (optional) extension and it's “name” - e.g."instance_extensions”{ DEBUG_REPORT}
- (optional) extension and it's “version” - extension version (formatted as
  major.minor.patch).
- (sometimes required) “functions” - mapping list of function entry points.  If
  multiple layers exist within the same shared library (or if a layer is in the
  same shared library as an ICD), this must be specified to allow each layer to
  have its own vkGet*ProcAddr entrypoints that can be found by the loader.  At
  this time, only the following two functions are required:
  - “vkGetInstanceProcAddr” name
  - “vkGetDeviceProcAddr” name
- (optional for implicit layers) “enable_environment” requirement(s) -
  environment variable and value required to enable an implicit layer.  This
  environment variable (which should vary with each "version" of the layer, as
  in "ENABLE_LAYER_FOO_1_0_0") must be set to the given value or else the
  implicit layer is not loaded.  This is for application environments
  (e.g. Steam) which want to enable a layer(s) only for applications that they
  launch, and allows for applications run outside of an application environment
  to not get that implicit layer(s).
- (required for implicit layers) “disable_environment” requirement(s) -
  environment variable and value required to disable an implicit layer.  Note:
  in rare cases of an application not working with an implicit layer, the
  application can set this environment variable (before calling Vulkan
  functions) in order to "blacklist" the layer.  This environment variable
  (which should vary with each "version" of the layer, as in
  "DISABLE_LAYER_FOO_1_0_0") must be set (not particularly to any value).  If
  both the "enable_environment" and "disable_environment" variables are set,
  the implicit layer is disabled.

For example:

{
     “file_format_version” : “1.0.0”,
     “layer”: {
         "name": "OverlayLayer",
         "type": "DEVICE",
         "library_path": "vkOverlayLayer.dll",
         “abi_versions” : “1.0.0:1.1.0”,
         “implementation_version” : “0.9.3”,
         “description” : “LunarG HUD layer”,
         “functions”: {
            “vkGetInstanceProcAddr”: “OverlayLayer_GetInstanceProcAddr”,
            “vkGetDeviceProcAddr”: “OverlayLayer_GetDeviceProcAddr”
         },
         instance_extensions”: [
             {
                 “name”: “DEBUG_REPORT”,
                 “version”: “1.0.0”
             },
             {
                 “name”: “DEBUG_X”,
                 “version”: “1.0.0”
             }
         ],
         device_extensions”: [
             {
                 “name”: “DEBUG_MARKER”,
                 “version”: “1.0.0”
             }
         ],
         “disable_environment”: {
             “DISABLE_LAYER_OVERLAY_1_0_0”: “”
         }
     }
}

The “library_path” specifies either a filename, a relative pathname, or a full
pathname to a layer shared library (“.dll”) file, which the loader will attempt
to load using LoadLibrary().  If the layer is specified via a relative
pathname, it is relative to the path of the info file (e.g. for cases when an
application provides a layer that is in the same folder hierarchy as the rest
of the application files).  If the layer is specified via a filename, the
shared library lives in the system’s DLL search path (e.g. in the
“C:\\Windows\\System32” folder).

There are no rules about the name of the text files (except the .json suffix).
There are no rules about the name of the layer shared library files.


2.2. Using Pre-Production Layers

As with ICDs, developers may need to use special, pre-production layers,
without modifying the properly-installed layers.

This need is met with the use of the “VK_LAYER_FOLDERS” environment variable,
which will override the mechanism using for finding properly-installed layers.
Because many layers may exist on a system, this environment variable is a
semi-colon-separated list of folders that contain layer info files.  Only the
folder listed in “VK_LAYER_FOLDERS” will be scanned for info files.  Each
semi-colon-separated entry is:

- The full pathname of a folder containing layer info files

In addition to overriding the mechanism for finding layers, the following
environment variables are used to select one or more layers/extensions
(respectively) to explicitly enable:

- “VK_INSTANCE_LAYERS” for instance/global layers/extensions, enabled at
  vkCreateInstance time

- “VK_DEVICE_LAYERS” for device layers/extensions, enabled at vkCreateDevice
  time

These are semi-colon-separated lists of extension names, as listed in the
“name” field of the info file.  The loader will load all layers/extensions that
match the given extension name(s), ignoring the “version” fields.
