| // | |
| // File: vk_icd.h | |
| // | |
| /* | |
| * Copyright (c) 2015-2016 The Khronos Group Inc. | |
| * Copyright (c) 2015-2016 Valve Corporation | |
| * Copyright (c) 2015-2016 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. | |
| * | |
| */ | |
| #ifndef VKICD_H | |
| #define VKICD_H | |
| #include "vulkan.h" | |
| #include <stdbool.h> | |
| // Loader-ICD version negotiation API. Versions add the following features: | |
| // Version 0 - Initial. Doesn't support vk_icdGetInstanceProcAddr | |
| // or vk_icdNegotiateLoaderICDInterfaceVersion. | |
| // Version 1 - Add support for vk_icdGetInstanceProcAddr. | |
| // Version 2 - Add Loader/ICD Interface version negotiation | |
| // via vk_icdNegotiateLoaderICDInterfaceVersion. | |
| // Version 3 - Add ICD creation/destruction of KHR_surface objects. | |
| // Version 4 - Add unknown physical device extension qyering via | |
| // vk_icdGetPhysicalDeviceProcAddr. | |
| // Version 5 - Tells ICDs that the loader is now paying attention to the | |
| // application version of Vulkan passed into the ApplicationInfo | |
| // structure during vkCreateInstance. This will tell the ICD | |
| // that if the loader is older, it should automatically fail a | |
| // call for any API version > 1.0. Otherwise, the loader will | |
| // manually determine if it can support the expected version. | |
| #define CURRENT_LOADER_ICD_INTERFACE_VERSION 5 | |
| #define MIN_SUPPORTED_LOADER_ICD_INTERFACE_VERSION 0 | |
| #define MIN_PHYS_DEV_EXTENSION_ICD_INTERFACE_VERSION 4 | |
| typedef VkResult(VKAPI_PTR *PFN_vkNegotiateLoaderICDInterfaceVersion)(uint32_t *pVersion); | |
| // This is defined in vk_layer.h which will be found by the loader, but if an ICD is building against this | |
| // file directly, it won't be found. | |
| #ifndef PFN_GetPhysicalDeviceProcAddr | |
| typedef PFN_vkVoidFunction(VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char *pName); | |
| #endif | |
| /* | |
| * The ICD must reserve space for a pointer for the loader's dispatch | |
| * table, at the start of <each object>. | |
| * The ICD must initialize this variable using the SET_LOADER_MAGIC_VALUE macro. | |
| */ | |
| #define ICD_LOADER_MAGIC 0x01CDC0DE | |
| typedef union { | |
| uintptr_t loaderMagic; | |
| void *loaderData; | |
| } VK_LOADER_DATA; | |
| static inline void set_loader_magic_value(void *pNewObject) { | |
| VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *)pNewObject; | |
| loader_info->loaderMagic = ICD_LOADER_MAGIC; | |
| } | |
| static inline bool valid_loader_magic_value(void *pNewObject) { | |
| const VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *)pNewObject; | |
| return (loader_info->loaderMagic & 0xffffffff) == ICD_LOADER_MAGIC; | |
| } | |
| /* | |
| * Windows and Linux ICDs will treat VkSurfaceKHR as a pointer to a struct that | |
| * contains the platform-specific connection and surface information. | |
| */ | |
| typedef enum { | |
| VK_ICD_WSI_PLATFORM_MIR, | |
| VK_ICD_WSI_PLATFORM_WAYLAND, | |
| VK_ICD_WSI_PLATFORM_WIN32, | |
| VK_ICD_WSI_PLATFORM_XCB, | |
| VK_ICD_WSI_PLATFORM_XLIB, | |
| VK_ICD_WSI_PLATFORM_ANDROID, | |
| VK_ICD_WSI_PLATFORM_MACOS, | |
| VK_ICD_WSI_PLATFORM_IOS, | |
| VK_ICD_WSI_PLATFORM_DISPLAY, | |
| VK_ICD_WSI_PLATFORM_HEADLESS, | |
| VK_ICD_WSI_PLATFORM_METAL, | |
| } VkIcdWsiPlatform; | |
| typedef struct { | |
| VkIcdWsiPlatform platform; | |
| } VkIcdSurfaceBase; | |
| #ifdef VK_USE_PLATFORM_MIR_KHR | |
| typedef struct { | |
| VkIcdSurfaceBase base; | |
| MirConnection *connection; | |
| MirSurface *mirSurface; | |
| } VkIcdSurfaceMir; | |
| #endif // VK_USE_PLATFORM_MIR_KHR | |
| #ifdef VK_USE_PLATFORM_WAYLAND_KHR | |
| typedef struct { | |
| VkIcdSurfaceBase base; | |
| struct wl_display *display; | |
| struct wl_surface *surface; | |
| } VkIcdSurfaceWayland; | |
| #endif // VK_USE_PLATFORM_WAYLAND_KHR | |
| #ifdef VK_USE_PLATFORM_WIN32_KHR | |
| typedef struct { | |
| VkIcdSurfaceBase base; | |
| HINSTANCE hinstance; | |
| HWND hwnd; | |
| } VkIcdSurfaceWin32; | |
| #endif // VK_USE_PLATFORM_WIN32_KHR | |
| #ifdef VK_USE_PLATFORM_XCB_KHR | |
| typedef struct { | |
| VkIcdSurfaceBase base; | |
| xcb_connection_t *connection; | |
| xcb_window_t window; | |
| } VkIcdSurfaceXcb; | |
| #endif // VK_USE_PLATFORM_XCB_KHR | |
| #ifdef VK_USE_PLATFORM_XLIB_KHR | |
| typedef struct { | |
| VkIcdSurfaceBase base; | |
| Display *dpy; | |
| Window window; | |
| } VkIcdSurfaceXlib; | |
| #endif // VK_USE_PLATFORM_XLIB_KHR | |
| #ifdef VK_USE_PLATFORM_ANDROID_KHR | |
| typedef struct { | |
| VkIcdSurfaceBase base; | |
| struct ANativeWindow *window; | |
| } VkIcdSurfaceAndroid; | |
| #endif // VK_USE_PLATFORM_ANDROID_KHR | |
| #ifdef VK_USE_PLATFORM_MACOS_MVK | |
| typedef struct { | |
| VkIcdSurfaceBase base; | |
| const void *pView; | |
| } VkIcdSurfaceMacOS; | |
| #endif // VK_USE_PLATFORM_MACOS_MVK | |
| #ifdef VK_USE_PLATFORM_IOS_MVK | |
| typedef struct { | |
| VkIcdSurfaceBase base; | |
| const void *pView; | |
| } VkIcdSurfaceIOS; | |
| #endif // VK_USE_PLATFORM_IOS_MVK | |
| typedef struct { | |
| VkIcdSurfaceBase base; | |
| VkDisplayModeKHR displayMode; | |
| uint32_t planeIndex; | |
| uint32_t planeStackIndex; | |
| VkSurfaceTransformFlagBitsKHR transform; | |
| float globalAlpha; | |
| VkDisplayPlaneAlphaFlagBitsKHR alphaMode; | |
| VkExtent2D imageExtent; | |
| } VkIcdSurfaceDisplay; | |
| typedef struct { | |
| VkIcdSurfaceBase base; | |
| } VkIcdSurfaceHeadless; | |
| #ifdef VK_USE_PLATFORM_METAL_EXT | |
| typedef struct { | |
| VkIcdSurfaceBase base; | |
| const CAMetalLayer *pLayer; | |
| } VkIcdSurfaceMetal; | |
| #endif // VK_USE_PLATFORM_METAL_EXT | |
| #endif // VKICD_H |