Mesa (main): radv: Set horizontal sync types.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Dec 31 15:40:22 UTC 2021


Module: Mesa
Branch: main
Commit: 31da5c41b6b29dbdd15828d5b33972ad5bf1b62d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=31da5c41b6b29dbdd15828d5b33972ad5bf1b62d

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Sun Nov 28 16:38:06 2021 +0100

radv: Set horizontal sync types.

We basically use 2 types for amdgpu:

1) syncobj. This supports both binary & timeline and autodetects
  all the features.
2) emulated timelines if (1) doesn't detect timeline syncobj support.

Note that one has to put these in order of preference so that the
common CreateFence/CreateSemaphore functions decide on the right
type.

Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13974>

---

 src/amd/vulkan/radv_device.c                      |  2 ++
 src/amd/vulkan/radv_radeon_winsys.h               |  3 +++
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c | 22 ++++++++++++++++++++++
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h |  7 +++++++
 src/amd/vulkan/winsys/null/radv_null_winsys.c     | 10 ++++++++++
 src/amd/vulkan/winsys/null/radv_null_winsys.h     |  3 +++
 6 files changed, 47 insertions(+)

diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 79313bd16d5..acc64f4c364 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -663,6 +663,8 @@ radv_physical_device_try_create(struct radv_instance *instance, drmDevicePtr drm
       goto fail_base;
    }
 
+   device->vk.supported_sync_types = device->ws->get_sync_types(device->ws);
+
 #ifndef _WIN32
    if (drm_device && instance->vk.enabled_extensions.KHR_display) {
       master_fd = open(drm_device->nodes[DRM_NODE_PRIMARY], O_RDWR | O_CLOEXEC);
diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h
index b7a281c6050..2e07fd4fa30 100644
--- a/src/amd/vulkan/radv_radeon_winsys.h
+++ b/src/amd/vulkan/radv_radeon_winsys.h
@@ -42,6 +42,7 @@
 struct radeon_info;
 struct ac_surf_info;
 struct radeon_surf;
+struct vk_sync_type;
 
 enum radeon_bo_domain { /* bitfield */
                         RADEON_DOMAIN_GTT = 2,
@@ -314,6 +315,8 @@ struct radeon_winsys {
    int (*import_syncobj_from_sync_file)(struct radeon_winsys *ws, uint32_t syncobj, int fd);
 
    int (*get_fd)(struct radeon_winsys *ws);
+
+   const struct vk_sync_type *const *(*get_sync_types)(struct radeon_winsys *ws);
 };
 
 static inline void
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c
index 538576db212..2f8d04e779e 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c
@@ -36,6 +36,7 @@
 #include "radv_amdgpu_surface.h"
 #include "radv_amdgpu_winsys_public.h"
 #include "radv_debug.h"
+#include "vk_drm_syncobj.h"
 #include "xf86drm.h"
 
 static bool
@@ -187,6 +188,13 @@ radv_amdgpu_winsys_get_fd(struct radeon_winsys *rws)
    return amdgpu_device_get_fd(ws->dev);
 }
 
+static const struct vk_sync_type *const *
+radv_amdgpu_winsys_get_sync_types(struct radeon_winsys *rws)
+{
+   struct radv_amdgpu_winsys *ws = (struct radv_amdgpu_winsys *)rws;
+   return ws->sync_types;
+}
+
 struct radeon_winsys *
 radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags, bool reserve_vmid)
 {
@@ -239,6 +247,19 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags,
       if (r)
          goto vmid_fail;
    }
+   int num_sync_types = 0;
+
+   ws->syncobj_sync_type = vk_drm_syncobj_get_type(amdgpu_device_get_fd(ws->dev));
+   if (ws->syncobj_sync_type.features) {
+      ws->sync_types[num_sync_types++] = &ws->syncobj_sync_type;
+      if (!(ws->syncobj_sync_type.features & VK_SYNC_FEATURE_TIMELINE)) {
+         ws->emulated_timeline_sync_type = vk_sync_timeline_get_type(&ws->syncobj_sync_type);
+         ws->sync_types[num_sync_types++] = &ws->emulated_timeline_sync_type.sync;
+      }
+   }
+
+   ws->sync_types[num_sync_types++] = NULL;
+   assert(num_sync_types <= ARRAY_SIZE(ws->sync_types));
 
    ws->perftest = perftest_flags;
    ws->zero_all_vram_allocs = debug_flags & RADV_DEBUG_ZERO_VRAM;
