wsi_common_private.h revision 8a1362ad
1/* 2 * Copyright © 2017 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_PRIVATE_H 24#define WSI_COMMON_PRIVATE_H 25 26#include "wsi_common.h" 27 28struct wsi_image { 29 VkImage image; 30 VkDeviceMemory memory; 31 32 struct { 33 VkBuffer buffer; 34 VkDeviceMemory memory; 35 VkCommandBuffer *blit_cmd_buffers; 36 } prime; 37 38 uint64_t drm_modifier; 39 int num_planes; 40 uint32_t sizes[4]; 41 uint32_t offsets[4]; 42 uint32_t row_pitches[4]; 43 int fds[4]; 44}; 45 46struct wsi_swapchain { 47 const struct wsi_device *wsi; 48 49 VkDevice device; 50 VkAllocationCallbacks alloc; 51 VkFence fences[3]; 52 VkPresentModeKHR present_mode; 53 uint32_t image_count; 54 55 bool use_prime_blit; 56 57 /* Command pools, one per queue family */ 58 VkCommandPool *cmd_pools; 59 60 VkResult (*destroy)(struct wsi_swapchain *swapchain, 61 const VkAllocationCallbacks *pAllocator); 62 struct wsi_image *(*get_wsi_image)(struct wsi_swapchain *swapchain, 63 uint32_t image_index); 64 VkResult (*acquire_next_image)(struct wsi_swapchain *swap_chain, 65 const VkAcquireNextImageInfoKHR *info, 66 uint32_t *image_index); 67 VkResult (*queue_present)(struct wsi_swapchain *swap_chain, 68 uint32_t image_index, 69 const VkPresentRegionKHR *damage); 70}; 71 72bool 73wsi_device_matches_drm_fd(const struct wsi_device *wsi, int drm_fd); 74 75VkResult 76wsi_swapchain_init(const struct wsi_device *wsi, 77 struct wsi_swapchain *chain, 78 VkDevice device, 79 const VkSwapchainCreateInfoKHR *pCreateInfo, 80 const VkAllocationCallbacks *pAllocator); 81 82enum VkPresentModeKHR 83wsi_swapchain_get_present_mode(struct wsi_device *wsi, 84 const VkSwapchainCreateInfoKHR *pCreateInfo); 85 86void wsi_swapchain_finish(struct wsi_swapchain *chain); 87 88VkResult 89wsi_create_native_image(const struct wsi_swapchain *chain, 90 const VkSwapchainCreateInfoKHR *pCreateInfo, 91 uint32_t num_modifier_lists, 92 const uint32_t *num_modifiers, 93 const uint64_t *const *modifiers, 94 struct wsi_image *image); 95 96VkResult 97wsi_create_prime_image(const struct wsi_swapchain *chain, 98 const VkSwapchainCreateInfoKHR *pCreateInfo, 99 bool use_modifier, 100 struct wsi_image *image); 101 102void 103wsi_destroy_image(const struct wsi_swapchain *chain, 104 struct wsi_image *image); 105 106 107struct wsi_interface { 108 VkResult (*get_support)(VkIcdSurfaceBase *surface, 109 struct wsi_device *wsi_device, 110 uint32_t queueFamilyIndex, 111 VkBool32* pSupported); 112 VkResult (*get_capabilities2)(VkIcdSurfaceBase *surface, 113 struct wsi_device *wsi_device, 114 const void *info_next, 115 VkSurfaceCapabilities2KHR* pSurfaceCapabilities); 116 VkResult (*get_formats)(VkIcdSurfaceBase *surface, 117 struct wsi_device *wsi_device, 118 uint32_t* pSurfaceFormatCount, 119 VkSurfaceFormatKHR* pSurfaceFormats); 120 VkResult (*get_formats2)(VkIcdSurfaceBase *surface, 121 struct wsi_device *wsi_device, 122 const void *info_next, 123 uint32_t* pSurfaceFormatCount, 124 VkSurfaceFormat2KHR* pSurfaceFormats); 125 VkResult (*get_present_modes)(VkIcdSurfaceBase *surface, 126 uint32_t* pPresentModeCount, 127 VkPresentModeKHR* pPresentModes); 128 VkResult (*get_present_rectangles)(VkIcdSurfaceBase *surface, 129 struct wsi_device *wsi_device, 130 uint32_t* pRectCount, 131 VkRect2D* pRects); 132 VkResult (*create_swapchain)(VkIcdSurfaceBase *surface, 133 VkDevice device, 134 struct wsi_device *wsi_device, 135 const VkSwapchainCreateInfoKHR* pCreateInfo, 136 const VkAllocationCallbacks* pAllocator, 137 struct wsi_swapchain **swapchain); 138}; 139 140VkResult wsi_x11_init_wsi(struct wsi_device *wsi_device, 141 const VkAllocationCallbacks *alloc, 142 const struct driOptionCache *dri_options); 143void wsi_x11_finish_wsi(struct wsi_device *wsi_device, 144 const VkAllocationCallbacks *alloc); 145VkResult wsi_wl_init_wsi(struct wsi_device *wsi_device, 146 const VkAllocationCallbacks *alloc, 147 VkPhysicalDevice physical_device); 148void wsi_wl_finish_wsi(struct wsi_device *wsi_device, 149 const VkAllocationCallbacks *alloc); 150 151 152VkResult 153wsi_display_init_wsi(struct wsi_device *wsi_device, 154 const VkAllocationCallbacks *alloc, 155 int display_fd); 156 157void 158wsi_display_finish_wsi(struct wsi_device *wsi_device, 159 const VkAllocationCallbacks *alloc); 160 161#define WSI_DEFINE_NONDISP_HANDLE_CASTS(__wsi_type, __VkType) \ 162 \ 163 static inline struct __wsi_type * \ 164 __wsi_type ## _from_handle(__VkType _handle) \ 165 { \ 166 return (struct __wsi_type *)(uintptr_t) _handle; \ 167 } \ 168 \ 169 static inline __VkType \ 170 __wsi_type ## _to_handle(struct __wsi_type *_obj) \ 171 { \ 172 return (__VkType)(uintptr_t) _obj; \ 173 } 174 175#define WSI_FROM_HANDLE(__wsi_type, __name, __handle) \ 176 struct __wsi_type *__name = __wsi_type ## _from_handle(__handle) 177 178WSI_DEFINE_NONDISP_HANDLE_CASTS(wsi_swapchain, VkSwapchainKHR) 179 180#endif /* WSI_COMMON_PRIVATE_H */ 181