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

Author: Marek Olšák <marek.ol...@amd.com>
Date:   Sun Dec  3 20:11:52 2023 -0500

winsys/amdgpu: clean up duplicated code around amdgpu_lookup/add_buffer

The function for real, slab, and sparse buffers can be unified, mostly.

Reviewed-by: Yogesh Mohan Marimuthu <yogesh.mohanmarimu...@amd.com>
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-pra...@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26547>

---

 src/gallium/winsys/amdgpu/drm/amdgpu_cs.c | 139 ++++++------------------------
 1 file changed, 25 insertions(+), 114 deletions(-)

diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c 
b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
index d1b2c5dabf7..bc138eb5988 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
@@ -587,153 +587,64 @@ int amdgpu_lookup_buffer_any_type(struct 
amdgpu_cs_context *cs, struct amdgpu_wi
 }
 
 static int
-amdgpu_do_add_real_buffer(struct amdgpu_cs_context *cs,
-                          struct amdgpu_winsys_bo *bo)
+amdgpu_do_add_buffer(struct amdgpu_cs_context *cs, struct amdgpu_winsys_bo *bo,
+                     struct amdgpu_buffer_list *list)
 {
-   struct amdgpu_cs_buffer *buffer;
-   int idx;
-
    /* New buffer, check if the backing array is large enough. */
-   if (cs->buffer_lists[AMDGPU_BO_REAL].num_buffers >=
-       cs->buffer_lists[AMDGPU_BO_REAL].max_buffers) {
+   if (list->num_buffers >= list->max_buffers) {
       unsigned new_max =
-         MAX2(cs->buffer_lists[AMDGPU_BO_REAL].max_buffers + 16,
-              (unsigned)(cs->buffer_lists[AMDGPU_BO_REAL].max_buffers * 1.3));
+         MAX2(list->max_buffers + 16, (unsigned)(list->max_buffers * 1.3));
       struct amdgpu_cs_buffer *new_buffers;
 
-      new_buffers = MALLOC(new_max * sizeof(*new_buffers));
-
+      new_buffers = REALLOC(list->buffers, list->max_buffers * 
sizeof(*new_buffers),
+                            new_max * sizeof(*new_buffers));
       if (!new_buffers) {
          fprintf(stderr, "amdgpu_do_add_buffer: allocation failed\n");
-         FREE(new_buffers);
-         return -1;
+         return 0;
       }
 
-      memcpy(new_buffers, cs->buffer_lists[AMDGPU_BO_REAL].buffers,
-             cs->buffer_lists[AMDGPU_BO_REAL].num_buffers * 
sizeof(*new_buffers));
-
-      FREE(cs->buffer_lists[AMDGPU_BO_REAL].buffers);
-
-      cs->buffer_lists[AMDGPU_BO_REAL].max_buffers = new_max;
-      cs->buffer_lists[AMDGPU_BO_REAL].buffers = new_buffers;
+      list->max_buffers = new_max;
+      list->buffers = new_buffers;
    }
 
-   idx = cs->buffer_lists[AMDGPU_BO_REAL].num_buffers;
-   buffer = &cs->buffer_lists[AMDGPU_BO_REAL].buffers[idx];
+   int idx = list->num_buffers;
+   struct amdgpu_cs_buffer *buffer = &list->buffers[idx];
 
    memset(buffer, 0, sizeof(*buffer));
    amdgpu_winsys_bo_reference(cs->ws, &buffer->bo, bo);
-   cs->buffer_lists[AMDGPU_BO_REAL].num_buffers++;
+   list->num_buffers++;
 
+   unsigned hash = bo->unique_id & (BUFFER_HASHLIST_SIZE-1);
+   cs->buffer_indices_hashlist[hash] = idx & 0x7fff;
    return idx;
 }
 
 static int
-amdgpu_lookup_or_add_real_buffer(struct amdgpu_cs_context *cs, struct 
amdgpu_winsys_bo *bo)
+amdgpu_lookup_or_add_buffer(struct amdgpu_cs_context *cs, struct 
amdgpu_winsys_bo *bo,
+                            enum amdgpu_bo_type type)
 {
-   unsigned hash;
-   struct amdgpu_buffer_list *list = &cs->buffer_lists[AMDGPU_BO_REAL];
+   struct amdgpu_buffer_list *list = &cs->buffer_lists[type];
    int idx = amdgpu_lookup_buffer(cs, bo, list);
 
-   if (idx >= 0)
-      return idx;
-
-   idx = amdgpu_do_add_real_buffer(cs, bo);
-
-   hash = bo->unique_id & (BUFFER_HASHLIST_SIZE-1);
-   cs->buffer_indices_hashlist[hash] = idx & 0x7fff;
-   return idx;
+   return idx >= 0 ? idx : amdgpu_do_add_buffer(cs, bo, list);
 }
 
-static int amdgpu_lookup_or_add_slab_buffer(struct amdgpu_cs_context *cs,
-                                            struct amdgpu_winsys_bo *bo)
+static int
+amdgpu_lookup_or_add_slab_buffer(struct amdgpu_cs_context *cs, struct 
amdgpu_winsys_bo *bo)
 {
-   struct amdgpu_cs_buffer *buffer;
-   unsigned hash;
    struct amdgpu_buffer_list *list = &cs->buffer_lists[AMDGPU_BO_SLAB];
    int idx = amdgpu_lookup_buffer(cs, bo, list);
 
    if (idx >= 0)
       return idx;
 
-   int real_idx = amdgpu_lookup_or_add_real_buffer(cs, 
&get_slab_bo(bo)->real->b);
+   int real_idx = amdgpu_lookup_or_add_buffer(cs, &get_slab_bo(bo)->real->b, 
AMDGPU_BO_REAL);
    if (real_idx < 0)
       return -1;
 
-   /* New buffer, check if the backing array is large enough. */
-   if (cs->buffer_lists[AMDGPU_BO_SLAB].num_buffers >=
-       cs->buffer_lists[AMDGPU_BO_SLAB].max_buffers) {
-      unsigned new_max =
-         MAX2(cs->buffer_lists[AMDGPU_BO_SLAB].max_buffers + 16,
-              (unsigned)(cs->buffer_lists[AMDGPU_BO_SLAB].max_buffers * 1.3));
-      struct amdgpu_cs_buffer *new_buffers;
-
-      new_buffers = REALLOC(cs->buffer_lists[AMDGPU_BO_SLAB].buffers,
-                            cs->buffer_lists[AMDGPU_BO_SLAB].max_buffers * 
sizeof(*new_buffers),
-                            new_max * sizeof(*new_buffers));
-      if (!new_buffers) {
-         fprintf(stderr, "amdgpu_lookup_or_add_slab_buffer: allocation 
failed\n");
-         return -1;
-      }
-
-      cs->buffer_lists[AMDGPU_BO_SLAB].max_buffers = new_max;
-      cs->buffer_lists[AMDGPU_BO_SLAB].buffers = new_buffers;
-   }
-
-   idx = cs->buffer_lists[AMDGPU_BO_SLAB].num_buffers;
-   buffer = &cs->buffer_lists[AMDGPU_BO_SLAB].buffers[idx];
-
-   memset(buffer, 0, sizeof(*buffer));
-   amdgpu_winsys_bo_reference(cs->ws, &buffer->bo, bo);
-   buffer->slab_real_idx = real_idx;
-   cs->buffer_lists[AMDGPU_BO_SLAB].num_buffers++;
-
-   hash = bo->unique_id & (BUFFER_HASHLIST_SIZE-1);
-   cs->buffer_indices_hashlist[hash] = idx & 0x7fff;
-
-   return idx;
-}
-
-static int amdgpu_lookup_or_add_sparse_buffer(struct amdgpu_cs_context *cs,
-                                              struct amdgpu_winsys_bo *bo)
-{
-   struct amdgpu_cs_buffer *buffer;
-   unsigned hash;
-   struct amdgpu_buffer_list *list = &cs->buffer_lists[AMDGPU_BO_SPARSE];
-   int idx = amdgpu_lookup_buffer(cs, bo, list);
-
+   idx = amdgpu_do_add_buffer(cs, bo, list);
    if (idx >= 0)
-      return idx;
-
-   /* New buffer, check if the backing array is large enough. */
-   if (cs->buffer_lists[AMDGPU_BO_SPARSE].num_buffers >=
-       cs->buffer_lists[AMDGPU_BO_SPARSE].max_buffers) {
-      unsigned new_max =
-         MAX2(cs->buffer_lists[AMDGPU_BO_SPARSE].max_buffers + 16,
-              (unsigned)(cs->buffer_lists[AMDGPU_BO_SPARSE].max_buffers * 
1.3));
-      struct amdgpu_cs_buffer *new_buffers;
-
-      new_buffers = REALLOC(cs->buffer_lists[AMDGPU_BO_SPARSE].buffers,
-                            cs->buffer_lists[AMDGPU_BO_SPARSE].max_buffers * 
sizeof(*new_buffers),
-                            new_max * sizeof(*new_buffers));
-      if (!new_buffers) {
-         fprintf(stderr, "amdgpu_lookup_or_add_sparse_buffer: allocation 
failed\n");
-         return -1;
-      }
-
-      cs->buffer_lists[AMDGPU_BO_SPARSE].max_buffers = new_max;
-      cs->buffer_lists[AMDGPU_BO_SPARSE].buffers = new_buffers;
-   }
-
-   idx = cs->buffer_lists[AMDGPU_BO_SPARSE].num_buffers;
-   buffer = &cs->buffer_lists[AMDGPU_BO_SPARSE].buffers[idx];
-
-   memset(buffer, 0, sizeof(*buffer));
-   amdgpu_winsys_bo_reference(cs->ws, &buffer->bo, bo);
-   cs->buffer_lists[AMDGPU_BO_SPARSE].num_buffers++;
-
-   hash = bo->unique_id & (BUFFER_HASHLIST_SIZE-1);
-   cs->buffer_indices_hashlist[hash] = idx & 0x7fff;
+      cs->buffer_lists[AMDGPU_BO_SLAB].buffers[idx].slab_real_idx = real_idx;
    return idx;
 }
 
@@ -766,13 +677,13 @@ static unsigned amdgpu_cs_add_buffer(struct radeon_cmdbuf 
*rcs,
       cs->buffer_lists[AMDGPU_BO_REAL].buffers[buffer->slab_real_idx].usage |=
          usage & ~RADEON_USAGE_SYNCHRONIZED;
    } else if (is_real_bo(bo)) {
-      int index = amdgpu_lookup_or_add_real_buffer(cs, bo);
+      int index = amdgpu_lookup_or_add_buffer(cs, bo, AMDGPU_BO_REAL);
       if (index < 0)
          return 0;
 
       buffer = &cs->buffer_lists[AMDGPU_BO_REAL].buffers[index];
    } else {
-      int index = amdgpu_lookup_or_add_sparse_buffer(cs, bo);
+      int index = amdgpu_lookup_or_add_buffer(cs, bo, AMDGPU_BO_SPARSE);
       if (index < 0)
          return 0;
 

Reply via email to