freedreno/a6xx: fix 3d texture layout
authorRob Clark <robdclark@gmail.com>
Tue, 18 Dec 2018 15:34:23 +0000 (10:34 -0500)
committerRob Clark <robdclark@gmail.com>
Sat, 22 Dec 2018 20:29:15 +0000 (15:29 -0500)
Maybe not 100% perfect, but seems to be a pretty good approximation of
that.

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/a6xx/fd6_resource.c
src/gallium/drivers/freedreno/a6xx/fd6_texture.c
src/gallium/drivers/freedreno/freedreno_resource.h

index 4f5ab902662fa58fb77cb1800a5117bb70ce5e90..fb24d230c446fd9130dc561e82d8fa7307767e56 100644 (file)
@@ -73,7 +73,19 @@ setup_slices(struct fd_resource *rsc, uint32_t alignment, enum pipe_format forma
                        pitchalign = tile_alignment[rsc->cpp].pitchalign;
                        aligned_height = align(aligned_height, heightalign);
                } else {
-                       pitchalign = 64;
+                       if (prsc->target == PIPE_TEXTURE_3D) {
+                               unsigned a;
+                               if (width >= 64) {
+                                       a = util_next_power_of_two(MAX2(width, height));
+                               } else {
+                                       a = 16;
+                               }
+
+                               pitchalign = align(a, 64);
+                               aligned_height = align(aligned_height, a);
+                       } else {
+                               pitchalign = 64;
+                       }
 
                        /* The blits used for mem<->gmem work at a granularity of
                         * 32x32, which can cause faults due to over-fetch on the
index 373a7937e40ea0ec6af3bbf3596f5a873876d9b9..b9121523b7c85fe047cdd2e778fedaa9efa51aad 100644 (file)
@@ -325,12 +325,12 @@ fd6_sampler_view_create(struct pipe_context *pctx, struct pipe_resource *prsc,
                break;
        case PIPE_TEXTURE_3D:
                so->texconst3 =
+                       A6XX_TEX_CONST_3_MIN_LAYERSZ(rsc->slices[prsc->last_level].size0) |
                        A6XX_TEX_CONST_3_ARRAY_PITCH(rsc->slices[lvl].size0);
                so->texconst5 =
                        A6XX_TEX_CONST_5_DEPTH(u_minify(prsc->depth0, lvl));
                break;
        default:
-               so->texconst3 = 0x00000000;
                break;
        }
 
index 09abb512d7eeae93db0007225f51bd8142811bd5..837082448572c8e55f78f21ff1d6b6dada081c8b 100644 (file)
@@ -41,7 +41,7 @@
  * programmed with the start address of each mipmap level, and hw
  * derives the layer offset within the level.
  *
- * Texture Layout on a4xx:
+ * Texture Layout on a4xx+:
  *
  * For cubemap and 2d array, each layer contains all of it's mipmap
  * levels (layer_first layout).