xref: /aosp_15_r20/external/swiftshader/include/vulkan/vk_layer.h (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
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