| // | |
| // File: vk_layer.h | |
| // | |
| /* | |
| * Copyright (c) 2015-2017 The Khronos Group Inc. | |
| * Copyright (c) 2015-2017 Valve Corporation | |
| * Copyright (c) 2015-2017 LunarG, Inc. | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| * | |
| */ | |
| /* Need to define dispatch table | |
| * Core struct can then have ptr to dispatch table at the top | |
| * Along with object ptrs for current and next OBJ | |
| */ | |
| #pragma once | |
| #include "vulkan.h" | |
| #if defined(__GNUC__) && __GNUC__ >= 4 | |
| #define VK_LAYER_EXPORT __attribute__((visibility("default"))) | |
| #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) | |
| #define VK_LAYER_EXPORT __attribute__((visibility("default"))) | |
| #else | |
| #define VK_LAYER_EXPORT | |
| #endif | |
| #define MAX_NUM_UNKNOWN_EXTS 250 | |
| // Loader-Layer version negotiation API. Versions add the following features: | |
| // Versions 0/1 - Initial. Doesn't support vk_layerGetPhysicalDeviceProcAddr | |
| // or vk_icdNegotiateLoaderLayerInterfaceVersion. | |
| // Version 2 - Add support for vk_layerGetPhysicalDeviceProcAddr and | |
| // vk_icdNegotiateLoaderLayerInterfaceVersion. | |
| #define CURRENT_LOADER_LAYER_INTERFACE_VERSION 2 | |
| #define MIN_SUPPORTED_LOADER_LAYER_INTERFACE_VERSION 1 | |
| #define VK_CURRENT_CHAIN_VERSION 1 | |
| // Typedef for use in the interfaces below | |
| typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char* pName); | |
| // Version negotiation values | |
| typedef enum VkNegotiateLayerStructType { | |
| LAYER_NEGOTIATE_UNINTIALIZED = 0, | |
| LAYER_NEGOTIATE_INTERFACE_STRUCT = 1, | |
| } VkNegotiateLayerStructType; | |
| // Version negotiation structures | |
| typedef struct VkNegotiateLayerInterface { | |
| VkNegotiateLayerStructType sType; | |
| void *pNext; | |
| uint32_t loaderLayerInterfaceVersion; | |
| PFN_vkGetInstanceProcAddr pfnGetInstanceProcAddr; | |
| PFN_vkGetDeviceProcAddr pfnGetDeviceProcAddr; | |
| PFN_GetPhysicalDeviceProcAddr pfnGetPhysicalDeviceProcAddr; | |
| } VkNegotiateLayerInterface; | |
| // Version negotiation functions | |
| typedef VkResult (VKAPI_PTR *PFN_vkNegotiateLoaderLayerInterfaceVersion)(VkNegotiateLayerInterface *pVersionStruct); | |
| // Function prototype for unknown physical device extension command | |
| typedef VkResult(VKAPI_PTR *PFN_PhysDevExt)(VkPhysicalDevice phys_device); | |
| // ------------------------------------------------------------------------------------------------ | |
| // CreateInstance and CreateDevice support structures | |
| /* Sub type of structure for instance and device loader ext of CreateInfo. | |
| * When sType == VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO | |
| * or sType == VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO | |
| * then VkLayerFunction indicates struct type pointed to by pNext | |
| */ | |
| typedef enum VkLayerFunction_ { | |
| VK_LAYER_LINK_INFO = 0, | |
| VK_LOADER_DATA_CALLBACK = 1, | |
| VK_LOADER_LAYER_CREATE_DEVICE_CALLBACK = 2 | |
| } VkLayerFunction; | |
| typedef struct VkLayerInstanceLink_ { | |
| struct VkLayerInstanceLink_ *pNext; | |
| PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr; | |
| PFN_GetPhysicalDeviceProcAddr pfnNextGetPhysicalDeviceProcAddr; | |
| } VkLayerInstanceLink; | |
| /* | |
| * When creating the device chain the loader needs to pass | |
| * down information about it's device structure needed at | |
| * the end of the chain. Passing the data via the | |
| * VkLayerDeviceInfo avoids issues with finding the | |
| * exact instance being used. | |
| */ | |
| typedef struct VkLayerDeviceInfo_ { | |
| void *device_info; | |
| PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr; | |
| } VkLayerDeviceInfo; | |
| typedef VkResult (VKAPI_PTR *PFN_vkSetInstanceLoaderData)(VkInstance instance, | |
| void *object); | |
| typedef VkResult (VKAPI_PTR *PFN_vkSetDeviceLoaderData)(VkDevice device, | |
| void *object); | |
| typedef VkResult (VKAPI_PTR *PFN_vkLayerCreateDevice)(VkInstance instance, VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo, | |
| const VkAllocationCallbacks *pAllocator, VkDevice *pDevice, PFN_vkGetInstanceProcAddr layerGIPA, PFN_vkGetDeviceProcAddr *nextGDPA); | |
| typedef void (VKAPI_PTR *PFN_vkLayerDestroyDevice)(VkDevice physicalDevice, const VkAllocationCallbacks *pAllocator, PFN_vkDestroyDevice destroyFunction); | |
| typedef struct { | |
| VkStructureType sType; // VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO | |
| const void *pNext; | |
| VkLayerFunction function; | |
| union { | |
| VkLayerInstanceLink *pLayerInfo; | |
| PFN_vkSetInstanceLoaderData pfnSetInstanceLoaderData; | |
| struct { | |
| PFN_vkLayerCreateDevice pfnLayerCreateDevice; | |
| PFN_vkLayerDestroyDevice pfnLayerDestroyDevice; | |
| } layerDevice; | |
| } u; | |
| } VkLayerInstanceCreateInfo; | |
| typedef struct VkLayerDeviceLink_ { | |
| struct VkLayerDeviceLink_ *pNext; | |
| PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr; | |
| PFN_vkGetDeviceProcAddr pfnNextGetDeviceProcAddr; | |
| } VkLayerDeviceLink; | |
| typedef struct { | |
| VkStructureType sType; // VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO | |
| const void *pNext; | |
| VkLayerFunction function; | |
| union { | |
| VkLayerDeviceLink *pLayerInfo; | |
| PFN_vkSetDeviceLoaderData pfnSetDeviceLoaderData; | |
| } u; | |
| } VkLayerDeviceCreateInfo; | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif | |
| VKAPI_ATTR VkResult VKAPI_CALL vkNegotiateLoaderLayerInterfaceVersion(VkNegotiateLayerInterface *pVersionStruct); | |
| typedef enum VkChainType { | |
| VK_CHAIN_TYPE_UNKNOWN = 0, | |
| VK_CHAIN_TYPE_ENUMERATE_INSTANCE_EXTENSION_PROPERTIES = 1, | |
| VK_CHAIN_TYPE_ENUMERATE_INSTANCE_LAYER_PROPERTIES = 2, | |
| VK_CHAIN_TYPE_ENUMERATE_INSTANCE_VERSION = 3, | |
| } VkChainType; | |
| typedef struct VkChainHeader { | |
| VkChainType type; | |
| uint32_t version; | |
| uint32_t size; | |
| } VkChainHeader; | |
| typedef struct VkEnumerateInstanceExtensionPropertiesChain { | |
| VkChainHeader header; | |
| VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceExtensionPropertiesChain *, const char *, uint32_t *, | |
| VkExtensionProperties *); | |
| const struct VkEnumerateInstanceExtensionPropertiesChain *pNextLink; | |
| #if defined(__cplusplus) | |
| inline VkResult CallDown(const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties) const { | |
| return pfnNextLayer(pNextLink, pLayerName, pPropertyCount, pProperties); | |
| } | |
| #endif | |
| } VkEnumerateInstanceExtensionPropertiesChain; | |
| typedef struct VkEnumerateInstanceLayerPropertiesChain { | |
| VkChainHeader header; | |
| VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceLayerPropertiesChain *, uint32_t *, VkLayerProperties *); | |
| const struct VkEnumerateInstanceLayerPropertiesChain *pNextLink; | |
| #if defined(__cplusplus) | |
| inline VkResult CallDown(uint32_t *pPropertyCount, VkLayerProperties *pProperties) const { | |
| return pfnNextLayer(pNextLink, pPropertyCount, pProperties); | |
| } | |
| #endif | |
| } VkEnumerateInstanceLayerPropertiesChain; | |
| typedef struct VkEnumerateInstanceVersionChain { | |
| VkChainHeader header; | |
| VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceVersionChain *, uint32_t *); | |
| const struct VkEnumerateInstanceVersionChain *pNextLink; | |
| #if defined(__cplusplus) | |
| inline VkResult CallDown(uint32_t *pApiVersion) const { | |
| return pfnNextLayer(pNextLink, pApiVersion); | |
| } | |
| #endif | |
| } VkEnumerateInstanceVersionChain; | |
| #ifdef __cplusplus | |
| } | |
| #endif |