Mesa (master): freedreno/a6xx: split up gmem/tile alignment requirements

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed May 20 18:45:12 UTC 2020


Module: Mesa
Branch: master
Commit: f6f8a19092027ab0248e216997a5529565ce2e12
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f6f8a19092027ab0248e216997a5529565ce2e12

Author: Jonathan Marek <jonathan at marek.ca>
Date:   Tue May 12 21:56:53 2020 -0400

freedreno/a6xx: split up gmem/tile alignment requirements

RB_BLIT has a granularity of 16x4, but tile sizes must be 32x16 aligned.

Signed-off-by: Jonathan Marek <jonathan at marek.ca>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4611>

---

 src/gallium/drivers/freedreno/freedreno_gmem.c   |  6 +++---
 src/gallium/drivers/freedreno/freedreno_screen.c | 14 ++++++++------
 src/gallium/drivers/freedreno/freedreno_screen.h |  3 ++-
 3 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/src/gallium/drivers/freedreno/freedreno_gmem.c b/src/gallium/drivers/freedreno/freedreno_gmem.c
index bbffda66e47..b3ef0978f9e 100644
--- a/src/gallium/drivers/freedreno/freedreno_gmem.c
+++ b/src/gallium/drivers/freedreno/freedreno_gmem.c
@@ -184,8 +184,8 @@ layout_gmem(struct gmem_key *key, uint32_t nbins_x, uint32_t nbins_y,
 		return false;
 
 	uint32_t bin_w, bin_h;
-	bin_w = div_align(key->width, nbins_x, screen->gmem_alignw);
-	bin_h = div_align(key->height, nbins_y, screen->gmem_alignh);
+	bin_w = div_align(key->width, nbins_x, screen->tile_alignw);
+	bin_h = div_align(key->height, nbins_y, screen->tile_alignh);
 
 	gmem->bin_w = bin_w;
 	gmem->bin_h = bin_h;
@@ -244,7 +244,7 @@ gmem_stateobj_init(struct fd_screen *screen, struct gmem_key *key)
 	/* first, find a bin width that satisfies the maximum width
 	 * restrictions:
 	 */
-	while (div_align(key->width, nbins_x, screen->gmem_alignw) > max_width) {
+	while (div_align(key->width, nbins_x, screen->tile_alignw) > max_width) {
 		nbins_x++;
 	}
 
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
index d19f6483e5f..d2ad24fb7c0 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -944,16 +944,18 @@ fd_screen_create(struct fd_device *dev, struct renderonly *ro)
 	}
 
 	if (screen->gpu_id >= 600) {
-		screen->gmem_alignw = 32;
-		screen->gmem_alignh = 32;
+		screen->gmem_alignw = 16;
+		screen->gmem_alignh = 4;
+		screen->tile_alignw = 32;
+		screen->tile_alignh = 32;
 		screen->num_vsc_pipes = 32;
 	} else if (screen->gpu_id >= 500) {
-		screen->gmem_alignw = 64;
-		screen->gmem_alignh = 32;
+		screen->gmem_alignw = screen->tile_alignw = 64;
+		screen->gmem_alignh = screen->tile_alignh = 32;
 		screen->num_vsc_pipes = 16;
 	} else {
-		screen->gmem_alignw = 32;
-		screen->gmem_alignh = 32;
+		screen->gmem_alignw = screen->tile_alignw = 32;
+		screen->gmem_alignh = screen->tile_alignh = 32;
 		screen->num_vsc_pipes = 8;
 	}
 
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h b/src/gallium/drivers/freedreno/freedreno_screen.h
index d6bd17daffc..13e48dd5d3d 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.h
+++ b/src/gallium/drivers/freedreno/freedreno_screen.h
@@ -70,7 +70,8 @@ struct fd_screen {
 	uint32_t max_freq;
 	uint32_t ram_size;
 	uint32_t max_rts;        /* max # of render targets */
-	uint32_t gmem_alignw, gmem_alignh;
+	uint32_t gmem_alignw, gmem_alignh; /* gmem load/store granularity */
+	uint32_t tile_alignw, tile_alignh; /* alignment for tile sizes */
 	uint32_t num_vsc_pipes;
 	uint32_t priority_mask;
 	bool has_timestamp;



More information about the mesa-commit mailing list