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