diff options
author | Iván Briano <[email protected]> | 2020-04-22 17:17:38 -0700 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-05-13 23:20:50 +0000 |
commit | 5b07f142d7fae956aea55082d4b3d8e5a3d3cfb8 (patch) | |
tree | b3fe9e58554dc177e861a055017cbb3ad7d9e98f | |
parent | 32d631dcd250bdfa0c8089921b50544988ee8f8b (diff) |
anv: Add a way to reserve states from a pool
Reviewed-by: Jason Ekstrand <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4898>
-rw-r--r-- | src/intel/vulkan/anv_allocator.c | 40 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 15 |
2 files changed, 55 insertions, 0 deletions
diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c index 9d90311d7df..703fa309aac 100644 --- a/src/intel/vulkan/anv_allocator.c +++ b/src/intel/vulkan/anv_allocator.c @@ -1269,6 +1269,46 @@ anv_state_stream_alloc(struct anv_state_stream *stream, } void +anv_state_reserved_pool_init(struct anv_state_reserved_pool *pool, + struct anv_state_pool *parent, + uint32_t count, uint32_t size, uint32_t alignment) +{ + pool->pool = parent; + pool->reserved_blocks = ANV_FREE_LIST_EMPTY; + pool->count = count; + + for (unsigned i = 0; i < count; i++) { + struct anv_state state = anv_state_pool_alloc(pool->pool, size, alignment); + anv_free_list_push(&pool->reserved_blocks, &pool->pool->table, state.idx, 1); + } +} + +void +anv_state_reserved_pool_finish(struct anv_state_reserved_pool *pool) +{ + struct anv_state *state; + + while ((state = anv_free_list_pop(&pool->reserved_blocks, &pool->pool->table))) { + anv_state_pool_free(pool->pool, *state); + pool->count--; + } + assert(pool->count == 0); +} + +struct anv_state +anv_state_reserved_pool_alloc(struct anv_state_reserved_pool *pool) +{ + return *anv_free_list_pop(&pool->reserved_blocks, &pool->pool->table); +} + +void +anv_state_reserved_pool_free(struct anv_state_reserved_pool *pool, + struct anv_state state) +{ + anv_free_list_push(&pool->reserved_blocks, &pool->pool->table, state.idx, 1); +} + +void anv_bo_pool_init(struct anv_bo_pool *pool, struct anv_device *device) { pool->device = device; diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index e2e33c96d08..e2914a2800f 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -897,6 +897,12 @@ struct anv_state_pool { struct anv_fixed_size_state_pool buckets[ANV_STATE_BUCKETS]; }; +struct anv_state_reserved_pool { + struct anv_state_pool *pool; + union anv_free_list reserved_blocks; + uint32_t count; +}; + struct anv_state_stream { struct anv_state_pool *state_pool; @@ -945,6 +951,15 @@ void anv_state_stream_finish(struct anv_state_stream *stream); struct anv_state anv_state_stream_alloc(struct anv_state_stream *stream, uint32_t size, uint32_t alignment); +void anv_state_reserved_pool_init(struct anv_state_reserved_pool *pool, + struct anv_state_pool *parent, + uint32_t count, uint32_t size, + uint32_t alignment); +void anv_state_reserved_pool_finish(struct anv_state_reserved_pool *pool); +struct anv_state anv_state_reserved_pool_alloc(struct anv_state_reserved_pool *pool); +void anv_state_reserved_pool_free(struct anv_state_reserved_pool *pool, + struct anv_state state); + VkResult anv_state_table_init(struct anv_state_table *table, struct anv_device *device, uint32_t initial_entries); |