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 * Permission is hereby granted, free of charge, to any person obtaining a copy
10 * of this software and/or associated documentation files (the "Materials"), to
11 * deal in the Materials without restriction, including without limitation the
12 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
13 * sell copies of the Materials, and to permit persons to whom the Materials are
14 * furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice(s) and this permission notice shall be included in
17 * all copies or substantial portions of the Materials.
18 *
19 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22 *
23 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
24 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
25 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
26 * USE OR OTHER DEALINGS IN THE MATERIALS.
27 *
28 */
29
30 #ifndef VKICD_H
31 #define VKICD_H
32
33 #include "vulkan.h"
34
35 /*
36 * The ICD must reserve space for a pointer for the loader's dispatch
37 * table, at the start of <each object>.
38 * The ICD must initialize this variable using the SET_LOADER_MAGIC_VALUE macro.
39 */
40
41 #define ICD_LOADER_MAGIC 0x01CDC0DE
42
43 typedef union _VK_LOADER_DATA {
44 uintptr_t loaderMagic;
45 void *loaderData;
46 } VK_LOADER_DATA;
47
set_loader_magic_value(void * pNewObject)48 static inline void set_loader_magic_value(void *pNewObject) {
49 VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *)pNewObject;
50 loader_info->loaderMagic = ICD_LOADER_MAGIC;
51 }
52
valid_loader_magic_value(void * pNewObject)53 static inline bool valid_loader_magic_value(void *pNewObject) {
54 const VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *)pNewObject;
55 return (loader_info->loaderMagic & 0xffffffff) == ICD_LOADER_MAGIC;
56 }
57
58 /*
59 * Windows and Linux ICDs will treat VkSurfaceKHR as a pointer to a struct that
60 * contains the platform-specific connection and surface information.
61 */
62 typedef enum _VkIcdWsiPlatform {
63 VK_ICD_WSI_PLATFORM_MIR,
64 VK_ICD_WSI_PLATFORM_WAYLAND,
65 VK_ICD_WSI_PLATFORM_WIN32,
66 VK_ICD_WSI_PLATFORM_XCB,
67 VK_ICD_WSI_PLATFORM_XLIB,
68 VK_ICD_WSI_PLATFORM_DISPLAY
69 } VkIcdWsiPlatform;
70
71 typedef struct _VkIcdSurfaceBase {
72 VkIcdWsiPlatform platform;
73 } VkIcdSurfaceBase;
74
75 #ifdef VK_USE_PLATFORM_MIR_KHR
76 typedef struct _VkIcdSurfaceMir {
77 VkIcdSurfaceBase base;
78 MirConnection *connection;
79 MirSurface *mirSurface;
80 } VkIcdSurfaceMir;
81 #endif // VK_USE_PLATFORM_MIR_KHR
82
83 #ifdef VK_USE_PLATFORM_WAYLAND_KHR
84 typedef struct _VkIcdSurfaceWayland {
85 VkIcdSurfaceBase base;
86 struct wl_display *display;
87 struct wl_surface *surface;
88 } VkIcdSurfaceWayland;
89 #endif // VK_USE_PLATFORM_WAYLAND_KHR
90
91 #ifdef VK_USE_PLATFORM_WIN32_KHR
92 typedef struct _VkIcdSurfaceWin32 {
93 VkIcdSurfaceBase base;
94 HINSTANCE hinstance;
95 HWND hwnd;
96 } VkIcdSurfaceWin32;
97 #endif // VK_USE_PLATFORM_WIN32_KHR
98
99 #ifdef VK_USE_PLATFORM_XCB_KHR
100 typedef struct _VkIcdSurfaceXcb {
101 VkIcdSurfaceBase base;
102 xcb_connection_t *connection;
103 xcb_window_t window;
104 } VkIcdSurfaceXcb;
105 #endif // VK_USE_PLATFORM_XCB_KHR
106
107 #ifdef VK_USE_PLATFORM_XLIB_KHR
108 typedef struct _VkIcdSurfaceXlib {
109 VkIcdSurfaceBase base;
110 Display *dpy;
111 Window window;
112 } VkIcdSurfaceXlib;
113 #endif // VK_USE_PLATFORM_XLIB_KHR
114
115 typedef struct _VkIcdSurfaceDisplay {
116 VkIcdSurfaceBase base;
117 VkDisplayModeKHR displayMode;
118 uint32_t planeIndex;
119 uint32_t planeStackIndex;
120 VkSurfaceTransformFlagBitsKHR transform;
121 float globalAlpha;
122 VkDisplayPlaneAlphaFlagBitsKHR alphaMode;
123 VkExtent2D imageExtent;
124 } VkIcdSurfaceDisplay;
125 #endif // VKICD_H
126