summaryrefslogtreecommitdiff
path: root/include/vulkan/vk_icd.h
blob: d664f2c06a7bda83907adfa50b46d3b1b0579702 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#ifndef VKICD_H
#define VKICD_H

#include "vk_platform.h"

/*
 * 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 _VK_LOADER_DATA {
  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 _VkIcdWsiPlatform {
    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,
} VkIcdWsiPlatform;

typedef struct _VkIcdSurfaceBase {
    VkIcdWsiPlatform   platform;
} VkIcdSurfaceBase;

#ifdef VK_USE_PLATFORM_MIR_KHR
typedef struct _VkIcdSurfaceMir {
    VkIcdSurfaceBase   base;
    MirConnection*     connection;
    MirSurface*        mirSurface;
} VkIcdSurfaceMir;
#endif // VK_USE_PLATFORM_MIR_KHR

#ifdef VK_USE_PLATFORM_WAYLAND_KHR
typedef struct _VkIcdSurfaceWayland {
    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 _VkIcdSurfaceWin32 {
    VkIcdSurfaceBase   base;
    HINSTANCE          hinstance;
    HWND               hwnd;
} VkIcdSurfaceWin32;
#endif // VK_USE_PLATFORM_WIN32_KHR

#ifdef VK_USE_PLATFORM_XCB_KHR
typedef struct _VkIcdSurfaceXcb {
    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 _VkIcdSurfaceXlib {
    VkIcdSurfaceBase   base;
    Display*           dpy;
    Window             window;
} VkIcdSurfaceXlib;
#endif // VK_USE_PLATFORM_XLIB_KHR

#endif // VKICD_H