• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
28 struct 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    uint32_t size;
39    uint32_t offset;
40    uint32_t row_pitch;
41    int fd;
42 };
43 
44 struct wsi_swapchain {
45    const struct wsi_device *wsi;
46 
47    VkDevice device;
48    VkAllocationCallbacks alloc;
49    VkFence fences[3];
50    VkPresentModeKHR present_mode;
51    uint32_t image_count;
52 
53    bool use_prime_blit;
54 
55    /* Command pools, one per queue family */
56    VkCommandPool *cmd_pools;
57 
58    VkResult (*destroy)(struct wsi_swapchain *swapchain,
59                        const VkAllocationCallbacks *pAllocator);
60    struct wsi_image *(*get_wsi_image)(struct wsi_swapchain *swapchain,
61                                       uint32_t image_index);
62    VkResult (*acquire_next_image)(struct wsi_swapchain *swap_chain,
63                                   uint64_t timeout, VkSemaphore semaphore,
64                                   uint32_t *image_index);
65    VkResult (*queue_present)(struct wsi_swapchain *swap_chain,
66                              uint32_t image_index,
67                              const VkPresentRegionKHR *damage);
68 };
69 
70 VkResult
71 wsi_swapchain_init(const struct wsi_device *wsi,
72                    struct wsi_swapchain *chain,
73                    VkDevice device,
74                    const VkSwapchainCreateInfoKHR *pCreateInfo,
75                    const VkAllocationCallbacks *pAllocator);
76 
77 void wsi_swapchain_finish(struct wsi_swapchain *chain);
78 
79 VkResult
80 wsi_create_native_image(const struct wsi_swapchain *chain,
81                         const VkSwapchainCreateInfoKHR *pCreateInfo,
82                         struct wsi_image *image);
83 
84 VkResult
85 wsi_create_prime_image(const struct wsi_swapchain *chain,
86                        const VkSwapchainCreateInfoKHR *pCreateInfo,
87                        struct wsi_image *image);
88 
89 void
90 wsi_destroy_image(const struct wsi_swapchain *chain,
91                   struct wsi_image *image);
92 
93 
94 struct wsi_interface {
95    VkResult (*get_support)(VkIcdSurfaceBase *surface,
96                            struct wsi_device *wsi_device,
97                            const VkAllocationCallbacks *alloc,
98                            uint32_t queueFamilyIndex,
99                            int local_fd,
100                            VkBool32* pSupported);
101    VkResult (*get_capabilities)(VkIcdSurfaceBase *surface,
102                                 VkSurfaceCapabilitiesKHR* pSurfaceCapabilities);
103    VkResult (*get_capabilities2)(VkIcdSurfaceBase *surface,
104                                  const void *info_next,
105                                  VkSurfaceCapabilities2KHR* pSurfaceCapabilities);
106    VkResult (*get_formats)(VkIcdSurfaceBase *surface,
107                            struct wsi_device *wsi_device,
108                            uint32_t* pSurfaceFormatCount,
109                            VkSurfaceFormatKHR* pSurfaceFormats);
110    VkResult (*get_formats2)(VkIcdSurfaceBase *surface,
111                             struct wsi_device *wsi_device,
112                             const void *info_next,
113                             uint32_t* pSurfaceFormatCount,
114                             VkSurfaceFormat2KHR* pSurfaceFormats);
115    VkResult (*get_present_modes)(VkIcdSurfaceBase *surface,
116                                  uint32_t* pPresentModeCount,
117                                  VkPresentModeKHR* pPresentModes);
118    VkResult (*create_swapchain)(VkIcdSurfaceBase *surface,
119                                 VkDevice device,
120                                 struct wsi_device *wsi_device,
121                                 int local_fd,
122                                 const VkSwapchainCreateInfoKHR* pCreateInfo,
123                                 const VkAllocationCallbacks* pAllocator,
124                                 struct wsi_swapchain **swapchain);
125 };
126 
127 VkResult wsi_x11_init_wsi(struct wsi_device *wsi_device,
128                           const VkAllocationCallbacks *alloc);
129 void wsi_x11_finish_wsi(struct wsi_device *wsi_device,
130                         const VkAllocationCallbacks *alloc);
131 VkResult wsi_wl_init_wsi(struct wsi_device *wsi_device,
132                          const VkAllocationCallbacks *alloc,
133                          VkPhysicalDevice physical_device);
134 void wsi_wl_finish_wsi(struct wsi_device *wsi_device,
135                        const VkAllocationCallbacks *alloc);
136 
137 
138 #define WSI_DEFINE_NONDISP_HANDLE_CASTS(__wsi_type, __VkType)              \
139                                                                            \
140    static inline struct __wsi_type *                                       \
141    __wsi_type ## _from_handle(__VkType _handle)                            \
142    {                                                                       \
143       return (struct __wsi_type *)(uintptr_t) _handle;                     \
144    }                                                                       \
145                                                                            \
146    static inline __VkType                                                  \
147    __wsi_type ## _to_handle(struct __wsi_type *_obj)                       \
148    {                                                                       \
149       return (__VkType)(uintptr_t) _obj;                                   \
150    }
151 
152 #define WSI_FROM_HANDLE(__wsi_type, __name, __handle) \
153    struct __wsi_type *__name = __wsi_type ## _from_handle(__handle)
154 
155 WSI_DEFINE_NONDISP_HANDLE_CASTS(wsi_swapchain, VkSwapchainKHR)
156 
157 #endif /* WSI_COMMON_PRIVATE_H */
158