i965/vec4: Make with_writemask() non-static.
[mesa.git] / src / mesa / drivers / dri / i965 / brw_fs_fp.cpp
index c0a88105e8135cafb7bbd03b75ffc8371dcb9efc..68531e3b2fa27f0bce32e516a1820005b12f7829 100644 (file)
@@ -88,9 +88,8 @@ fs_visitor::emit_fp_sop(uint32_t conditional_mod,
       if (fpi->DstReg.WriteMask & (1 << i)) {
          fs_inst *inst;
 
-         inst = emit(BRW_OPCODE_CMP, fs_reg(brw_null_reg()),
-                     regoffset(src0, i), regoffset(src1, i));
-         inst->conditional_mod = conditional_mod;
+         emit(CMP(reg_null_d, regoffset(src0, i), regoffset(src1, i),
+                  conditional_mod));
 
          inst = emit(BRW_OPCODE_SEL, regoffset(dst, i), one, fs_reg(0.0f));
          inst->predicate = BRW_PREDICATE_NORMAL;
@@ -104,7 +103,7 @@ fs_visitor::emit_fp_scalar_write(const struct prog_instruction *fpi,
 {
    for (int i = 0; i < 4; i++) {
       if (fpi->DstReg.WriteMask & (1 << i))
-         emit(BRW_OPCODE_MOV, regoffset(dst, i), src);
+         emit(MOV(regoffset(dst, i), src));
    }
 }
 
@@ -136,7 +135,7 @@ fs_visitor::emit_fragment_program_code()
     * mov.f0 dst 1.0
     */
    fs_reg one = fs_reg(this, glsl_type::float_type);
-   emit(BRW_OPCODE_MOV, one, fs_reg(1.0f));
+   emit(MOV(one, fs_reg(1.0f)));
 
    for (unsigned int insn = 0; insn < fp->Base.NumInstructions; insn++) {
       const struct prog_instruction *fpi = &fp->Base.Instructions[insn];
@@ -171,9 +170,8 @@ fs_visitor::emit_fragment_program_code()
             if (fpi->DstReg.WriteMask & (1 << i)) {
                fs_inst *inst;
 
-               inst = emit(BRW_OPCODE_CMP, null,
-                           regoffset(src[0], i), fs_reg(0.0f));
-               inst->conditional_mod = BRW_CONDITIONAL_L;
+               emit(CMP(null, regoffset(src[0], i), fs_reg(0.0f),
+                        BRW_CONDITIONAL_L));
 
                inst = emit(BRW_OPCODE_SEL, regoffset(dst, i),
                            regoffset(src[1], i), regoffset(src[2], i));
@@ -202,16 +200,14 @@ fs_visitor::emit_fragment_program_code()
          default: assert(!"not reached"); count = 0; break;
          }
 
-         emit(BRW_OPCODE_MUL, acc,
-              regoffset(src[0], 0), regoffset(src[1], 0));
+         emit(MUL(acc, regoffset(src[0], 0), regoffset(src[1], 0)));
          for (int i = 1; i < count; i++) {
-            emit(BRW_OPCODE_MUL, mul,
-                 regoffset(src[0], i), regoffset(src[1], i));
-            emit(BRW_OPCODE_ADD, acc, acc, mul);
+            emit(MUL(mul, regoffset(src[0], i), regoffset(src[1], i)));
+            emit(ADD(acc, acc, mul));
          }
 
          if (fpi->Opcode == OPCODE_DPH)
-            emit(BRW_OPCODE_ADD, acc, acc, regoffset(src[1], 3));
+            emit(ADD(acc, acc, regoffset(src[1], 3)));
 
          emit_fp_scalar_write(fpi, dst, acc);
          break;
@@ -219,15 +215,15 @@ fs_visitor::emit_fragment_program_code()
 
       case OPCODE_DST:
          if (fpi->DstReg.WriteMask & WRITEMASK_X)
-            emit(BRW_OPCODE_MOV, dst, fs_reg(1.0f));
+            emit(MOV(dst, fs_reg(1.0f)));
          if (fpi->DstReg.WriteMask & WRITEMASK_Y) {
-            emit(BRW_OPCODE_MUL, regoffset(dst, 1),
-                 regoffset(src[0], 1), regoffset(src[1], 1));
+            emit(MUL(regoffset(dst, 1),
+                     regoffset(src[0], 1), regoffset(src[1], 1)));
          }
          if (fpi->DstReg.WriteMask & WRITEMASK_Z)
-            emit(BRW_OPCODE_MOV, regoffset(dst, 2), regoffset(src[0], 2));
+            emit(MOV(regoffset(dst, 2), regoffset(src[0], 2)));
          if (fpi->DstReg.WriteMask & WRITEMASK_W)
-            emit(BRW_OPCODE_MOV, regoffset(dst, 3), regoffset(src[1], 3));
+            emit(MOV(regoffset(dst, 3), regoffset(src[1], 3)));
          break;
 
       case OPCODE_EX2:
@@ -256,14 +252,15 @@ fs_visitor::emit_fragment_program_code()
                continue;
             }
 
-            fs_inst *inst = emit(BRW_OPCODE_CMP, null,
-                                 regoffset(src[0], i), 0.0f);
-            inst->conditional_mod = BRW_CONDITIONAL_L;
 
-            inst = emit(BRW_OPCODE_IF);
-            inst->predicate = BRW_PREDICATE_NORMAL;
-            emit(FS_OPCODE_DISCARD);
-            emit(BRW_OPCODE_ENDIF);
+            /* Emit an instruction that's predicated on the current
+             * undiscarded pixels, and updates just those pixels to be
+             * turned off.
+             */
+            fs_inst *cmp = emit(CMP(null, regoffset(src[0], i), fs_reg(0.0f),
+                                    BRW_CONDITIONAL_GE));
+            cmp->predicate = BRW_PREDICATE_NORMAL;
+            cmp->flag_subreg = 1;
          }
          break;
       }
@@ -289,17 +286,16 @@ fs_visitor::emit_fragment_program_code()
           * brw_wm_emit.c either.
           */
          if (fpi->DstReg.WriteMask & WRITEMASK_X)
-            emit(BRW_OPCODE_MOV, regoffset(dst, 0), fs_reg(1.0f));
+            emit(MOV(regoffset(dst, 0), fs_reg(1.0f)));
 
          if (fpi->DstReg.WriteMask & WRITEMASK_YZ) {
             fs_inst *inst;
-            inst = emit(BRW_OPCODE_CMP, null,
-                        regoffset(src[0], 0), fs_reg(0.0f));
-            inst->conditional_mod = BRW_CONDITIONAL_LE;
+            emit(CMP(null, regoffset(src[0], 0), fs_reg(0.0f),
+                     BRW_CONDITIONAL_LE));
 
             if (fpi->DstReg.WriteMask & WRITEMASK_Y) {
-               emit(BRW_OPCODE_MOV, regoffset(dst, 1), regoffset(src[0], 0));
-               inst = emit(BRW_OPCODE_MOV, regoffset(dst, 1), fs_reg(0.0f));
+               emit(MOV(regoffset(dst, 1), regoffset(src[0], 0)));
+               inst = emit(MOV(regoffset(dst, 1), fs_reg(0.0f)));
                inst->predicate = BRW_PREDICATE_NORMAL;
             }
 
@@ -307,28 +303,23 @@ fs_visitor::emit_fragment_program_code()
                emit_math(SHADER_OPCODE_POW, regoffset(dst, 2),
                          regoffset(src[0], 1), regoffset(src[0], 3));
 
-               inst = emit(BRW_OPCODE_MOV, regoffset(dst, 2), fs_reg(0.0f));
+               inst = emit(MOV(regoffset(dst, 2), fs_reg(0.0f)));
                inst->predicate = BRW_PREDICATE_NORMAL;
             }
          }
 
          if (fpi->DstReg.WriteMask & WRITEMASK_W)
