1// 2// File: vk_icd.h 3// 4/* 5 * Copyright (c) 2015-2016 The Khronos Group Inc. 6 * Copyright (c) 2015-2016 Valve Corporation 7 * Copyright (c) 2015-2016 LunarG, Inc. 8 * 9 * 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 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * 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. 20 * 21 */ 22 23#ifndef VKICD_H 24#define VKICD_H 25 26#include "vulkan.h" 27#include <stdbool.h> 28 29// Loader-ICD version negotiation API. Versions add the following features: 30// Version 0 - Initial. Doesn't support vk_icdGetInstanceProcAddr 31// or vk_icdNegotiateLoaderICDInterfaceVersion. 32// Version 1 - Add support for vk_icdGetInstanceProcAddr. 33// Version 2 - Add Loader/ICD Interface version negotiation 34// via vk_icdNegotiateLoaderICDInterfaceVersion. 35// Version 3 - Add ICD creation/destruction of KHR_surface objects. 36// Version 4 - Add unknown physical device extension qyering via 37// vk_icdGetPhysicalDeviceProcAddr. 38// Version 5 - Tells ICDs that the loader is now paying attention to the 39// application version of Vulkan passed into the ApplicationInfo 40// structure during vkCreateInstance. This will tell the ICD 41// that if the loader is older, it should automatically fail a 42// call for any API version > 1.0. Otherwise, the loader will 43// manually determine if it can support the expected version. 44#define CURRENT_LOADER_ICD_INTERFACE_VERSION 5 45#define MIN_SUPPORTED_LOADER_ICD_INTERFACE_VERSION 0 46#define MIN_PHYS_DEV_EXTENSION_ICD_INTERFACE_VERSION 4 47typedef VkResult(VKAPI_PTR *PFN_vkNegotiateLoaderICDInterfaceVersion)(uint32_t *pVersion); 48 49// This is defined in vk_layer.h which will be found by the loader, but if an ICD is building against this 50// file directly, it won't be found. 51#ifndef PFN_GetPhysicalDeviceProcAddr 52typedef PFN_vkVoidFunction(VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char *pName); 53#endif 54 55/* 56 * The ICD must reserve space for a pointer for the loader's dispatch 57 * table, at the start of <each object>. 58 * The ICD must initialize this variable using the SET_LOADER_MAGIC_VALUE macro. 59 */ 60 61#define ICD_LOADER_MAGIC 0x01CDC0DE 62 63typedef union { 64 uintptr_t loaderMagic; 65 void *loaderData; 66} VK_LOADER_DATA; 67 68static inline void set_loader_magic_value(void *pNewObject) { 69 VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *)pNewObject; 70 loader_info->loaderMagic = ICD_LOADER_MAGIC; 71} 72 73static inline bool valid_loader_magic_value(void *pNewObject) { 74 const VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *)pNewObject; 75 return (loader_info->loaderMagic & 0xffffffff) == ICD_LOADER_MAGIC; 76} 77 78/* 79 * Windows and Linux ICDs will treat VkSurfaceKHR as a pointer to a struct that 80 * contains the platform-specific connection and surface information. 81 */ 82typedef enum { 83 VK_ICD_WSI_PLATFORM_MIR, 84 VK_ICD_WSI_PLATFORM_WAYLAND, 85 VK_ICD_WSI_PLATFORM_WIN32, 86 VK_ICD_WSI_PLATFORM_XCB, 87 VK_ICD_WSI_PLATFORM_XLIB, 88 VK_ICD_WSI_PLATFORM_ANDROID, 89 VK_ICD_WSI_PLATFORM_MACOS, 90 VK_ICD_WSI_PLATFORM_IOS, 91 VK_ICD_WSI_PLATFORM_DISPLAY 92} VkIcdWsiPlatform; 93 94typedef struct { 95 VkIcdWsiPlatform platform; 96} VkIcdSurfaceBase; 97 98#ifdef VK_USE_PLATFORM_MIR_KHR 99typedef struct { 100 VkIcdSurfaceBase base; 101 MirConnection *connection; 102 MirSurface *mirSurface; 103} VkIcdSurfaceMir; 104#endif // VK_USE_PLATFORM_MIR_KHR 105 106#ifdef VK_USE_PLATFORM_WAYLAND_KHR 107typedef struct { 108 VkIcdSurfaceBase base; 109 struct wl_display *display; 110 struct wl_surface *surface; 111} VkIcdSurfaceWayland; 112#endif // VK_USE_PLATFORM_WAYLAND_KHR 113 114#ifdef VK_USE_PLATFORM_WIN32_KHR 115typedef struct { 116 VkIcdSurfaceBase base; 117 HINSTANCE hinstance; 118 HWND hwnd; 119} VkIcdSurfaceWin32; 120#endif // VK_USE_PLATFORM_WIN32_KHR 121 122#ifdef VK_USE_PLATFORM_XCB_KHR 123typedef struct { 124 VkIcdSurfaceBase base; 125 xcb_connection_t *connection; 126 xcb_window_t window; 127} VkIcdSurfaceXcb; 128#endif // VK_USE_PLATFORM_XCB_KHR 129 130#ifdef VK_USE_PLATFORM_XLIB_KHR 131typedef struct { 132 VkIcdSurfaceBase base; 133 Display *dpy; 134 Window window; 135} VkIcdSurfaceXlib; 136#endif // VK_USE_PLATFORM_XLIB_KHR 137 138#ifdef VK_USE_PLATFORM_ANDROID_KHR 139typedef struct { 140 VkIcdSurfaceBase base; 141 struct ANativeWindow *window; 142} VkIcdSurfaceAndroid; 143#endif // VK_USE_PLATFORM_ANDROID_KHR 144 145#ifdef VK_USE_PLATFORM_MACOS_MVK 146typedef struct { 147 VkIcdSurfaceBase base; 148 const void *pView; 149} VkIcdSurfaceMacOS; 150#endif // VK_USE_PLATFORM_MACOS_MVK 151 152#ifdef VK_USE_PLATFORM_IOS_MVK 153typedef struct { 154 VkIcdSurfaceBase base; 155 const void *pView; 156} VkIcdSurfaceIOS; 157#endif // VK_USE_PLATFORM_IOS_MVK 158 159typedef struct { 160 VkIcdSurfaceBase base; 161 VkDisplayModeKHR displayMode; 162 uint32_t planeIndex; 163 uint32_t planeStackIndex; 164 VkSurfaceTransformFlagBitsKHR transform; 165 float globalAlpha; 166 VkDisplayPlaneAlphaFlagBitsKHR alphaMode; 167 VkExtent2D imageExtent; 168} VkIcdSurfaceDisplay; 169 170#endif // VKICD_H 171