i965/fs_nir: Don't duplicate emit_general_interpolation
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 21 Oct 2014 01:07:28 +0000 (18:07 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 15 Jan 2015 15:18:59 +0000 (07:18 -0800)
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
src/mesa/drivers/dri/i965/brw_fs.h
src/mesa/drivers/dri/i965/brw_fs_nir.cpp

index e6ecc0820aa4ccf97817c807a39657e128936fe4..d9388c585e42ed68ed5b7c954fca15f071d53cd4 100644 (file)
@@ -573,7 +573,6 @@ public:
    void nir_setup_outputs(nir_shader *shader);
    void nir_setup_uniforms(nir_shader *shader);
    void nir_setup_registers(exec_list *regs);
-   void nir_emit_interpolation(nir_variable *var, fs_reg *reg);
    void nir_setup_uniform(nir_variable *var);
    void nir_setup_builtin_uniform(nir_variable *var);
    void nir_emit_impl(nir_function_impl *impl);
index 36ee294f42aca8afb6a2517c3d87968c55a81baa..6fa4527522ae0e57a3fce215d9b69aa49c9ca480 100644 (file)
 #include "glsl/nir/glsl_to_nir.h"
 #include "brw_fs.h"
 
-static glsl_interp_qualifier
-determine_interpolation_mode(nir_variable *var, bool flat_shade)
-{
-   if (var->data.interpolation != INTERP_QUALIFIER_NONE)
-      return (glsl_interp_qualifier) var->data.interpolation;
-   int location = var->data.location;
-   bool is_gl_Color =
-      location == VARYING_SLOT_COL0 || location == VARYING_SLOT_COL1;
-   if (flat_shade && is_gl_Color)
-      return INTERP_QUALIFIER_FLAT;
-   else
-      return INTERP_QUALIFIER_SMOOTH;
-}
-
 void
 fs_visitor::emit_nir_code()
 {
@@ -118,101 +104,10 @@ fs_visitor::nir_setup_inputs(nir_shader *shader)
          reg = *emit_frontfacing_interpolation();
          emit(MOV(retype(varying, BRW_REGISTER_TYPE_UD), reg));
       } else {
-         nir_emit_interpolation(var, &varying);
-      }
-   }
-}
-
-void
-fs_visitor::nir_emit_interpolation(nir_variable *var, fs_reg *varying)
-{
-   brw_wm_prog_data *prog_data = (brw_wm_prog_data*) this->prog_data;
-   brw_wm_prog_key *key = (brw_wm_prog_key*) this->key;
-   fs_reg reg = *varying;
-   reg.type = brw_type_for_base_type(var->type->get_scalar_type());
-
-   unsigned int array_elements;
-   const glsl_type *type;
-
-   if (var->type->is_array()) {
-      array_elements = var->type->length;
-      if (array_elements == 0) {
-         fail("dereferenced array '%s' has length 0\n", var->name);
-      }
-      type = var->type->fields.array;
-   } else {
-      array_elements = 1;
-      type = var->type;
-   }
-
-   glsl_interp_qualifier interpolation_mode =
-      determine_interpolation_mode(var, key->flat_shade);
-
-   int location = var->data.location;
-   for (unsigned int i = 0; i < array_elements; i++) {
-      for (unsigned int j = 0; j < type->matrix_columns; j++) {
-         if (prog_data->urb_setup[location] == -1) {
-            /* If there's no incoming setup data for this slot, don't
-             * emit interpolation for it.
-             */
-            reg.reg_offset += type->vector_elements;
-            location++;
-            continue;
-         }
-
-         if (interpolation_mode == INTERP_QUALIFIER_FLAT) {
-            /* Constant interpolation (flat shading) case. The SF has
-             * handed us defined values in only the constant offset
-             * field of the setup reg.
-             */
-            for (unsigned int k = 0; k < type->vector_elements; k++) {
-               struct brw_reg interp = interp_reg(location, k);
-               interp = suboffset(interp, 3);
-               interp.type = reg.type;
-               emit(FS_OPCODE_CINTERP, reg, fs_reg(interp));
-               reg.reg_offset++;
-            }
-         } else {
-            /* Smooth/noperspective interpolation case. */
-            for (unsigned int k = 0; k < type->vector_elements; k++) {
-               struct brw_reg interp = interp_reg(location, k);
-               if (brw->needs_unlit_centroid_workaround && var->data.centroid) {
-                  /* Get the pixel/sample mask into f0 so that we know
-                   * which pixels are lit.  Then, for each channel that is
-                   * unlit, replace the centroid data with non-centroid
-                   * data.
-                   */
-                  emit(FS_OPCODE_MOV_DISPATCH_TO_FLAGS);
-
-                  fs_inst *inst;
-                  inst = emit_linterp(reg, fs_reg(interp), interpolation_mode,
-                                      false, false);
-                  inst->predicate = BRW_PREDICATE_NORMAL;
-                  inst->predicate_inverse = true;
-                  if (brw->has_pln)
-                     inst->no_dd_clear = true;
-
-                  inst = emit_linterp(reg, fs_reg(interp), interpolation_mode,
-                                      var->data.centroid && !key->persample_shading,
-                                      var->data.sample || key->persample_shading);
-                  inst->predicate = BRW_PREDICATE_NORMAL;
-                  inst->predicate_inverse = false;
-                  if (brw->has_pln)
-                     inst->no_dd_check = true;
-
-               } else {
-                  emit_linterp(reg, fs_reg(interp), interpolation_mode,
-                               var->data.centroid && !key->persample_shading,
-                               var->data.sample || key->persample_shading);
-               }
-               if (brw->gen < 6 && interpolation_mode == INTERP_QUALIFIER_SMOOTH) {
-                  emit(BRW_OPCODE_MUL, reg, reg, this->pixel_w);
-               }
-              reg.reg_offset++;
-            }
-
-         }
-         location++;
+         emit_general_interpolation(varying, var->name, var->type,
+                                    (glsl_interp_qualifier) var->data.interpolation,
+                                    var->data.location, var->data.centroid,
+                                    var->data.sample);
       }
    }
 }