mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-06-13 15:58:18 +02:00
zink/bo: use pb_buffer_lean to save a little mem
vtbl is not used Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41936>
This commit is contained in:
parent
47142da666
commit
cf1ca02bd0
4 changed files with 49 additions and 49 deletions
|
|
@ -131,7 +131,7 @@ bo_destroy(struct zink_screen *screen, struct zink_bo *bo)
|
|||
}
|
||||
|
||||
static bool
|
||||
bo_can_reclaim(struct zink_screen *screen, struct pb_buffer *pbuf)
|
||||
bo_can_reclaim(struct zink_screen *screen, struct pb_buffer_lean *pbuf)
|
||||
{
|
||||
struct zink_bo *bo = zink_bo(pbuf);
|
||||
|
||||
|
|
@ -150,7 +150,7 @@ static void
|
|||
bo_slab_free(struct zink_screen *screen, struct pb_slab *pslab)
|
||||
{
|
||||
struct zink_slab *slab = zink_slab(pslab);
|
||||
ASSERTED unsigned slab_size = slab->buffer->base.base.size;
|
||||
ASSERTED unsigned slab_size = slab->buffer->base.size;
|
||||
|
||||
assert(slab->base.num_entries * slab->base.entry_size <= slab_size);
|
||||
FREE(slab->entries);
|
||||
|
|
@ -273,7 +273,7 @@ bo_create_internal(struct zink_screen *screen,
|
|||
|
||||
if (init_pb_cache) {
|
||||
bo->u.real.use_reusable_pool = true;
|
||||
pb_cache_init_entry(&screen->pb.bo_cache, bo->cache_entry, &bo->base.base, mem_type_idx);
|
||||
pb_cache_init_entry(&screen->pb.bo_cache, bo->cache_entry, &bo->base, mem_type_idx);
|
||||
} else {
|
||||
#ifdef ZINK_USE_DMABUF
|
||||
list_inithead(&bo->u.real.exports);
|
||||
|
|
@ -283,12 +283,12 @@ bo_create_internal(struct zink_screen *screen,
|
|||
|
||||
|
||||
simple_mtx_init(&bo->lock, mtx_plain);
|
||||
pipe_reference_init(&bo->base.base.reference, 1);
|
||||
bo->base.base.alignment_log2 = util_logbase2(alignment);
|
||||
bo->base.base.size = mai.allocationSize;
|
||||
pipe_reference_init(&bo->base.reference, 1);
|
||||
bo->base.alignment_log2 = util_logbase2(alignment);
|
||||
bo->base.size = mai.allocationSize;
|
||||
bo->type = ZINK_BO_REAL;
|
||||
bo->base.base.placement = mem_type_idx;
|
||||
bo->base.base.usage = flags;
|
||||
bo->base.placement = mem_type_idx;
|
||||
bo->base.usage = flags;
|
||||
bo->unique_id = p_atomic_inc_return(&screen->pb.next_bo_unique_id);
|
||||
|
||||
return bo;
|
||||
|
|
@ -330,7 +330,7 @@ sparse_backing_alloc(struct zink_screen *screen, struct zink_bo *bo,
|
|||
|
||||
/* Allocate a new backing buffer if necessary. */
|
||||
if (!best_backing) {
|
||||
struct pb_buffer *buf;
|
||||
struct pb_buffer_lean *buf;
|
||||
uint64_t size;
|
||||
uint32_t pages;
|
||||
|
||||
|
|
@ -346,11 +346,11 @@ sparse_backing_alloc(struct zink_screen *screen, struct zink_bo *bo,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
assert(bo->u.sparse.num_backing_pages < DIV_ROUND_UP(bo->base.base.size, ZINK_SPARSE_BUFFER_PAGE_SIZE));
|
||||
assert(bo->u.sparse.num_backing_pages < DIV_ROUND_UP(bo->base.size, ZINK_SPARSE_BUFFER_PAGE_SIZE));
|
||||
|
||||
size = MIN3(bo->base.base.size / 16,
|
||||
size = MIN3(bo->base.size / 16,
|
||||
8 * 1024 * 1024,
|
||||
bo->base.base.size - (uint64_t)bo->u.sparse.num_backing_pages * ZINK_SPARSE_BUFFER_PAGE_SIZE);
|
||||
bo->base.size - (uint64_t)bo->u.sparse.num_backing_pages * ZINK_SPARSE_BUFFER_PAGE_SIZE);
|
||||
size = MAX2(size, ZINK_SPARSE_BUFFER_PAGE_SIZE);
|
||||
|
||||
buf = zink_bo_create(screen, size, ZINK_SPARSE_BUFFER_PAGE_SIZE,
|
||||
|
|
@ -362,7 +362,7 @@ sparse_backing_alloc(struct zink_screen *screen, struct zink_bo *bo,
|
|||
}
|
||||
|
||||
/* We might have gotten a bigger buffer than requested via caching. */
|
||||
pages = buf->base.size / ZINK_SPARSE_BUFFER_PAGE_SIZE;
|
||||
pages = buf->size / ZINK_SPARSE_BUFFER_PAGE_SIZE;
|
||||
|
||||
best_backing->bo = zink_bo(buf);
|
||||
best_backing->num_chunks = 1;
|
||||
|
|
@ -393,7 +393,7 @@ static void
|
|||
sparse_free_backing_buffer(struct zink_screen *screen, struct zink_bo *bo,
|
||||
struct zink_sparse_backing *backing)
|
||||
{
|
||||
bo->u.sparse.num_backing_pages -= backing->bo->base.base.size / ZINK_SPARSE_BUFFER_PAGE_SIZE;
|
||||
bo->u.sparse.num_backing_pages -= backing->bo->base.size / ZINK_SPARSE_BUFFER_PAGE_SIZE;
|
||||
|
||||
list_del(&backing->list);
|
||||
zink_bo_unref(screen, backing->bo);
|
||||
|
|
@ -460,7 +460,7 @@ sparse_backing_free(struct zink_screen *screen, struct zink_bo *bo,
|
|||
}
|
||||
|
||||
if (backing->num_chunks == 1 && backing->chunks[0].begin == 0 &&
|
||||
backing->chunks[0].end == backing->bo->base.base.size / ZINK_SPARSE_BUFFER_PAGE_SIZE)
|
||||
backing->chunks[0].end == backing->bo->base.size / ZINK_SPARSE_BUFFER_PAGE_SIZE)
|
||||
sparse_free_backing_buffer(screen, bo, backing);
|
||||
|
||||
return true;
|
||||
|
|
@ -469,7 +469,7 @@ sparse_backing_free(struct zink_screen *screen, struct zink_bo *bo,
|
|||
static void
|
||||
bo_sparse_destroy(struct zink_screen *screen, struct zink_bo *bo)
|
||||
{
|
||||
assert(!bo->mem && bo->base.base.usage & ZINK_ALLOC_SPARSE);
|
||||
assert(!bo->mem && bo->base.usage & ZINK_ALLOC_SPARSE);
|
||||
|
||||
while (!list_is_empty(&bo->u.sparse.backing)) {
|
||||
sparse_free_backing_buffer(screen, bo,
|
||||
|
|
@ -482,7 +482,7 @@ bo_sparse_destroy(struct zink_screen *screen, struct zink_bo *bo)
|
|||
FREE(bo);
|
||||
}
|
||||
|
||||
static struct pb_buffer *
|
||||
static struct pb_buffer_lean *
|
||||
bo_sparse_create(struct zink_screen *screen, uint64_t size)
|
||||
{
|
||||
struct zink_bo *bo;
|
||||
|
|
@ -499,15 +499,15 @@ bo_sparse_create(struct zink_screen *screen, uint64_t size)
|
|||
return NULL;
|
||||
|
||||
simple_mtx_init(&bo->lock, mtx_plain);
|
||||
pipe_reference_init(&bo->base.base.reference, 1);
|
||||
bo->base.base.alignment_log2 = util_logbase2(ZINK_SPARSE_BUFFER_PAGE_SIZE);
|
||||
bo->base.base.size = size;
|
||||
pipe_reference_init(&bo->base.reference, 1);
|
||||
bo->base.alignment_log2 = util_logbase2(ZINK_SPARSE_BUFFER_PAGE_SIZE);
|
||||
bo->base.size = size;
|
||||
bo->type = ZINK_BO_SPARSE;
|
||||
unsigned placement = zink_mem_type_idx_from_types(screen, ZINK_HEAP_DEVICE_LOCAL_SPARSE, UINT32_MAX);
|
||||
assert(placement != UINT32_MAX);
|
||||
bo->base.base.placement = placement;
|
||||
bo->base.placement = placement;
|
||||
bo->unique_id = p_atomic_inc_return(&screen->pb.next_bo_unique_id);
|
||||
bo->base.base.usage = ZINK_ALLOC_SPARSE;
|
||||
bo->base.usage = ZINK_ALLOC_SPARSE;
|
||||
|
||||
bo->u.sparse.num_va_pages = DIV_ROUND_UP(size, ZINK_SPARSE_BUFFER_PAGE_SIZE);
|
||||
bo->u.sparse.commitments = CALLOC(bo->u.sparse.num_va_pages,
|
||||
|
|
@ -525,7 +525,7 @@ error_alloc_commitments:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
struct pb_buffer *
|
||||
struct pb_buffer_lean *
|
||||
zink_bo_create(struct zink_screen *screen, uint64_t size, unsigned alignment, enum zink_heap heap, enum zink_alloc_flag flags, unsigned mem_type_idx, const void *pNext)
|
||||
{
|
||||
struct zink_bo *bo;
|
||||
|
|
@ -586,13 +586,13 @@ zink_bo_create(struct zink_screen *screen, uint64_t size, unsigned alignment, en
|
|||
return NULL;
|
||||
|
||||
bo = container_of(entry, struct zink_bo, u.slab.entry);
|
||||
assert(bo->base.base.placement == mem_type_idx);
|
||||
pipe_reference_init(&bo->base.base.reference, 1);
|
||||
bo->base.base.size = size;
|
||||
assert(bo->base.placement == mem_type_idx);
|
||||
pipe_reference_init(&bo->base.reference, 1);
|
||||
bo->base.size = size;
|
||||
memset(&bo->reads, 0, sizeof(bo->reads));
|
||||
memset(&bo->writes, 0, sizeof(bo->writes));
|
||||
bo->unique_id = p_atomic_inc_return(&screen->pb.next_bo_unique_id);
|
||||
assert(alignment <= 1 << bo->base.base.alignment_log2);
|
||||
assert(alignment <= 1 << bo->base.alignment_log2);
|
||||
|
||||
return &bo->base;
|
||||
}
|
||||
|
|
@ -619,7 +619,7 @@ no_slab:
|
|||
/* Get a buffer from the cache. */
|
||||
bo = (struct zink_bo*)
|
||||
pb_cache_reclaim_buffer(&screen->pb.bo_cache, size, alignment, 0, mem_type_idx);
|
||||
assert(!bo || bo->base.base.placement == mem_type_idx);
|
||||
assert(!bo || bo->base.placement == mem_type_idx);
|
||||
if (bo) {
|
||||
memset(&bo->reads, 0, sizeof(bo->reads));
|
||||
memset(&bo->writes, 0, sizeof(bo->writes));
|
||||
|
|
@ -636,7 +636,7 @@ no_slab:
|
|||
if (!bo)
|
||||
return NULL;
|
||||
}
|
||||
assert(bo->base.base.placement == mem_type_idx);
|
||||
assert(bo->base.placement == mem_type_idx);
|
||||
|
||||
return &bo->base;
|
||||
}
|
||||
|
|
@ -663,7 +663,7 @@ zink_bo_map(struct zink_screen *screen, struct zink_bo *bo)
|
|||
* be atomic thanks to the lock. */
|
||||
cpu = real->u.real.cpu_ptr;
|
||||
if (!cpu) {
|
||||
VkResult result = VKSCR(MapMemory)(screen->dev, real->mem, 0, real->base.base.size, 0, &cpu);
|
||||
VkResult result = VKSCR(MapMemory)(screen->dev, real->mem, 0, real->base.size, 0, &cpu);
|
||||
if (result != VK_SUCCESS) {
|
||||
mesa_loge("ZINK: vkMapMemory failed (%s)", vk_Result_to_str(result));
|
||||
simple_mtx_unlock(&real->lock);
|
||||
|
|
@ -671,8 +671,8 @@ zink_bo_map(struct zink_screen *screen, struct zink_bo *bo)
|
|||
return NULL;
|
||||
}
|
||||
if (unlikely(zink_debug & ZINK_DEBUG_MAP)) {
|
||||
p_atomic_add(&screen->mapped_vram, real->base.base.size);
|
||||
mesa_loge("NEW MAP(%"PRIu64") TOTAL(%"PRIu64")", real->base.base.size, screen->mapped_vram);
|
||||
p_atomic_add(&screen->mapped_vram, real->base.size);
|
||||
mesa_loge("NEW MAP(%"PRIu64") TOTAL(%"PRIu64")", real->base.size, screen->mapped_vram);
|
||||
}
|
||||
p_atomic_set(&real->u.real.cpu_ptr, cpu);
|
||||
}
|
||||
|
|
@ -695,8 +695,8 @@ zink_bo_unmap(struct zink_screen *screen, struct zink_bo *bo)
|
|||
if (!p_atomic_read(&real->u.real.map_count)) {
|
||||
p_atomic_set(&real->u.real.cpu_ptr, NULL);
|
||||
if (unlikely(zink_debug & ZINK_DEBUG_MAP)) {
|
||||
p_atomic_add(&screen->mapped_vram, -real->base.base.size);
|
||||
mesa_loge("UNMAP(%"PRIu64") TOTAL(%"PRIu64")", real->base.base.size, screen->mapped_vram);
|
||||
p_atomic_add(&screen->mapped_vram, -real->base.size);
|
||||
mesa_loge("UNMAP(%"PRIu64") TOTAL(%"PRIu64")", real->base.size, screen->mapped_vram);
|
||||
}
|
||||
VKSCR(UnmapMemory)(screen->dev, real->mem);
|
||||
}
|
||||
|
|
@ -708,7 +708,7 @@ zink_bo_unmap(struct zink_screen *screen, struct zink_bo *bo)
|
|||
static void
|
||||
track_freed_sparse_bo(struct zink_context *ctx, struct zink_sparse_backing *backing)
|
||||
{
|
||||
pipe_reference(NULL, &backing->bo->base.base.reference);
|
||||
pipe_reference(NULL, &backing->bo->base.reference);
|
||||
util_dynarray_append(&ctx->bs->freed_sparse_backing_bos, backing->bo);
|
||||
}
|
||||
|
||||
|
|
@ -788,8 +788,8 @@ buffer_bo_commit(struct zink_context *ctx, struct zink_resource *res, uint32_t o
|
|||
struct zink_screen *screen = zink_screen(ctx->base.screen);
|
||||
struct zink_bo *bo = res->obj->bo;
|
||||
assert(offset % ZINK_SPARSE_BUFFER_PAGE_SIZE == 0);
|
||||
assert(offset <= bo->base.base.size);
|
||||
assert(size <= bo->base.base.size - offset);
|
||||
assert(offset <= bo->base.size);
|
||||
assert(size <= bo->base.size - offset);
|
||||
assert(size % ZINK_SPARSE_BUFFER_PAGE_SIZE == 0 || offset + size == res->obj->size);
|
||||
|
||||
struct zink_sparse_commitment *comm = bo->u.sparse.commitments;
|
||||
|
|
@ -1284,7 +1284,7 @@ bo_slab_alloc(void *priv, unsigned mem_type_idx, unsigned entry_size, unsigned g
|
|||
if (!slab->buffer)
|
||||
goto fail;
|
||||
|
||||
slab_size = slab->buffer->base.base.size;
|
||||
slab_size = slab->buffer->base.size;
|
||||
|
||||
slab->base.num_entries = slab_size / entry_size;
|
||||
slab->base.num_free = slab->base.num_entries;
|
||||
|
|
@ -1300,8 +1300,8 @@ bo_slab_alloc(void *priv, unsigned mem_type_idx, unsigned entry_size, unsigned g
|
|||
struct zink_bo *bo = &slab->entries[i];
|
||||
|
||||
simple_mtx_init(&bo->lock, mtx_plain);
|
||||
bo->base.base.alignment_log2 = util_logbase2(get_slab_entry_alignment(screen, entry_size));
|
||||
bo->base.base.size = entry_size;
|
||||
bo->base.alignment_log2 = util_logbase2(get_slab_entry_alignment(screen, entry_size));
|
||||
bo->base.size = entry_size;
|
||||
bo->type = ZINK_BO_SLAB;
|
||||
bo->offset = slab->buffer->offset + i * entry_size;
|
||||
bo->u.slab.entry.slab = &slab->base;
|
||||
|
|
@ -1314,7 +1314,7 @@ bo_slab_alloc(void *priv, unsigned mem_type_idx, unsigned entry_size, unsigned g
|
|||
bo->u.slab.real = slab->buffer->u.slab.real;
|
||||
assert(bo->u.slab.real->mem);
|
||||
}
|
||||
bo->base.base.placement = bo->u.slab.real->base.base.placement;
|
||||
bo->base.placement = bo->u.slab.real->base.placement;
|
||||
|
||||
list_addtail(&bo->u.slab.entry.head, &slab->base.free);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ zink_bo_init(struct zink_screen *screen);
|
|||
void
|
||||
zink_bo_deinit(struct zink_screen *screen);
|
||||
|
||||
struct pb_buffer *
|
||||
struct pb_buffer_lean *
|
||||
zink_bo_create(struct zink_screen *screen, uint64_t size, unsigned alignment, enum zink_heap heap, enum zink_alloc_flag flags, unsigned mem_type_idx, const void *pNext);
|
||||
|
||||
void
|
||||
|
|
@ -134,7 +134,7 @@ zink_bo_get_mem(const struct zink_bo *bo)
|
|||
static ALWAYS_INLINE VkDeviceSize
|
||||
zink_bo_get_size(const struct zink_bo *bo)
|
||||
{
|
||||
return bo->mem ? bo->base.base.size : bo->u.slab.real->base.base.size;
|
||||
return bo->mem ? bo->base.size : bo->u.slab.real->base.size;
|
||||
}
|
||||
|
||||
void *
|
||||
|
|
@ -241,7 +241,7 @@ zink_bo_usage_unset(struct zink_bo *bo, struct zink_batch_state *bs)
|
|||
static ALWAYS_INLINE void
|
||||
zink_bo_unref(struct zink_screen *screen, struct zink_bo *bo)
|
||||
{
|
||||
if (pipe_reference(&bo->base.base.reference, NULL))
|
||||
if (pipe_reference(&bo->base.reference, NULL))
|
||||
zink_bo_destroy(screen, bo);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1217,9 +1217,9 @@ update_obj_info(struct zink_screen *screen, struct zink_resource_object *obj,
|
|||
obj->size = zink_bo_get_size(obj->bo);
|
||||
}
|
||||
|
||||
obj->coherent = screen->info.mem_props.memoryTypes[obj->bo->base.base.placement].propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
|
||||
obj->coherent = screen->info.mem_props.memoryTypes[obj->bo->base.placement].propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
|
||||
if (!(templ->flags & PIPE_RESOURCE_FLAG_SPARSE)) {
|
||||
obj->host_visible = screen->info.mem_props.memoryTypes[obj->bo->base.base.placement].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
|
||||
obj->host_visible = screen->info.mem_props.memoryTypes[obj->bo->base.placement].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2678,7 +2678,7 @@ zink_buffer_map(struct pipe_context *pctx,
|
|||
|
||||
unsigned map_offset = box->x;
|
||||
/* ideally never ever read or write to non-cached mem */
|
||||
bool is_cached_mem = (screen->info.mem_props.memoryTypes[res->obj->bo->base.base.placement].propertyFlags & VK_STAGING_RAM) == VK_STAGING_RAM;
|
||||
bool is_cached_mem = (screen->info.mem_props.memoryTypes[res->obj->bo->base.placement].propertyFlags & VK_STAGING_RAM) == VK_STAGING_RAM;
|
||||
/* but this is only viable with a certain amount of vram since it may fully duplicate lots of large buffers */
|
||||
bool host_mem_type_check = res->obj->host_visible;
|
||||
if (screen->always_cached_upload)
|
||||
|
|
|
|||
|
|
@ -708,7 +708,7 @@ enum zink_bo_type {
|
|||
};
|
||||
|
||||
struct zink_bo {
|
||||
struct pb_buffer base;
|
||||
struct pb_buffer_lean base;
|
||||
enum zink_bo_type type;
|
||||
|
||||
union {
|
||||
|
|
@ -756,7 +756,7 @@ struct zink_bo {
|
|||
};
|
||||
|
||||
static inline struct zink_bo *
|
||||
zink_bo(struct pb_buffer *pbuf)
|
||||
zink_bo(struct pb_buffer_lean *pbuf)
|
||||
{
|
||||
return (struct zink_bo*)pbuf;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue