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