Mesa (main): vulkan/wsi: Implement VK_EXT_acquire_drm_display
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jun 24 16:13:32 UTC 2021
Module: Mesa
Branch: main
Commit: f9944899a7f80994661fb0e8b4a09e1d5f3c8caf
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f9944899a7f80994661fb0e8b4a09e1d5f3c8caf
Author: Simon Zeni <simon at bl4ckb0ne.ca>
Date: Mon Jun 21 11:55:14 2021 -0400
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 <simon at bl4ckb0ne.ca>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Reviewed-by: Simon Ser <contact at emersion.fr>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11014>
---
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
More information about the mesa-commit
mailing list