From e902f2ab8cc6fdd5e716916deb779311ede67e88 Mon Sep 17 00:00:00 2001 From: Giancarlo Devich Date: Mon, 17 Oct 2022 13:17:19 -0700 Subject: [PATCH] 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 Part-of: --- src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c index d48f79c23b1..60aaa2dd300 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c @@ -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;