65814435ce496d2d0e5b234896e0225a6e8c141b
[mesa.git] / src / vulkan / wsi / wsi_common.h
1 /*
2 * Copyright © 2015 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23 #ifndef WSI_COMMON_H
24 #define WSI_COMMON_H
25
26 #include <stdint.h>
27 #include <stdbool.h>
28
29 #include "vk_alloc.h"
30 #include <vulkan/vulkan.h>
31 #include <vulkan/vk_icd.h>
32
33 /* This is guaranteed to not collide with anything because it's in the
34 * VK_KHR_swapchain namespace but not actually used by the extension.
35 */
36 #define VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA (VkStructureType)1000001002
37 #define VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO_MESA (VkStructureType)1000001003
38
39 struct wsi_image_create_info {
40 VkStructureType sType;
41 const void *pNext;
42 bool scanout;
43 };
44
45 struct wsi_memory_allocate_info {
46 VkStructureType sType;
47 const void *pNext;
48 bool implicit_sync;
49 };
50
51 struct wsi_interface;
52
53 #define VK_ICD_WSI_PLATFORM_MAX 5
54
55 struct wsi_device {
56 VkPhysicalDeviceMemoryProperties memory_props;
57 uint32_t queue_family_count;
58
59 #define WSI_CB(cb) PFN_vk##cb cb
60 WSI_CB(AllocateMemory);
61 WSI_CB(AllocateCommandBuffers);
62 WSI_CB(BindBufferMemory);
63 WSI_CB(BindImageMemory);
64 WSI_CB(BeginCommandBuffer);
65 WSI_CB(CmdCopyImageToBuffer);
66 WSI_CB(CreateBuffer);
67 WSI_CB(CreateCommandPool);
68 WSI_CB(CreateFence);
69 WSI_CB(CreateImage);
70 WSI_CB(DestroyBuffer);
71 WSI_CB(DestroyCommandPool);
72 WSI_CB(DestroyFence);
73 WSI_CB(DestroyImage);
74 WSI_CB(EndCommandBuffer);
75 WSI_CB(FreeMemory);
76 WSI_CB(FreeCommandBuffers);
77 WSI_CB(GetBufferMemoryRequirements);
78 WSI_CB(GetImageMemoryRequirements);
79 WSI_CB(GetImageSubresourceLayout);
80 WSI_CB(GetMemoryFdKHR);
81 WSI_CB(GetPhysicalDeviceFormatProperties);
82 WSI_CB(ResetFences);
83 WSI_CB(QueueSubmit);
84 WSI_CB(WaitForFences);
85 #undef WSI_CB
86
87 struct wsi_interface * wsi[VK_ICD_WSI_PLATFORM_MAX];
88 };
89
90 typedef PFN_vkVoidFunction (VKAPI_PTR *WSI_FN_GetPhysicalDeviceProcAddr)(VkPhysicalDevice physicalDevice, const char* pName);
91
92 void
93 wsi_device_init(struct wsi_device *wsi,
94 VkPhysicalDevice pdevice,
95 WSI_FN_GetPhysicalDeviceProcAddr proc_addr);
96
97 #define ICD_DEFINE_NONDISP_HANDLE_CASTS(__VkIcdType, __VkType) \
98 \
99 static inline __VkIcdType * \
100 __VkIcdType ## _from_handle(__VkType _handle) \
101 { \
102 return (__VkIcdType *)(uintptr_t) _handle; \
103 } \
104 \
105 static inline __VkType \
106 __VkIcdType ## _to_handle(__VkIcdType *_obj) \
107 { \
108 return (__VkType)(uintptr_t) _obj; \
109 }
110
111 #define ICD_FROM_HANDLE(__VkIcdType, __name, __handle) \
112 __VkIcdType *__name = __VkIcdType ## _from_handle(__handle)
113
114 ICD_DEFINE_NONDISP_HANDLE_CASTS(VkIcdSurfaceBase, VkSurfaceKHR)
115
116 VkResult wsi_x11_init_wsi(struct wsi_device *wsi_device,
117 const VkAllocationCallbacks *alloc);
118 void wsi_x11_finish_wsi(struct wsi_device *wsi_device,
119 const VkAllocationCallbacks *alloc);
120 VkResult wsi_wl_init_wsi(struct wsi_device *wsi_device,
121 const VkAllocationCallbacks *alloc,
122 VkPhysicalDevice physical_device);
123 void wsi_wl_finish_wsi(struct wsi_device *wsi_device,
124 const VkAllocationCallbacks *alloc);
125
126 VkResult
127 wsi_common_get_surface_support(struct wsi_device *wsi_device,
128 int local_fd,
129 uint32_t queueFamilyIndex,
130 VkSurfaceKHR surface,
131 const VkAllocationCallbacks *alloc,
132 VkBool32* pSupported);
133
134 VkResult
135 wsi_common_get_surface_capabilities(struct wsi_device *wsi_device,
136 VkSurfaceKHR surface,
137 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities);
138
139 VkResult
140 wsi_common_get_surface_capabilities2(struct wsi_device *wsi_device,
141 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
142 VkSurfaceCapabilities2KHR *pSurfaceCapabilities);
143
144 VkResult
145 wsi_common_get_surface_formats(struct wsi_device *wsi_device,
146 VkSurfaceKHR surface,
147 uint32_t *pSurfaceFormatCount,
148 VkSurfaceFormatKHR *pSurfaceFormats);
149
150 VkResult
151 wsi_common_get_surface_formats2(struct wsi_device *wsi_device,
152 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo,
153 uint32_t *pSurfaceFormatCount,
154 VkSurfaceFormat2KHR *pSurfaceFormats);
155
156 VkResult
157 wsi_common_get_surface_present_modes(struct wsi_device *wsi_device,
158 VkSurfaceKHR surface,
159 uint32_t *pPresentModeCount,
160 VkPresentModeKHR *pPresentModes);
161
162 VkResult
163 wsi_common_get_images(VkSwapchainKHR _swapchain,
164 uint32_t *pSwapchainImageCount,
165 VkImage *pSwapchainImages);
166
167 VkResult
168 wsi_common_acquire_next_image(const struct wsi_device *wsi,
169 VkDevice device,
170 VkSwapchainKHR swapchain,
171 uint64_t timeout,
172 VkSemaphore semaphore,
173 uint32_t *pImageIndex);
174
175 VkResult
176 wsi_common_create_swapchain(struct wsi_device *wsi,
177 VkDevice device,
178 int fd,
179 const VkSwapchainCreateInfoKHR *pCreateInfo,
180 const VkAllocationCallbacks *pAllocator,
181 VkSwapchainKHR *pSwapchain);
182 void
183 wsi_common_destroy_swapchain(VkDevice device,
184 VkSwapchainKHR swapchain,
185 const VkAllocationCallbacks *pAllocator);
186
187 VkResult
188 wsi_common_queue_present(const struct wsi_device *wsi,
189 VkDevice device_h,
190 VkQueue queue_h,
191 int queue_family_index,
192 const VkPresentInfoKHR *pPresentInfo);
193
194 #endif