mirror of https://gitlab.freedesktop.org/mesa/mesa
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:
parent
67d772b112
commit
806281f61f
|
@ -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);
|
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
|
void
|
||||||
anv_bo_pool_init(struct anv_bo_pool *pool, struct anv_device *device,
|
anv_bo_pool_init(struct anv_bo_pool *pool, struct anv_device *device,
|
||||||
const char *name, enum anv_bo_alloc_flags alloc_flags)
|
const char *name, enum anv_bo_alloc_flags alloc_flags)
|
||||||
|
|
|
@ -752,6 +752,21 @@ struct anv_state_reserved_pool {
|
||||||
uint32_t count;
|
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_stream {
|
||||||
struct anv_state_pool *state_pool;
|
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,
|
void anv_state_reserved_pool_free(struct anv_state_reserved_pool *pool,
|
||||||
struct anv_state state);
|
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,
|
VkResult anv_state_table_init(struct anv_state_table *table,
|
||||||
struct anv_device *device,
|
struct anv_device *device,
|
||||||
uint32_t initial_entries);
|
uint32_t initial_entries);
|
||||||
|
|
Loading…
Reference in New Issue