summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Clark <[email protected]>2016-11-23 09:53:44 -0500
committerRob Clark <[email protected]>2016-11-30 12:25:48 -0500
commit8c56789f60526282564dfbbf1d4f0f80df12839a (patch)
treef43114e2ca5d77e898a623bfd920b3cb4cfe4d0d
parent728e2c4d38b2c03ad1fdc997bef70e646ada9fe4 (diff)
freedreno: make gmem tile size alignment configurable
a5xx seems to prefer 64 pixel alignment, in at least some cases. Make this configurable per generation. Signed-off-by: Rob Clark <[email protected]>
-rw-r--r--src/gallium/drivers/freedreno/freedreno_gmem.c18
-rw-r--r--src/gallium/drivers/freedreno/freedreno_screen.c6
-rw-r--r--src/gallium/drivers/freedreno/freedreno_screen.h1
3 files changed, 17 insertions, 8 deletions
diff --git a/src/gallium/drivers/freedreno/freedreno_gmem.c b/src/gallium/drivers/freedreno/freedreno_gmem.c
index ed625e455af..b94e33d285e 100644
--- a/src/gallium/drivers/freedreno/freedreno_gmem.c
+++ b/src/gallium/drivers/freedreno/freedreno_gmem.c
@@ -109,7 +109,8 @@ calculate_tiles(struct fd_batch *batch)
struct fd_gmem_stateobj *gmem = &ctx->gmem;
struct pipe_scissor_state *scissor = &batch->max_scissor;
struct pipe_framebuffer_state *pfb = &batch->framebuffer;
- uint32_t gmem_size = ctx->screen->gmemsize_bytes;
+ const uint32_t gmem_alignment = ctx->screen->gmem_alignment;
+ const uint32_t gmem_size = ctx->screen->gmemsize_bytes;
uint32_t minx, miny, width, height;
uint32_t nbins_x = 1, nbins_y = 1;
uint32_t bin_w, bin_h;
@@ -146,21 +147,22 @@ calculate_tiles(struct fd_batch *batch)
width = pfb->width;
height = pfb->height;
} else {
- minx = scissor->minx & ~31; /* round down to multiple of 32 */
- miny = scissor->miny & ~31;
+ /* round down to multiple of alignment: */
+ minx = scissor->minx & ~(gmem_alignment - 1);
+ miny = scissor->miny & ~(gmem_alignment - 1);
width = scissor->maxx - minx;
height = scissor->maxy - miny;
}
- bin_w = align(width, 32);
- bin_h = align(height, 32);
+ bin_w = align(width, gmem_alignment);
+ bin_h = align(height, gmem_alignment);
/* first, find a bin width that satisfies the maximum width
* restrictions:
*/
while (bin_w > max_width) {
nbins_x++;
- bin_w = align(width / nbins_x, 32);
+ bin_w = align(width / nbins_x, gmem_alignment);
}
if (fd_mesa_debug & FD_DBG_MSGS) {
@@ -177,10 +179,10 @@ calculate_tiles(struct fd_batch *batch)
while (total_size(cbuf_cpp, zsbuf_cpp, bin_w, bin_h, gmem) > gmem_size) {
if (bin_w > bin_h) {
nbins_x++;
- bin_w = align(width / nbins_x, 32);
+ bin_w = align(width / nbins_x, gmem_alignment);
} else {
nbins_y++;
- bin_h = align(height / nbins_y, 32);
+ bin_h = align(height / nbins_y, gmem_alignment);
}
}
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
index fb35742f2c0..f6ec5763f76 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -672,6 +672,12 @@ fd_screen_create(struct fd_device *dev)
goto fail;
}
+ if (screen->gpu_id >= 500) {
+ screen->gmem_alignment = 64;
+ } else {
+ screen->gmem_alignment = 32;
+ }
+
/* NOTE: don't enable reordering on a2xx, since completely untested.
* Also, don't enable if we have too old of a kernel to support
* growable cmdstream buffers, since memory requirement for cmdstream
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h b/src/gallium/drivers/freedreno/freedreno_screen.h
index db9050e71be..3fc66fb9607 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.h
+++ b/src/gallium/drivers/freedreno/freedreno_screen.h
@@ -64,6 +64,7 @@ struct fd_screen {
uint32_t chip_id; /* coreid:8 majorrev:8 minorrev:8 patch:8 */
uint32_t max_freq;
uint32_t max_rts; /* max # of render targets */
+ uint32_t gmem_alignment;
bool has_timestamp;
void *compiler; /* currently unused for a2xx */