mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-17 15:40:20 +01:00
radv: Add locking to radv_replay_shader_arena_block
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29169>
This commit is contained in:
parent
c31038ef98
commit
28be0cca45
1 changed files with 12 additions and 9 deletions
|
|
@ -1177,21 +1177,21 @@ radv_replay_shader_arena_block(struct radv_device *device, const struct radv_ser
|
||||||
void *ptr)
|
void *ptr)
|
||||||
{
|
{
|
||||||
mtx_lock(&device->shader_arena_mutex);
|
mtx_lock(&device->shader_arena_mutex);
|
||||||
|
|
||||||
|
union radv_shader_arena_block *ret_block = NULL;
|
||||||
|
|
||||||
uint64_t va = src->arena_va;
|
uint64_t va = src->arena_va;
|
||||||
void *data = _mesa_hash_table_u64_search(device->capture_replay_arena_vas, va);
|
void *data = _mesa_hash_table_u64_search(device->capture_replay_arena_vas, va);
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
struct radv_shader_arena *arena = radv_create_shader_arena(device, NULL, 0, src->arena_size, true, src->arena_va);
|
struct radv_shader_arena *arena = radv_create_shader_arena(device, NULL, 0, src->arena_size, true, src->arena_va);
|
||||||
if (!arena) {
|
if (!arena)
|
||||||
mtx_unlock(&device->shader_arena_mutex);
|
goto out;
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
_mesa_hash_table_u64_insert(device->capture_replay_arena_vas, src->arena_va, arena);
|
_mesa_hash_table_u64_insert(device->capture_replay_arena_vas, src->arena_va, arena);
|
||||||
list_addtail(&arena->list, &device->shader_arenas);
|
list_addtail(&arena->list, &device->shader_arenas);
|
||||||
data = arena;
|
data = arena;
|
||||||
}
|
}
|
||||||
mtx_unlock(&device->shader_arena_mutex);
|
|
||||||
|
|
||||||
uint32_t block_begin = src->offset;
|
uint32_t block_begin = src->offset;
|
||||||
uint32_t block_end = src->offset + src->size;
|
uint32_t block_end = src->offset + src->size;
|
||||||
|
|
@ -1210,17 +1210,20 @@ radv_replay_shader_arena_block(struct radv_device *device, const struct radv_ser
|
||||||
|
|
||||||
/* If another allocated block overlaps the current replay block, allocation is impossible */
|
/* If another allocated block overlaps the current replay block, allocation is impossible */
|
||||||
if (hole_begin > block_begin)
|
if (hole_begin > block_begin)
|
||||||
return NULL;
|
goto out;
|
||||||
|
|
||||||
union radv_shader_arena_block *block = insert_block(device, hole, block_begin - hole_begin, src->size, NULL);
|
union radv_shader_arena_block *block = insert_block(device, hole, block_begin - hole_begin, src->size, NULL);
|
||||||
if (!block)
|
if (!block)
|
||||||
return NULL;
|
goto out;
|
||||||
|
|
||||||
block->freelist.prev = NULL;
|
block->freelist.prev = NULL;
|
||||||
block->freelist.next = ptr;
|
block->freelist.next = ptr;
|
||||||
return hole;
|
break;
|
||||||
}
|
}
|
||||||
return NULL;
|
|
||||||
|
out:
|
||||||
|
mtx_unlock(&device->shader_arena_mutex);
|
||||||
|
return ret_block;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue