wsi_common.h 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#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#define VK_STRUCTURE_TYPE_WSI_FORMAT_MODIFIER_PROPERTIES_LIST_MESA (VkStructureType)1000001004 39#define VK_STRUCTURE_TYPE_WSI_SURFACE_SUPPORTED_COUNTERS_MESA (VkStructureType)1000001005 40 41struct wsi_image_create_info { 42 VkStructureType sType; 43 const void *pNext; 44 bool scanout; 45 46 uint32_t modifier_count; 47 const uint64_t *modifiers; 48}; 49 50struct wsi_memory_allocate_info { 51 VkStructureType sType; 52 const void *pNext; 53 bool implicit_sync; 54}; 55 56struct wsi_format_modifier_properties { 57 uint64_t modifier; 58 uint32_t modifier_plane_count; 59}; 60 61/* Chain in for vkGetPhysicalDeviceFormatProperties2KHR */ 62struct wsi_format_modifier_properties_list { 63 VkStructureType sType; 64 const void *pNext; 65 66 uint32_t modifier_count; 67 struct wsi_format_modifier_properties *modifier_properties; 68}; 69 70/* To be chained into VkSurfaceCapabilities2KHR */ 71struct wsi_surface_supported_counters { 72 VkStructureType sType; 73 const void *pNext; 74 75 VkSurfaceCounterFlagsEXT supported_surface_counters; 76 77}; 78 79struct wsi_fence { 80 VkDevice device; 81 const struct wsi_device *wsi_device; 82 VkDisplayKHR display; 83 const VkAllocationCallbacks *alloc; 84 VkResult (*wait)(struct wsi_fence *fence, uint64_t abs_timeout); 85 void (*destroy)(struct wsi_fence *fence); 86}; 87 88struct wsi_interface; 89 90#define VK_ICD_WSI_PLATFORM_MAX (VK_ICD_WSI_PLATFORM_DISPLAY + 1) 91 92struct wsi_device { 93 /* Allocator for the instance */ 94 VkAllocationCallbacks instance_alloc; 95 96 VkPhysicalDevice pdevice; 97 VkPhysicalDeviceMemoryProperties memory_props; 98 uint32_t queue_family_count; 99 100 VkPhysicalDevicePCIBusInfoPropertiesEXT pci_bus_info; 101 102 bool supports_modifiers; 103 uint64_t (*image_get_modifier)(VkImage image); 104 105#define WSI_CB(cb) PFN_vk##cb cb 106 WSI_CB(AllocateMemory); 107 WSI_CB(AllocateCommandBuffers); 108 WSI_CB(BindBufferMemory); 109 WSI_CB(BindImageMemory); 110 WSI_CB(BeginCommandBuffer); 111 WSI_CB(CmdCopyImageToBuffer); 112 WSI_CB(CreateBuffer); 113 WSI_CB(CreateCommandPool); 114 WSI_CB(CreateFence); 115 WSI_CB(CreateImage); 116 WSI_CB(DestroyBuffer); 117 WSI_CB(DestroyCommandPool); 118 WSI_CB(DestroyFence); 119 WSI_CB(DestroyImage); 120 WSI_CB(EndCommandBuffer); 121 WSI_CB(FreeMemory); 122 WSI_CB(FreeCommandBuffers); 123 WSI_CB(GetBufferMemoryRequirements); 124 WSI_CB(GetImageMemoryRequirements); 125 WSI_CB(GetImageSubresourceLayout); 126 WSI_CB(GetMemoryFdKHR); 127 WSI_CB(GetPhysicalDeviceFormatProperties); 128 WSI_CB(GetPhysicalDeviceFormatProperties2KHR); 129 WSI_CB(ResetFences); 130 WSI_CB(QueueSubmit); 131 WSI_CB(WaitForFences); 132#undef WSI_CB 133 134 struct wsi_interface * wsi[VK_ICD_WSI_PLATFORM_MAX]; 135}; 136 137typedef PFN_vkVoidFunction (VKAPI_PTR *WSI_FN_GetPhysicalDeviceProcAddr)(VkPhysicalDevice physicalDevice, const char* pName); 138 139VkResult 140wsi_device_init(struct wsi_device *wsi, 141 VkPhysicalDevice pdevice, 142 WSI_FN_GetPhysicalDeviceProcAddr proc_addr, 143 const VkAllocationCallbacks *alloc, 144 int display_fd); 145 146void 147wsi_device_finish(struct wsi_device *wsi, 148 const VkAllocationCallbacks *alloc); 149 150#define ICD_DEFINE_NONDISP_HANDLE_CASTS(__VkIcdType, __VkType) \ 151 \ 152 static inline __VkIcdType * \ 153 __VkIcdType ## _from_handle(__VkType _handle) \ 154 { \ 155 return (__VkIcdType *)(uintptr_t) _handle; \ 156 } \ 157 \ 158 static inline __VkType \ 159 __VkIcdType ## _to_handle(__VkIcdType *_obj) \ 160 { \ 161 return (__VkType)(uintptr_t) _obj; \ 162 } 163 164#define ICD_FROM_HANDLE(__VkIcdType, __name, __handle) \ 165 __VkIcdType *__name = __VkIcdType ## _from_handle(__handle) 166 167ICD_DEFINE_NONDISP_HANDLE_CASTS(VkIcdSurfaceBase, VkSurfaceKHR) 168 169VkResult 170wsi_common_get_surface_support(struct wsi_device *wsi_device, 171 uint32_t queueFamilyIndex, 172 VkSurfaceKHR surface, 173 VkBool32* pSupported); 174 175VkResult 176wsi_common_get_surface_capabilities(struct wsi_device *wsi_device, 177 VkSurfaceKHR surface, 178 VkSurfaceCapabilitiesKHR *pSurfaceCapabilities); 179 180VkResult 181wsi_common_get_surface_capabilities2(struct wsi_device *wsi_device, 182 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, 183 VkSurfaceCapabilities2KHR *pSurfaceCapabilities); 184 185VkResult 186wsi_common_get_surface_formats(struct wsi_device *wsi_device, 187 VkSurfaceKHR surface, 188 uint32_t *pSurfaceFormatCount, 189 VkSurfaceFormatKHR *pSurfaceFormats); 190 191VkResult 192wsi_common_get_surface_formats2(struct wsi_device *wsi_device, 193 const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, 194 uint32_t *pSurfaceFormatCount, 195 VkSurfaceFormat2KHR *pSurfaceFormats); 196 197VkResult 198wsi_common_get_surface_present_modes(struct wsi_device *wsi_device, 199 VkSurfaceKHR surface, 200 uint32_t *pPresentModeCount, 201 VkPresentModeKHR *pPresentModes); 202 203VkResult 204wsi_common_get_present_rectangles(struct wsi_device *wsi, 205 VkSurfaceKHR surface, 206 uint32_t* pRectCount, 207 VkRect2D* pRects); 208 209VkResult 210wsi_common_get_surface_capabilities2ext( 211 struct wsi_device *wsi_device, 212 VkSurfaceKHR surface, 213 VkSurfaceCapabilities2EXT *pSurfaceCapabilities); 214 215VkResult 216wsi_common_get_images(VkSwapchainKHR _swapchain, 217 uint32_t *pSwapchainImageCount, 218 VkImage *pSwapchainImages); 219 220VkResult 221wsi_common_acquire_next_image2(const struct wsi_device *wsi, 222 VkDevice device, 223 const VkAcquireNextImageInfoKHR *pAcquireInfo, 224 uint32_t *pImageIndex); 225 226VkResult 227wsi_common_create_swapchain(struct wsi_device *wsi, 228 VkDevice device, 229 const VkSwapchainCreateInfoKHR *pCreateInfo, 230 const VkAllocationCallbacks *pAllocator, 231 VkSwapchainKHR *pSwapchain); 232void 233wsi_common_destroy_swapchain(VkDevice device, 234 VkSwapchainKHR swapchain, 235 const VkAllocationCallbacks *pAllocator); 236 237VkResult 238wsi_common_queue_present(const struct wsi_device *wsi, 239 VkDevice device_h, 240 VkQueue queue_h, 241 int queue_family_index, 242 const VkPresentInfoKHR *pPresentInfo); 243 244#endif 245