gallium/pipe: Align allocation size in pb_cache_manager_create_buffer

Some drivers have minimum buffer size or alignment requirements. When a
buffer is created using pb_cache_manager_create_buffer, the cache is
first checked for a compatible buffer to return instead. If the
requested buffer size is less than
(minimum buffer size) / (mgr->size_factor), no buffer in the cache
is _ever_ applicable.
The alignment is used to determine the true allocation size when
evaluating against cached buffers.

Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19082>
This commit is contained in:
Giancarlo Devich 2022-10-17 13:17:19 -07:00 committed by Marge Bot
parent 416b33337d
commit e902f2ab8c

View file

@ -206,9 +206,11 @@ pb_cache_manager_create_buffer(struct pb_manager *_mgr,
struct pb_cache_manager *mgr = pb_cache_manager(_mgr);
struct pb_cache_buffer *buf;
pb_size aligned_size = align64(size, desc->alignment);
/* get a buffer from the cache */
buf = (struct pb_cache_buffer *)
pb_cache_reclaim_buffer(&mgr->cache, size, desc->alignment,
pb_cache_reclaim_buffer(&mgr->cache, aligned_size, desc->alignment,
desc->usage, 0);
if (buf)
return &buf->base;
@ -218,12 +220,12 @@ pb_cache_manager_create_buffer(struct pb_manager *_mgr,
if (!buf)
return NULL;
buf->buffer = mgr->provider->create_buffer(mgr->provider, size, desc);
buf->buffer = mgr->provider->create_buffer(mgr->provider, aligned_size, desc);
/* Empty the cache and try again. */
if (!buf->buffer) {
pb_cache_release_all_buffers(&mgr->cache);
buf->buffer = mgr->provider->create_buffer(mgr->provider, size, desc);
buf->buffer = mgr->provider->create_buffer(mgr->provider, aligned_size, desc);
}
if(!buf->buffer) {
@ -233,7 +235,7 @@ pb_cache_manager_create_buffer(struct pb_manager *_mgr,
assert(pipe_is_referenced(&buf->buffer->reference));
assert(pb_check_alignment(desc->alignment, 1u << buf->buffer->alignment_log2));
assert(buf->buffer->size >= size);
assert(buf->buffer->size >= aligned_size);
pipe_reference_init(&buf->base.reference, 1);
buf->base.alignment_log2 = buf->buffer->alignment_log2;