-            emit(BRW_OPCODE_MOV, regoffset(dst, 3), fs_reg(1.0f));
+            emit(MOV(regoffset(dst, 3), fs_reg(1.0f)));
 
          break;
 
       case OPCODE_LRP:
          for (int i = 0; i < 4; i++) {
             if (fpi->DstReg.WriteMask & (1 << i)) {
-               fs_reg neg_src0 = regoffset(src[0], i);
-               neg_src0.negate = !neg_src0.negate;
-               fs_reg temp = fs_reg(this, glsl_type::float_type);
-               fs_reg temp2 = fs_reg(this, glsl_type::float_type);
-               emit(BRW_OPCODE_ADD, temp, neg_src0, fs_reg(1.0f));
-               emit(BRW_OPCODE_MUL, temp, temp, regoffset(src[2], i));
-               emit(BRW_OPCODE_MUL, temp2,
-                    regoffset(src[0], i), regoffset(src[1], i));
-               emit(BRW_OPCODE_ADD, regoffset(dst, i), temp, temp2);
+               fs_reg a = regoffset(src[0], i);
+               fs_reg y = regoffset(src[1], i);
+               fs_reg x = regoffset(src[2], i);
+               emit_lrp(regoffset(dst, i), x, y, a);
             }
          }
          break;
