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

2011-01-06 Thread Tilman Sauerbeck
Signed-off-by: Tilman Sauerbeck til...@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

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


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

2011-01-06 Thread Alex Deucher
On Thu, Jan 6, 2011 at 4:30 PM, Tilman Sauerbeck til...@code-monkey.de wrote:
 Signed-off-by: Tilman Sauerbeck til...@code-monkey.de

looks good to me.  should probably be applied to 7.10 as well.

Reviewed-by: Alex Deucher alexdeuc...@gmail.com

Alex

 ---
  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

 ___
 mesa-dev mailing list
 mesa-dev@lists.freedesktop.org
 http://lists.freedesktop.org/mailman/listinfo/mesa-dev

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev