Mesa (main): radv: Add new cs_submit2 winsys call.

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


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

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Sun Nov 28 17:51:23 2021 +0100

radv: Add new cs_submit2 winsys call.

A bit more runtime dependence so we can remove all the syncobj stuff
in radv itself.

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

---

 src/amd/vulkan/radv_radeon_winsys.h           |  9 ++++
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 78 +++++++++++++++++++++++++++
 2 files changed, 87 insertions(+)

diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h
index 2e07fd4fa30..222e7a365e0 100644
--- a/src/amd/vulkan/radv_radeon_winsys.h
+++ b/src/amd/vulkan/radv_radeon_winsys.h
@@ -43,6 +43,8 @@ struct radeon_info;
 struct ac_surf_info;
 struct radeon_surf;
 struct vk_sync_type;
+struct vk_sync_wait;
+struct vk_sync_signal;
 
 enum radeon_bo_domain { /* bitfield */
                         RADEON_DOMAIN_GTT = 2,
@@ -280,6 +282,13 @@ struct radeon_winsys {
                          struct radeon_cmdbuf *continue_preamble_cs,
                          struct radv_winsys_sem_info *sem_info, bool can_patch);
 
+   VkResult (*cs_submit2)(struct radeon_winsys_ctx *ctx, enum ring_type ring_type, int queue_index,
+                          struct radeon_cmdbuf **cs_array, unsigned cs_count,
+                          struct radeon_cmdbuf *initial_preamble_cs,
+                          struct radeon_cmdbuf *continue_preamble_cs, uint32_t wait_count,
+                          const struct vk_sync_wait *waits, uint32_t signal_count,
+                          const struct vk_sync_signal *signals, bool can_patch);
+
    void (*cs_add_buffer)(struct radeon_cmdbuf *cs, struct radeon_winsys_bo *bo);
 
    void (*cs_execute_secondary)(struct radeon_cmdbuf *parent, struct radeon_cmdbuf *child,
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
index b2ed11e60a0..2b01cb716c1 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
@@ -37,6 +37,10 @@
 #include "radv_debug.h"
 #include "radv_radeon_winsys.h"
 #include "sid.h"
+#include "vk_alloc.h"
+#include "vk_drm_syncobj.h"
+#include "vk_sync.h"
+#include "vk_sync_dummy.h"
 
 #define GFX6_MAX_CS_SIZE 0xffff8 /* in dwords */
 
@@ -1279,6 +1283,79 @@ radv_amdgpu_winsys_cs_submit(struct radeon_winsys_ctx *_ctx, enum ring_type ring
    return result;
 }
 
+static VkResult
+radv_amdgpu_winsys_cs_submit2(struct radeon_winsys_ctx *_ctx, enum ring_type ring_type,
+                              int queue_idx, struct radeon_cmdbuf **cs_array, unsigned cs_count,
+                              struct radeon_cmdbuf *initial_preamble_cs,
+                              struct radeon_cmdbuf *continue_preamble_cs, uint32_t wait_count,
+                              const struct vk_sync_wait *waits, uint32_t signal_count,
+                              const struct vk_sync_signal *signals, bool can_patch)
+{
+   struct radv_amdgpu_winsys *ws = radv_amdgpu_ctx(_ctx)->ws;
+   struct radv_winsys_sem_info sem_info;
+   memset(&sem_info, 0, sizeof(sem_info));
+   VkResult result;
+   unsigned wait_idx = 0, signal_idx = 0;
+
+   STACK_ARRAY(uint64_t, wait_points, wait_count);
+   STACK_ARRAY(uint32_t, wait_syncobj, wait_count);
+   STACK_ARRAY(uint64_t, signal_points, signal_count);
+   STACK_ARRAY(uint32_t, signal_syncobj, signal_count);
+
+   if (!wait_points || !wait_syncobj || !signal_points || !signal_syncobj) {
+      result = VK_ERROR_OUT_OF_HOST_MEMORY;
+      goto out;
+   }
+
+   sem_info.wait.points = wait_points;
+   sem_info.wait.syncobj = wait_syncobj;
+   sem_info.signal.points = signal_points;
+   sem_info.signal.syncobj = signal_syncobj;
+
+   for (uint32_t i = 0; i < wait_count; ++i) {
+      if (waits[i].sync->type == &vk_sync_dummy_type)
+         continue;
+
+      assert(waits[i].sync->type == &ws->syncobj_sync_type);
+      sem_info.wait.syncobj[wait_idx] = ((struct vk_drm_syncobj *)waits[i].sync)->syncobj;
+      sem_info.wait.points[wait_idx] = waits[i].wait_value;
+      ++wait_idx;
+   }
+
+   for (uint32_t i = 0; i < signal_count; ++i) {
+      if (signals[i].sync->type == &vk_sync_dummy_type)
+         continue;
+
+      assert(signals[i].sync->type == &ws->syncobj_sync_type);
+      sem_info.signal.syncobj[signal_idx] = ((struct vk_drm_syncobj *)signals[i].sync)->syncobj;
+      sem_info.signal.points[signal_idx] = signals[i].signal_value;
+      ++signal_idx;
+   }
+
+   assert(signal_idx <= signal_count);
+   assert(wait_idx <= wait_count);
+   sem_info.wait.timeline_syncobj_count =
+      (ws->syncobj_sync_type.features & VK_SYNC_FEATURE_TIMELINE) ? wait_idx : 0;
+   sem_info.wait.syncobj_count = wait_idx - sem_info.wait.timeline_syncobj_count;
+   sem_info.cs_emit_wait = true;
+
+   sem_info.signal.timeline_syncobj_count =
+      (ws->syncobj_sync_type.features & VK_SYNC_FEATURE_TIMELINE) ? signal_idx : 0;
+   sem_info.signal.syncobj_count = signal_idx - sem_info.signal.timeline_syncobj_count;
+   sem_info.cs_emit_signal = true;
+
+   result =
+      radv_amdgpu_winsys_cs_submit(_ctx, ring_type, queue_idx, cs_array, cs_count,
+                                   initial_preamble_cs, continue_preamble_cs, &sem_info, can_patch);
+
+out:
+   STACK_ARRAY_FINISH(wait_points);
+   STACK_ARRAY_FINISH(wait_syncobj);
+   STACK_ARRAY_FINISH(signal_points);
+   STACK_ARRAY_FINISH(signal_syncobj);
+   return result;
+}
+
 static void *
 radv_amdgpu_winsys_get_cpu_addr(void *_cs, uint64_t addr)
 {
@@ -1916,6 +1993,7 @@ radv_amdgpu_cs_init_functions(struct radv_amdgpu_winsys *ws)
    ws->base.cs_add_buffer = radv_amdgpu_cs_add_buffer;
    ws->base.cs_execute_secondary = radv_amdgpu_cs_execute_secondary;
    ws->base.cs_submit = radv_amdgpu_winsys_cs_submit;
+   ws->base.cs_submit2 = radv_amdgpu_winsys_cs_submit2;
    ws->base.cs_dump = radv_amdgpu_winsys_cs_dump;
    ws->base.create_syncobj = radv_amdgpu_create_syncobj;
    ws->base.destroy_syncobj = radv_amdgpu_destroy_syncobj;



More information about the mesa-commit mailing list