r600g: Use clamped math for RCP and RSQ.
authorTilman Sauerbeck <tilman@code-monkey.de>
Fri, 10 Sep 2010 16:24:01 +0000 (18:24 +0200)
committerTilman Sauerbeck <tilman@code-monkey.de>
Thu, 16 Sep 2010 09:08:00 +0000 (11:08 +0200)
This is likely only correct for OpenGL and not other state trackers.

Signed-off-by: Tilman Sauerbeck <tilman@code-monkey.de>
src/gallium/drivers/r600/r600_shader.c

index 0453138d2ba7d51333aabf5e45c5b6b9281411eb..ad19238697d5c03680058ce974fedf76ed93fe49 100644 (file)
@@ -1129,7 +1129,13 @@ static int tgsi_rsq(struct r600_shader_ctx *ctx)
        int i, r;
 
        memset(&alu, 0, sizeof(struct r600_bc_alu));
-       alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE);
+
+       /* FIXME:
+        * For state trackers other than OpenGL, we'll want to use
+        * _RECIPSQRT_IEEE instead.
+        */
+       alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
+
        for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
                r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
                if (r)
@@ -2633,7 +2639,13 @@ static struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
        {TGSI_OPCODE_ARL,       0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_arl},
        {TGSI_OPCODE_MOV,       0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
        {TGSI_OPCODE_LIT,       0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
-       {TGSI_OPCODE_RCP,       0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
+
+       /* FIXME:
+        * For state trackers other than OpenGL, we'll want to use
+        * _RECIP_IEEE instead.
+        */
+       {TGSI_OPCODE_RCP,       0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
+
        {TGSI_OPCODE_RSQ,       0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
        {TGSI_OPCODE_EXP,       0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
        {TGSI_OPCODE_LOG,       0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},