vulkan/wsi: Add wrappers for all of the surface queries
[mesa.git] / src / intel / vulkan / anv_wsi.c
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
24 #include "anv_private.h"
25 #include "wsi_common.h"
26 #include "vk_format_info.h"
27 #include "vk_util.h"
28
29 #ifdef VK_USE_PLATFORM_WAYLAND_KHR
30 #define WSI_CB(x) .x = anv_##x
31 static const struct wsi_callbacks wsi_cbs = {
32 WSI_CB(GetPhysicalDeviceFormatProperties),
33 };
34 #endif
35
36 static PFN_vkVoidFunction
37 anv_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName)
38 {
39 ANV_FROM_HANDLE(anv_physical_device, physical_device, physicalDevice);
40 return anv_lookup_entrypoint(&physical_device->info, pName);
41 }
42
43 static uint32_t
44 anv_wsi_queue_get_family_index(VkQueue queue)
45 {
46 return 0;
47 }
48
49 VkResult
50 anv_init_wsi(struct anv_physical_device *physical_device)
51 {
52 VkResult result;
53
54 wsi_device_init(&physical_device->wsi_device,
55 anv_physical_device_to_handle(physical_device),
56 anv_wsi_proc_addr);
57
58 physical_device->wsi_device.queue_get_family_index =
59 anv_wsi_queue_get_family_index;
60
61 #ifdef VK_USE_PLATFORM_XCB_KHR
62 result = wsi_x11_init_wsi(&physical_device->wsi_device, &physical_device->instance->alloc);
63 if (result != VK_SUCCESS)
64 return result;
65 #endif
66
67 #ifdef VK_USE_PLATFORM_WAYLAND_KHR
68 result = wsi_wl_init_wsi(&physical_device->wsi_device, &physical_device->instance->alloc,
69 anv_physical_device_to_handle(physical_device),
70 &wsi_cbs);
71 if (result != VK_SUCCESS) {
72 #ifdef VK_USE_PLATFORM_XCB_KHR
73 wsi_x11_finish_wsi(&physical_device->wsi_device, &physical_device->instance->alloc);
74 #endif
75 return result;
76 }
77 #endif
78
79 return VK_SUCCESS;
80 }
81
82 void
83 anv_finish_wsi(struct anv_physical_device *physical_device)
84 {
85 #ifdef VK_USE_PLATFORM_WAYLAND_KHR
86 wsi_wl_finish_wsi(&physical_device->wsi_device, &physical_device->instance->alloc);
87 #endif
88 #ifdef VK_USE_PLATFORM_XCB_KHR
89 wsi_x11_finish_wsi(&physical_device->wsi_device, &physical_device->instance->alloc);
90 #endif
91 }
92
93 void anv_DestroySurfaceKHR(
94 VkInstance _instance,
95 VkSurfaceKHR _surface,
96 const VkAllocationCallbacks* pAllocator)
97 {
98 ANV_FROM_HANDLE(anv_instance, instance, _instance);
99 ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface);
100
101 if (!surface)
102 return;
103
104 vk_free2(&instance->alloc, pAllocator, surface);
105 }
106
107 VkResult anv_GetPhysicalDeviceSurfaceSupportKHR(
108 VkPhysicalDevice physicalDevice,
109 uint32_t queueFamilyIndex,
110 VkSurfaceKHR surface,
111 VkBool32* pSupported)
112 {
113 ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice);
114
115 return wsi_common_get_surface_support(&device->wsi_device,
116 device->local_fd,
117 queueFamilyIndex,
118 surface,
119 &device->instance->alloc,
120 pSupported);
121 }
122
123 VkResult anv_GetPhysicalDeviceSurfaceCapabilitiesKHR(
124 VkPhysicalDevice physicalDevice,
125 VkSurfaceKHR surface,
126 VkSurfaceCapabilitiesKHR* pSurfaceCapabilities)
127 {
128 ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice);
129
130 return wsi_common_get_surface_capabilities(&device->wsi_device,
131 surface,
132 pSurfaceCapabilities);
133 }
134
135 VkResult anv_GetPhysicalDeviceSurfaceCapabilities2KHR(
136 VkPhysicalDevice physicalDevice,
137 const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
138 VkSurfaceCapabilities2KHR* pSurfaceCapabilities)
139 {
140 ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice);
141
142 return wsi_common_get_surface_capabilities2(&device->wsi_device,
143 pSurfaceInfo,
144 pSurfaceCapabilities);
145 }
146
147 VkResult anv_GetPhysicalDeviceSurfaceFormatsKHR(
148 VkPhysicalDevice physicalDevice,
149 VkSurfaceKHR surface,
150 uint32_t* pSurfaceFormatCount,
151 VkSurfaceFormatKHR* pSurfaceFormats)
152 {
153 ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice);
154
155 return wsi_common_get_surface_formats(&device->wsi_device, surface,
156 pSurfaceFormatCount, pSurfaceFormats);
157 }
158
159 VkResult anv_GetPhysicalDeviceSurfaceFormats2KHR(
160 VkPhysicalDevice physicalDevice,
161 const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
162 uint32_t* pSurfaceFormatCount,
163 VkSurfaceFormat2KHR* pSurfaceFormats)
164 {
165 ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice);
166
167 return wsi_common_get_surface_formats2(&device->wsi_device, pSurfaceInfo,
168 pSurfaceFormatCount, pSurfaceFormats);
169 }
170
171 VkResult anv_GetPhysicalDeviceSurfacePresentModesKHR(
172 VkPhysicalDevice physicalDevice,
173 VkSurfaceKHR surface,
174 uint32_t* pPresentModeCount,
175 VkPresentModeKHR* pPresentModes)
176 {
177 ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice);
178
179 return wsi_common_get_surface_present_modes(&device->wsi_device, surface,
180 pPresentModeCount,
181 pPresentModes);
182 }
183
184 VkResult anv_CreateSwapchainKHR(
185 VkDevice _device,
186 const VkSwapchainCreateInfoKHR* pCreateInfo,
187 const VkAllocationCallbacks* pAllocator,
188 VkSwapchainKHR* pSwapchain)
189 {
190 ANV_FROM_HANDLE(anv_device, device, _device);
191 struct wsi_device *wsi_device = &device->instance->physicalDevice.wsi_device;
192 const VkAllocationCallbacks *alloc;
193
194 if (pAllocator)
195 alloc = pAllocator;
196 else
197 alloc = &device->alloc;
198
199 return wsi_common_create_swapchain(wsi_device, _device, device->fd,
200 pCreateInfo, alloc, pSwapchain);
201 }
202
203 void anv_DestroySwapchainKHR(
204 VkDevice _device,
205 VkSwapchainKHR swapchain,
206 const VkAllocationCallbacks* pAllocator)
207 {
208 ANV_FROM_HANDLE(anv_device, device, _device);
209 const VkAllocationCallbacks *alloc;
210
211 if (pAllocator)
212 alloc = pAllocator;
213 else
214 alloc = &device->alloc;
215
216 wsi_common_destroy_swapchain(_device, swapchain, alloc);
217 }
218
219 VkResult anv_GetSwapchainImagesKHR(
220 VkDevice device,
221 VkSwapchainKHR swapchain,
222 uint32_t* pSwapchainImageCount,
223 VkImage* pSwapchainImages)
224 {
225 return wsi_common_get_images(swapchain,
226 pSwapchainImageCount,
227 pSwapchainImages);
228 }
229
230 VkResult anv_AcquireNextImageKHR(
231 VkDevice _device,
232 VkSwapchainKHR swapchain,
233 uint64_t timeout,
234 VkSemaphore semaphore,
235 VkFence fence,
236 uint32_t* pImageIndex)
237 {
238 ANV_FROM_HANDLE(anv_device, device, _device);
239 struct anv_physical_device *pdevice = &device->instance->physicalDevice;
240
241 VkResult result = wsi_common_acquire_next_image(&pdevice->wsi_device,
242 _device,
243 swapchain,
244 timeout,
245 semaphore,
246 pImageIndex);
247
248 /* Thanks to implicit sync, the image is ready immediately. However, we
249 * should wait for the current GPU state to finish.
250 */
251 if (fence != VK_NULL_HANDLE)
252 anv_QueueSubmit(anv_queue_to_handle(&device->queue), 0, NULL, fence);
253
254 return result;
255 }
256
257 VkResult anv_QueuePresentKHR(
258 VkQueue _queue,
259 const VkPresentInfoKHR* pPresentInfo)
260 {
261 ANV_FROM_HANDLE(anv_queue, queue, _queue);
262 struct anv_physical_device *pdevice =
263 &queue->device->instance->physicalDevice;
264
265 return wsi_common_queue_present(&pdevice->wsi_device,
266 anv_device_to_handle(queue->device),
267 _queue, 0,
268 pPresentInfo);
269 }