Jon Ashburn | bd7d192 | 2015-01-06 10:33:36 -0700 | [diff] [blame] | 1 | # Loader Description |
| 2 | |
| 3 | ## Overview |
Jon Ashburn | fd4d09d | 2016-01-07 09:44:27 -0700 | [diff] [blame] | 4 | The Loader implements the main VK library (e.g. "vulkan-1.dll" on Windows and |
Jeremy Hayes | 2264144 | 2016-02-08 12:14:51 -0700 | [diff] [blame] | 5 | "libvulkan.so" on Linux). It handles layer management and driver management. The |
Ian Elliott | 3672c78 | 2015-02-13 11:23:05 -0700 | [diff] [blame] | 6 | loader fully supports multi-gpu operation. As part of this, it dispatches API |
| 7 | calls to the correct driver, and to the correct layers, based on the GPU object |
| 8 | selected by the application. |
Jon Ashburn | bd7d192 | 2015-01-06 10:33:36 -0700 | [diff] [blame] | 9 | |
Ian Elliott | 3672c78 | 2015-02-13 11:23:05 -0700 | [diff] [blame] | 10 | The loader's driver management includes finding driver libraries and loading |
| 11 | them. When a driver is initialized, the loader sets up its dispatch tables, |
| 12 | using a very light-weight "trampoline" mechanism. To do so, it reserves space |
| 13 | for a pointer in API objects (see below for more information about this). |
| 14 | |
| 15 | The loader's layer management includes finding layer libraries and activating |
| 16 | them as requested. The loader correctly sets up each activated layer, and its |
| 17 | own dispatch tables in order to support all activated layers. Each active |
| 18 | layer can intercept a subset of the full API entrypoints. A layer which |
| 19 | doesn't intercept a given entrypoint will be skipped for that entrypoint. The |
| 20 | loader supports layers that operate on multiple GPUs. |
Jon Ashburn | bd7d192 | 2015-01-06 10:33:36 -0700 | [diff] [blame] | 21 | |
Jon Ashburn | 4a511f1 | 2015-07-16 10:54:55 -0600 | [diff] [blame] | 22 | ## ICD discovery |
| 23 | See file LinuxICDs.txt and WindowsICDs.txt for description of how the loader |
| 24 | finds ICD driver libraries. |
Jon Ashburn | bd7d192 | 2015-01-06 10:33:36 -0700 | [diff] [blame] | 25 | |
| 26 | ## Interface to driver (ICD) |
Jon Ashburn | fd4d09d | 2016-01-07 09:44:27 -0700 | [diff] [blame] | 27 | Currently two supported methods of the loader finding ICD entry points are supported: |
| 28 | 1) Recommended |
| 29 | - vk_icdGetInstanceProcAddr exported in the ICD library and returns valid function pointers for all the VK API entrypoints |
Jon Ashburn | 8ceb1f1 | 2016-01-11 14:21:31 -0700 | [diff] [blame] | 30 | both core entry points and any instance or device extension entrypoints |
| 31 | - ICD supports NULL instance handle for the global Vulkan entrypoints when called from vk_icdGetInstanceProcAddr |
Jon Ashburn | fd4d09d | 2016-01-07 09:44:27 -0700 | [diff] [blame] | 32 | - all other Vulkan entrypoints either NOT exported from the ICD library or else will not use the official Vulkan function names |
| 33 | if they are exported. (NOTE: this requirement is for ICD libraries that include other functionality (such as OpenGL library) |
| 34 | and thus could be loaded prior to when the Vulkan loader library is loaded by the app. Thus the ICD library exported Vulkan symbols must not |
| 35 | clash with the loader's exported Vulkan symbols). |
| 36 | 2) Deprecated |
Jon Ashburn | 8ceb1f1 | 2016-01-11 14:21:31 -0700 | [diff] [blame] | 37 | - vkGetInstanceProcAddr exported in the ICD library and returns valid function pointers for all the VK API entrypoints. |
| 38 | - vkCreateInstance exported in the ICD library |
| 39 | - vkEnumerateInstanceExtensionProperties exported in the ICD library |
Jon Ashburn | fd4d09d | 2016-01-07 09:44:27 -0700 | [diff] [blame] | 40 | |
Jon Ashburn | 7726f4f | 2015-11-27 17:57:12 -0700 | [diff] [blame] | 41 | - WSI surface extensions (vk_KHR_*surface) handling: |
| 42 | 1. Loader handles the vkCreate*SurfaceKHR() and vkDestroySurfaceKHR() functions including creating/destroying the VkSurfaceKHR object |
| 43 | 2. VkSurfaceKHR objects have the underlying structure (VKIcdSurface*) as defined in include/vulkan/vk_icd.h |
| 44 | 3. ICDs can cast any VkSurfaceKHR object to a pointer to the appropriate VKIcdSurface* structure |
| 45 | 4. VkIcdSurface* structures include VkIcdSurfaceWin32, VkIcdSurfaceXcb, VkIcdSurfaceXlib, VkIcdSurfaceMir, and VkIcdSurfaceWayland |
| 46 | - all objects created by an ICD can be cast to (VK\_LAYER\_DISPATCH\_TABLE \*\*) |
Jon Ashburn | bd7d192 | 2015-01-06 10:33:36 -0700 | [diff] [blame] | 47 | where the loader will replace the first entry with a pointer to the dispatch table which is |
Courtney Goeltzenleuchter | 64ca923 | 2015-02-10 18:40:14 -0700 | [diff] [blame] | 48 | owned by the loader. This implies three things for ICD drivers: |
Ian Elliott | 3672c78 | 2015-02-13 11:23:05 -0700 | [diff] [blame] | 49 | 1. The ICD must return a pointer for the opaque object handle |
| 50 | 2. This pointer points to a regular C structure with the first entry being a pointer. |
Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 51 | Note: for any C++ ICD's that implement VK objects directly as C++ classes. |
Ian Elliott | 3672c78 | 2015-02-13 11:23:05 -0700 | [diff] [blame] | 52 | The C++ compiler may put a vtable at offset zero, if your class is virtual. |
| 53 | In this case use a regular C structure (see below). |
| 54 | 3. The reservedForLoader.loaderMagic member must be initialized with ICD\_LOADER\_MAGIC, as follows: |
| 55 | |
Jon Ashburn | 50a561c | 2015-02-11 12:40:00 -0700 | [diff] [blame] | 56 | ``` |
Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 57 | #include "vkIcd.h" |
Ian Elliott | 3672c78 | 2015-02-13 11:23:05 -0700 | [diff] [blame] | 58 | |
Jon Ashburn | 50a561c | 2015-02-11 12:40:00 -0700 | [diff] [blame] | 59 | struct { |
Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 60 | VK_LOADER_DATA reservedForLoader; // Reserve space for pointer to loader's dispatch table |
Ian Elliott | 42258e0 | 2015-02-13 16:51:05 -0700 | [diff] [blame] | 61 | myObjectClass myObj; // Your driver's C++ class |
Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 62 | } vkObj; |
Ian Elliott | 3672c78 | 2015-02-13 11:23:05 -0700 | [diff] [blame] | 63 | |
Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 64 | vkObj alloc_icd_obj() |
Ian Elliott | 3672c78 | 2015-02-13 11:23:05 -0700 | [diff] [blame] | 65 | { |
Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 66 | vkObj *newObj = alloc_obj(); |
Ian Elliott | 3672c78 | 2015-02-13 11:23:05 -0700 | [diff] [blame] | 67 | ... |
| 68 | // Initialize pointer to loader's dispatch table with ICD_LOADER_MAGIC |
| 69 | set_loader_magic_value(newObj); |
| 70 | ... |
| 71 | return newObj; |
| 72 | } |
Jon Ashburn | 50a561c | 2015-02-11 12:40:00 -0700 | [diff] [blame] | 73 | ``` |
Ian Elliott | 3672c78 | 2015-02-13 11:23:05 -0700 | [diff] [blame] | 74 | |
| 75 | Additional Notes: |
Jon Ashburn | fd4d09d | 2016-01-07 09:44:27 -0700 | [diff] [blame] | 76 | - loader will filter out extensions requested in vkCreateInstance and vkCreateDevice |
| 77 | before calling into the ICD; |
| 78 | Filtering will be of extensions advertised by entities (eg layers) different from the ICD in question |
| 79 | - loader will not call ICD for vkEnumerate*LayerProperties() as layer properties are obtained from |
| 80 | the layer libraries and ICD files. |
| 81 | - loader will not call ICD for vkEnumerate*ExtensionProperties(pLayerName != NULL) |
Ian Elliott | 3672c78 | 2015-02-13 11:23:05 -0700 | [diff] [blame] | 82 | - The ICD may or may not implement a dispatch table. |
Courtney Goeltzenleuchter | d8e229c | 2015-04-08 15:36:08 -0600 | [diff] [blame] | 83 | - 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 Goeltzenleuchter | c1f8639 | 2015-01-07 09:24:45 -0700 | [diff] [blame] | 84 | |
Jon Ashburn | 4a511f1 | 2015-07-16 10:54:55 -0600 | [diff] [blame] | 85 | ## Layer library discovery |
| 86 | See file LinuxICDs.txt and WindowsICDs.txt for description of how the loader |
| 87 | finds layer libraries. |
| 88 | |
| 89 | ## Interface to layer libraries |
| 90 | TBD |
| 91 | |