aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2017-04-24 02:17:43 -0700
committerJason Ekstrand <[email protected]>2017-05-04 19:07:54 -0700
commit55f49e6b7ea945df9ffe85d184b86bcdbfb98e8d (patch)
tree0bb1d30f4324f7ec7d32557fe30e8ecfe680a127
parent49ecaf88d1405ea17fc05c9b4ca066d6ebf51f62 (diff)
anv/allocator: Add support for "back" allocations to state_pool
Reviewed-by: Juan A. Suarez Romero <[email protected]>
-rw-r--r--src/intel/vulkan/anv_allocator.c31
-rw-r--r--src/intel/vulkan/anv_private.h4
2 files changed, 33 insertions, 2 deletions
diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c
index cd300122395..b7cf1136bbd 100644
--- a/src/intel/vulkan/anv_allocator.c
+++ b/src/intel/vulkan/anv_allocator.c
@@ -644,6 +644,7 @@ anv_state_pool_init(struct anv_state_pool *pool,
pool->block_pool = block_pool;
assert(util_is_power_of_two(block_size));
pool->block_size = block_size;
+ pool->back_alloc_free_list = ANV_FREE_LIST_EMPTY;
for (unsigned i = 0; i < ANV_STATE_BUCKETS; i++) {
pool->buckets[i].free_list = ANV_FREE_LIST_EMPTY;
pool->buckets[i].block.next = 0;
@@ -727,6 +728,26 @@ anv_state_pool_alloc(struct anv_state_pool *pool, uint32_t size, uint32_t align)
return state;
}
+struct anv_state
+anv_state_pool_alloc_back(struct anv_state_pool *pool)
+{
+ struct anv_state state;
+ state.alloc_size = pool->block_size;
+
+ if (anv_free_list_pop(&pool->back_alloc_free_list,
+ &pool->block_pool->map, &state.offset)) {
+ assert(state.offset < 0);
+ goto done;
+ }
+
+ state.offset = anv_block_pool_alloc_back(pool->block_pool, pool->block_size);
+
+done:
+ state.map = pool->block_pool->map + state.offset;
+ VG(VALGRIND_MEMPOOL_ALLOC(pool, state.map, state.alloc_size));
+ return state;
+}
+
static void
anv_state_pool_free_no_vg(struct anv_state_pool *pool, struct anv_state state)
{
@@ -736,8 +757,14 @@ anv_state_pool_free_no_vg(struct anv_state_pool *pool, struct anv_state state)
size_log2 <= ANV_MAX_STATE_SIZE_LOG2);
unsigned bucket = size_log2 - ANV_MIN_STATE_SIZE_LOG2;
- anv_free_list_push(&pool->buckets[bucket].free_list,
- pool->block_pool->map, state.offset);
+ if (state.offset < 0) {
+ assert(state.alloc_size == pool->block_size);
+ anv_free_list_push(&pool->back_alloc_free_list,
+ pool->block_pool->map, state.offset);
+ } else {
+ anv_free_list_push(&pool->buckets[bucket].free_list,
+ pool->block_pool->map, state.offset);
+ }
}
void
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index 81a026451a1..30517576d79 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -506,6 +506,9 @@ struct anv_state_pool {
/* The size of blocks which will be allocated from the block pool */
uint32_t block_size;
+ /** Free list for "back" allocations */
+ union anv_free_list back_alloc_free_list;
+
struct anv_fixed_size_state_pool buckets[ANV_STATE_BUCKETS];
};
@@ -571,6 +574,7 @@ void anv_state_pool_init(struct anv_state_pool *pool,
void anv_state_pool_finish(struct anv_state_pool *pool);
struct anv_state anv_state_pool_alloc(struct anv_state_pool *pool,
uint32_t state_size, uint32_t alignment);
+struct anv_state anv_state_pool_alloc_back(struct anv_state_pool *pool);
void anv_state_pool_free(struct anv_state_pool *pool, struct anv_state state);
void anv_state_stream_init(struct anv_state_stream *stream,
struct anv_state_pool *state_pool,