190 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Copyright 2015-2023 The Khronos Group Inc.
 | 
						|
 * Copyright 2015-2023 Valve Corporation
 | 
						|
 * Copyright 2015-2023 LunarG, Inc.
 | 
						|
 *
 | 
						|
 * SPDX-License-Identifier: Apache-2.0
 | 
						|
 */
 | 
						|
#pragma once
 | 
						|
 | 
						|
/* 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
 | 
						|
 */
 | 
						|
 | 
						|
#include "vulkan_core.h"
 | 
						|
 | 
						|
#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,
 | 
						|
    VK_LOADER_FEATURES = 3,
 | 
						|
} 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 enum VkLoaderFeastureFlagBits {
 | 
						|
    VK_LOADER_FEATURE_PHYSICAL_DEVICE_SORTING = 0x00000001,
 | 
						|
} VkLoaderFlagBits;
 | 
						|
typedef VkFlags VkLoaderFeatureFlags;
 | 
						|
 | 
						|
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;
 | 
						|
        VkLoaderFeatureFlags loaderFeatures;
 | 
						|
    } 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
 |