blob: 748e552d50c6bef955e483c9eb663b1d2bd86836 [file] [log] [blame]
Karl Schultz37419ed2016-02-02 12:32:50 -07001//
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 *
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#ifndef VKICD_H
24#define VKICD_H
25
Jon Ashburnc7d3e732016-03-08 09:30:30 -070026#include "vulkan.h"
Courtney Goeltzenleuchter64d1a712015-04-08 18:04:29 -060027
Mark Young39389872017-01-19 21:10:49 -070028// Loader-ICD version negotiation API. Versions add the following features:
29// Version 0 - Initial. Doesn't support vk_icdGetInstanceProcAddr
30// or vk_icdNegotiateLoaderICDInterfaceVersion.
31// Version 1 - Add support for vk_icdGetInstanceProcAddr.
32// Version 2 - Add Loader/ICD Interface version negotiation
33// via vk_icdNegotiateLoaderICDInterfaceVersion.
34// Version 3 - Add ICD creation/destruction of KHR_surface objects.
35// Version 4 - Add unknown physical device extension qyering via
36// vk_icdGetPhysicalDeviceProcAddr.
37#define CURRENT_LOADER_ICD_INTERFACE_VERSION 4
Jon Ashburn17b4c862016-04-25 11:09:37 -060038#define MIN_SUPPORTED_LOADER_ICD_INTERFACE_VERSION 0
Mark Young39389872017-01-19 21:10:49 -070039#define MIN_PHYS_DEV_EXTENSION_ICD_INTERFACE_VERSION 4
Jon Ashburn17b4c862016-04-25 11:09:37 -060040typedef VkResult (VKAPI_PTR *PFN_vkNegotiateLoaderICDInterfaceVersion)(uint32_t *pVersion);
Mark Young39389872017-01-19 21:10:49 -070041
42// This is defined in vk_layer.h which will be found by the loader, but if an ICD is building against this
43// flie directly, it won't be found.
44#ifndef PFN_GetPhysicalDeviceProcAddr
45typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char* pName);
46#endif
47
Jon Ashburn17b4c862016-04-25 11:09:37 -060048/*
Courtney Goeltzenleuchter64d1a712015-04-08 18:04:29 -060049 * The ICD must reserve space for a pointer for the loader's dispatch
50 * table, at the start of <each object>.
51 * The ICD must initialize this variable using the SET_LOADER_MAGIC_VALUE macro.
52 */
53
Karl Schultz37419ed2016-02-02 12:32:50 -070054#define ICD_LOADER_MAGIC 0x01CDC0DE
Courtney Goeltzenleuchter64d1a712015-04-08 18:04:29 -060055
Mark Lobodzinski2b46a9d2016-05-19 17:17:58 -060056typedef union {
Karl Schultz37419ed2016-02-02 12:32:50 -070057 uintptr_t loaderMagic;
58 void *loaderData;
Courtney Goeltzenleuchter64d1a712015-04-08 18:04:29 -060059} VK_LOADER_DATA;
60
Karl Schultz37419ed2016-02-02 12:32:50 -070061static inline void set_loader_magic_value(void *pNewObject) {
62 VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *)pNewObject;
Courtney Goeltzenleuchter64d1a712015-04-08 18:04:29 -060063 loader_info->loaderMagic = ICD_LOADER_MAGIC;
64}
65
Karl Schultz37419ed2016-02-02 12:32:50 -070066static inline bool valid_loader_magic_value(void *pNewObject) {
67 const VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *)pNewObject;
Courtney Goeltzenleuchter2e991f82015-07-24 10:18:40 -060068 return (loader_info->loaderMagic & 0xffffffff) == ICD_LOADER_MAGIC;
Courtney Goeltzenleuchter64d1a712015-04-08 18:04:29 -060069}
70
Ian Elliott4d520542015-11-18 12:19:12 -070071/*
72 * Windows and Linux ICDs will treat VkSurfaceKHR as a pointer to a struct that
73 * contains the platform-specific connection and surface information.
74 */
Mark Lobodzinski2b46a9d2016-05-19 17:17:58 -060075typedef enum {
Ian Elliott4d520542015-11-18 12:19:12 -070076 VK_ICD_WSI_PLATFORM_MIR,
77 VK_ICD_WSI_PLATFORM_WAYLAND,
78 VK_ICD_WSI_PLATFORM_WIN32,
79 VK_ICD_WSI_PLATFORM_XCB,
80 VK_ICD_WSI_PLATFORM_XLIB,
Jon Ashburnc7d3e732016-03-08 09:30:30 -070081 VK_ICD_WSI_PLATFORM_DISPLAY
Ian Elliott4d520542015-11-18 12:19:12 -070082} VkIcdWsiPlatform;
83
Mark Lobodzinski2b46a9d2016-05-19 17:17:58 -060084typedef struct {
Karl Schultz37419ed2016-02-02 12:32:50 -070085 VkIcdWsiPlatform platform;
Ian Elliott4d520542015-11-18 12:19:12 -070086} VkIcdSurfaceBase;
87
88#ifdef VK_USE_PLATFORM_MIR_KHR
Mark Lobodzinski2b46a9d2016-05-19 17:17:58 -060089typedef struct {
Karl Schultz37419ed2016-02-02 12:32:50 -070090 VkIcdSurfaceBase base;
91 MirConnection *connection;
92 MirSurface *mirSurface;
Ian Elliott4d520542015-11-18 12:19:12 -070093} VkIcdSurfaceMir;
94#endif // VK_USE_PLATFORM_MIR_KHR
95
96#ifdef VK_USE_PLATFORM_WAYLAND_KHR
Mark Lobodzinski2b46a9d2016-05-19 17:17:58 -060097typedef struct {
Karl Schultz37419ed2016-02-02 12:32:50 -070098 VkIcdSurfaceBase base;
99 struct wl_display *display;
100 struct wl_surface *surface;
Ian Elliott4d520542015-11-18 12:19:12 -0700101} VkIcdSurfaceWayland;
102#endif // VK_USE_PLATFORM_WAYLAND_KHR
103
104#ifdef VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski2b46a9d2016-05-19 17:17:58 -0600105typedef struct {
Karl Schultz37419ed2016-02-02 12:32:50 -0700106 VkIcdSurfaceBase base;
107 HINSTANCE hinstance;
108 HWND hwnd;
Ian Elliott4d520542015-11-18 12:19:12 -0700109} VkIcdSurfaceWin32;
110#endif // VK_USE_PLATFORM_WIN32_KHR
111
112#ifdef VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski2b46a9d2016-05-19 17:17:58 -0600113typedef struct {
Karl Schultz37419ed2016-02-02 12:32:50 -0700114 VkIcdSurfaceBase base;
115 xcb_connection_t *connection;
116 xcb_window_t window;
Ian Elliott4d520542015-11-18 12:19:12 -0700117} VkIcdSurfaceXcb;
118#endif // VK_USE_PLATFORM_XCB_KHR
119
120#ifdef VK_USE_PLATFORM_XLIB_KHR
Mark Lobodzinski2b46a9d2016-05-19 17:17:58 -0600121typedef struct {
Karl Schultz37419ed2016-02-02 12:32:50 -0700122 VkIcdSurfaceBase base;
123 Display *dpy;
124 Window window;
Ian Elliott4d520542015-11-18 12:19:12 -0700125} VkIcdSurfaceXlib;
126#endif // VK_USE_PLATFORM_XLIB_KHR
127
Cody Northropfa2f36c2016-09-22 14:39:16 -0600128#ifdef VK_USE_PLATFORM_ANDROID_KHR
129typedef struct {
130 ANativeWindow* window;
131} VkIcdSurfaceAndroid;
132#endif //VK_USE_PLATFORM_ANDROID_KHR
133
Mark Lobodzinski2b46a9d2016-05-19 17:17:58 -0600134typedef struct {
Jon Ashburnc7d3e732016-03-08 09:30:30 -0700135 VkIcdSurfaceBase base;
136 VkDisplayModeKHR displayMode;
137 uint32_t planeIndex;
138 uint32_t planeStackIndex;
139 VkSurfaceTransformFlagBitsKHR transform;
140 float globalAlpha;
141 VkDisplayPlaneAlphaFlagBitsKHR alphaMode;
142 VkExtent2D imageExtent;
143} VkIcdSurfaceDisplay;
Mark Young16573c72016-06-28 10:52:43 -0600144
Courtney Goeltzenleuchter64d1a712015-04-08 18:04:29 -0600145#endif // VKICD_H