venus: implement VK_EXT_physical_device_drm
authorClément Guérin <libcg@protonmail.com>
Wed, 6 Jul 2022 23:04:32 +0000 (16:04 -0700)
committerMarge Bot <emma+marge@anholt.net>
Thu, 7 Jul 2022 02:46:45 +0000 (02:46 +0000)
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17387>

src/virtio/vulkan/vn_physical_device.c
src/virtio/vulkan/vn_renderer.h
src/virtio/vulkan/vn_renderer_virtgpu.c
src/virtio/vulkan/vn_renderer_vtest.c

index c9bd721..f03d49f 100644 (file)
@@ -928,6 +928,8 @@ vn_physical_device_get_native_extensions(
    exts->KHR_swapchain_mutable_format = true;
 #endif
 #endif /* ANDROID */
+
+   exts->EXT_physical_device_drm = true;
 }
 
 static void
@@ -1893,6 +1895,7 @@ vn_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
       VkPhysicalDeviceConservativeRasterizationPropertiesEXT
          *conservative_rasterization;
       VkPhysicalDeviceCustomBorderColorPropertiesEXT *custom_border_color;
+      VkPhysicalDeviceDrmPropertiesEXT *drm;
       VkPhysicalDeviceLineRasterizationPropertiesEXT *line_rasterization;
       VkPhysicalDevicePCIBusInfoPropertiesEXT *pci_bus_info;
       VkPhysicalDevicePresentationPropertiesANDROID *presentation_properties;
@@ -2095,6 +2098,20 @@ vn_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
       case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
          *u.custom_border_color = props->custom_border_color;
          break;
+      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT:
+         u.drm->hasPrimary =
+            physical_dev->instance->renderer->info.drm.has_primary;
+         u.drm->primaryMajor =
+            physical_dev->instance->renderer->info.drm.primary_major;
+         u.drm->primaryMinor =
+            physical_dev->instance->renderer->info.drm.primary_minor;
+         u.drm->hasRender =
+            physical_dev->instance->renderer->info.drm.has_render;
+         u.drm->renderMajor =
+            physical_dev->instance->renderer->info.drm.render_major;
+         u.drm->renderMinor =
+            physical_dev->instance->renderer->info.drm.render_minor;
+         break;
       case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT:
          *u.line_rasterization = props->line_rasterization;
          break;
index 24abfc9..a8207c6 100644 (file)
@@ -42,6 +42,15 @@ struct vn_renderer_sync {
 
 struct vn_renderer_info {
    struct {
+      bool has_primary;
+      int primary_major;
+      int primary_minor;
+      bool has_render;
+      int render_major;
+      int render_minor;
+   } drm;
+
+   struct {
       uint16_t vendor_id;
       uint16_t device_id;
 
index 5c7c82d..fb87691 100644 (file)
 #include <unistd.h>
 #include <xf86drm.h>
 
+#ifdef MAJOR_IN_MKDEV
+#include <sys/mkdev.h>
+#endif
+#ifdef MAJOR_IN_SYSMACROS
+#include <sys/sysmacros.h>
+#endif
+
 #include "drm-uapi/virtgpu_drm.h"
 #include "util/sparse_array.h"
 #define VIRGL_RENDERER_UNSTABLE_APIS
@@ -99,7 +106,12 @@ struct virtgpu {
    struct vn_instance *instance;
 
    int fd;
-   int version_minor;
+
+   bool has_primary;
+   int primary_major;
+   int primary_minor;
+   int render_major;
+   int render_minor;
 
    int bustype;
    drmPciBusInfo pci_bus_info;
@@ -1375,6 +1387,13 @@ virtgpu_init_renderer_info(struct virtgpu *gpu)
 {
    struct vn_renderer_info *info = &gpu->base.info;
 
+   info->drm.has_primary = gpu->has_primary;
+   info->drm.primary_major = gpu->primary_major;
+   info->drm.primary_minor = gpu->primary_minor;
+   info->drm.has_render = true;
+   info->drm.render_major = gpu->render_major;
+   info->drm.render_minor = gpu->render_minor;
+
    info->pci.vendor_id = VIRTGPU_PCI_VENDOR_ID;
    info->pci.device_id = VIRTGPU_PCI_DEVICE_ID;
 
@@ -1583,6 +1602,7 @@ virtgpu_open_device(struct virtgpu *gpu, const drmDevicePtr dev)
       return VK_ERROR_INITIALIZATION_FAILED;
    }
 
+   const char *primary_path = dev->nodes[DRM_NODE_PRIMARY];
    const char *node_path = dev->nodes[DRM_NODE_RENDER];
 
    int fd = open(node_path, O_RDWR | O_CLOEXEC);
@@ -1610,7 +1630,21 @@ virtgpu_open_device(struct virtgpu *gpu, const drmDevicePtr dev)
    }
 
    gpu->fd = fd;
-   gpu->version_minor = version->version_minor;
+
+   struct stat st;
+   if (stat(primary_path, &st) == 0) {
+      gpu->has_primary = true;
+      gpu->primary_major = major(st.st_rdev);
+      gpu->primary_minor = minor(st.st_rdev);
+   } else {
+      gpu->has_primary = false;
+      gpu->primary_major = 0;
+      gpu->primary_minor = 0;
+   }
+   stat(node_path, &st);
+   gpu->render_major = major(st.st_rdev);
+   gpu->render_minor = minor(st.st_rdev);
+
    gpu->bustype = dev->bustype;
    if (dev->bustype == DRM_BUS_PCI)
       gpu->pci_bus_info = *dev->businfo.pci;
index dd20111..8d37a65 100644 (file)
@@ -927,6 +927,13 @@ vtest_init_renderer_info(struct vtest *vtest)
 {
    struct vn_renderer_info *info = &vtest->base.info;
 
+   info->drm.has_primary = false;
+   info->drm.primary_major = 0;
+   info->drm.primary_minor = 0;
+   info->drm.has_render = false;
+   info->drm.render_major = 0;
+   info->drm.render_minor = 0;
+
    info->pci.vendor_id = VTEST_PCI_VENDOR_ID;
    info->pci.device_id = VTEST_PCI_DEVICE_ID;