Mesa (master): freedreno: remove alpha key from ir3_shader

Ilia Mirkin imirkin at kemper.freedesktop.org
Thu Apr 2 04:12:00 UTC 2015


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

Author: Ilia Mirkin <imirkin at alum.mit.edu>
Date:   Sun Mar 29 19:59:38 2015 -0400

freedreno: remove alpha key from ir3_shader

This complication is unnecessary and makes MRTs more complicated and
likely to generate tons of variants.

Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>

---

 src/gallium/drivers/freedreno/a3xx/fd3_draw.c    |    4 ----
 src/gallium/drivers/freedreno/a3xx/fd3_program.c |    3 +++
 src/gallium/drivers/freedreno/a4xx/fd4_draw.c    |    5 +----
 src/gallium/drivers/freedreno/a4xx/fd4_emit.h    |    1 +
 src/gallium/drivers/freedreno/a4xx/fd4_program.c |    3 +++
 src/gallium/drivers/freedreno/ir3/ir3_cmdline.c  |    8 --------
 src/gallium/drivers/freedreno/ir3/ir3_compiler.c |   17 -----------------
 src/gallium/drivers/freedreno/ir3/ir3_shader.c   |    1 -
 src/gallium/drivers/freedreno/ir3/ir3_shader.h   |    8 --------
 9 files changed, 8 insertions(+), 42 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
index a3f9549..6ff762e 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
@@ -121,9 +121,6 @@ fixup_shader_state(struct fd_context *ctx, struct ir3_shader_key *key)
 		if (last_key->half_precision != key->half_precision)
 			ctx->prog.dirty |= FD_SHADER_DIRTY_FP;
 
-		if (last_key->alpha != key->alpha)
-			ctx->prog.dirty |= FD_SHADER_DIRTY_FP;
-
 		fd3_ctx->last_key = *key;
 	}
 }
@@ -141,7 +138,6 @@ fd3_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info)
 			/* do binning pass first: */
 			.binning_pass = true,
 			.color_two_side = ctx->rasterizer ? ctx->rasterizer->light_twoside : false,
-			.alpha = util_format_is_alpha(pipe_surface_format(pfb->cbufs[0])),
 			// TODO set .half_precision based on render target format,
 			// ie. float16 and smaller use half, float32 use full..
 			.half_precision = !!(fd_mesa_debug & FD_DBG_FRAGHALF),
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_program.c b/src/gallium/drivers/freedreno/a3xx/fd3_program.c
index 1250dff..442b47d 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_program.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_program.c
@@ -202,6 +202,9 @@ fd3_program_emit(struct fd_ringbuffer *ring, struct fd3_emit *emit)
 	color_regid = ir3_find_output_regid(fp,
 		ir3_semantic_name(TGSI_SEMANTIC_COLOR, 0));
 
+	if (util_format_is_alpha(emit->format))
+		color_regid += 3;
+
 	/* we could probably divide this up into things that need to be
 	 * emitted if frag-prog is dirty vs if vert-prog is dirty..
 	 */
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c
index 57f2574..6c54f61 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_draw.c
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_draw.c
@@ -97,9 +97,6 @@ fixup_shader_state(struct fd_context *ctx, struct ir3_shader_key *key)
 		if (last_key->half_precision != key->half_precision)
 			ctx->prog.dirty |= FD_SHADER_DIRTY_FP;
 
-		if (last_key->alpha != key->alpha)
-			ctx->prog.dirty |= FD_SHADER_DIRTY_FP;
-
 		if (last_key->rasterflat != key->rasterflat)
 			ctx->prog.dirty |= FD_SHADER_DIRTY_FP;
 
@@ -120,7 +117,6 @@ fd4_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info)
 			/* do binning pass first: */
 			.binning_pass = true,
 			.color_two_side = ctx->rasterizer ? ctx->rasterizer->light_twoside : false,
-			.alpha = util_format_is_alpha(pipe_surface_format(pfb->cbufs[0])),
 			.rasterflat = ctx->rasterizer && ctx->rasterizer->flatshade,
 			// TODO set .half_precision based on render target format,
 			// ie. float16 and smaller use half, float32 use full..
@@ -134,6 +130,7 @@ fd4_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info)
 			.fsaturate_r = fd4_ctx->fsaturate_r,
 		},
 		.format = fd4_emit_format(pfb->cbufs[0]),
