radeonsi: change si_resource::alignment to alignment_log2 for better packing
authorMarek Olšák <marek.olsak@amd.com>
Thu, 22 Apr 2021 04:31:28 +0000 (00:31 -0400)
committerMarge Bot <eric+marge@anholt.net>
Tue, 25 May 2021 16:15:44 +0000 (16:15 +0000)
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10813>

src/gallium/drivers/radeonsi/si_buffer.c
src/gallium/drivers/radeonsi/si_pipe.h
src/gallium/drivers/radeonsi/si_texture.c

index e329253..9db2aa2 100644 (file)
@@ -48,7 +48,7 @@ void si_init_resource_fields(struct si_screen *sscreen, struct si_resource *res,
    struct si_texture *tex = (struct si_texture *)res;
 
    res->bo_size = size;
-   res->bo_alignment = alignment;
+   res->bo_alignment_log2 = util_logbase2(alignment);
    res->flags = 0;
    res->texture_handle_allocated = false;
    res->image_handle_allocated = false;
@@ -177,8 +177,8 @@ bool si_alloc_resource(struct si_screen *sscreen, struct si_resource *res)
    struct pb_buffer *old_buf, *new_buf;
 
    /* Allocate a new resource. */
-   new_buf = sscreen->ws->buffer_create(sscreen->ws, res->bo_size, res->bo_alignment, res->domains,
-                                        res->flags);
+   new_buf = sscreen->ws->buffer_create(sscreen->ws, res->bo_size, 1 << res->bo_alignment_log2,
+                                        res->domains, res->flags);
    if (!new_buf) {
       return false;
    }
@@ -299,7 +299,7 @@ void si_replace_buffer_storage(struct pipe_context *ctx, struct pipe_resource *d
    assert(sdst->vram_usage_kb == ssrc->vram_usage_kb);
    assert(sdst->gart_usage_kb == ssrc->gart_usage_kb);
    assert(sdst->bo_size == ssrc->bo_size);
-   assert(sdst->bo_alignment == ssrc->bo_alignment);
+   assert(sdst->bo_alignment_log2 == ssrc->bo_alignment_log2);
    assert(sdst->domains == ssrc->domains);
 
    si_rebind_buffer(sctx, dst);
@@ -676,7 +676,7 @@ struct pipe_resource *si_buffer_from_winsys_buffer(struct pipe_screen *screen,
    res->buf = imported_buf;
    res->gpu_address = sscreen->ws->buffer_get_virtual_address(res->buf);
    res->bo_size = imported_buf->size;
-   res->bo_alignment = 1 << imported_buf->alignment_log2;
+   res->bo_alignment_log2 = imported_buf->alignment_log2;
    res->domains = sscreen->ws->buffer_get_initial_domain(res->buf);
 
    if (res->domains & RADEON_DOMAIN_VRAM)
index 948ae1f..f665ad4 100644 (file)
@@ -299,7 +299,7 @@ struct si_resource {
 
    /* Resource properties. */
    uint64_t bo_size;
-   unsigned bo_alignment;
+   uint8_t bo_alignment_log2;
    enum radeon_bo_domain domains;
    enum radeon_bo_flag flags;
    unsigned bind_history;
index 1487278..f15ed38 100644 (file)
@@ -450,7 +450,7 @@ static void si_reallocate_texture_inplace(struct si_context *sctx, struct si_tex
    tex->buffer.vram_usage_kb = new_tex->buffer.vram_usage_kb;
    tex->buffer.gart_usage_kb = new_tex->buffer.gart_usage_kb;
    tex->buffer.bo_size = new_tex->buffer.bo_size;
-   tex->buffer.bo_alignment = new_tex->buffer.bo_alignment;
+   tex->buffer.bo_alignment_log2 = new_tex->buffer.bo_alignment_log2;
    tex->buffer.domains = new_tex->buffer.domains;
    tex->buffer.flags = new_tex->buffer.flags;
 
@@ -981,7 +981,7 @@ static struct si_texture *si_texture_create_object(struct pipe_screen *screen,
    if (plane0) {
       /* The buffer is shared with the first plane. */
       resource->bo_size = plane0->buffer.bo_size;
-      resource->bo_alignment = plane0->buffer.bo_alignment;
+      resource->bo_alignment_log2 = plane0->buffer.bo_alignment_log2;
       resource->flags = plane0->buffer.flags;
       resource->domains = plane0->buffer.domains;
       resource->vram_usage_kb = plane0->buffer.vram_usage_kb;
@@ -999,7 +999,7 @@ static struct si_texture *si_texture_create_object(struct pipe_screen *screen,
       resource->buf = imported_buf;
       resource->gpu_address = sscreen->ws->buffer_get_virtual_address(resource->buf);
       resource->bo_size = imported_buf->size;
-      resource->bo_alignment = 1 << imported_buf->alignment_log2;
+      resource->bo_alignment_log2 = imported_buf->alignment_log2;
       resource->domains = sscreen->ws->buffer_get_initial_domain(resource->buf);
       if (resource->domains & RADEON_DOMAIN_VRAM)
          resource->vram_usage_kb = MAX2(1, resource->bo_size / 1024);