blob: 147dcd43ab37bed9b7aafaa3160d0cae31bd05a4 [file] [log] [blame]
Karl Schultz37419ed2016-02-02 12:32:50 -07001//
2// File: vk_layer.h
3//
4/*
Mark Young0f183a82017-02-28 09:58:04 -07005 * Copyright (c) 2015-2017 The Khronos Group Inc.
6 * Copyright (c) 2015-2017 Valve Corporation
7 * Copyright (c) 2015-2017 LunarG, Inc.
Karl Schultz37419ed2016-02-02 12:32:50 -07008 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06009 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
Karl Schultz37419ed2016-02-02 12:32:50 -070012 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060013 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz37419ed2016-02-02 12:32:50 -070014 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060015 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
Karl Schultz37419ed2016-02-02 12:32:50 -070020 *
21 */
22
Courtney Goeltzenleuchter64d1a712015-04-08 18:04:29 -060023/* Need to define dispatch table
24 * Core struct can then have ptr to dispatch table at the top
25 * Along with object ptrs for current and next OBJ
26 */
27#pragma once
28
Karl Schultz1aec29c2016-02-10 15:41:43 -070029#include "vulkan.h"
Courtney Goeltzenleuchter64d1a712015-04-08 18:04:29 -060030#if defined(__GNUC__) && __GNUC__ >= 4
Karl Schultz37419ed2016-02-02 12:32:50 -070031#define VK_LAYER_EXPORT __attribute__((visibility("default")))
Courtney Goeltzenleuchter64d1a712015-04-08 18:04:29 -060032#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)
Karl Schultz37419ed2016-02-02 12:32:50 -070033#define VK_LAYER_EXPORT __attribute__((visibility("default")))
Courtney Goeltzenleuchter64d1a712015-04-08 18:04:29 -060034#else
Karl Schultz37419ed2016-02-02 12:32:50 -070035#define VK_LAYER_EXPORT
Courtney Goeltzenleuchter64d1a712015-04-08 18:04:29 -060036#endif
37
Mark Young0f183a82017-02-28 09:58:04 -070038// Definition for VkLayerDispatchTable and VkLayerInstanceDispatchTable now appear in externally generated header
39#include "vk_layer_dispatch_table.h"
40
Mark Young39389872017-01-19 21:10:49 -070041#define MAX_NUM_UNKNOWN_EXTS 250
42
43 // Loader-Layer version negotiation API. Versions add the following features:
44 // Versions 0/1 - Initial. Doesn't support vk_layerGetPhysicalDeviceProcAddr
45 // or vk_icdNegotiateLoaderLayerInterfaceVersion.
46 // Version 2 - Add support for vk_layerGetPhysicalDeviceProcAddr and
47 // vk_icdNegotiateLoaderLayerInterfaceVersion.
48#define CURRENT_LOADER_LAYER_INTERFACE_VERSION 2
49#define MIN_SUPPORTED_LOADER_LAYER_INTERFACE_VERSION 1
50
Lenny Komow3cf3ac72017-12-19 16:38:37 -070051#define VK_CURRENT_CHAIN_VERSION 1
52
Mark Young39389872017-01-19 21:10:49 -070053// Version negotiation values
54typedef enum VkNegotiateLayerStructType {
55 LAYER_NEGOTIATE_UNINTIALIZED = 0,
56 LAYER_NEGOTIATE_INTERFACE_STRUCT = 1,
57} VkNegotiateLayerStructType;
58
59// Version negotiation structures
60typedef struct VkNegotiateLayerInterface {
61 VkNegotiateLayerStructType sType;
62 void *pNext;
63 uint32_t loaderLayerInterfaceVersion;
64 PFN_vkGetInstanceProcAddr pfnGetInstanceProcAddr;
65 PFN_vkGetDeviceProcAddr pfnGetDeviceProcAddr;
66 PFN_GetPhysicalDeviceProcAddr pfnGetPhysicalDeviceProcAddr;
67} VkNegotiateLayerInterface;
68
69// Version negotiation functions
70typedef VkResult (VKAPI_PTR *PFN_vkNegotiateLoaderLayerInterfaceVersion)(VkNegotiateLayerInterface *pVersionStruct);
71
72// Function prototype for unknown physical device extension command
Mark Youngc0e0b1c2017-04-05 15:58:44 -060073typedef VkResult(VKAPI_PTR *PFN_PhysDevExt)(VkPhysicalDevice phys_device);
Mark Young39389872017-01-19 21:10:49 -070074
Courtney Goeltzenleuchter64d1a712015-04-08 18:04:29 -060075// ------------------------------------------------------------------------------------------------
Courtney Goeltzenleuchter8286acc2016-01-08 11:40:27 -070076// CreateInstance and CreateDevice support structures
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -070077
Jon Ashburnc3c58772016-03-29 11:16:01 -060078/* Sub type of structure for instance and device loader ext of CreateInfo.
ttyio37c64842016-04-10 22:07:28 +080079 * When sType == VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO
80 * or sType == VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO
Jon Ashburnc3c58772016-03-29 11:16:01 -060081 * then VkLayerFunction indicates struct type pointed to by pNext
82 */
Karl Schultz37419ed2016-02-02 12:32:50 -070083typedef enum VkLayerFunction_ {
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -070084 VK_LAYER_LINK_INFO = 0,
Jon Ashburned8f2312016-03-31 10:52:22 -060085 VK_LOADER_DATA_CALLBACK = 1
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -070086} VkLayerFunction;
87
Courtney Goeltzenleuchter8286acc2016-01-08 11:40:27 -070088typedef struct VkLayerInstanceLink_ {
Karl Schultz37419ed2016-02-02 12:32:50 -070089 struct VkLayerInstanceLink_ *pNext;
Courtney Goeltzenleuchter8286acc2016-01-08 11:40:27 -070090 PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr;
Mark Young39389872017-01-19 21:10:49 -070091 PFN_GetPhysicalDeviceProcAddr pfnNextGetPhysicalDeviceProcAddr;
Courtney Goeltzenleuchter8286acc2016-01-08 11:40:27 -070092} VkLayerInstanceLink;
93
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -070094/*
95 * When creating the device chain the loader needs to pass
96 * down information about it's device structure needed at
97 * the end of the chain. Passing the data via the
98 * VkLayerDeviceInfo avoids issues with finding the
99 * exact instance being used.
100 */
101typedef struct VkLayerDeviceInfo_ {
102 void *device_info;
103 PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr;
104} VkLayerDeviceInfo;
105
Jon Ashburnc3c58772016-03-29 11:16:01 -0600106typedef VkResult (VKAPI_PTR *PFN_vkSetInstanceLoaderData)(VkInstance instance,
107 void *object);
Jon Ashburned8f2312016-03-31 10:52:22 -0600108typedef VkResult (VKAPI_PTR *PFN_vkSetDeviceLoaderData)(VkDevice device,
109 void *object);
Jon Ashburnc3c58772016-03-29 11:16:01 -0600110
Courtney Goeltzenleuchter8286acc2016-01-08 11:40:27 -0700111typedef struct {
Vinjn Zhange5891442016-04-06 15:38:24 +0800112 VkStructureType sType; // VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO
Karl Schultz37419ed2016-02-02 12:32:50 -0700113 const void *pNext;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700114 VkLayerFunction function;
115 union {
Karl Schultz37419ed2016-02-02 12:32:50 -0700116 VkLayerInstanceLink *pLayerInfo;
Jon Ashburnc3c58772016-03-29 11:16:01 -0600117 PFN_vkSetInstanceLoaderData pfnSetInstanceLoaderData;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700118 } u;
Courtney Goeltzenleuchter8286acc2016-01-08 11:40:27 -0700119} VkLayerInstanceCreateInfo;
120
121typedef struct VkLayerDeviceLink_ {
Karl Schultz37419ed2016-02-02 12:32:50 -0700122 struct VkLayerDeviceLink_ *pNext;
Courtney Goeltzenleuchter8286acc2016-01-08 11:40:27 -0700123 PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr;
124 PFN_vkGetDeviceProcAddr pfnNextGetDeviceProcAddr;
125} VkLayerDeviceLink;
126
127typedef struct {
Vinjn Zhange5891442016-04-06 15:38:24 +0800128 VkStructureType sType; // VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO
Karl Schultz37419ed2016-02-02 12:32:50 -0700129 const void *pNext;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700130 VkLayerFunction function;
131 union {
Karl Schultz37419ed2016-02-02 12:32:50 -0700132 VkLayerDeviceLink *pLayerInfo;
Jon Ashburned8f2312016-03-31 10:52:22 -0600133 PFN_vkSetDeviceLoaderData pfnSetDeviceLoaderData;
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700134 } u;
Courtney Goeltzenleuchter8286acc2016-01-08 11:40:27 -0700135} VkLayerDeviceCreateInfo;
136
Mark Young21aa6d62017-03-29 13:39:27 -0600137#ifdef __cplusplus
138extern "C" {
139#endif
140
141VKAPI_ATTR VkResult VKAPI_CALL vkNegotiateLoaderLayerInterfaceVersion(VkNegotiateLayerInterface *pVersionStruct);
142
Lenny Komow3cf3ac72017-12-19 16:38:37 -0700143typedef enum VkChainType {
144 VK_CHAIN_TYPE_UNKNOWN = 0,
145 VK_CHAIN_TYPE_ENUMERATE_INSTANCE_EXTENSION_PROPERTIES = 1,
146 VK_CHAIN_TYPE_ENUMERATE_INSTANCE_LAYER_PROPERTIES = 2,
147} VkChainType;
148
149typedef struct VkChainHeader {
150 VkChainType type;
151 uint32_t version;
152 uint32_t size;
153} VkChainHeader;
154
155typedef struct VkEnumerateInstanceExtensionPropertiesChain {
156 VkChainHeader header;
157 VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceExtensionPropertiesChain *, const char *, uint32_t *,
158 VkExtensionProperties *);
159 const struct VkEnumerateInstanceExtensionPropertiesChain *pNextLink;
160
161#if defined(__cplusplus)
162 inline VkResult CallDown(const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties) const {
163 return pfnNextLayer(pNextLink, pLayerName, pPropertyCount, pProperties);
164 }
165#endif
166} VkEnumerateInstanceExtensionPropertiesChain;
167
168typedef struct VkEnumerateInstanceLayerPropertiesChain {
169 VkChainHeader header;
170 VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceLayerPropertiesChain *, uint32_t *, VkLayerProperties *);
171 const struct VkEnumerateInstanceLayerPropertiesChain *pNextLink;
172
173#if defined(__cplusplus)
174 inline VkResult CallDown(uint32_t *pPropertyCount, VkLayerProperties *pProperties) const {
175 return pfnNextLayer(pNextLink, pPropertyCount, pProperties);
176 }
177#endif
178} VkEnumerateInstanceLayerPropertiesChain;
179
Mark Young21aa6d62017-03-29 13:39:27 -0600180#ifdef __cplusplus
181}
182#endif