Module: Mesa Branch: main Commit: 378984b994d352dc38da9824e3f1c4cf40833350 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=378984b994d352dc38da9824e3f1c4cf40833350
Author: Marek Olšák <marek.ol...@amd.com> Date: Sun Dec 3 19:54:40 2023 -0500 winsys/amdgpu: return amdgpu_cs_buffer* from add/lookup_buffer instead of index because we only use the index to get amdgpu_cs_buffer. 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 | 78 ++++++++++++++++--------------- src/gallium/winsys/amdgpu/drm/amdgpu_cs.h | 18 ++----- 2 files changed, 45 insertions(+), 51 deletions(-) diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c index bc138eb5988..b65b967142b 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c @@ -550,8 +550,9 @@ static inline unsigned amdgpu_cs_epilog_dws(struct amdgpu_cs *cs) return 0; } -static int amdgpu_lookup_buffer(struct amdgpu_cs_context *cs, struct amdgpu_winsys_bo *bo, - struct amdgpu_buffer_list *list) +static struct amdgpu_cs_buffer * +amdgpu_lookup_buffer(struct amdgpu_cs_context *cs, struct amdgpu_winsys_bo *bo, + struct amdgpu_buffer_list *list) { unsigned num_buffers = list->num_buffers; struct amdgpu_cs_buffer *buffers = list->buffers; @@ -559,8 +560,11 @@ static int amdgpu_lookup_buffer(struct amdgpu_cs_context *cs, struct amdgpu_wins int i = cs->buffer_indices_hashlist[hash]; /* not found or found */ - if (i < 0 || (i < num_buffers && buffers[i].bo == bo)) - return i; + if (i < 0) + return NULL; + + if (i < num_buffers && buffers[i].bo == bo) + return &buffers[i]; /* Hash collision, look for the BO in the list of buffers linearly. */ for (int i = num_buffers - 1; i >= 0; i--) { @@ -575,18 +579,19 @@ static int amdgpu_lookup_buffer(struct amdgpu_cs_context *cs, struct amdgpu_wins * will collide here: ^ and here: ^, * meaning that we should get very few collisions in the end. */ cs->buffer_indices_hashlist[hash] = i & 0x7fff; - return i; + return &buffers[i]; } } - return -1; + return NULL; } -int amdgpu_lookup_buffer_any_type(struct amdgpu_cs_context *cs, struct amdgpu_winsys_bo *bo) +struct amdgpu_cs_buffer * +amdgpu_lookup_buffer_any_type(struct amdgpu_cs_context *cs, struct amdgpu_winsys_bo *bo) { return amdgpu_lookup_buffer(cs, bo, &cs->buffer_lists[get_buf_list_idx(bo)]); } -static int +static struct amdgpu_cs_buffer * amdgpu_do_add_buffer(struct amdgpu_cs_context *cs, struct amdgpu_winsys_bo *bo, struct amdgpu_buffer_list *list) { @@ -600,7 +605,7 @@ amdgpu_do_add_buffer(struct amdgpu_cs_context *cs, struct amdgpu_winsys_bo *bo, new_max * sizeof(*new_buffers)); if (!new_buffers) { fprintf(stderr, "amdgpu_do_add_buffer: allocation failed\n"); - return 0; + return NULL; } list->max_buffers = new_max; @@ -616,36 +621,37 @@ amdgpu_do_add_buffer(struct amdgpu_cs_context *cs, struct amdgpu_winsys_bo *bo, unsigned hash = bo->unique_id & (BUFFER_HASHLIST_SIZE-1); cs->buffer_indices_hashlist[hash] = idx & 0x7fff; - return idx; + return buffer; } -static int +static struct amdgpu_cs_buffer * amdgpu_lookup_or_add_buffer(struct amdgpu_cs_context *cs, struct amdgpu_winsys_bo *bo, enum amdgpu_bo_type type) { struct amdgpu_buffer_list *list = &cs->buffer_lists[type]; - int idx = amdgpu_lookup_buffer(cs, bo, list); + struct amdgpu_cs_buffer *buffer = amdgpu_lookup_buffer(cs, bo, list); - return idx >= 0 ? idx : amdgpu_do_add_buffer(cs, bo, list); + return buffer ? buffer : amdgpu_do_add_buffer(cs, bo, list); } -static int +static struct amdgpu_cs_buffer * amdgpu_lookup_or_add_slab_buffer(struct amdgpu_cs_context *cs, struct amdgpu_winsys_bo *bo) { struct amdgpu_buffer_list *list = &cs->buffer_lists[AMDGPU_BO_SLAB]; - int idx = amdgpu_lookup_buffer(cs, bo, list); + struct amdgpu_cs_buffer *buffer = amdgpu_lookup_buffer(cs, bo, list); - if (idx >= 0) - return idx; + if (buffer) + return buffer; - int real_idx = amdgpu_lookup_or_add_buffer(cs, &get_slab_bo(bo)->real->b, AMDGPU_BO_REAL); - if (real_idx < 0) - return -1; + struct amdgpu_cs_buffer *real_buffer = + amdgpu_lookup_or_add_buffer(cs, &get_slab_bo(bo)->real->b, AMDGPU_BO_REAL); + if (!real_buffer) + return NULL; - idx = amdgpu_do_add_buffer(cs, bo, list); - if (idx >= 0) - cs->buffer_lists[AMDGPU_BO_SLAB].buffers[idx].slab_real_idx = real_idx; - return idx; + buffer = amdgpu_do_add_buffer(cs, bo, list); + if (buffer) + buffer->slab_real_idx = real_buffer - cs->buffer_lists[AMDGPU_BO_REAL].buffers; + return buffer; } static unsigned amdgpu_cs_add_buffer(struct radeon_cmdbuf *rcs, @@ -669,25 +675,20 @@ static unsigned amdgpu_cs_add_buffer(struct radeon_cmdbuf *rcs, return 0; if (bo->type == AMDGPU_BO_SLAB) { - int index = amdgpu_lookup_or_add_slab_buffer(cs, bo); - if (index < 0) + buffer = amdgpu_lookup_or_add_slab_buffer(cs, bo); + if (!buffer) return 0; - buffer = &cs->buffer_lists[AMDGPU_BO_SLAB].buffers[index]; 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_buffer(cs, bo, AMDGPU_BO_REAL); - if (index < 0) + buffer = amdgpu_lookup_or_add_buffer(cs, bo, AMDGPU_BO_REAL); + if (!buffer) return 0; - - buffer = &cs->buffer_lists[AMDGPU_BO_REAL].buffers[index]; } else { - int index = amdgpu_lookup_or_add_buffer(cs, bo, AMDGPU_BO_SPARSE); - if (index < 0) + buffer = amdgpu_lookup_or_add_buffer(cs, bo, AMDGPU_BO_SPARSE); + if (!buffer) return 0; - - buffer = &cs->buffer_lists[AMDGPU_BO_SPARSE].buffers[index]; } buffer->usage |= usage; @@ -1354,14 +1355,15 @@ static bool amdgpu_add_sparse_backing_buffers(struct amdgpu_cs_context *cs) /* We can directly add the buffer here, because we know that each * backing buffer occurs only once. */ - int idx = amdgpu_do_add_real_buffer(cs, &backing->bo->b); - if (idx < 0) { + struct amdgpu_cs_buffer *real_buffer = + amdgpu_do_add_buffer(cs, &backing->bo->b, &cs->buffer_lists[AMDGPU_BO_REAL]); + if (!real_buffer) { fprintf(stderr, "%s: failed to add buffer\n", __func__); simple_mtx_unlock(&bo->lock); return false; } - cs->buffer_lists[AMDGPU_BO_REAL].buffers[idx].usage = buffer->usage; + real_buffer->usage = buffer->usage; } simple_mtx_unlock(&bo->lock); diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h index c1ae663c0db..81ab171deaf 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h @@ -201,7 +201,8 @@ static inline void amdgpu_fence_reference(struct pipe_fence_handle **dst, *adst = asrc; } -int amdgpu_lookup_buffer_any_type(struct amdgpu_cs_context *cs, struct amdgpu_winsys_bo *bo); +struct amdgpu_cs_buffer * +amdgpu_lookup_buffer_any_type(struct amdgpu_cs_context *cs, struct amdgpu_winsys_bo *bo); static inline struct amdgpu_cs * amdgpu_cs(struct radeon_cmdbuf *rcs) @@ -218,7 +219,7 @@ static inline bool amdgpu_bo_is_referenced_by_cs(struct amdgpu_cs *cs, struct amdgpu_winsys_bo *bo) { - return amdgpu_lookup_buffer_any_type(cs->csc, bo) != -1; + return amdgpu_lookup_buffer_any_type(cs->csc, bo) != NULL; } static inline unsigned get_buf_list_idx(struct amdgpu_winsys_bo *bo) @@ -233,18 +234,9 @@ amdgpu_bo_is_referenced_by_cs_with_usage(struct amdgpu_cs *cs, struct amdgpu_winsys_bo *bo, unsigned usage) { - int index; - struct amdgpu_cs_buffer *buffer; + struct amdgpu_cs_buffer *buffer = amdgpu_lookup_buffer_any_type(cs->csc, bo); - index = amdgpu_lookup_buffer_any_type(cs->csc, bo); - if (index == -1) - return false; - - buffer = is_real_bo(bo) ? &cs->csc->buffer_lists[AMDGPU_BO_REAL].buffers[index] : - bo->base.usage & RADEON_FLAG_SPARSE ? &cs->csc->buffer_lists[AMDGPU_BO_SPARSE].buffers[index] : - &cs->csc->buffer_lists[AMDGPU_BO_SLAB].buffers[index]; - - return (buffer->usage & usage) != 0; + return buffer && (buffer->usage & usage) != 0; } bool amdgpu_fence_wait(struct pipe_fence_handle *fence, uint64_t timeout,