Mesa (master): freedreno: be more clever about gmem usage

Rob Clark robclark at kemper.freedesktop.org
Wed Jan 8 21:52:48 UTC 2014


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

Author: Rob Clark <robclark at freedesktop.org>
Date:   Fri Dec 27 10:31:22 2013 -0500

freedreno: be more clever about gmem usage

Only need to leave room for depth/stencil if it is actually used, etc.

Signed-off-by: Rob Clark <robclark at freedesktop.org>

---

 src/gallium/drivers/freedreno/freedreno_gmem.c |   26 ++++++++++++++++--------
 src/gallium/drivers/freedreno/freedreno_gmem.h |    1 +
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/src/gallium/drivers/freedreno/freedreno_gmem.c b/src/gallium/drivers/freedreno/freedreno_gmem.c
index 47d99d3..47f7a31 100644
--- a/src/gallium/drivers/freedreno/freedreno_gmem.c
+++ b/src/gallium/drivers/freedreno/freedreno_gmem.c
@@ -66,6 +66,13 @@
  * resolve.
  */
 
+static uint32_t bin_width(struct fd_context *ctx)
+{
+	if (ctx->screen->gpu_id >= 300)
+		return 992;
+	return 512;
+}
+
 static void
 calculate_tiles(struct fd_context *ctx)
 {
@@ -76,19 +83,26 @@ calculate_tiles(struct fd_context *ctx)
 	uint32_t minx, miny, width, height;
 	uint32_t nbins_x = 1, nbins_y = 1;
 	uint32_t bin_w, bin_h;
-	uint32_t max_width = 992;
+	uint32_t max_width = bin_width(ctx);
 	uint32_t cpp = 4;
 	uint32_t i, j, t, p, n, xoff, yoff;
+	bool has_zs = !!(ctx->resolve & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL));
 
 	if (pfb->cbufs[0])
 		cpp = util_format_get_blocksize(pfb->cbufs[0]->format);
 
-	if ((gmem->cpp == cpp) &&
+	if ((gmem->cpp == cpp) && (gmem->has_zs == has_zs) &&
 			!memcmp(&gmem->scissor, scissor, sizeof(gmem->scissor))) {
 		/* everything is up-to-date */
 		return;
 	}
 
+	/* if have depth/stencil, we need to leave room: */
+	if (has_zs) {
+		gmem_size /= 2;
+		max_width /= 2;
+	}
+
 	if (fd_mesa_debug & FD_DBG_DSCIS) {
 		minx = 0;
 		miny = 0;
@@ -101,13 +115,6 @@ calculate_tiles(struct fd_context *ctx)
 		height = scissor->maxy - miny;
 	}
 
-// TODO we probably could optimize this a bit if we know that
-// Z or stencil is not enabled for any of the draw calls..
-//	if (fd_stencil_enabled(ctx->zsa) || fd_depth_enabled(ctx->zsa)) {
-		gmem_size /= 2;
-		max_width = 256;
-//	}
-
 	bin_w = align(width, 32);
 	bin_h = align(height, 32);
 
@@ -130,6 +137,7 @@ calculate_tiles(struct fd_context *ctx)
 
 	gmem->scissor = *scissor;
 	gmem->cpp = cpp;
+	gmem->has_zs = has_zs;
 	gmem->bin_h = bin_h;
 	gmem->bin_w = bin_w;
 	gmem->nbins_x = nbins_x;
diff --git a/src/gallium/drivers/freedreno/freedreno_gmem.h b/src/gallium/drivers/freedreno/freedreno_gmem.h
index 1082d54..b52557c 100644
--- a/src/gallium/drivers/freedreno/freedreno_gmem.h
+++ b/src/gallium/drivers/freedreno/freedreno_gmem.h
@@ -51,6 +51,7 @@ struct fd_gmem_stateobj {
 	uint16_t bin_h, nbins_y;
 	uint16_t bin_w, nbins_x;
 	uint16_t width, height;
+	bool has_zs;  /* gmem config using depth/stencil? */
 };
 
 void fd_gmem_render_tiles(struct pipe_context *pctx);




More information about the mesa-commit mailing list