@@ -337,10 +328,8 @@ fs_visitor::emit_fragment_program_code()
          for (int i = 0; i < 4; i++) {
             if (fpi->DstReg.WriteMask & (1 << i)) {
                fs_reg temp = fs_reg(this, glsl_type::float_type);
-               emit(BRW_OPCODE_MUL, temp,
-                    regoffset(src[0], i), regoffset(src[1], i));
-               emit(BRW_OPCODE_ADD, regoffset(dst, i),
-                    temp, regoffset(src[2], i));
+               emit(MUL(temp, regoffset(src[0], i), regoffset(src[1], i)));
+               emit(ADD(regoffset(dst, i), temp, regoffset(src[2], i)));
             }
          }
          break;
@@ -423,6 +412,7 @@ fs_visitor::emit_fragment_program_code()
          fs_reg dpdy;
          fs_reg coordinate = src[0];
          fs_reg shadow_c;
+         fs_reg sample_index;
 
          switch (fpi->Opcode) {
          case OPCODE_TEX:
@@ -435,8 +425,8 @@ fs_visitor::emit_fragment_program_code()
             fs_reg invproj = fs_reg(this, glsl_type::float_type);
             emit_math(SHADER_OPCODE_RCP, invproj, regoffset(src[0], 3));
             for (int i = 0; i < 3; i++) {
-               emit(BRW_OPCODE_MUL, regoffset(coordinate, i),
-                    regoffset(src[0], i), invproj);
+               emit(MUL(regoffset(coordinate, i),
+                        regoffset(src[0], i), invproj));
             }
             break;
          }
@@ -449,6 +439,8 @@ fs_visitor::emit_fragment_program_code()
             break;
          }
 
+         ir->type = glsl_type::vec4_type;
+
          const glsl_type *coordinate_type;
          switch (fpi->TexSrcTarget) {
          case TEXTURE_1D_INDEX:
@@ -481,8 +473,8 @@ fs_visitor::emit_fragment_program_code()
                         temp, regoffset(abscoord, 2));
             emit_math(SHADER_OPCODE_RCP, temp, temp);
             for (int i = 0; i < 3; i++) {
-               emit(BRW_OPCODE_MUL, regoffset(cubecoord, i),
-                    regoffset(coordinate, i), temp);
+               emit(MUL(regoffset(cubecoord, i),
+                        regoffset(coordinate, i), temp));
             }
 
             coordinate = cubecoord;
@@ -508,10 +500,10 @@ fs_visitor::emit_fragment_program_code()
          }
 
          fs_inst *inst;
