anv_wsi.c revision 01e04c3f
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 29static PFN_vkVoidFunction 30anv_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName) 31{ 32 ANV_FROM_HANDLE(anv_physical_device, physical_device, physicalDevice); 33 return anv_lookup_entrypoint(&physical_device->info, pName); 34} 35 36static uint64_t 37anv_wsi_image_get_modifier(VkImage _image) 38{ 39 ANV_FROM_HANDLE(anv_image, image, _image); 40 return image->drm_format_mod; 41} 42 43VkResult 44anv_init_wsi(struct anv_physical_device *physical_device) 45{ 46 VkResult result; 47 48 result = wsi_device_init(&physical_device->wsi_device, 49 anv_physical_device_to_handle(physical_device), 50 anv_wsi_proc_addr, 51 &physical_device->instance->alloc, 52 physical_device->master_fd); 53 if (result != VK_SUCCESS) 54 return result; 55 56 physical_device->wsi_device.supports_modifiers = true; 57 physical_device->wsi_device.image_get_modifier = anv_wsi_image_get_modifier; 58 59 return VK_SUCCESS; 60} 61 62void 63anv_finish_wsi(struct anv_physical_device *physical_device) 64{ 65 wsi_device_finish(&physical_device->wsi_device, 66 &physical_device->instance->alloc); 67} 68 69void anv_DestroySurfaceKHR( 70 VkInstance _instance, 71 VkSurfaceKHR _surface, 72 const VkAllocationCallbacks* pAllocator) 73{ 74 ANV_FROM_HANDLE(anv_instance, instance, _instance); 75 ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface); 76 77 if (!surface) 78 return; 79 80 vk_free2(&instance->alloc, pAllocator, surface); 81} 82 83VkResult anv_GetPhysicalDeviceSurfaceSupportKHR( 84 VkPhysicalDevice physicalDevice, 85 uint32_t queueFamilyIndex, 86 VkSurfaceKHR surface, 87 VkBool32* pSupported) 88{ 89 ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice); 90 91 return wsi_common_get_surface_support(&device->wsi_device, 92 queueFamilyIndex, 93 surface, 94 pSupported); 95} 96 97VkResult anv_GetPhysicalDeviceSurfaceCapabilitiesKHR( 98 VkPhysicalDevice physicalDevice, 99 VkSurfaceKHR surface, 100 VkSurfaceCapabilitiesKHR* pSurfaceCapabilities) 101{ 102 ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice); 103 104 return wsi_common_get_surface_capabilities(&device->wsi_device, 105 surface, 106 pSurfaceCapabilities); 107} 108 109VkResult anv_GetPhysicalDeviceSurfaceCapabilities2KHR( 110 VkPhysicalDevice physicalDevice, 111 const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, 112 VkSurfaceCapabilities2KHR* pSurfaceCapabilities) 113{ 114 ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice); 115 116 return wsi_common_get_surface_capabilities2(&device->wsi_device, 117 pSurfaceInfo, 118 pSurfaceCapabilities); 119} 120 121VkResult anv_GetPhysicalDeviceSurfaceCapabilities2EXT( 122 VkPhysicalDevice physicalDevice, 123 VkSurfaceKHR surface, 124 VkSurfaceCapabilities2EXT* pSurfaceCapabilities) 125{ 126 ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice); 127 128 return wsi_common_get_surface_capabilities2ext(&device->wsi_device, 129 surface, 130 pSurfaceCapabilities); 131} 132 133VkResult anv_GetPhysicalDeviceSurfaceFormatsKHR( 134 VkPhysicalDevice physicalDevice, 135 VkSurfaceKHR surface, 136 uint32_t* pSurfaceFormatCount, 137 VkSurfaceFormatKHR* pSurfaceFormats) 138{ 139 ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice); 140 141 return wsi_common_get_surface_formats(&device->wsi_device, surface, 142 pSurfaceFormatCount, pSurfaceFormats); 143} 144 145VkResult anv_GetPhysicalDeviceSurfaceFormats2KHR( 146 VkPhysicalDevice physicalDevice, 147 const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, 148 uint32_t* pSurfaceFormatCount, 149 VkSurfaceFormat2KHR* pSurfaceFormats) 150{ 151 ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice); 152 153 return wsi_common_get_surface_formats2(&device->wsi_device, pSurfaceInfo, 154 pSurfaceFormatCount, pSurfaceFormats); 155} 156 157VkResult anv_GetPhysicalDeviceSurfacePresentModesKHR( 158 VkPhysicalDevice physicalDevice, 159 VkSurfaceKHR surface, 160 uint32_t* pPresentModeCount, 161 VkPresentModeKHR* pPresentModes) 162{ 163 ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice); 164 165 return wsi_common_get_surface_present_modes(&device->wsi_device, surface, 166 pPresentModeCount, 167 pPresentModes); 168} 169 170VkResult anv_CreateSwapchainKHR( 171 VkDevice _device, 172 const VkSwapchainCreateInfoKHR* pCreateInfo, 173 const VkAllocationCallbacks* pAllocator, 174 VkSwapchainKHR* pSwapchain) 175{ 176 ANV_FROM_HANDLE(anv_device, device, _device); 177 struct wsi_device *wsi_device = &device->instance->physicalDevice.wsi_device; 178 const VkAllocationCallbacks *alloc; 179 180 if (pAllocator) 181 alloc = pAllocator; 182 else 183 alloc = &device->alloc; 184 185 return wsi_common_create_swapchain(wsi_device, _device, 186 pCreateInfo, alloc, pSwapchain); 187} 188 189void anv_DestroySwapchainKHR( 190 VkDevice _device, 191 VkSwapchainKHR swapchain, 192 const VkAllocationCallbacks* pAllocator) 193{ 194 ANV_FROM_HANDLE(anv_device, device, _device); 195 const VkAllocationCallbacks *alloc; 196 197 if (pAllocator) 198 alloc = pAllocator; 199 else 200 alloc = &device->alloc; 201 202 wsi_common_destroy_swapchain(_device, swapchain, alloc); 203} 204 205VkResult anv_GetSwapchainImagesKHR( 206 VkDevice device, 207 VkSwapchainKHR swapchain, 208 uint32_t* pSwapchainImageCount, 209 VkImage* pSwapchainImages) 210{ 211 return wsi_common_get_images(swapchain, 212 pSwapchainImageCount, 213 pSwapchainImages); 214} 215 216VkResult anv_AcquireNextImageKHR( 217 VkDevice device, 218 VkSwapchainKHR swapchain, 219 uint64_t timeout, 220 VkSemaphore semaphore, 221 VkFence fence, 222 uint32_t* pImageIndex) 223{ 224 VkAcquireNextImageInfoKHR acquire_info = { 225 .sType = VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR, 226 .swapchain = swapchain, 227 .timeout = timeout, 228 .semaphore = semaphore, 229 .fence = fence, 230 .deviceMask = 0, 231 }; 232 233 return anv_AcquireNextImage2KHR(device, &acquire_info, pImageIndex); 234} 235 236VkResult anv_AcquireNextImage2KHR( 237 VkDevice _device, 238 const VkAcquireNextImageInfoKHR* pAcquireInfo, 239 uint32_t* pImageIndex) 240{ 241 ANV_FROM_HANDLE(anv_device, device, _device); 242 struct anv_physical_device *pdevice = &device->instance->physicalDevice; 243 244 VkResult result = wsi_common_acquire_next_image2(&pdevice->wsi_device, 245 _device, 246 pAcquireInfo, 247 pImageIndex); 248 249 /* Thanks to implicit sync, the image is ready immediately. However, we 250 * should wait for the current GPU state to finish. 251 */ 252 if (pAcquireInfo->fence != VK_NULL_HANDLE) { 253 anv_QueueSubmit(anv_queue_to_handle(&device->queue), 0, NULL, 254 pAcquireInfo->fence); 255 } 256 257 return result; 258} 259 260VkResult anv_QueuePresentKHR( 261 VkQueue _queue, 262 const VkPresentInfoKHR* pPresentInfo) 263{ 264 ANV_FROM_HANDLE(anv_queue, queue, _queue); 265 struct anv_physical_device *pdevice = 266 &queue->device->instance->physicalDevice; 267 268 return wsi_common_queue_present(&pdevice->wsi_device, 269 anv_device_to_handle(queue->device), 270 _queue, 0, 271 pPresentInfo); 272} 273 274VkResult anv_GetDeviceGroupPresentCapabilitiesKHR( 275 VkDevice device, 276 VkDeviceGroupPresentCapabilitiesKHR* pCapabilities) 277{ 278 memset(pCapabilities->presentMask, 0, 279 sizeof(pCapabilities->presentMask)); 280 pCapabilities->presentMask[0] = 0x1; 281 pCapabilities->modes = VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR; 282 283 return VK_SUCCESS; 284} 285 286VkResult anv_GetDeviceGroupSurfacePresentModesKHR( 287 VkDevice device, 288 VkSurfaceKHR surface, 289 VkDeviceGroupPresentModeFlagsKHR* pModes) 290{ 291 *pModes = VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR; 292 293 return VK_SUCCESS; 294} 295 296VkResult anv_GetPhysicalDevicePresentRectanglesKHR( 297 VkPhysicalDevice physicalDevice, 298 VkSurfaceKHR surface, 299 uint32_t* pRectCount, 300 VkRect2D* pRects) 301{ 302 ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice); 303 304 return wsi_common_get_present_rectangles(&device->wsi_device, 305 surface, 306 pRectCount, pRects); 307} 308