[Mesa-dev] [PATCH] i915g: implement more opcodes.

Stéphane Marchesin marcheu at chromium.org
Mon Jun 6 12:32:53 PDT 2011


---
 src/gallium/drivers/i915/i915_fpc_translate.c |   94 +++++++++++++++++++++---
 1 files changed, 82 insertions(+), 12 deletions(-)

diff --git a/src/gallium/drivers/i915/i915_fpc_translate.c b/src/gallium/drivers/i915/i915_fpc_translate.c
index 695a396..51766cd 100644
--- a/src/gallium/drivers/i915/i915_fpc_translate.c
+++ b/src/gallium/drivers/i915/i915_fpc_translate.c
@@ -501,6 +501,17 @@ i915_translate_instruction(struct i915_fp_compile *p,
                       i915_emit_const4fv(p, cos_constants), 0);
       break;
 
+  case TGSI_OPCODE_DP2:
+      src0 = src_vector(p, &inst->Src[0]);
+      src1 = src_vector(p, &inst->Src[1]);
+
+      i915_emit_arith(p,
+                      A0_DP3,
+                      get_result_vector(p, &inst->Dst[0]),
+                      get_result_flags(inst), 0,
+                      swizzle(src0, X, Y, ZERO, ZERO), src1, 0);
+      break;
+
    case TGSI_OPCODE_DP3:
       emit_simple_arith(p, inst, A0_DP3, 2);
       break;
@@ -706,7 +717,7 @@ i915_translate_instruction(struct i915_fp_compile *p,
       i915_emit_arith(p,
                       A0_RCP,
                       get_result_vector(p, &inst->Dst[0]),
-                         get_result_flags(inst), 0,
+                      get_result_flags(inst), 0,
                       swizzle(src0, X, X, X, X), 0, 0);
       break;
 
@@ -784,13 +795,36 @@ i915_translate_instruction(struct i915_fp_compile *p,
       }
       break;
 
-   case TGSI_OPCODE_SGE:
-      emit_simple_arith(p, inst, A0_SGE, 2);
+   case TGSI_OPCODE_SEQ:
+      /* if we're both >= and <= then we're == */
+      src0 = src_vector(p, &inst->Src[0]);
+      src1 = src_vector(p, &inst->Src[1]);
+      tmp = i915_get_utemp(p);
+
+      i915_emit_arith(p,
+                      A0_SGE,
+                      tmp, A0_DEST_CHANNEL_ALL, 0,
+                      src0,
+                      src1, 0);
+
+      i915_emit_arith(p,
+                      A0_SGE,
+                      get_result_vector(p, &inst->Dst[0]),
+                      A0_DEST_CHANNEL_ALL, 0,
+                      src1,
+                      src0, 0);
+
+      i915_emit_arith(p,
+                      A0_MUL,
+                      get_result_vector(p, &inst->Dst[0]),
+                      A0_DEST_CHANNEL_ALL, 0,
+                      get_result_vector(p, &inst->Dst[0]),
+                      tmp, 0);
+
       break;
 
-   case TGSI_OPCODE_SLE:
-      /* like SGE, but swap reg0, reg1 */
-      emit_simple_arith_swap2(p, inst, A0_SGE, 2);
+   case TGSI_OPCODE_SGE:
+      emit_simple_arith(p, inst, A0_SGE, 2);
       break;
 
    case TGSI_OPCODE_SIN:
@@ -843,6 +877,11 @@ i915_translate_instruction(struct i915_fp_compile *p,
                       i915_emit_const4fv(p, sin_constants), 0);
       break;
 
+   case TGSI_OPCODE_SLE:
+      /* like SGE, but swap reg0, reg1 */
+      emit_simple_arith_swap2(p, inst, A0_SGE, 2);
+      break;
+
    case TGSI_OPCODE_SLT:
       emit_simple_arith(p, inst, A0_SLT, 2);
       break;
@@ -852,32 +891,59 @@ i915_translate_instruction(struct i915_fp_compile *p,
       emit_simple_arith_swap2(p, inst, A0_SLT, 2);
       break;
 
-   case TGSI_OPCODE_SEQ:
-      /* if we're both >= and <= then we're == */
+   case TGSI_OPCODE_SNE:
+      /* if we're neither < nor > then we're != */
       src0 = src_vector(p, &inst->Src[0]);
       src1 = src_vector(p, &inst->Src[1]);
       tmp = i915_get_utemp(p);
 
       i915_emit_arith(p,
-                      A0_SGE,
-                      tmp, A0_DEST_CHANNEL_ALL, 0,
+                      A0_SLT,
+                      tmp,
+                      A0_DEST_CHANNEL_ALL, 0,
                       src0,
                       src1, 0);
 
       i915_emit_arith(p,
-                      A0_SGE,
+                      A0_SLT,
                       get_result_vector(p, &inst->Dst[0]),
                       A0_DEST_CHANNEL_ALL, 0,
                       src1,
                       src0, 0);
 
       i915_emit_arith(p,
-                      A0_MUL,
+                      A0_ADD,
                       get_result_vector(p, &inst->Dst[0]),
                       A0_DEST_CHANNEL_ALL, 0,
                       get_result_vector(p, &inst->Dst[0]),
                       tmp, 0);
+      break;
 
+   case TGSI_OPCODE_SSG:
+      /* compute (src>0) - (src<0) */
+      src0 = src_vector(p, &inst->Src[0]);
+      tmp = i915_get_utemp(p);
+
+      i915_emit_arith(p,
+                      A0_SLT,
+                      tmp,
+                      A0_DEST_CHANNEL_ALL, 0,
+                      src0,
+                      swizzle(src0, ZERO, ZERO, ZERO, ZERO), 0);
+
+      i915_emit_arith(p,
+                      A0_SLT,
+                      get_result_vector(p, &inst->Dst[0]),
+                      A0_DEST_CHANNEL_ALL, 0,
+                      swizzle(src0, ZERO, ZERO, ZERO, ZERO),
+                      src0, 0);
+
+      i915_emit_arith(p,
+                      A0_ADD,
+                      get_result_vector(p, &inst->Dst[0]),
+                      A0_DEST_CHANNEL_ALL, 0,
+                      get_result_vector(p, &inst->Dst[0]),
+                      negate(tmp, 1, 1, 1, 1), 0);
       break;
 
    case TGSI_OPCODE_SUB:
@@ -895,6 +961,10 @@ i915_translate_instruction(struct i915_fp_compile *p,
       emit_tex(p, inst, T0_TEXLD);
       break;
 
+   case TGSI_OPCODE_TRUNC:
+      emit_simple_arith(p, inst, A0_TRC, 1);
+      break;
+
    case TGSI_OPCODE_TXB:
       emit_tex(p, inst, T0_TEXLDB);
       break;
-- 
1.7.5.3.367.ga9930



More information about the mesa-dev mailing list