blob: a64792832f1c6260ae1a46c23eb9772934cf00d2 [file] [log] [blame] [view]
Jon Ashburnbd7d1922015-01-06 10:33:36 -07001# Loader Description
2
3## Overview
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06004The Loader implements the main VK library (e.g. "VK.dll" on Windows and
5"libVK.so" on Linux). It handles layer management and driver management. The
Ian Elliott3672c782015-02-13 11:23:05 -07006loader fully supports multi-gpu operation. As part of this, it dispatches API
7calls to the correct driver, and to the correct layers, based on the GPU object
8selected by the application.
Jon Ashburnbd7d1922015-01-06 10:33:36 -07009
Ian Elliott3672c782015-02-13 11:23:05 -070010The loader's driver management includes finding driver libraries and loading
11them. When a driver is initialized, the loader sets up its dispatch tables,
12using a very light-weight "trampoline" mechanism. To do so, it reserves space
13for a pointer in API objects (see below for more information about this).
14
15The loader's layer management includes finding layer libraries and activating
16them as requested. The loader correctly sets up each activated layer, and its
17own dispatch tables in order to support all activated layers. Each active
18layer can intercept a subset of the full API entrypoints. A layer which
19doesn't intercept a given entrypoint will be skipped for that entrypoint. The
20loader supports layers that operate on multiple GPUs.
Jon Ashburnbd7d1922015-01-06 10:33:36 -070021
22## Environment Variables
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060023**LIBVK\_DRIVERS\_PATH** directory for loader to search for ICD driver libraries to open
Courtney Goeltzenleuchterc1f86392015-01-07 09:24:45 -070024
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060025**LIBVK\_LAYERS\_PATH** directory for loader to search for layer libraries that may get activated and used at vkCreateDevice() time.
Courtney Goeltzenleuchterc1f86392015-01-07 09:24:45 -070026
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060027**LIBVK\_LAYER\_NAMES** colon-separated list of layer names to be activated (e.g., LIBVK\_LAYER\_NAMES=MemTracker:DrawState).
Ian Elliott3672c782015-02-13 11:23:05 -070028
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060029Note: Both of the LIBVK\_*\_PATH variables may contain more than one directory. Each directory must be separated by one of the following characters, depending on your OS:
Ian Elliott3672c782015-02-13 11:23:05 -070030
31- ";" on Windows
32- ":" on Linux
Jon Ashburnbd7d1922015-01-06 10:33:36 -070033
34## Interface to driver (ICD)
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060035- vkEnumerateGpus exported
36- vkCreateInstance exported
37- vkDestroyInstance exported
38- vkGetProcAddr exported and returns valid function pointers for all the VK API entrypoints
39- all objects created by ICD can be cast to (VK\_LAYER\_DISPATCH\_TABLE \*\*)
Jon Ashburnbd7d1922015-01-06 10:33:36 -070040 where the loader will replace the first entry with a pointer to the dispatch table which is
Courtney Goeltzenleuchter64ca9232015-02-10 18:40:14 -070041 owned by the loader. This implies three things for ICD drivers:
Ian Elliott3672c782015-02-13 11:23:05 -070042 1. The ICD must return a pointer for the opaque object handle
43 2. This pointer points to a regular C structure with the first entry being a pointer.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060044 Note: for any C++ ICD's that implement VK objects directly as C++ classes.
Ian Elliott3672c782015-02-13 11:23:05 -070045 The C++ compiler may put a vtable at offset zero, if your class is virtual.
46 In this case use a regular C structure (see below).
47 3. The reservedForLoader.loaderMagic member must be initialized with ICD\_LOADER\_MAGIC, as follows:
48
Jon Ashburn50a561c2015-02-11 12:40:00 -070049```
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060050 #include "vkIcd.h"
Ian Elliott3672c782015-02-13 11:23:05 -070051
Jon Ashburn50a561c2015-02-11 12:40:00 -070052 struct {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060053 VK_LOADER_DATA reservedForLoader; // Reserve space for pointer to loader's dispatch table
Ian Elliott42258e02015-02-13 16:51:05 -070054 myObjectClass myObj; // Your driver's C++ class
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060055 } vkObj;
Ian Elliott3672c782015-02-13 11:23:05 -070056
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060057 vkObj alloc_icd_obj()
Ian Elliott3672c782015-02-13 11:23:05 -070058 {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060059 vkObj *newObj = alloc_obj();
Ian Elliott3672c782015-02-13 11:23:05 -070060 ...
61 // Initialize pointer to loader's dispatch table with ICD_LOADER_MAGIC
62 set_loader_magic_value(newObj);
63 ...
64 return newObj;
65 }
Jon Ashburn50a561c2015-02-11 12:40:00 -070066```
Ian Elliott3672c782015-02-13 11:23:05 -070067
68Additional Notes:
69
70- The ICD may or may not implement a dispatch table.
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060071- ICD entrypoints can be named anything including the offcial vk name such as vkCreateDevice(). However, beware of interposing by dynamic OS library loaders if the offical names are used. On Linux, if offical names are used, the ICD library must be linked with -Bsymbolic.
Courtney Goeltzenleuchterc1f86392015-01-07 09:24:45 -070072