• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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