freedreno/a4xx: fix 3d texture setup
authorIlia Mirkin <imirkin@alum.mit.edu>
Sat, 21 Nov 2015 02:34:20 +0000 (21:34 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 21 Nov 2015 14:08:16 +0000 (09:08 -0500)
Same fix as on a3xx - set the second (tiny) layer size bitfield to the
smallest level's size so that the hw knows not to minify beyond that.

This fixes texelFetch sampler3D piglits.

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

index 99d1602d74bdae858343183aabd034a6731b1aeb..8d3112fde3c9a3d91e95bf4764bd13a7e07dc4da 100644 (file)
@@ -194,7 +194,7 @@ emit_textures(struct fd_context *ctx, struct fd_ringbuffer *ring,
                        if (view->base.texture) {
                                struct fd_resource *rsc = fd_resource(view->base.texture);
                                uint32_t offset = fd_resource_offset(rsc, start, 0);
-                               OUT_RELOC(ring, rsc->bo, offset, view->textconst4, 0);
+                               OUT_RELOC(ring, rsc->bo, offset, view->texconst4, 0);
                        } else {
                                OUT_RING(ring, 0x00000000);
                        }
index 75b083b8ca0899ee9fd40d58a8744723f0bf8262..598f1e19116fe01c0af757cdc015567498e6fa11 100644 (file)
@@ -214,6 +214,7 @@ fd4_sampler_view_create(struct pipe_context *pctx, struct pipe_resource *prsc,
        struct fd_resource *rsc = fd_resource(prsc);
        unsigned lvl = fd_sampler_first_level(cso);
        unsigned miplevels = fd_sampler_last_level(cso) - lvl;
+       uint32_t sz2 = 0;
 
        if (!so)
                return NULL;
@@ -259,7 +260,10 @@ fd4_sampler_view_create(struct pipe_context *pctx, struct pipe_resource *prsc,
        case PIPE_TEXTURE_3D:
                so->texconst3 =
                        A4XX_TEX_CONST_3_DEPTH(u_minify(prsc->depth0, lvl)) |
-                       A4XX_TEX_CONST_3_LAYERSZ(rsc->slices[0].size0);
+                       A4XX_TEX_CONST_3_LAYERSZ(rsc->slices[lvl].size0);
+               while (lvl < cso->u.tex.last_level && sz2 != rsc->slices[lvl+1].size0)
+                       sz2 = rsc->slices[++lvl].size0;
+               so->texconst4 = A4XX_TEX_CONST_4_LAYERSZ(sz2);
                break;
        default:
                so->texconst3 = 0x00000000;
index 31955770a85de3a5b56ff33fd3c62c1b946d6528..d74d88701a850104f5544569ed1b28525b9cfefc 100644 (file)
@@ -51,7 +51,7 @@ fd4_sampler_stateobj(struct pipe_sampler_state *samp)
 
 struct fd4_pipe_sampler_view {
        struct pipe_sampler_view base;
-       uint32_t texconst0, texconst1, texconst2, texconst3, textconst4;
+       uint32_t texconst0, texconst1, texconst2, texconst3, texconst4;
 };
 
 static inline struct fd4_pipe_sampler_view *