Courtney Goeltzenleuchter | 89e99e6 | 2015-04-08 18:04:29 -0600 | [diff] [blame] | 1 | #ifndef VKICD_H |
| 2 | #define VKICD_H |
| 3 | |
| 4 | #include <stdint.h> |
| 5 | #include <stdbool.h> |
Courtney Goeltzenleuchter | 2040b43 | 2015-04-09 11:52:55 -0600 | [diff] [blame] | 6 | #include "vk_platform.h" |
Courtney Goeltzenleuchter | 89e99e6 | 2015-04-08 18:04:29 -0600 | [diff] [blame] | 7 | |
| 8 | /* |
| 9 | * The ICD must reserve space for a pointer for the loader's dispatch |
| 10 | * table, at the start of <each object>. |
| 11 | * The ICD must initialize this variable using the SET_LOADER_MAGIC_VALUE macro. |
| 12 | */ |
| 13 | |
| 14 | #define ICD_LOADER_MAGIC 0x01CDC0DE |
| 15 | |
| 16 | typedef union _VK_LOADER_DATA { |
Courtney Goeltzenleuchter | b24b258 | 2015-07-22 08:35:04 -0600 | [diff] [blame] | 17 | uintptr_t loaderMagic; |
Courtney Goeltzenleuchter | 89e99e6 | 2015-04-08 18:04:29 -0600 | [diff] [blame] | 18 | void *loaderData; |
| 19 | } VK_LOADER_DATA; |
| 20 | |
Tony Barbour | de4124d | 2015-07-03 10:33:54 -0600 | [diff] [blame] | 21 | static inline void set_loader_magic_value(void* pNewObject) { |
Courtney Goeltzenleuchter | 89e99e6 | 2015-04-08 18:04:29 -0600 | [diff] [blame] | 22 | VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *) pNewObject; |
| 23 | loader_info->loaderMagic = ICD_LOADER_MAGIC; |
| 24 | } |
| 25 | |
Tony Barbour | de4124d | 2015-07-03 10:33:54 -0600 | [diff] [blame] | 26 | static inline bool valid_loader_magic_value(void* pNewObject) { |
Courtney Goeltzenleuchter | 89e99e6 | 2015-04-08 18:04:29 -0600 | [diff] [blame] | 27 | const VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *) pNewObject; |
Courtney Goeltzenleuchter | 5f70fc4 | 2015-07-24 10:18:40 -0600 | [diff] [blame] | 28 | return (loader_info->loaderMagic & 0xffffffff) == ICD_LOADER_MAGIC; |
Courtney Goeltzenleuchter | 89e99e6 | 2015-04-08 18:04:29 -0600 | [diff] [blame] | 29 | } |
| 30 | |
| 31 | #endif // VKICD_H |
| 32 | |