From f9944899a7f80994661fb0e8b4a09e1d5f3c8caf Mon Sep 17 00:00:00 2001 From: Simon Zeni Date: Mon, 21 Jun 2021 11:55:14 -0400 Subject: [PATCH] vulkan/wsi: Implement VK_EXT_acquire_drm_display Implements the two functions defined in the extension VK_EXT_acquire_drm_display, vkAcquireDrmDisplayEXT and vkGetDrmDisplayEXT. Signed-off-by: Simon Zeni Reviewed-by: Jason Ekstrand Reviewed-by: Simon Ser Part-of: --- src/vulkan/wsi/wsi_common_display.c | 53 +++++++++++++++++++++++++++++ src/vulkan/wsi/wsi_common_display.h | 14 ++++++++ 2 files changed, 67 insertions(+) diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c index 24c206069c2..aa07cada107 100644 --- a/src/vulkan/wsi/wsi_common_display.c +++ b/src/vulkan/wsi/wsi_common_display.c @@ -2603,3 +2603,56 @@ wsi_get_swapchain_counter(VkDevice device, return VK_SUCCESS; } +VkResult +wsi_acquire_drm_display(VkPhysicalDevice pDevice, + struct wsi_device *wsi_device, + int drm_fd, + VkDisplayKHR display) +{ + if (!wsi_device_matches_drm_fd(wsi_device, drm_fd)) + return VK_ERROR_UNKNOWN; + + struct wsi_display *wsi = + (struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY]; + + /* XXX no support for mulitple leases yet */ + if (wsi->fd >= 0 || !local_drmIsMaster(drm_fd)) + return VK_ERROR_INITIALIZATION_FAILED; + + struct wsi_display_connector *connector = + wsi_display_connector_from_handle(display); + + drmModeConnectorPtr drm_connector = + drmModeGetConnectorCurrent(drm_fd, connector->id); + + if (!drm_connector) + return VK_ERROR_INITIALIZATION_FAILED; + + drmModeFreeConnector(drm_connector); + + wsi->fd = drm_fd; + return VK_SUCCESS; +} + +VkResult +wsi_get_drm_display(VkPhysicalDevice pDevice, + struct wsi_device *wsi_device, + int drm_fd, + int connector_id, + VkDisplayKHR *display) +{ + if (!wsi_device_matches_drm_fd(wsi_device, drm_fd)) + return VK_ERROR_UNKNOWN; + + struct wsi_display_connector *connector = + wsi_display_get_connector(wsi_device, drm_fd, connector_id); + + if (!connector) { + *display = VK_NULL_HANDLE; + return VK_ERROR_UNKNOWN; + } + + *display = wsi_display_connector_to_handle(connector); + return VK_SUCCESS; +} + diff --git a/src/vulkan/wsi/wsi_common_display.h b/src/vulkan/wsi/wsi_common_display.h index d65517ab941..3f78d00dab5 100644 --- a/src/vulkan/wsi/wsi_common_display.h +++ b/src/vulkan/wsi/wsi_common_display.h @@ -157,4 +157,18 @@ wsi_get_swapchain_counter(VkDevice device, VkSurfaceCounterFlagBitsEXT flag_bits, uint64_t *value); +/* VK_EXT_acquire_drm_display */ +VkResult +wsi_acquire_drm_display(VkPhysicalDevice pDevice, + struct wsi_device *wsi_device, + int drmFd, + VkDisplayKHR display); + +VkResult +wsi_get_drm_display(VkPhysicalDevice pDevice, + struct wsi_device *wsi_device, + int drmFd, + int connectorId, + VkDisplayKHR *display); + #endif