i965: implement OPCODE_NRM3/NRM4
authorBrian Paul <brianp@vmware.com>
Wed, 31 Dec 2008 23:49:58 +0000 (16:49 -0700)
committerBrian Paul <brianp@vmware.com>
Thu, 1 Jan 2009 21:05:30 +0000 (14:05 -0700)
src/mesa/drivers/dri/i965/brw_vs_emit.c

index ebd8a17f7959867efb94fcb2762cd7659d7240ed..10f3e28190872ba78f61373461f4989380774401 100644 (file)
@@ -591,6 +591,31 @@ static void emit_lit_noalias( struct brw_vs_compile *c,
 }
 
 
+/** 3 or 4-component vector normalization */
+static void emit_nrm( struct brw_vs_compile *c, 
+                      struct brw_reg dst,
+                      struct brw_reg arg0,
+                      int num_comps)
+{
+   struct brw_compile *p = &c->func;
+   struct brw_reg tmp = get_tmp(c);
+
+   /* tmp = dot(arg0, arg0) */
+   if (num_comps == 3)
+      brw_DP3(p, tmp, arg0, arg0);
+   else
+      brw_DP4(p, tmp, arg0, arg0);
+
+   /* tmp = 1 / tmp */
+   emit_math1(c, BRW_MATH_FUNCTION_RSQ, tmp, tmp, BRW_MATH_PRECISION_FULL);
+
+   /* dst = arg0 * tmp */
+   brw_MUL(p, dst, arg0, tmp);
+
+   release_tmp(c, tmp);
+}
+
+
 /* TODO: relative addressing!
  */
 static struct brw_reg get_reg( struct brw_vs_compile *c,
@@ -1019,6 +1044,12 @@ void brw_vs_emit(struct brw_vs_compile *c )
       case OPCODE_DPH:
         brw_DPH(p, dst, args[0], args[1]);
         break;
+      case OPCODE_NRM3:
+        emit_nrm(c, dst, args[0], 3);
+        break;
+      case OPCODE_NRM4:
+        emit_nrm(c, dst, args[0], 4);
+        break;
       case OPCODE_DST:
         unalias2(c, dst, args[0], args[1], emit_dst_noalias); 
         break;
@@ -1145,11 +1176,10 @@ void brw_vs_emit(struct brw_vs_compile *c )
          /* no-op instructions */
         break;
       default:
-        _mesa_printf("Unsupported opcode %i (%s) in vertex shader\n",
-                     inst->Opcode, inst->Opcode < MAX_OPCODE ?
+        _mesa_problem(NULL, "Unsupported opcode %i (%s) in vertex shader",
+                       inst->Opcode, inst->Opcode < MAX_OPCODE ?
                                    _mesa_opcode_string(inst->Opcode) :
                                    "unknown");
-        break;
       }
 
       if ((inst->DstReg.File == PROGRAM_OUTPUT)