freedreno/a4xx: only align slices in non-layer_first textures
authorIlia Mirkin <imirkin@alum.mit.edu>
Sat, 21 Nov 2015 02:20:00 +0000 (21:20 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 21 Nov 2015 14:08:16 +0000 (09:08 -0500)
When layer is the container, slices are tightly packed inside of each
layer. We don't need any additional alignment. On a3xx, each slice
contains all the layers, so having alignment makes sense.

This fixes a whole slew of array-related piglits, including texelFetch
and tex-miplevel-selection varieties.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Cc: mesa-stable@lists.freedesktop.org
src/gallium/drivers/freedreno/freedreno_resource.c

index 43b818f401407ebce0570ddd775af8c9036e4317..c8e2779d390e0a3e267cff25e84481302a0d0fbd 100644 (file)
@@ -551,7 +551,7 @@ fd_resource_create(struct pipe_screen *pscreen,
        struct fd_resource *rsc = CALLOC_STRUCT(fd_resource);
        struct pipe_resource *prsc = &rsc->base.b;
        enum pipe_format format = tmpl->format;
-       uint32_t size;
+       uint32_t size, alignment;
 
        DBG("target=%d, format=%s, %ux%ux%u, array_size=%u, last_level=%u, "
                        "nr_samples=%u, usage=%u, bind=%x, flags=%x",
@@ -583,6 +583,7 @@ fd_resource_create(struct pipe_screen *pscreen,
 
        assert(rsc->cpp);
 
+       alignment = slice_alignment(pscreen, tmpl);
        if (is_a4xx(fd_screen(pscreen))) {
                switch (tmpl->target) {
                case PIPE_TEXTURE_3D:
@@ -590,11 +591,12 @@ fd_resource_create(struct pipe_screen *pscreen,
                        break;
                default:
                        rsc->layer_first = true;
+                       alignment = 1;
                        break;
                }
        }
 
-       size = setup_slices(rsc, slice_alignment(pscreen, tmpl), format);
+       size = setup_slices(rsc, alignment, format);
 
        if (rsc->layer_first) {
                rsc->layer_size = align(size, 4096);