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.mohanmarimuthu@amd.com>
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26547>
This commit is contained in:
Marek Olšák 2023-12-03 19:54:40 -05:00 committed by Marge Bot
parent 05ba3c9cc5
commit 378984b994
2 changed files with 45 additions and 51 deletions

View file

@ -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);

View file

@ -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,