turnip: Implement VK_EXT_physical_device_drm
authorDanylo Piliaiev <dpiliaiev@igalia.com>
Thu, 10 Feb 2022 13:35:59 +0000 (15:35 +0200)
committerMarge Bot <emma+marge@anholt.net>
Tue, 1 Mar 2022 07:10:40 +0000 (07:10 +0000)
Copied from ANV and V3DV.

v1. Fix a build error for clang "unannotated fall-through between switch labels"
( Hyunjun Ko <zzoon.ko@igalia.com> )

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6011

Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com>
Reviewed-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14971>

docs/features.txt
src/freedreno/vulkan/tu_device.c
src/freedreno/vulkan/tu_drm.c
src/freedreno/vulkan/tu_private.h

index 52b4b83..e380cc4 100644 (file)
@@ -555,7 +555,7 @@ Khronos extensions that are not part of any Vulkan version:
   VK_EXT_memory_priority                                DONE (radv)
   VK_EXT_multi_draw                                     DONE (anv, lvp, radv)
   VK_EXT_pci_bus_info                                   DONE (anv, radv)
-  VK_EXT_physical_device_drm                            DONE (anv, radv, v3dv)
+  VK_EXT_physical_device_drm                            DONE (anv, radv, tu, v3dv)
   VK_EXT_post_depth_coverage                            DONE (anv/gfx10+, lvp, radv/gfx10+)
   VK_EXT_primitive_topology_list_restart                DONE (anv, lvp, radv, tu)
   VK_EXT_provoking_vertex                               DONE (anv, lvp, radv, tu, v3dv)
index 49f6235..e5f35a1 100644 (file)
@@ -203,6 +203,9 @@ get_device_extensions(const struct tu_physical_device *device,
       .EXT_line_rasterization = true,
       .EXT_subgroup_size_control = true,
       .EXT_image_robustness = true,
+#ifndef TU_USE_KGSL
+      .EXT_physical_device_drm = true,
+#endif
       /* For Graphics Flight Recorder (GFR) */
       .AMD_buffer_marker = true,
       .ARM_rasterization_order_attachment_access = true,
@@ -1252,6 +1255,18 @@ tu_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
          props->lineSubPixelPrecisionBits = 8;
          break;
       }
+      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT: {
+         VkPhysicalDeviceDrmPropertiesEXT *props =
+            (VkPhysicalDeviceDrmPropertiesEXT *)ext;
+         props->hasPrimary = pdevice->has_master;
+         props->primaryMajor = pdevice->master_major;
+         props->primaryMinor = pdevice->master_minor;
+
+         props->hasRender = pdevice->has_local;
+         props->renderMajor = pdevice->local_major;
+         props->renderMinor = pdevice->local_minor;
+         break;
+      }
 
       default:
          break;
index bd6f528..92ff875 100644 (file)
 #include <sys/mman.h>
 #include <xf86drm.h>
 
+#ifdef MAJOR_IN_MKDEV
+#include <sys/mkdev.h>
+#endif
+#ifdef MAJOR_IN_SYSMACROS
+#include <sys/sysmacros.h>
+#endif
+
 #include "vk_util.h"
 
 #include "drm-uapi/msm_drm.h"
@@ -609,6 +616,7 @@ tu_drm_device_init(struct tu_physical_device *device,
                    struct tu_instance *instance,
                    drmDevicePtr drm_device)
 {
+   const char *primary_path = drm_device->nodes[DRM_NODE_PRIMARY];
    const char *path = drm_device->nodes[DRM_NODE_RENDER];
    VkResult result = VK_SUCCESS;
    drmVersionPtr version;
@@ -665,8 +673,7 @@ tu_drm_device_init(struct tu_physical_device *device,
    device->instance = instance;
 
    if (instance->vk.enabled_extensions.KHR_display) {
-      master_fd =
-         open(drm_device->nodes[DRM_NODE_PRIMARY], O_RDWR | O_CLOEXEC);
+      master_fd = open(primary_path, O_RDWR | O_CLOEXEC);
       if (master_fd >= 0) {
          /* TODO: free master_fd is accel is not working? */
       }
@@ -700,6 +707,28 @@ tu_drm_device_init(struct tu_physical_device *device,
       goto fail;
    }
 
+   struct stat st;
+
+   if (stat(primary_path, &st) == 0) {
+      device->has_master = true;
+      device->master_major = major(st.st_rdev);
+      device->master_minor = minor(st.st_rdev);
+   } else {
+      device->has_master = false;
+      device->master_major = 0;
+      device->master_minor = 0;
+   }
+
+   if (stat(path, &st) == 0) {
+      device->has_local = true;
+      device->local_major = major(st.st_rdev);
+      device->local_minor = minor(st.st_rdev);
+   } else {
+      result = vk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
+                         "failed to stat DRM render node %s", path);
+      goto fail;
+   }
+
    device->syncobj_type = vk_drm_syncobj_get_type(fd);
    device->timeline_type = vk_sync_timeline_get_type(&tu_timeline_sync_type);
 
index b3e7d48..1bd88a3 100644 (file)
@@ -215,7 +215,13 @@ struct tu_physical_device
    struct wsi_device wsi_device;
 
    int local_fd;
+   bool has_local;
+   int64_t local_major;
+   int64_t local_minor;
    int master_fd;
+   bool has_master;
+   int64_t master_major;
+   int64_t master_minor;
 
    uint32_t gmem_size;
    uint64_t gmem_base;