[Mesa-dev] [PATCH 42/53] r600/shader: handle TES exports and streamout

Dave Airlie airlied at gmail.com
Sun Nov 29 22:20:51 PST 2015


From: Dave Airlie <airlied at redhat.com>

when tessellation is enabled the TES shader is responsible
for handling streamout and exports.

This adds the streamout and export workarounds to TES,
and also makes sure TES sets up spi_sid.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 src/gallium/drivers/r600/r600_shader.c | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index b306c6e..d2cc927 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -836,7 +836,8 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx)
 			ctx->shader->output[i].interpolate = d->Interp.Interpolate;
 			ctx->shader->output[i].write_mask = d->Declaration.UsageMask;
 			if (ctx->type == TGSI_PROCESSOR_VERTEX ||
-			    ctx->type == TGSI_PROCESSOR_GEOMETRY) {
+			    ctx->type == TGSI_PROCESSOR_GEOMETRY ||
+			    ctx->type == TGSI_PROCESSOR_TESS_EVAL) {
 				ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
 				switch (d->Semantic.Name) {
 				case TGSI_SEMANTIC_CLIPDIST:
@@ -3202,10 +3203,15 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
 	}
 
 	/* Add stream outputs. */
-	if (!ring_outputs && ctx.type == TGSI_PROCESSOR_VERTEX &&
-	    so.num_outputs && !use_llvm)
-		emit_streamout(&ctx, &so, -1, NULL);
-
+	if (!use_llvm && so.num_outputs) {
+		bool emit = false;
+		if (!lds_outputs && !ring_outputs && ctx.type == TGSI_PROCESSOR_VERTEX)
+			emit = true;
+		if (!ring_outputs && ctx.type == TGSI_PROCESSOR_TESS_EVAL)
+			emit = true;
+		if (emit)
+			emit_streamout(&ctx, &so, -1, NULL);
+	}
 	pipeshader->enabled_stream_buffers_mask = ctx.enabled_stream_buffers_mask;
 	convert_edgeflag_to_int(&ctx);
 
@@ -3243,6 +3249,7 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
 			output[j].op = CF_OP_EXPORT;
 			switch (ctx.type) {
 			case TGSI_PROCESSOR_VERTEX:
+			case TGSI_PROCESSOR_TESS_EVAL:
 				switch (shader->output[i].name) {
 				case TGSI_SEMANTIC_POSITION:
 					output[j].array_base = 60;
@@ -3386,6 +3393,8 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
 					goto out_err;
 				}
 				break;
+			case TGSI_PROCESSOR_TESS_CTRL:
+				break;
 			default:
 				R600_ERR("unsupported processor type %d\n", ctx.type);
 				r = -EINVAL;
@@ -3399,7 +3408,7 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
 		}
 
 		/* add fake position export */
-		if (ctx.type == TGSI_PROCESSOR_VERTEX && pos_emitted == false) {
+		if ((ctx.type == TGSI_PROCESSOR_VERTEX || ctx.type == TGSI_PROCESSOR_TESS_EVAL) && pos_emitted == false) {
 			memset(&output[j], 0, sizeof(struct r600_bytecode_output));
 			output[j].gpr = 0;
 			output[j].elem_size = 3;
@@ -3415,7 +3424,7 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
 		}
 
 		/* add fake param output for vertex shader if no param is exported */
-		if (ctx.type == TGSI_PROCESSOR_VERTEX && next_param_base == 0) {
+		if ((ctx.type == TGSI_PROCESSOR_VERTEX || ctx.type == TGSI_PROCESSOR_TESS_EVAL) && next_param_base == 0) {
 			memset(&output[j], 0, sizeof(struct r600_bytecode_output));
 			output[j].gpr = 0;
 			output[j].elem_size = 3;
-- 
2.5.0



More information about the mesa-dev mailing list