vk_layer.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /*
  2. * Copyright 2015-2023 The Khronos Group Inc.
  3. * Copyright 2015-2023 Valve Corporation
  4. * Copyright 2015-2023 LunarG, Inc.
  5. *
  6. * SPDX-License-Identifier: Apache-2.0
  7. */
  8. #pragma once
  9. /* Need to define dispatch table
  10. * Core struct can then have ptr to dispatch table at the top
  11. * Along with object ptrs for current and next OBJ
  12. */
  13. #include "vulkan_core.h"
  14. #define MAX_NUM_UNKNOWN_EXTS 250
  15. // Loader-Layer version negotiation API. Versions add the following features:
  16. // Versions 0/1 - Initial. Doesn't support vk_layerGetPhysicalDeviceProcAddr
  17. // or vk_icdNegotiateLoaderLayerInterfaceVersion.
  18. // Version 2 - Add support for vk_layerGetPhysicalDeviceProcAddr and
  19. // vk_icdNegotiateLoaderLayerInterfaceVersion.
  20. #define CURRENT_LOADER_LAYER_INTERFACE_VERSION 2
  21. #define MIN_SUPPORTED_LOADER_LAYER_INTERFACE_VERSION 1
  22. #define VK_CURRENT_CHAIN_VERSION 1
  23. // Typedef for use in the interfaces below
  24. typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char* pName);
  25. // Version negotiation values
  26. typedef enum VkNegotiateLayerStructType {
  27. LAYER_NEGOTIATE_UNINTIALIZED = 0,
  28. LAYER_NEGOTIATE_INTERFACE_STRUCT = 1,
  29. } VkNegotiateLayerStructType;
  30. // Version negotiation structures
  31. typedef struct VkNegotiateLayerInterface {
  32. VkNegotiateLayerStructType sType;
  33. void *pNext;
  34. uint32_t loaderLayerInterfaceVersion;
  35. PFN_vkGetInstanceProcAddr pfnGetInstanceProcAddr;
  36. PFN_vkGetDeviceProcAddr pfnGetDeviceProcAddr;
  37. PFN_GetPhysicalDeviceProcAddr pfnGetPhysicalDeviceProcAddr;
  38. } VkNegotiateLayerInterface;
  39. // Version negotiation functions
  40. typedef VkResult (VKAPI_PTR *PFN_vkNegotiateLoaderLayerInterfaceVersion)(VkNegotiateLayerInterface *pVersionStruct);
  41. // Function prototype for unknown physical device extension command
  42. typedef VkResult(VKAPI_PTR *PFN_PhysDevExt)(VkPhysicalDevice phys_device);
  43. // ------------------------------------------------------------------------------------------------
  44. // CreateInstance and CreateDevice support structures
  45. /* Sub type of structure for instance and device loader ext of CreateInfo.
  46. * When sType == VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO
  47. * or sType == VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO
  48. * then VkLayerFunction indicates struct type pointed to by pNext
  49. */
  50. typedef enum VkLayerFunction_ {
  51. VK_LAYER_LINK_INFO = 0,
  52. VK_LOADER_DATA_CALLBACK = 1,
  53. VK_LOADER_LAYER_CREATE_DEVICE_CALLBACK = 2,
  54. VK_LOADER_FEATURES = 3,
  55. } VkLayerFunction;
  56. typedef struct VkLayerInstanceLink_ {
  57. struct VkLayerInstanceLink_ *pNext;
  58. PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr;
  59. PFN_GetPhysicalDeviceProcAddr pfnNextGetPhysicalDeviceProcAddr;
  60. } VkLayerInstanceLink;
  61. /*
  62. * When creating the device chain the loader needs to pass
  63. * down information about it's device structure needed at
  64. * the end of the chain. Passing the data via the
  65. * VkLayerDeviceInfo avoids issues with finding the
  66. * exact instance being used.
  67. */
  68. typedef struct VkLayerDeviceInfo_ {
  69. void *device_info;
  70. PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr;
  71. } VkLayerDeviceInfo;
  72. typedef VkResult (VKAPI_PTR *PFN_vkSetInstanceLoaderData)(VkInstance instance,
  73. void *object);
  74. typedef VkResult (VKAPI_PTR *PFN_vkSetDeviceLoaderData)(VkDevice device,
  75. void *object);
  76. typedef VkResult (VKAPI_PTR *PFN_vkLayerCreateDevice)(VkInstance instance, VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
  77. const VkAllocationCallbacks *pAllocator, VkDevice *pDevice, PFN_vkGetInstanceProcAddr layerGIPA, PFN_vkGetDeviceProcAddr *nextGDPA);
  78. typedef void (VKAPI_PTR *PFN_vkLayerDestroyDevice)(VkDevice physicalDevice, const VkAllocationCallbacks *pAllocator, PFN_vkDestroyDevice destroyFunction);
  79. typedef enum VkLoaderFeastureFlagBits {
  80. VK_LOADER_FEATURE_PHYSICAL_DEVICE_SORTING = 0x00000001,
  81. } VkLoaderFlagBits;
  82. typedef VkFlags VkLoaderFeatureFlags;
  83. typedef struct {
  84. VkStructureType sType; // VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO
  85. const void *pNext;
  86. VkLayerFunction function;
  87. union {
  88. VkLayerInstanceLink *pLayerInfo;
  89. PFN_vkSetInstanceLoaderData pfnSetInstanceLoaderData;
  90. struct {
  91. PFN_vkLayerCreateDevice pfnLayerCreateDevice;
  92. PFN_vkLayerDestroyDevice pfnLayerDestroyDevice;
  93. } layerDevice;
  94. VkLoaderFeatureFlags loaderFeatures;
  95. } u;
  96. } VkLayerInstanceCreateInfo;
  97. typedef struct VkLayerDeviceLink_ {
  98. struct VkLayerDeviceLink_ *pNext;
  99. PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr;
  100. PFN_vkGetDeviceProcAddr pfnNextGetDeviceProcAddr;
  101. } VkLayerDeviceLink;
  102. typedef struct {
  103. VkStructureType sType; // VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO
  104. const void *pNext;
  105. VkLayerFunction function;
  106. union {
  107. VkLayerDeviceLink *pLayerInfo;
  108. PFN_vkSetDeviceLoaderData pfnSetDeviceLoaderData;
  109. } u;
  110. } VkLayerDeviceCreateInfo;
  111. #ifdef __cplusplus
  112. extern "C" {
  113. #endif
  114. VKAPI_ATTR VkResult VKAPI_CALL vkNegotiateLoaderLayerInterfaceVersion(VkNegotiateLayerInterface *pVersionStruct);
  115. typedef enum VkChainType {
  116. VK_CHAIN_TYPE_UNKNOWN = 0,
  117. VK_CHAIN_TYPE_ENUMERATE_INSTANCE_EXTENSION_PROPERTIES = 1,
  118. VK_CHAIN_TYPE_ENUMERATE_INSTANCE_LAYER_PROPERTIES = 2,
  119. VK_CHAIN_TYPE_ENUMERATE_INSTANCE_VERSION = 3,
  120. } VkChainType;
  121. typedef struct VkChainHeader {
  122. VkChainType type;
  123. uint32_t version;
  124. uint32_t size;
  125. } VkChainHeader;
  126. typedef struct VkEnumerateInstanceExtensionPropertiesChain {
  127. VkChainHeader header;
  128. VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceExtensionPropertiesChain *, const char *, uint32_t *,
  129. VkExtensionProperties *);
  130. const struct VkEnumerateInstanceExtensionPropertiesChain *pNextLink;
  131. #if defined(__cplusplus)
  132. inline VkResult CallDown(const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties) const {
  133. return pfnNextLayer(pNextLink, pLayerName, pPropertyCount, pProperties);
  134. }
  135. #endif
  136. } VkEnumerateInstanceExtensionPropertiesChain;
  137. typedef struct VkEnumerateInstanceLayerPropertiesChain {
  138. VkChainHeader header;
  139. VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceLayerPropertiesChain *, uint32_t *, VkLayerProperties *);
  140. const struct VkEnumerateInstanceLayerPropertiesChain *pNextLink;
  141. #if defined(__cplusplus)
  142. inline VkResult CallDown(uint32_t *pPropertyCount, VkLayerProperties *pProperties) const {
  143. return pfnNextLayer(pNextLink, pPropertyCount, pProperties);
  144. }
  145. #endif
  146. } VkEnumerateInstanceLayerPropertiesChain;
  147. typedef struct VkEnumerateInstanceVersionChain {
  148. VkChainHeader header;
  149. VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceVersionChain *, uint32_t *);
  150. const struct VkEnumerateInstanceVersionChain *pNextLink;
  151. #if defined(__cplusplus)
  152. inline VkResult CallDown(uint32_t *pApiVersion) const {
  153. return pfnNextLayer(pNextLink, pApiVersion);
  154. }
  155. #endif
  156. } VkEnumerateInstanceVersionChain;
  157. #ifdef __cplusplus
  158. }
  159. #endif