@@ -252,6 +273,7 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags,
    ws->base.get_chip_name = radv_amdgpu_winsys_get_chip_name;
    ws->base.destroy = radv_amdgpu_winsys_destroy;
    ws->base.get_fd = radv_amdgpu_winsys_get_fd;
+   ws->base.get_sync_types = radv_amdgpu_winsys_get_sync_types;
    radv_amdgpu_bo_init_functions(ws);
    radv_amdgpu_cs_init_functions(ws);
    radv_amdgpu_surface_init_functions(ws);
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h
index 06ca90564f0..b40a75d93f0 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h
@@ -35,6 +35,9 @@
 #include "ac_gpu_info.h"
 #include "radv_radeon_winsys.h"
 
+#include "vk_sync.h"
+#include "vk_sync_timeline.h"
+
 struct radv_amdgpu_winsys {
    struct radeon_winsys base;
    amdgpu_device_handle dev;
@@ -71,6 +74,10 @@ struct radv_amdgpu_winsys {
    struct u_rwlock log_bo_list_lock;
    struct list_head log_bo_list;
 
+   const struct vk_sync_type *sync_types[3];
+   struct vk_sync_type syncobj_sync_type;
+   struct vk_sync_timeline_type emulated_timeline_sync_type;
+
    uint32_t refcount;
 };
 
diff --git a/src/amd/vulkan/winsys/null/radv_null_winsys.c b/src/amd/vulkan/winsys/null/radv_null_winsys.c
index bcac3528ed8..d93f1ea98ff 100644
--- a/src/amd/vulkan/winsys/null/radv_null_winsys.c
+++ b/src/amd/vulkan/winsys/null/radv_null_winsys.c
@@ -29,6 +29,7 @@
 #include "util/u_string.h"
 #include "radv_null_bo.h"
 #include "radv_null_cs.h"
+#include "vk_sync_dummy.h"
 
 /* Hardcode some GPU info that are needed for the driver or for some tools. */
 static const struct {
@@ -163,6 +164,12 @@ radv_null_winsys_get_fd(struct radeon_winsys *rws)
    return -1;
 }
 
+static const struct vk_sync_type *const *
+radv_null_winsys_get_sync_types(struct radeon_winsys *rws)
+{
+   return radv_null_winsys(rws)->sync_types;
+}
+
 struct radeon_winsys *
 radv_null_winsys_create()
 {
@@ -175,8 +182,11 @@ radv_null_winsys_create()
    ws->base.destroy = radv_null_winsys_destroy;
    ws->base.query_info = radv_null_winsys_query_info;
    ws->base.get_fd = radv_null_winsys_get_fd;
+   ws->base.get_sync_types = radv_null_winsys_get_sync_types;
    radv_null_bo_init_functions(ws);
    radv_null_cs_init_functions(ws);
 
+   ws->sync_types[0] = &vk_sync_dummy_type;
+   ws->sync_types[1] = NULL;
    return &ws->base;
 }
diff --git a/src/amd/vulkan/winsys/null/radv_null_winsys.h b/src/amd/vulkan/winsys/null/radv_null_winsys.h
index c29b6ce5862..dae869cb4e6 100644
--- a/src/amd/vulkan/winsys/null/radv_null_winsys.h
+++ b/src/amd/vulkan/winsys/null/radv_null_winsys.h
@@ -32,8 +32,11 @@
 #include "ac_gpu_info.h"
 #include "radv_radeon_winsys.h"
 
+struct vk_sync_type;
+
 struct radv_null_winsys {
    struct radeon_winsys base;
+   const struct vk_sync_type *sync_types[2];
 };
 
 static inline struct radv_null_winsys *



More information about the mesa-commit mailing list