Merge remote branch 'origin/master' into lp-setup-llvm
[mesa.git] / src / mesa / drivers / dri / i965 / brw_wm_emit.c
index a9ebc2689ceb5ed01814c4bab86ff9be709e82ab..cb71c665b47c52becf738811f32cd81e5f595229 100644 (file)
@@ -173,6 +173,7 @@ void emit_delta_xy(struct brw_compile *p,
                   GLuint mask,
                   const struct brw_reg *arg0)
 {
+   struct intel_context *intel = &p->brw->intel;
    struct brw_reg r1 = brw_vec1_grf(1, 0);
 
    if (mask == 0)
@@ -180,6 +181,21 @@ void emit_delta_xy(struct brw_compile *p,
 
    assert(mask == WRITEMASK_XY);
 
+   if (intel->gen >= 6) {
+       /* XXX Gen6 WM doesn't have Xstart/Ystart in payload r1.0/r1.1.
+         Just add them with 0.0 for dst reg.. */
+       r1 = brw_imm_v(0x00000000);
+       brw_ADD(p,
+              dst[0],
+              retype(arg0[0], BRW_REGISTER_TYPE_UW),
+              r1);
+       brw_ADD(p,
+              dst[1],
+              retype(arg0[1], BRW_REGISTER_TYPE_UW),
+              r1);
+       return;
+   }
+
    /* Calc delta X,Y by subtracting origin in r1 from the pixel
     * centers produced by emit_pixel_xy().
     */
@@ -253,6 +269,13 @@ void emit_pixel_w(struct brw_wm_compile *c,
 {
    struct brw_compile *p = &c->func;
    struct intel_context *intel = &p->brw->intel;
+   struct brw_reg src;
+   struct brw_reg temp_dst;
+
+   if (intel->gen >= 6)
+       temp_dst = dst[3];
+   else
+       temp_dst = brw_message_reg(2);
 
    assert(intel->gen < 6);
 
@@ -266,24 +289,29 @@ void emit_pixel_w(struct brw_wm_compile *c,
        * result straight into a message reg.
        */
       if (can_do_pln(intel, deltas)) {
-        brw_PLN(p, brw_message_reg(2), interp3, deltas[0]);
+        brw_PLN(p, temp_dst, interp3, deltas[0]);
       } else {
         brw_LINE(p, brw_null_reg(), interp3, deltas[0]);
-        brw_MAC(p, brw_message_reg(2), suboffset(interp3, 1), deltas[1]);
+        brw_MAC(p, temp_dst, suboffset(interp3, 1), deltas[1]);
       }
 
       /* Calc w */
+      if (intel->gen >= 6)
+        src = temp_dst;
+      else
+        src = brw_null_reg();
+
       if (c->dispatch_width == 16) {
         brw_math_16(p, dst[3],
                     BRW_MATH_FUNCTION_INV,
                     BRW_MATH_SATURATE_NONE,
-                    2, brw_null_reg(),
+                    2, src,
                     BRW_MATH_PRECISION_FULL);
       } else {
         brw_math(p, dst[3],
                  BRW_MATH_FUNCTION_INV,
                  BRW_MATH_SATURATE_NONE,
-                 2, brw_null_reg(),
+                 2, src,
                  BRW_MATH_DATA_VECTOR,
                  BRW_MATH_PRECISION_FULL);
       }
@@ -1744,7 +1772,11 @@ void brw_wm_emit( struct brw_wm_compile *c )
         break;
 
       case OPCODE_TRUNC:
-        emit_alu1(p, brw_RNDZ, dst, dst_flags, args[0]);
+        for (i = 0; i < 4; i++) {
+           if (dst_flags & (1<<i)) {
+              brw_RNDZ(p, dst[i], args[0][i]);
+           }
+        }
         break;
 
       case OPCODE_LRP: