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