2 * Copyright © 2017 Keith Packard
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that copyright
7 * notice and this permission notice appear in supporting documentation, and
8 * that the name of the copyright holders not be used in advertising or
9 * publicity pertaining to distribution of the software without specific,
10 * written prior permission. The copyright holders make no representations
11 * about the suitability of this software for any purpose. It is provided "as
12 * is" without express or implied warranty.
14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
27 #include "tu_private.h"
29 #include "util/disk_cache.h"
30 #include "util/strtod.h"
33 #include <xf86drmMode.h>
34 #include "vk_format.h"
35 #include "util/debug.h"
36 #include "wsi_common_display.h"
39 tu_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physical_device
,
40 uint32_t *property_count
,
41 VkDisplayPropertiesKHR
*properties
)
43 TU_FROM_HANDLE(tu_physical_device
, pdevice
, physical_device
);
45 return wsi_display_get_physical_device_display_properties(
53 tu_GetPhysicalDeviceDisplayProperties2KHR(VkPhysicalDevice physical_device
,
54 uint32_t *property_count
,
55 VkDisplayProperties2KHR
*properties
)
57 TU_FROM_HANDLE(tu_physical_device
, pdevice
, physical_device
);
59 return wsi_display_get_physical_device_display_properties2(
67 tu_GetPhysicalDeviceDisplayPlanePropertiesKHR(
68 VkPhysicalDevice physical_device
,
69 uint32_t *property_count
,
70 VkDisplayPlanePropertiesKHR
*properties
)
72 TU_FROM_HANDLE(tu_physical_device
, pdevice
, physical_device
);
74 return wsi_display_get_physical_device_display_plane_properties(
82 tu_GetPhysicalDeviceDisplayPlaneProperties2KHR(
83 VkPhysicalDevice physical_device
,
84 uint32_t *property_count
,
85 VkDisplayPlaneProperties2KHR
*properties
)
87 TU_FROM_HANDLE(tu_physical_device
, pdevice
, physical_device
);
89 return wsi_display_get_physical_device_display_plane_properties2(
97 tu_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physical_device
,
99 uint32_t *display_count
,
100 VkDisplayKHR
*displays
)
102 TU_FROM_HANDLE(tu_physical_device
, pdevice
, physical_device
);
104 return wsi_display_get_display_plane_supported_displays(
106 &pdevice
->wsi_device
,
114 tu_GetDisplayModePropertiesKHR(VkPhysicalDevice physical_device
,
115 VkDisplayKHR display
,
116 uint32_t *property_count
,
117 VkDisplayModePropertiesKHR
*properties
)
119 TU_FROM_HANDLE(tu_physical_device
, pdevice
, physical_device
);
121 return wsi_display_get_display_mode_properties(physical_device
,
122 &pdevice
->wsi_device
,
129 tu_GetDisplayModeProperties2KHR(VkPhysicalDevice physical_device
,
130 VkDisplayKHR display
,
131 uint32_t *property_count
,
132 VkDisplayModeProperties2KHR
*properties
)
134 TU_FROM_HANDLE(tu_physical_device
, pdevice
, physical_device
);
136 return wsi_display_get_display_mode_properties2(physical_device
,
137 &pdevice
->wsi_device
,
144 tu_CreateDisplayModeKHR(VkPhysicalDevice physical_device
,
145 VkDisplayKHR display
,
146 const VkDisplayModeCreateInfoKHR
*create_info
,
147 const VkAllocationCallbacks
*allocator
,
148 VkDisplayModeKHR
*mode
)
150 TU_FROM_HANDLE(tu_physical_device
, pdevice
, physical_device
);
152 return wsi_display_create_display_mode(physical_device
,
153 &pdevice
->wsi_device
,
161 tu_GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physical_device
,
162 VkDisplayModeKHR mode_khr
,
163 uint32_t plane_index
,
164 VkDisplayPlaneCapabilitiesKHR
*capabilities
)
166 TU_FROM_HANDLE(tu_physical_device
, pdevice
, physical_device
);
168 return wsi_get_display_plane_capabilities(physical_device
,
169 &pdevice
->wsi_device
,
176 tu_GetDisplayPlaneCapabilities2KHR(VkPhysicalDevice physical_device
,
177 const VkDisplayPlaneInfo2KHR
*pDisplayPlaneInfo
,
178 VkDisplayPlaneCapabilities2KHR
*capabilities
)
180 TU_FROM_HANDLE(tu_physical_device
, pdevice
, physical_device
);
182 return wsi_get_display_plane_capabilities2(physical_device
,
183 &pdevice
->wsi_device
,
189 tu_CreateDisplayPlaneSurfaceKHR(
190 VkInstance _instance
,
191 const VkDisplaySurfaceCreateInfoKHR
*create_info
,
192 const VkAllocationCallbacks
*allocator
,
193 VkSurfaceKHR
*surface
)
195 TU_FROM_HANDLE(tu_instance
, instance
, _instance
);
196 const VkAllocationCallbacks
*alloc
;
201 alloc
= &instance
->alloc
;
203 return wsi_create_display_surface(_instance
, alloc
,
204 create_info
, surface
);
208 tu_ReleaseDisplayEXT(VkPhysicalDevice physical_device
,
209 VkDisplayKHR display
)
211 TU_FROM_HANDLE(tu_physical_device
, pdevice
, physical_device
);
213 return wsi_release_display(physical_device
,
214 &pdevice
->wsi_device
,
218 #ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
220 tu_AcquireXlibDisplayEXT(VkPhysicalDevice physical_device
,
222 VkDisplayKHR display
)
224 TU_FROM_HANDLE(tu_physical_device
, pdevice
, physical_device
);
226 return wsi_acquire_xlib_display(physical_device
,
227 &pdevice
->wsi_device
,
233 tu_GetRandROutputDisplayEXT(VkPhysicalDevice physical_device
,
236 VkDisplayKHR
*display
)
238 TU_FROM_HANDLE(tu_physical_device
, pdevice
, physical_device
);
240 return wsi_get_randr_output_display(physical_device
,
241 &pdevice
->wsi_device
,
246 #endif /* VK_USE_PLATFORM_XLIB_XRANDR_EXT */
248 /* VK_EXT_display_control */
251 tu_DisplayPowerControlEXT(VkDevice _device
,
252 VkDisplayKHR display
,
253 const VkDisplayPowerInfoEXT
*display_power_info
)
255 TU_FROM_HANDLE(tu_device
, device
, _device
);
257 return wsi_display_power_control(_device
,
258 &device
->physical_device
->wsi_device
,
264 tu_RegisterDeviceEventEXT(VkDevice _device
,
265 const VkDeviceEventInfoEXT
*device_event_info
,
266 const VkAllocationCallbacks
*allocator
,
269 TU_FROM_HANDLE(tu_device
, device
, _device
);
270 struct tu_fence
*fence
;
273 fence
= vk_alloc2(&device
->instance
->alloc
, allocator
, sizeof (*fence
),
274 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT
);
276 return VK_ERROR_OUT_OF_HOST_MEMORY
;
278 tu_fence_init(fence
, false);
280 ret
= wsi_register_device_event(_device
,
281 &device
->physical_device
->wsi_device
,
285 if (ret
== VK_SUCCESS
)
286 *_fence
= tu_fence_to_handle(fence
);
288 vk_free2(&device
->instance
->alloc
, allocator
, fence
);
293 tu_RegisterDisplayEventEXT(VkDevice _device
,
294 VkDisplayKHR display
,
295 const VkDisplayEventInfoEXT
*display_event_info
,
296 const VkAllocationCallbacks
*allocator
,
299 TU_FROM_HANDLE(tu_device
, device
, _device
);
301 struct tu_fence
*fence
;
304 fence
= vk_alloc2(&device
->instance
->alloc
, allocator
, sizeof (*fence
),
305 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT
);
307 return VK_ERROR_OUT_OF_HOST_MEMORY
;
309 tu_fence_init(fence
, false);
311 ret
= wsi_register_display_event(_device
,
312 &device
->physical_device
->wsi_device
,
318 if (ret
== VK_SUCCESS
)
319 *_fence
= tu_fence_to_handle(fence
);
321 vk_free2(&device
->instance
->alloc
, allocator
, fence
);
326 tu_GetSwapchainCounterEXT(VkDevice _device
,
327 VkSwapchainKHR swapchain
,
328 VkSurfaceCounterFlagBitsEXT flag_bits
,
331 TU_FROM_HANDLE(tu_device
, device
, _device
);
333 return wsi_get_swapchain_counter(_device
,
334 &device
->physical_device
->wsi_device
,