Mesa (main): radv: Remove syncobj reset mechanism.

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


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

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Sun Nov 28 21:02:30 2021 +0100

radv: Remove syncobj reset mechanism.

Now done with the vulkan runtime.

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

---

 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c     | 139 ++--------------------
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c |   6 -
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h |   5 -
 3 files changed, 9 insertions(+), 141 deletions(-)

diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
index ac14343d106..c7014e53ebe 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
@@ -85,7 +85,6 @@ struct radv_amdgpu_cs {
 
 struct radv_winsys_sem_counts {
    uint32_t syncobj_count;
-   uint32_t syncobj_reset_count; /* for wait only, whether to reset the syncobj */
    uint32_t timeline_syncobj_count;
    uint32_t *syncobj;
    uint64_t *points;
@@ -1248,13 +1247,6 @@ radv_amdgpu_cs_submit_zero(struct radv_amdgpu_ctx *ctx, enum ring_type ring_type
       ctx->queue_syncobj_wait[hw_ip][queue_idx] = true;
    }
 
-   if (sem_info->wait.syncobj_reset_count) {
-      ret = amdgpu_cs_syncobj_reset(ctx->ws->dev, sem_info->wait.syncobj,
-                                    sem_info->wait.syncobj_reset_count);
-      if (ret < 0)
-         return VK_ERROR_DEVICE_LOST;
-   }
-
    for (unsigned i = 0; i < sem_info->signal.syncobj_count; ++i) {
       ret = amdgpu_cs_syncobj_transfer(ctx->ws->dev, sem_info->signal.syncobj[i], 0, queue_syncobj,
                                        0, 0);
@@ -1526,11 +1518,9 @@ radv_amdgpu_ctx_wait_idle(struct radeon_winsys_ctx *rwctx, enum ring_type ring_t
 }
 
 static void *
-radv_amdgpu_cs_alloc_syncobj_chunk(struct radv_winsys_sem_counts *counts,
-                                   const uint32_t *syncobj_override, uint32_t queue_syncobj,
+radv_amdgpu_cs_alloc_syncobj_chunk(struct radv_winsys_sem_counts *counts, uint32_t queue_syncobj,
                                    struct drm_amdgpu_cs_chunk *chunk, int chunk_id)
 {
-   const uint32_t *src = syncobj_override ? syncobj_override : counts->syncobj;
    unsigned count = counts->syncobj_count + (queue_syncobj ? 1 : 0);
    struct drm_amdgpu_cs_chunk_sem *syncobj =
       malloc(sizeof(struct drm_amdgpu_cs_chunk_sem) * count);
@@ -1539,7 +1529,7 @@ radv_amdgpu_cs_alloc_syncobj_chunk(struct radv_winsys_sem_counts *counts,
 
    for (unsigned i = 0; i < counts->syncobj_count; i++) {
       struct drm_amdgpu_cs_chunk_sem *sem = &syncobj[i];
-      sem->handle = src[i];
+      sem->handle = counts->syncobj[i];
    }
 
    if (queue_syncobj)
@@ -1553,11 +1543,9 @@ radv_amdgpu_cs_alloc_syncobj_chunk(struct radv_winsys_sem_counts *counts,
 
 static void *
 radv_amdgpu_cs_alloc_timeline_syncobj_chunk(struct radv_winsys_sem_counts *counts,
-                                            const uint32_t *syncobj_override,
                                             uint32_t queue_syncobj,
                                             struct drm_amdgpu_cs_chunk *chunk, int chunk_id)
 {
-   const uint32_t *src = syncobj_override ? syncobj_override : counts->syncobj;
    uint32_t count =
       counts->syncobj_count + counts->timeline_syncobj_count + (queue_syncobj ? 1 : 0);
    struct drm_amdgpu_cs_chunk_syncobj *syncobj =
@@ -1567,7 +1555,7 @@ radv_amdgpu_cs_alloc_timeline_syncobj_chunk(struct radv_winsys_sem_counts *count
 
    for (unsigned i = 0; i < counts->syncobj_count; i++) {
       struct drm_amdgpu_cs_chunk_syncobj *sem = &syncobj[i];
-      sem->handle = src[i];
+      sem->handle = counts->syncobj[i];
       sem->flags = 0;
       sem->point = 0;
    }
@@ -1591,103 +1579,6 @@ radv_amdgpu_cs_alloc_timeline_syncobj_chunk(struct radv_winsys_sem_counts *count
    return syncobj;
 }
 
-static int
-radv_amdgpu_cache_alloc_syncobjs(struct radv_amdgpu_winsys *ws, unsigned count, uint32_t *dst)
-{
-   pthread_mutex_lock(&ws->syncobj_lock);
-   if (count > ws->syncobj_capacity) {
-      if (ws->syncobj_capacity > UINT32_MAX / 2)
-         goto fail;
-
-      unsigned new_capacity = MAX2(count, ws->syncobj_capacity * 2);
-      uint32_t *n = realloc(ws->syncobj, new_capacity * sizeof(*ws->syncobj));
-      if (!n)
-         goto fail;
-      ws->syncobj_capacity = new_capacity;
-      ws->syncobj = n;
-   }
-
-   while (ws->syncobj_count < count) {
-      int r = amdgpu_cs_create_syncobj(ws->dev, ws->syncobj + ws->syncobj_count);
-      if (r)
-         goto fail;
-      ++ws->syncobj_count;
-   }
-
-   for (unsigned i = 0; i < count; ++i)
-      dst[i] = ws->syncobj[--ws->syncobj_count];
-
-   pthread_mutex_unlock(&ws->syncobj_lock);
-   return 0;
-
-fail:
-   pthread_mutex_unlock(&ws->syncobj_lock);
-   return -ENOMEM;
-}
-
-static void
-radv_amdgpu_cache_free_syncobjs(struct radv_amdgpu_winsys *ws, unsigned count, uint32_t *src)
-{
-   pthread_mutex_lock(&ws->syncobj_lock);
-
-   uint32_t cache_count = MIN2(count, UINT32_MAX - ws->syncobj_count);
-   if (cache_count + ws->syncobj_count > ws->syncobj_capacity) {
-      unsigned new_capacity = MAX2(ws->syncobj_count + cache_count, ws->syncobj_capacity * 2);
-      uint32_t *n = realloc(ws->syncobj, new_capacity * sizeof(*ws->syncobj));
-      if (n) {
-         ws->syncobj_capacity = new_capacity;
-         ws->syncobj = n;
-      }
-   }
-
-   for (unsigned i = 0; i < count; ++i) {
-      if (ws->syncobj_count < ws->syncobj_capacity)
-         ws->syncobj[ws->syncobj_count++] = src[i];
-      else
-         amdgpu_cs_destroy_syncobj(ws->dev, src[i]);
-   }
-
-   pthread_mutex_unlock(&ws->syncobj_lock);
-}
-
-static int
-radv_amdgpu_cs_prepare_syncobjs(struct radv_amdgpu_winsys *ws,
-                                struct radv_winsys_sem_counts *counts, uint32_t **out_syncobjs)
-{
-   int r = 0;
-
-   if (!ws->info.has_timeline_syncobj || !counts->syncobj_count) {
-      *out_syncobjs = NULL;
-      return 0;
-   }
-
-   *out_syncobjs = malloc(counts->syncobj_count * sizeof(**out_syncobjs));
-   if (!*out_syncobjs)
-      return -ENOMEM;
-
-   r = radv_amdgpu_cache_alloc_syncobjs(ws, counts->syncobj_count, *out_syncobjs);
-   if (r)
-      return r;
-
-   for (unsigned i = 0; i < counts->syncobj_count; ++i) {
-      r = amdgpu_cs_syncobj_transfer(ws->dev, (*out_syncobjs)[i], 0, counts->syncobj[i], 0,
-                                     DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT);
-      if (r)
-         goto fail;
-   }
-
-   r = amdgpu_cs_syncobj_reset(ws->dev, counts->syncobj, counts->syncobj_reset_count);
-   if (r)
-      goto fail;
-
-   return 0;
-fail:
-   radv_amdgpu_cache_free_syncobjs(ws, counts->syncobj_count, *out_syncobjs);
-   free(*out_syncobjs);
-   *out_syncobjs = NULL;
-   return r;
-}
-
 static VkResult
 radv_amdgpu_cs_submit(struct radv_amdgpu_ctx *ctx, struct radv_amdgpu_cs_request *request,
                       struct radv_winsys_sem_info *sem_info)
@@ -1700,7 +1591,6 @@ radv_amdgpu_cs_submit(struct radv_amdgpu_ctx *ctx, struct radv_amdgpu_cs_request
    bool use_bo_list_create = ctx->ws->info.drm_minor < 27;
    struct drm_amdgpu_bo_list_in bo_list_in;
    void *wait_syncobj = NULL, *signal_syncobj = NULL;
-   uint32_t *in_syncobjs = NULL;
    int i;
    uint32_t bo_list = 0;
    VkResult result = VK_SUCCESS;
@@ -1754,20 +1644,14 @@ radv_amdgpu_cs_submit(struct radv_amdgpu_ctx *ctx, struct radv_amdgpu_cs_request
 
    if (sem_info->cs_emit_wait && (sem_info->wait.timeline_syncobj_count ||
                                   sem_info->wait.syncobj_count || *queue_syncobj_wait)) {
-      uint32_t queue_wait_syncobj = *queue_syncobj_wait ? queue_syncobj : 0;
-
-      r = radv_amdgpu_cs_prepare_syncobjs(ctx->ws, &sem_info->wait, &in_syncobjs);
-      if (r)
-         goto error_out;
 
       if (ctx->ws->info.has_timeline_syncobj) {
          wait_syncobj = radv_amdgpu_cs_alloc_timeline_syncobj_chunk(
-            &sem_info->wait, in_syncobjs, queue_wait_syncobj, &chunks[num_chunks],
+            &sem_info->wait, queue_syncobj, &chunks[num_chunks],
             AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_WAIT);
       } else {
-         wait_syncobj =
-            radv_amdgpu_cs_alloc_syncobj_chunk(&sem_info->wait, in_syncobjs, queue_wait_syncobj,
-                                               &chunks[num_chunks], AMDGPU_CHUNK_ID_SYNCOBJ_IN);
+         wait_syncobj = radv_amdgpu_cs_alloc_syncobj_chunk(
+            &sem_info->wait, queue_syncobj, &chunks[num_chunks], AMDGPU_CHUNK_ID_SYNCOBJ_IN);
       }
       if (!wait_syncobj) {
          result = VK_ERROR_OUT_OF_HOST_MEMORY;
@@ -1782,12 +1666,11 @@ radv_amdgpu_cs_submit(struct radv_amdgpu_ctx *ctx, struct radv_amdgpu_cs_request
    if (sem_info->cs_emit_signal) {
       if (ctx->ws->info.has_timeline_syncobj) {
          signal_syncobj = radv_amdgpu_cs_alloc_timeline_syncobj_chunk(
-            &sem_info->signal, NULL, queue_syncobj, &chunks[num_chunks],
+            &sem_info->signal, queue_syncobj, &chunks[num_chunks],
             AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_SIGNAL);
       } else {
-         signal_syncobj =
-            radv_amdgpu_cs_alloc_syncobj_chunk(&sem_info->signal, NULL, queue_syncobj,
-                                               &chunks[num_chunks], AMDGPU_CHUNK_ID_SYNCOBJ_OUT);
+         signal_syncobj = radv_amdgpu_cs_alloc_syncobj_chunk(
+            &sem_info->signal, queue_syncobj, &chunks[num_chunks], AMDGPU_CHUNK_ID_SYNCOBJ_OUT);
       }
       if (!signal_syncobj) {
          result = VK_ERROR_OUT_OF_HOST_MEMORY;
@@ -1848,10 +1731,6 @@ radv_amdgpu_cs_submit(struct radv_amdgpu_ctx *ctx, struct radv_amdgpu_cs_request
       amdgpu_bo_list_destroy_raw(ctx->ws->dev, bo_list);
 
 error_out:
-   if (in_syncobjs) {
-      radv_amdgpu_cache_free_syncobjs(ctx->ws, sem_info->wait.syncobj_count, in_syncobjs);
-      free(in_syncobjs);
-   }
    free(chunks);
    free(chunk_data);
    free(wait_syncobj);
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c
index 2f8d04e779e..122447b4055 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c
@@ -164,17 +164,12 @@ radv_amdgpu_winsys_destroy(struct radeon_winsys *rws)
    if (!destroy)
       return;
 
-   for (unsigned i = 0; i < ws->syncobj_count; ++i)
-      amdgpu_cs_destroy_syncobj(ws->dev, ws->syncobj[i]);
-   free(ws->syncobj);
-
    u_rwlock_destroy(&ws->global_bo_list.lock);
    free(ws->global_bo_list.bos);
 
    if (ws->reserve_vmid)
       amdgpu_vm_unreserve_vmid(ws->dev, 0);
 
-   pthread_mutex_destroy(&ws->syncobj_lock);
    u_rwlock_destroy(&ws->log_bo_list_lock);
    ac_addrlib_destroy(ws->addrlib);
    amdgpu_device_deinitialize(ws->dev);
@@ -266,7 +261,6 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags,
    u_rwlock_init(&ws->global_bo_list.lock);
    list_inithead(&ws->log_bo_list);
    u_rwlock_init(&ws->log_bo_list_lock);
-   pthread_mutex_init(&ws->syncobj_lock, NULL);
    ws->base.query_info = radv_amdgpu_winsys_query_info;
    ws->base.query_value = radv_amdgpu_winsys_query_value;
    ws->base.read_registers = radv_amdgpu_winsys_read_registers;
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h
index b40a75d93f0..18b3761679f 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h
@@ -65,11 +65,6 @@ struct radv_amdgpu_winsys {
       struct u_rwlock lock;
    } global_bo_list;
 
-   /* syncobj cache */
-   pthread_mutex_t syncobj_lock;
-   uint32_t *syncobj;
-   uint32_t syncobj_count, syncobj_capacity;
-
    /* BO log */
    struct u_rwlock log_bo_list_lock;
    struct list_head log_bo_list;



More information about the mesa-commit mailing list