[Mesa-dev] [PATCH] r600g: Fixed SIN/COS/SCS for the case where the operand is a literal.

Tilman Sauerbeck tilman at code-monkey.de
Thu Jan 6 13:30:17 PST 2011


Signed-off-by: Tilman Sauerbeck <tilman at code-monkey.de>
---
 src/gallium/drivers/r600/r600_shader.c |   17 +++++++++++++++--
 1 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index bb5038c..35a4cea 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -948,7 +948,7 @@ static int tgsi_setup_trig(struct r600_shader_ctx *ctx,
 			   struct r600_bc_alu_src r600_src[3])
 {
 	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
-	int r;
+	int r, src0_chan;
 	uint32_t lit_vals[4];
 	struct r600_bc_alu alu;
 
@@ -960,6 +960,19 @@ static int tgsi_setup_trig(struct r600_shader_ctx *ctx,
 	if (r)
 		return r;
 
+	src0_chan = tgsi_chan(&inst->Src[0], 0);
+
+	/* We are going to feed two literals to the MAD below,
+	 * which means that if the first operand is a literal as well,
+	 * we need to copy its value manually.
+	 */
+	if (r600_src[0].sel == V_SQ_ALU_SRC_LITERAL) {
+		unsigned index = inst->Src[0].Register.Index;
+
+		lit_vals[2] = ctx->literals[index * 4 + src0_chan];
+		src0_chan = 2;
+	}
+
 	lit_vals[0] = fui(1.0 /(3.1415926535 * 2));
 	lit_vals[1] = fui(0.5f);
 
@@ -972,7 +985,7 @@ static int tgsi_setup_trig(struct r600_shader_ctx *ctx,
 	alu.dst.write = 1;
 
 	alu.src[0] = r600_src[0];
-	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
+	alu.src[0].chan = src0_chan;
 
 	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
 	alu.src[1].chan = 0;
-- 
1.7.3.1



More information about the mesa-dev mailing list