-         if (intel->gen >= 7) {
-            inst = emit_texture_gen7(ir, dst, coordinate, shadow_c, lod, dpdy);
-         } else if (intel->gen >= 5) {
-            inst = emit_texture_gen5(ir, dst, coordinate, shadow_c, lod, dpdy);
+         if (brw->gen >= 7) {
+            inst = emit_texture_gen7(ir, dst, coordinate, shadow_c, lod, dpdy, sample_index);
+         } else if (brw->gen >= 5) {
+            inst = emit_texture_gen5(ir, dst, coordinate, shadow_c, lod, dpdy, sample_index);
          } else {
             inst = emit_texture_gen4(ir, dst, coordinate, shadow_c, lod, dpdy);
          }
@@ -542,12 +534,10 @@ fs_visitor::emit_fragment_program_code()
                fs_reg temp = fs_reg(this, glsl_type::float_type);
                fs_reg neg_src1_1 = regoffset(src[1], i1);
                neg_src1_1.negate = !neg_src1_1.negate;
-               emit(BRW_OPCODE_MUL, temp,
-                    regoffset(src[0], i2), neg_src1_1);
-               emit(BRW_OPCODE_MUL, regoffset(dst, i),
-                    regoffset(src[0], i1), regoffset(src[1], i2));
-               emit(BRW_OPCODE_ADD, regoffset(dst, i),
-                    regoffset(dst, i), temp);
+               emit(MUL(temp, regoffset(src[0], i2), neg_src1_1));
+               emit(MUL(regoffset(dst, i),
+                        regoffset(src[0], i1), regoffset(src[1], i2)));
+               emit(ADD(regoffset(dst, i), regoffset(dst, i), temp));
             }
          }
          break;
@@ -568,9 +558,8 @@ fs_visitor::emit_fragment_program_code()
 
          for (int i = 0; i < 4; i++) {
             if (fpi->DstReg.WriteMask & (1 << i)) {
-               fs_inst *inst = emit(BRW_OPCODE_MOV,
-                                    regoffset(real_dst, i),
-                                    regoffset(dst, i));
+               fs_inst *inst = emit(MOV(regoffset(real_dst, i),
+                                        regoffset(dst, i)));
                inst->saturate = fpi->SaturateMode;
             }
          }
@@ -585,7 +574,7 @@ fs_visitor::emit_fragment_program_code()
    this->current_annotation = "result.depth write";
    if (frag_depth.file != BAD_FILE) {
       fs_reg temp = fs_reg(this, glsl_type::float_type);
-      emit(BRW_OPCODE_MOV, temp, regoffset(frag_depth, 2));
+      emit(MOV(temp, regoffset(frag_depth, 2)));
       frag_depth = temp;
    }
 }
@@ -600,50 +589,46 @@ fs_visitor::setup_fp_regs()
       fp_temp_regs[i] = fs_reg(this, glsl_type::vec4_type);
 
    /* PROGRAM_STATE_VAR etc. */
