summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Clark <[email protected]>2018-12-18 10:34:23 -0500
committerRob Clark <[email protected]>2018-12-22 15:29:15 -0500
commit51a44c3aac7642a4b26dcfb3a80d3dd87892aa6f (patch)
tree1a1860803621697938c6e2d6262152a666517363
parent8f60f1381dd5975486af0390fdc397959126fd3e (diff)
freedreno/a6xx: fix 3d texture layout
Maybe not 100% perfect, but seems to be a pretty good approximation of that. Signed-off-by: Rob Clark <[email protected]>
-rw-r--r--src/gallium/drivers/freedreno/a6xx/fd6_resource.c14
-rw-r--r--src/gallium/drivers/freedreno/a6xx/fd6_texture.c2
-rw-r--r--src/gallium/drivers/freedreno/freedreno_resource.h2
3 files changed, 15 insertions, 3 deletions
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_resource.c b/src/gallium/drivers/freedreno/a6xx/fd6_resource.c
index 4f5ab902662..fb24d230c44 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_resource.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_resource.c
@@ -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
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_texture.c b/src/gallium/drivers/freedreno/a6xx/fd6_texture.c
index 373a7937e40..b9121523b7c 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_texture.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_texture.c
@@ -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;
}
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.h b/src/gallium/drivers/freedreno/freedreno_resource.h
index 09abb512d7e..83708244857 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.h
+++ b/src/gallium/drivers/freedreno/freedreno_resource.h
@@ -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).