+		.pformat = pipe_surface_format(pfb->cbufs[0]),
 	};
 	unsigned dirty;
 
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_emit.h b/src/gallium/drivers/freedreno/a4xx/fd4_emit.h
index 5dc3db8..7d059f8 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_emit.h
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_emit.h
@@ -54,6 +54,7 @@ struct fd4_emit {
 	const struct pipe_draw_info *info;
 	struct ir3_shader_key key;
 	enum a4xx_color_fmt format;
+	enum pipe_format pformat;
 	uint32_t dirty;
 
 	/* cached to avoid repeated lookups of same variants: */
diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_program.c b/src/gallium/drivers/freedreno/a4xx/fd4_program.c
index 776e4a1..9ee47fb 100644
--- a/src/gallium/drivers/freedreno/a4xx/fd4_program.c
+++ b/src/gallium/drivers/freedreno/a4xx/fd4_program.c
@@ -218,6 +218,9 @@ fd4_program_emit(struct fd_ringbuffer *ring, struct fd4_emit *emit)
 	color_regid = ir3_find_output_regid(s[FS].v,
 		ir3_semantic_name(TGSI_SEMANTIC_COLOR, 0));
 
+	if (util_format_is_alpha(emit->pformat))
+		color_regid += 3;
+
 	/* TODO get these dynamically: */
 	face_regid = s[FS].v->frag_face ? regid(0,0) : regid(63,0);
 	coord_regid = s[FS].v->frag_coord ? regid(0,0) : regid(63,0);
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c b/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c
index bf6bcb8..11bfe34 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c
@@ -225,7 +225,6 @@ static void print_usage(void)
 	printf("    --binning-pass    - generate binning pass shader (VERT)\n");
 	printf("    --color-two-side  - emulate two-sided color (FRAG)\n");
 	printf("    --half-precision  - use half-precision\n");
-	printf("    --alpha           - generate render-to-alpha shader (FRAG)\n");
 	printf("    --saturate-s MASK - bitmask of samplers to saturate S coord\n");
 	printf("    --saturate-t MASK - bitmask of samplers to saturate T coord\n");
 	printf("    --saturate-r MASK - bitmask of samplers to saturate R coord\n");
@@ -282,13 +281,6 @@ int main(int argc, char **argv)
 			continue;
 		}
 
-		if (!strcmp(argv[n], "--alpha")) {
-			debug_printf(" %s", argv[n]);
-			key.alpha = true;
-			n++;
-			continue;
-		}
-
 		if (!strcmp(argv[n], "--saturate-s")) {
 			debug_printf(" %s %s", argv[n], argv[n+1]);
 			key.vsaturate_s = key.fsaturate_s = strtol(argv[n+1], NULL, 0);
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler.c b/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
index f6bdc06..c600252 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
@@ -3496,23 +3496,6 @@ ir3_compile_shader(struct ir3_shader_variant *so,
 		block->noutputs = j * 4;
 	}
 
-	/* for rendering to alpha format, we only need the .w component,
-	 * and we need it to be in the .x position:
-	 */
-	if (key.alpha) {
-		for (i = 0, j = 0; i < so->outputs_count; i++) {
-			unsigned name = sem2name(so->outputs[i].semantic);
-
-			/* move .w component to .x and discard others: */
-			if (name == TGSI_SEMANTIC_COLOR) {
-				block->outputs[(i*4)+0] = block->outputs[(i*4)+3];
-				block->outputs[(i*4)+1] = NULL;
-				block->outputs[(i*4)+2] = NULL;
-				block->outputs[(i*4)+3] = NULL;
-			}
-		}
-	}
-
 	/* if we want half-precision outputs, mark the output registers
 	 * as half:
 	 */
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_shader.c b/src/gallium/drivers/freedreno/ir3/ir3_shader.c
index 122a447..b1dff38 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_shader.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_shader.c
@@ -236,7 +236,6 @@ ir3_shader_variant(struct ir3_shader *shader, struct ir3_shader_key key)
 	case SHADER_VERTEX:
 		key.color_two_side = false;
 		key.half_precision = false;
-		key.alpha = false;
 		key.rasterflat = false;
 		if (key.has_per_samp) {
 			key.fsaturate_s = 0;
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_shader.h b/src/gallium/drivers/freedreno/ir3/ir3_shader.h
index 7f38067..4b7d038 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_shader.h
+++ b/src/gallium/drivers/freedreno/ir3/ir3_shader.h
@@ -69,14 +69,6 @@ struct ir3_shader_key {
 			 */
 			unsigned color_two_side : 1;
 			unsigned half_precision : 1;
-			/* For rendering to alpha, we need a bit of special handling
-			 * since the hw always takes gl_FragColor starting from x
-			 * component, rather than figuring out to take the w component.
-			 * We could be more clever and generate variants for other
-			 * render target formats (ie. luminance formats are xxx1), but
-			 * let's start with this and see how it goes:
-			 */
-			unsigned alpha : 1;
 			/* used when shader needs to handle flat varyings (a4xx),
 			 * for TGSI_INTERPOLATE_COLOR:
 			 */




More information about the mesa-commit mailing list