anv: add a new reserved pool for capture/release

Reviewed-by: Ivan Briano <ivan.briano@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28708>
This commit is contained in:
Lionel Landwerlin 2024-04-11 21:26:58 +03:00 committed by Marge Bot
parent 67d772b112
commit 806281f61f
2 changed files with 123 additions and 0 deletions

View File

@ -1107,6 +1107,100 @@ anv_state_reserved_pool_free(struct anv_state_reserved_pool *pool,
anv_free_list_push(&pool->reserved_blocks, &pool->pool->table, state.idx, 1);
}
VkResult
anv_state_reserved_array_pool_init(struct anv_state_reserved_array_pool *pool,
struct anv_state_pool *parent,
uint32_t count, uint32_t size, uint32_t alignment)
{
pool->pool = parent;
pool->count = count;
pool->size = size;
pool->stride = align(size, alignment);
pool->states = vk_zalloc(&pool->pool->block_pool.device->vk.alloc,
sizeof(BITSET_WORD) * BITSET_WORDS(pool->count), 8,
VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
if (pool->states == NULL)
return VK_ERROR_OUT_OF_HOST_MEMORY;
BITSET_SET_RANGE(pool->states, 0, pool->count - 1);
simple_mtx_init(&pool->mutex, mtx_plain);
pool->state = anv_state_pool_alloc(pool->pool, pool->stride * count, alignment);
return VK_SUCCESS;
}
void
anv_state_reserved_array_pool_finish(struct anv_state_reserved_array_pool *pool)
{
anv_state_pool_free(pool->pool, pool->state);
vk_free(&pool->pool->block_pool.device->vk.alloc, pool->states);
simple_mtx_destroy(&pool->mutex);
}
struct anv_state
anv_state_reserved_array_pool_alloc(struct anv_state_reserved_array_pool *pool,
bool alloc_back)
{
simple_mtx_lock(&pool->mutex);
int idx = alloc_back ?
__bitset_last_bit(pool->states, BITSET_WORDS(pool->count)) :
__bitset_ffs(pool->states, BITSET_WORDS(pool->count));
if (idx != 0)
BITSET_CLEAR(pool->states, idx - 1);
simple_mtx_unlock(&pool->mutex);
if (idx == 0)
return ANV_STATE_NULL;
idx--;
struct anv_state state = pool->state;
state.offset += idx * pool->stride;
state.map += idx * pool->stride;
state.alloc_size = pool->size;
return state;
}
struct anv_state
anv_state_reserved_array_pool_alloc_index(struct anv_state_reserved_array_pool *pool,
uint32_t idx)
{
simple_mtx_lock(&pool->mutex);
bool already_allocated = !BITSET_TEST(pool->states, idx);
if (!already_allocated)
BITSET_CLEAR(pool->states, idx);
simple_mtx_unlock(&pool->mutex);
if (already_allocated)
return ANV_STATE_NULL;
struct anv_state state = pool->state;
state.offset += idx * pool->stride;
state.map += idx * pool->stride;
state.alloc_size = pool->size;
return state;
}
uint32_t
anv_state_reserved_array_pool_state_index(struct anv_state_reserved_array_pool *pool,
struct anv_state state)
{
return (state.offset - pool->state.offset) / pool->stride;
}
void
anv_state_reserved_array_pool_free(struct anv_state_reserved_array_pool *pool,
struct anv_state state)
{
unsigned idx = (state.offset - pool->state.offset) / pool->stride;
simple_mtx_lock(&pool->mutex);
BITSET_SET(pool->states, idx);
simple_mtx_unlock(&pool->mutex);
}
void
anv_bo_pool_init(struct anv_bo_pool *pool, struct anv_device *device,
const char *name, enum anv_bo_alloc_flags alloc_flags)

View File

@ -752,6 +752,21 @@ struct anv_state_reserved_pool {
uint32_t count;
};
struct anv_state_reserved_array_pool {
struct anv_state_pool *pool;
simple_mtx_t mutex;
/* Bitfield of usable elements */
BITSET_WORD *states;
/* Backing store */
struct anv_state state;
/* Number of elements */
uint32_t count;
/* Stride between each element */
uint32_t stride;
/* Size of each element */
uint32_t size;
};
struct anv_state_stream {
struct anv_state_pool *state_pool;
@ -871,6 +886,20 @@ struct anv_state anv_state_reserved_pool_alloc(struct anv_state_reserved_pool *p
void anv_state_reserved_pool_free(struct anv_state_reserved_pool *pool,
struct anv_state state);
VkResult anv_state_reserved_array_pool_init(struct anv_state_reserved_array_pool *pool,
struct anv_state_pool *parent,
uint32_t count, uint32_t size,
uint32_t alignment);
void anv_state_reserved_array_pool_finish(struct anv_state_reserved_array_pool *pool);
struct anv_state anv_state_reserved_array_pool_alloc(struct anv_state_reserved_array_pool *pool,
bool alloc_back);
struct anv_state anv_state_reserved_array_pool_alloc_index(struct anv_state_reserved_array_pool *pool,
unsigned idx);
uint32_t anv_state_reserved_array_pool_state_index(struct anv_state_reserved_array_pool *pool,
struct anv_state state);
void anv_state_reserved_array_pool_free(struct anv_state_reserved_array_pool *pool,
struct anv_state state);
VkResult anv_state_table_init(struct anv_state_table *table,
struct anv_device *device,
uint32_t initial_entries);