Mesa (master): radeonsi: Refactor initialization of shader export intrinsic arguments.

Michel Dänzer daenzer at kemper.freedesktop.org
Mon Aug 27 10:13:57 UTC 2012


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

Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Fri Aug 24 12:03:11 2012 +0200

radeonsi: Refactor initialization of shader export intrinsic arguments.

In preparation for extending this code, which would make it rather unwieldy in
its current place.

Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
Reviewed-by: Christian König <christian.koenig at amd.com>
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

---

 src/gallium/drivers/radeonsi/radeonsi_shader.c |   84 ++++++++++++++----------
 1 files changed, 48 insertions(+), 36 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c
index 671eda4..fd614dd 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_shader.c
+++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c
@@ -376,6 +376,53 @@ static LLVMValueRef fetch_constant(
 	return bitcast(bld_base, type, load);
 }
 
+/* Initialize arguments for the shader export intrinsic */
+static void si_llvm_init_export_args(struct lp_build_tgsi_context *bld_base,
+				     struct tgsi_full_declaration *d,
+				     unsigned index,
+				     unsigned target,
+				     LLVMValueRef *args)
+{
+	struct si_shader_context *si_shader_ctx = si_shader_context(bld_base);
+	struct lp_build_context *uint =
+				&si_shader_ctx->radeon_bld.soa.bld_base.uint_bld;
+	struct lp_build_context *base = &bld_base->base;
+	unsigned compressed = 0;
+	unsigned chan;
+
+	for (chan = 0; chan < 4; chan++ ) {
+		LLVMValueRef out_ptr =
+			si_shader_ctx->radeon_bld.soa.outputs[index][chan];
+		/* +5 because the first output value will be
+		 * the 6th argument to the intrinsic. */
+		args[chan + 5] = LLVMBuildLoad(base->gallivm->builder,
+					       out_ptr, "");
+	}
+
+	/* XXX: This controls which components of the output
+	 * registers actually get exported. (e.g bit 0 means export
+	 * X component, bit 1 means export Y component, etc.)  I'm
+	 * hard coding this to 0xf for now.  In the future, we might
+	 * want to do something else. */
+	args[0] = lp_build_const_int32(base->gallivm, 0xf);
+
+	/* Specify whether the EXEC mask represents the valid mask */
+	args[1] = uint->zero;
+
+	/* Specify whether this is the last export */
+	args[2] = uint->zero;
+
+	/* Specify the target we are exporting */
+	args[3] = lp_build_const_int32(base->gallivm, target);
+
+	/* Set COMPR flag */
+	args[4] = uint->zero;
+
+	/* XXX: We probably need to keep track of the output
+	 * values, so we know what we are passing to the next
+	 * stage. */
+}
+
 /* XXX: This is partially implemented for VS only at this point.  It is not complete */
 static void si_llvm_emit_epilogue(struct lp_build_tgsi_context * bld_base)
 {
@@ -390,13 +437,6 @@ static void si_llvm_emit_epilogue(struct lp_build_tgsi_context * bld_base)
 	unsigned param_count = 0;
 
 	while (!tgsi_parse_end_of_tokens(parse)) {
-		/* XXX: component_bits controls which components of the output
-		 * registers actually get exported. (e.g bit 0 means export
-		 * X component, bit 1 means export Y component, etc.)  I'm
-		 * hard coding this to 0xf for now.  In the future, we might
-		 * want to do something else. */
-		unsigned component_bits = 0xf;
-		unsigned chan;
 		struct tgsi_full_declaration *d =
 					&parse->FullToken.FullDeclaration;
 		LLVMValueRef args[9];
@@ -429,20 +469,6 @@ static void si_llvm_emit_epilogue(struct lp_build_tgsi_context * bld_base)
 		}
 
 		for (index = d->Range.First; index <= d->Range.Last; index++) {
-			for (chan = 0; chan < 4; chan++ ) {
-				LLVMValueRef out_ptr =
-					si_shader_ctx->radeon_bld.soa.outputs
-					[index][chan];
-				/* +5 because the first output value will be
-				 * the 6th argument to the intrinsic. */
-				args[chan + 5]= LLVMBuildLoad(
-					base->gallivm->builder,	out_ptr, "");
-			}
-
-			/* XXX: We probably need to keep track of the output
-			 * values, so we know what we are passing to the next
-			 * stage. */
-
 			/* Select the correct target */
 			switch(d->Semantic.Name) {
 			case TGSI_SEMANTIC_POSITION:
@@ -470,21 +496,7 @@ static void si_llvm_emit_epilogue(struct lp_build_tgsi_context * bld_base)
 					d->Semantic.Name);
 			}
 
-			/* Specify which components to enable */
-			args[0] = lp_build_const_int32(base->gallivm,
-								component_bits);
-
-			/* Specify whether the EXEC mask represents the valid mask */
-			args[1] = lp_build_const_int32(base->gallivm, 0);
-
-			/* Specify whether this is the last export */
-			args[2] = lp_build_const_int32(base->gallivm, 0);
-
-			/* Specify the target we are exporting */
-			args[3] = lp_build_const_int32(base->gallivm, target);
-
-			/* Set COMPR flag to zero to export data as 32-bit */
-			args[4] = uint->zero;
+			si_llvm_init_export_args(bld_base, d, index, target, args);
 
 			if (si_shader_ctx->type == TGSI_PROCESSOR_VERTEX ?
 			    (d->Semantic.Name == TGSI_SEMANTIC_POSITION) :




More information about the mesa-commit mailing list