[Mesa-dev] [PATCH 7/8] r600: increment ring index after emit vertex not before.

Dave Airlie airlied at gmail.com
Mon Nov 9 20:10:28 PST 2015


From: Dave Airlie <airlied at redhat.com>

The docs say we should send the emit after the ring writes,
so lets do that and not have an ALU in between.

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

diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index 0e7c0e8..80922bf 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -1788,6 +1788,27 @@ static int generate_gs_copy_shader(struct r600_context *rctx,
 	return r600_bytecode_build(ctx.bc);
 }
 
+static int emit_inc_ring_offset(struct r600_shader_ctx *ctx, int idx, bool ind)
+{
+	if (ind) {
+		struct r600_bytecode_alu alu;
+		int r;
+
+		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
+		alu.op = ALU_OP2_ADD_INT;
+		alu.src[0].sel = ctx->gs_export_gpr_tregs[idx];
+		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
+		alu.src[1].value = ctx->gs_out_ring_offset >> 4;
+		alu.dst.sel = ctx->gs_export_gpr_tregs[idx];
+		alu.dst.write = 1;
+		alu.last = 1;
+		r = r600_bytecode_add_alu(ctx->bc, &alu);
+		if (r)
+			return r;
+	}
+	return 0;
+}
+
 static int emit_gs_ring_writes(struct r600_shader_ctx *ctx, const struct pipe_stream_output_info *so, int stream, bool ind)
 {
 	struct r600_bytecode_output output;
@@ -1854,23 +1875,6 @@ static int emit_gs_ring_writes(struct r600_shader_ctx *ctx, const struct pipe_st
 		r600_bytecode_add_output(ctx->bc, &output);
 	}
 
-	if (ind) {
-		/* get a temp and add the ring offset to the next vertex base in the shader */
-		struct r600_bytecode_alu alu;
-		int r;
-
-		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
-		alu.op = ALU_OP2_ADD_INT;
-		alu.src[0].sel = ctx->gs_export_gpr_tregs[effective_stream];
-		alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
-		alu.src[1].value = ctx->gs_out_ring_offset >> 4;
-		alu.dst.sel = ctx->gs_export_gpr_tregs[effective_stream];
-		alu.dst.write = 1;
-		alu.last = 1;
-		r = r600_bytecode_add_alu(ctx->bc, &alu);
-		if (r)
-			return r;
-	}
 	++ctx->gs_next_vertex;
 	return 0;
 }
@@ -7758,8 +7762,10 @@ static int tgsi_gs_emit(struct r600_shader_ctx *ctx)
 		emit_gs_ring_writes(ctx, ctx->gs_stream_output_info, stream, TRUE);
 
 	r = r600_bytecode_add_cfinst(ctx->bc, ctx->inst_info->op);
-	if (!r)
+	if (!r) {
 		ctx->bc->cf_last->count = stream; // Count field for CUT/EMIT_VERTEX indicates which stream
+		return emit_inc_ring_offset(ctx, stream, TRUE);
+	}
 	return r;
 }
 
-- 
2.1.0



More information about the mesa-dev mailing list