diff --git a/src/gallium/drivers/freedreno/freedreno_gmem.c b/src/gallium/drivers/freedreno/freedreno_gmem.c index 101bb1d33f9..681063f003e 100644 --- a/src/gallium/drivers/freedreno/freedreno_gmem.c +++ b/src/gallium/drivers/freedreno/freedreno_gmem.c @@ -427,6 +427,19 @@ gmem_stateobj_init(struct fd_screen *screen, struct gmem_key *key) yoff += bh; } + /* Swap the order of alternating rows to form an 'S' pattern, to improve + * cache access patterns (ie. adjacent bins are likely to access adjacent + * portions of textures) + */ + if (!FD_DBG(NOSBIN)) { + for (i = 0; i < gmem->nbins_y; i+=2) { + unsigned col0 = gmem->nbins_y * i; + for (j = 0; j < gmem->nbins_x/2; j++) { + swap(gmem->tile[col0 + j], gmem->tile[col0 + gmem->nbins_x - j - 1]); + } + } + } + if (BIN_DEBUG) { t = 0; for (i = 0; i < gmem->nbins_y; i++) { diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index d2450c56288..c2017d062b3 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -96,6 +96,7 @@ static const struct debug_named_value fd_debug_options[] = { {"layout", FD_DBG_LAYOUT, "Dump resource layouts"}, {"nofp16", FD_DBG_NOFP16, "Disable mediump precision lowering"}, {"nohw", FD_DBG_NOHW, "Disable submitting commands to the HW"}, + {"nosbin", FD_DBG_NOSBIN, "Execute GMEM bins in raster order instead of 'S' pattern"}, DEBUG_NAMED_VALUE_END }; /* clang-format on */ diff --git a/src/gallium/drivers/freedreno/freedreno_util.h b/src/gallium/drivers/freedreno/freedreno_util.h index 41f3548f3df..09a24b356ab 100644 --- a/src/gallium/drivers/freedreno/freedreno_util.h +++ b/src/gallium/drivers/freedreno/freedreno_util.h @@ -96,6 +96,7 @@ enum fd_debug_flag { FD_DBG_LAYOUT = BITFIELD_BIT(26), FD_DBG_NOFP16 = BITFIELD_BIT(27), FD_DBG_NOHW = BITFIELD_BIT(28), + FD_DBG_NOSBIN = BITFIELD_BIT(29), }; /* clang-format on */