ReactOS 0.4.17-dev-966-gf06eace
vulkan_driver.h
Go to the documentation of this file.
1/*
2 * Copyright 2017-2018 Roderick Colenbrander
3 * Copyright 2022 Jacek Caban for CodeWeavers
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19
20#ifndef __WINE_VULKAN_DRIVER_H
21#define __WINE_VULKAN_DRIVER_H
22
23#include <stdarg.h>
24#include <stddef.h>
25
26#include <windef.h>
27#include <winbase.h>
28
29/* Base 'class' for our Vulkan dispatchable objects such as VkDevice and VkInstance.
30 * This structure MUST be the first element of a dispatchable object as the ICD
31 * loader depends on it. For now only contains loader_magic, but over time more common
32 * functionality is expected.
33 */
35{
36 /* Special section in each dispatchable object for use by the ICD loader for
37 * storing dispatch tables. The start contains a magical value '0x01CDC0DE'.
38 */
41};
42
43#ifdef WINE_UNIX_LIB
44
45#include "wine/vulkan.h"
46#include "wine/rbtree.h"
47
48/* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */
49#define WINE_VULKAN_DRIVER_VERSION 35
50
51struct vulkan_object
52{
53 UINT64 host_handle;
54 UINT64 client_handle;
55 struct rb_entry entry;
56};
57
58#define VULKAN_OBJECT_HEADER( type, name ) \
59 union { \
60 struct vulkan_object obj; \
61 struct { \
62 union { type name; UINT64 handle; } host; \
63 union { type name; UINT64 handle; } client; \
64 }; \
65 }
66
67static inline void vulkan_object_init( struct vulkan_object *obj, UINT64 host_handle )
68{
69 obj->host_handle = host_handle;
70 obj->client_handle = (UINT_PTR)obj;
71}
72
73struct vulkan_instance
74{
75 VULKAN_OBJECT_HEADER( VkInstance, instance );
76#define USE_VK_FUNC(x) PFN_ ## x p_ ## x;
78#undef USE_VK_FUNC
79 void (*p_insert_object)( struct vulkan_instance *instance, struct vulkan_object *obj );
80 void (*p_remove_object)( struct vulkan_instance *instance, struct vulkan_object *obj );
81};
82
83static inline struct vulkan_instance *vulkan_instance_from_handle( VkInstance handle )
84{
86 return (struct vulkan_instance *)(UINT_PTR)client->unix_handle;
87}
88
89struct vulkan_physical_device
90{
91 VULKAN_OBJECT_HEADER( VkPhysicalDevice, physical_device );
92 struct vulkan_instance *instance;
93};
94
95static inline struct vulkan_physical_device *vulkan_physical_device_from_handle( VkPhysicalDevice handle )
96{
98 return (struct vulkan_physical_device *)(UINT_PTR)client->unix_handle;
99}
100
101struct vulkan_device
102{
103 VULKAN_OBJECT_HEADER( VkDevice, device );
104 struct vulkan_physical_device *physical_device;
105#define USE_VK_FUNC(x) PFN_ ## x p_ ## x;
107#undef USE_VK_FUNC
108};
109
110static inline struct vulkan_device *vulkan_device_from_handle( VkDevice handle )
111{
113 return (struct vulkan_device *)(UINT_PTR)client->unix_handle;
114}
115
116struct vulkan_queue
117{
118 VULKAN_OBJECT_HEADER( VkQueue, queue );
119 struct vulkan_device *device;
120};
121
122static inline struct vulkan_queue *vulkan_queue_from_handle( VkQueue handle )
123{
125 return (struct vulkan_queue *)(UINT_PTR)client->unix_handle;
126}
127
128struct vulkan_surface
129{
130 VULKAN_OBJECT_HEADER( VkSurfaceKHR, surface );
131 struct vulkan_instance *instance;
132};
133
134static inline struct vulkan_surface *vulkan_surface_from_handle( VkSurfaceKHR handle )
135{
136 return (struct vulkan_surface *)(UINT_PTR)handle;
137}
138
139struct vulkan_swapchain
140{
141 VULKAN_OBJECT_HEADER( VkSwapchainKHR, swapchain );
142};
143
144static inline struct vulkan_swapchain *vulkan_swapchain_from_handle( VkSwapchainKHR handle )
145{
146 return (struct vulkan_swapchain *)(UINT_PTR)handle;
147}
148
149struct vulkan_funcs
150{
151 /* Vulkan global functions. These are the only calls at this point a graphics driver
152 * needs to provide. Other function calls will be provided indirectly by dispatch
153 * tables part of dispatchable Vulkan objects such as VkInstance or vkDevice.
154 */
155 PFN_vkAcquireNextImage2KHR p_vkAcquireNextImage2KHR;
156 PFN_vkAcquireNextImageKHR p_vkAcquireNextImageKHR;
157 PFN_vkCreateSwapchainKHR p_vkCreateSwapchainKHR;
158 PFN_vkCreateWin32SurfaceKHR p_vkCreateWin32SurfaceKHR;
159 PFN_vkDestroySurfaceKHR p_vkDestroySurfaceKHR;
160 PFN_vkDestroySwapchainKHR p_vkDestroySwapchainKHR;
161 PFN_vkGetDeviceProcAddr p_vkGetDeviceProcAddr;
162 PFN_vkGetInstanceProcAddr p_vkGetInstanceProcAddr;
163 PFN_vkGetPhysicalDevicePresentRectanglesKHR p_vkGetPhysicalDevicePresentRectanglesKHR;
164 PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR p_vkGetPhysicalDeviceSurfaceCapabilities2KHR;
165 PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
166 PFN_vkGetPhysicalDeviceSurfaceFormats2KHR p_vkGetPhysicalDeviceSurfaceFormats2KHR;
167 PFN_vkGetPhysicalDeviceSurfaceFormatsKHR p_vkGetPhysicalDeviceSurfaceFormatsKHR;
168 PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR p_vkGetPhysicalDeviceWin32PresentationSupportKHR;
169 PFN_vkQueuePresentKHR p_vkQueuePresentKHR;
170
171 /* winevulkan specific functions */
172 const char *(*p_get_host_surface_extension)(void);
173};
174
175/* interface between win32u and the user drivers */
176struct vulkan_driver_funcs
177{
178 VkResult (*p_vulkan_surface_create)(HWND, VkInstance, VkSurfaceKHR *, void **);
179 void (*p_vulkan_surface_destroy)(HWND, void *);
180 void (*p_vulkan_surface_detach)(HWND, void *);
181 void (*p_vulkan_surface_update)(HWND, void *);
182 void (*p_vulkan_surface_presented)(HWND, void *, VkResult);
183
184 VkBool32 (*p_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice, uint32_t);
185 const char *(*p_get_host_surface_extension)(void);
186};
187
188#endif /* WINE_UNIX_LIB */
189
190#endif /* __WINE_VULKAN_DRIVER_H */
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
static HINSTANCE instance
Definition: main.c:35
HANDLE HWND
Definition: compat.h:19
uint32_t entry
Definition: isohybrid.c:63
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
#define uint32_t
Definition: nsiface.idl:61
static FILE * client
Definition: client.c:37
Definition: devices.h:37
Definition: queue.c:179
Definition: rbtree.h:30
VkResult(VKAPI_PTR * PFN_vkAcquireNextImage2KHR)(VkDevice, const VkAcquireNextImageInfoKHR *, uint32_t *)
Definition: vulkan.h:17655
VkResult(VKAPI_PTR * PFN_vkCreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR *, const VkAllocationCallbacks *, VkSwapchainKHR *)
Definition: vulkan.h:18001
VkResult(VKAPI_PTR * PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, uint32_t *, VkSurfaceFormat2KHR *)
Definition: vulkan.h:18192
PFN_vkVoidFunction(VKAPI_PTR * PFN_vkGetInstanceProcAddr)(VkInstance, const char *)
Definition: vulkan.h:18143
PFN_vkVoidFunction(VKAPI_PTR * PFN_vkGetDeviceProcAddr)(VkDevice, const char *)
Definition: vulkan.h:18117
VkBool32(VKAPI_PTR * PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice, uint32_t)
Definition: vulkan.h:18201
VkResult(VKAPI_PTR * PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, VkSurfaceCapabilities2KHR *)
Definition: vulkan.h:18190
VkResult(VKAPI_PTR * PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkSurfaceFormatKHR *)
Definition: vulkan.h:18193
VkResult(VKAPI_PTR * PFN_vkGetPhysicalDevicePresentRectanglesKHR)(VkPhysicalDevice, VkSurfaceKHR, uint32_t *, VkRect2D *)
Definition: vulkan.h:18178
#define ALL_VK_DEVICE_FUNCS
Definition: vulkan.h:18939
void(VKAPI_PTR * PFN_vkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *)
Definition: vulkan.h:18053
void(VKAPI_PTR * PFN_vkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *)
Definition: vulkan.h:18052
VkResult(VKAPI_PTR * PFN_vkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *)
Definition: vulkan.h:18246
VkResult(VKAPI_PTR * PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)(VkPhysicalDevice, VkSurfaceKHR, VkSurfaceCapabilitiesKHR *)
Definition: vulkan.h:18191
VkResult
Definition: vulkan.h:4639
VkResult(VKAPI_PTR * PFN_vkAcquireNextImageKHR)(VkDevice, VkSwapchainKHR, uint64_t, VkSemaphore, VkFence, uint32_t *)
Definition: vulkan.h:17656
#define ALL_VK_INSTANCE_FUNCS
Definition: vulkan.h:19506
uint32_t VkBool32
Definition: vulkan.h:946
VkResult(VKAPI_PTR * PFN_vkCreateWin32SurfaceKHR)(VkInstance, const VkWin32SurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *)
Definition: vulkan.h:18005