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 "vk_dispatch_table.h" 31 #include <vulkan/vulkan.h> 32 #include <vulkan/vk_icd.h> 33 34 #ifndef WSI_ENTRYPOINTS_H 35 extern const struct vk_instance_entrypoint_table wsi_instance_entrypoints; 36 extern const struct vk_physical_device_entrypoint_table wsi_physical_device_entrypoints; 37 extern const struct vk_device_entrypoint_table wsi_device_entrypoints; 38 #endif 39 40 /* This is guaranteed to not collide with anything because it's in the 41 * VK_KHR_swapchain namespace but not actually used by the extension. 42 */ 43 #define VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA (VkStructureType)1000001002 44 #define VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO_MESA (VkStructureType)1000001003 45 #define VK_STRUCTURE_TYPE_WSI_SURFACE_SUPPORTED_COUNTERS_MESA (VkStructureType)1000001005 46 #define VK_STRUCTURE_TYPE_WSI_MEMORY_SIGNAL_SUBMIT_INFO_MESA (VkStructureType)1000001006 47 48 /* This is always chained to VkImageCreateInfo when a wsi image is created. 49 * It indicates that the image can be transitioned to/from 50 * VK_IMAGE_LAYOUT_PRESENT_SRC_KHR. 51 */ 52 struct wsi_image_create_info { 53 VkStructureType sType; 54 const void *pNext; 55 bool scanout; 56 57 /* if true, the image is a prime blit source */ 58 bool prime_blit_src; 59 }; 60 61 struct wsi_memory_allocate_info { 62 VkStructureType sType; 63 const void *pNext; 64 bool implicit_sync; 65 }; 66 67 /* To be chained into VkSurfaceCapabilities2KHR */ 68 struct wsi_surface_supported_counters { 69 VkStructureType sType; 70 const void *pNext; 71 72 VkSurfaceCounterFlagsEXT supported_surface_counters; 73 74 }; 75 76 /* To be chained into VkSubmitInfo */ 77 struct wsi_memory_signal_submit_info { 78 VkStructureType sType; 79 const void *pNext; 80 VkDeviceMemory memory; 81 }; 82 83 struct wsi_fence { 84 VkDevice device; 85 const struct wsi_device *wsi_device; 86 VkDisplayKHR display; 87 const VkAllocationCallbacks *alloc; 88 VkResult (*wait)(struct wsi_fence *fence, uint64_t abs_timeout); 89 void (*destroy)(struct wsi_fence *fence); 90 }; 91 92 struct wsi_interface; 93 94 struct driOptionCache; 95 96 #define VK_ICD_WSI_PLATFORM_MAX (VK_ICD_WSI_PLATFORM_DISPLAY + 1) 97 98 struct wsi_device { 99 /* Allocator for the instance */ 100 VkAllocationCallbacks instance_alloc; 101 102 VkPhysicalDevice pdevice; 103 VkPhysicalDeviceMemoryProperties memory_props; 104 uint32_t queue_family_count; 105 106 VkPhysicalDevicePCIBusInfoPropertiesEXT pci_bus_info; 107 108 bool supports_modifiers; 109 uint32_t maxImageDimension2D; 110 VkPresentModeKHR override_present_mode; 111 bool force_bgra8_unorm_first; 112 113 /* Whether to enable adaptive sync for a swapchain if implemented and 114 * available. Not all window systems might support this. */ 115 bool enable_adaptive_sync; 116 117 struct { 118 /* Override the minimum number of images on the swapchain. 119 * 0 = no override */ 120 uint32_t override_minImageCount; 121 122 /* Forces strict number of image on the swapchain using application 123 * provided VkSwapchainCreateInfoKH::RminImageCount. 124 */ 125 bool strict_imageCount; 126 127 /* Ensures to create at least the number of image specified by the 128 * driver in VkSurfaceCapabilitiesKHR::minImageCount. 129 */ 130 bool ensure_minImageCount; 131 132 /* Wait for fences before submitting buffers to Xwayland. Defaults to 133 * true. 134 */ 135 bool xwaylandWaitReady; 136 } x11; 137 138 bool sw; 139 140 /* Signals the semaphore such that any wait on the semaphore will wait on 141 * any reads or writes on the give memory object. This is used to 142 * implement the semaphore signal operation in vkAcquireNextImage. 143 */ 144 void (*signal_semaphore_for_memory)(VkDevice device, 145 VkSemaphore semaphore, 146 VkDeviceMemory memory); 147 148 /* Signals the fence such that any wait on the fence will wait on any reads 149 * or writes on the give memory object. This is used to implement the 150 * semaphore signal operation in vkAcquireNextImage. 151 */ 152 void (*signal_fence_for_memory)(VkDevice device, 153 VkFence fence, 154 VkDeviceMemory memory); 155 156 /* 157 * This sets the ownership for a WSI memory object: 158 * 159 * The ownership is true if and only if the application is allowed to submit 160 * command buffers that reference the buffer. 161 * 162 * This can be used to prune BO lists without too many adverse affects on 163 * implicit sync. 164 * 165 * Side note: care needs to be taken for internally delayed submissions wrt 166 * timeline semaphores. 167 */ 168 void (*set_memory_ownership)(VkDevice device, 169 VkDeviceMemory memory, 170 VkBool32 ownership); 171 172 /* 173 * If this is set, the WSI device will call it to let the driver backend 174 * decide if it can present images directly on the given device fd. 175 */ 176 bool (*can_present_on_device)(VkPhysicalDevice pdevice, int fd); 177 178 #define WSI_CB(cb) PFN_vk##cb cb 179 WSI_CB(AllocateMemory); 180 WSI_CB(AllocateCommandBuffers); 181 WSI_CB(BindBufferMemory); 182 WSI_CB(BindImageMemory); 183 WSI_CB(BeginCommandBuffer); 184 WSI_CB(CmdCopyImageToBuffer); 185 WSI_CB(CreateBuffer); 186 WSI_CB(CreateCommandPool); 187 WSI_CB(CreateFence); 188 WSI_CB(CreateImage); 189 WSI_CB(DestroyBuffer); 190 WSI_CB(DestroyCommandPool); 191 WSI_CB(DestroyFence); 192 WSI_CB(DestroyImage); 193 WSI_CB(EndCommandBuffer); 194 WSI_CB(FreeMemory); 195 WSI_CB(FreeCommandBuffers); 196 WSI_CB(GetBufferMemoryRequirements); 197 WSI_CB(GetImageDrmFormatModifierPropertiesEXT); 198 WSI_CB(GetImageMemoryRequirements); 199 WSI_CB(GetImageSubresourceLayout); 200 WSI_CB(GetMemoryFdKHR); 201 WSI_CB(GetPhysicalDeviceFormatProperties); 202 WSI_CB(GetPhysicalDeviceFormatProperties2KHR); 203 WSI_CB(GetPhysicalDeviceImageFormatProperties2); 204 WSI_CB(ResetFences); 205 WSI_CB(QueueSubmit); 206 WSI_CB(WaitForFences); 207 WSI_CB(MapMemory); 208 WSI_CB(UnmapMemory); 209 #undef WSI_CB 210 211 struct wsi_interface * wsi[VK_ICD_WSI_PLATFORM_MAX]; 212 }; 213 214 typedef PFN_vkVoidFunction (VKAPI_PTR *WSI_FN_GetPhysicalDeviceProcAddr)(VkPhysicalDevice physicalDevice, const char* pName); 215 216 VkResult 217 wsi_device_init(struct wsi_device *wsi, 218 VkPhysicalDevice pdevice, 219 WSI_FN_GetPhysicalDeviceProcAddr proc_addr, 220 const VkAllocationCallbacks *alloc, 221 int display_fd, 222 const struct driOptionCache *dri_options, 223 bool sw_device); 224 225 void 226 wsi_device_finish(struct wsi_device *wsi, 227 const VkAllocationCallbacks *alloc); 228 229 #define ICD_DEFINE_NONDISP_HANDLE_CASTS(__VkIcdType, __VkType) \ 230 \ 231 static inline __VkIcdType * \ 232 __VkIcdType ## _from_handle(__VkType _handle) \ 233 { \ 234 return (__VkIcdType *)(uintptr_t) _handle; \ 235 } \ 236 \ 237 static inline __VkType \ 238 __VkIcdType ## _to_handle(__VkIcdType *_obj) \ 239 { \ 240 return (__VkType)(uintptr_t) _obj; \ 241 } 242 243 #define ICD_FROM_HANDLE(__VkIcdType, __name, __handle) \ 244 __VkIcdType *__name = __VkIcdType ## _from_handle(__handle) 245 246 ICD_DEFINE_NONDISP_HANDLE_CASTS(VkIcdSurfaceBase, VkSurfaceKHR) 247 248 VkResult 249 wsi_common_get_images(VkSwapchainKHR _swapchain, 250 uint32_t *pSwapchainImageCount, 251 VkImage *pSwapchainImages); 252 253 VkResult 254 wsi_common_acquire_next_image2(const struct wsi_device *wsi, 255 VkDevice device, 256 const VkAcquireNextImageInfoKHR *pAcquireInfo, 257 uint32_t *pImageIndex); 258 259 VkResult 260 wsi_common_queue_present(const struct wsi_device *wsi, 261 VkDevice device_h, 262 VkQueue queue_h, 263 int queue_family_index, 264 const VkPresentInfoKHR *pPresentInfo); 265 266 uint64_t 267 wsi_common_get_current_time(void); 268 269 #endif 270