-   if (c->dispatch_width == 8) {
+   if (dispatch_width == 8) {
       for (unsigned p = 0;
-           p < c->fp->program.Base.Parameters->NumParameters; p++) {
+           p < fp->Base.Parameters->NumParameters; p++) {
          for (unsigned int i = 0; i < 4; i++) {
-            this->param_index[c->prog_data.nr_params] = p;
-            this->param_offset[c->prog_data.nr_params] = i;
-            c->prog_data.nr_params++;
+            c->prog_data.param[c->prog_data.nr_params++] =
+               &fp->Base.Parameters->ParameterValues[p][i].f;
          }
       }
    }
 
-   fp_input_regs = rzalloc_array(mem_ctx, fs_reg, FRAG_ATTRIB_MAX);
-   for (int i = 0; i < FRAG_ATTRIB_MAX; i++) {
+   fp_input_regs = rzalloc_array(mem_ctx, fs_reg, VARYING_SLOT_MAX);
+   for (int i = 0; i < VARYING_SLOT_MAX; i++) {
       if (fp->Base.InputsRead & BITFIELD64_BIT(i)) {
          /* Make up a dummy instruction to reuse code for emitting
           * interpolation.
           */
          ir_variable *ir = new(mem_ctx) ir_variable(glsl_type::vec4_type,
                                                     "fp_input",
-                                                    ir_var_in);
+                                                    ir_var_shader_in);
          ir->location = i;
 
          this->current_annotation = ralloc_asprintf(ctx, "interpolate input %d",
                                                     i);
 
          switch (i) {
-         case FRAG_ATTRIB_WPOS:
+         case VARYING_SLOT_POS:
             ir->pixel_center_integer = fp->PixelCenterInteger;
             ir->origin_upper_left = fp->OriginUpperLeft;
             fp_input_regs[i] = *emit_fragcoord_interpolation(ir);
             break;
-         case FRAG_ATTRIB_FACE:
+         case VARYING_SLOT_FACE:
             fp_input_regs[i] = *emit_frontfacing_interpolation(ir);
             break;
          default:
             fp_input_regs[i] = *emit_general_interpolation(ir);
 
-            if (i == FRAG_ATTRIB_FOGC) {
-               emit(BRW_OPCODE_MOV,
-                    regoffset(fp_input_regs[i], 1), fs_reg(0.0f));
-               emit(BRW_OPCODE_MOV,
-                    regoffset(fp_input_regs[i], 2), fs_reg(0.0f));
-               emit(BRW_OPCODE_MOV,
-                    regoffset(fp_input_regs[i], 3), fs_reg(1.0f));
+            if (i == VARYING_SLOT_FOGC) {
+               emit(MOV(regoffset(fp_input_regs[i], 1), fs_reg(0.0f)));
+               emit(MOV(regoffset(fp_input_regs[i], 2), fs_reg(0.0f)));
+               emit(MOV(regoffset(fp_input_regs[i], 3), fs_reg(1.0f)));
             }
 
             break;
@@ -702,7 +687,7 @@ fs_visitor::get_fp_dst_reg(const prog_dst_register *dst)
 fs_reg
 fs_visitor::get_fp_src_reg(const prog_src_register *src)
 {
-   struct gl_program_parameter_list *plist = c->fp->program.Base.Parameters;
+   struct gl_program_parameter_list *plist = fp->Base.Parameters;
 
    fs_reg result;
 
@@ -731,8 +716,8 @@ fs_visitor::get_fp_src_reg(const prog_src_register *src)
          result = fs_reg(this, glsl_type::vec4_type);
 
          for (int i = 0; i < 4; i++) {
-            emit(BRW_OPCODE_MOV, regoffset(result, i),
-                 fs_reg(plist->ParameterValues[src->Index][i].f));
+            emit(MOV(regoffset(result, i),
+                     fs_reg(plist->ParameterValues[src->Index][i].f)));
          }
          break;
       }
@@ -765,15 +750,15 @@ fs_visitor::get_fp_src_reg(const prog_src_register *src)
           */
          int src_swiz = GET_SWZ(src->Swizzle, i);
          if (src_swiz == SWIZZLE_ZERO) {
-            emit(BRW_OPCODE_MOV, regoffset(result, i), fs_reg(0.0f));
+            emit(MOV(regoffset(result, i), fs_reg(0.0f)));
          } else if (src_swiz == SWIZZLE_ONE) {
-            emit(BRW_OPCODE_MOV, regoffset(result, i),
-                 negate ? fs_reg(-1.0f) : fs_reg(1.0f));
+            emit(MOV(regoffset(result, i),
+                     negate ? fs_reg(-1.0f) : fs_reg(1.0f)));
          } else {
             fs_reg src = regoffset(unswizzled, src_swiz);
             if (negate)
                src.negate = !src.negate;
-            emit(BRW_OPCODE_MOV, regoffset(result, i), src);
+            emit(MOV(regoffset(result, i), src));
          }
       }
    }