i965/fs: Use a single instance of the pull_constant_loc[] array.
[mesa.git] / src / mesa / drivers / dri / i965 / brw_fs.h
index f2750f91d9cdf23d3e5e81cdfb153394c2ca6d4e..9de1f3a0a8a40eeb83458c5740b8dc8337973591 100644 (file)
@@ -74,7 +74,7 @@ public:
    fs_reg(uint32_t u);
    fs_reg(struct brw_reg fixed_hw_reg);
    fs_reg(enum register_file file, int reg);
-   fs_reg(enum register_file file, int reg, enum brw_reg_type type);
+   fs_reg(enum register_file file, int reg, uint32_t type);
    fs_reg(class fs_visitor *v, const struct glsl_type *type);
 
    bool equals(const fs_reg &r) const;
@@ -91,7 +91,7 @@ public:
    /** Register file: GRF, MRF, IMM. */
    enum register_file file;
    /** Register type.  BRW_REGISTER_TYPE_* */
-   enum brw_reg_type type;
+   uint8_t type;
    /**
     * Register number.  For MRF, it's the hardware register.  For
     * GRF, it's a virtual register number until register allocation
@@ -284,7 +284,6 @@ public:
 
    bool can_do_source_mods(fs_inst *inst);
 
-   fs_inst *emit(fs_inst inst);
    fs_inst *emit(fs_inst *inst);
    void emit(exec_list list);
 
@@ -332,10 +331,11 @@ public:
    int type_size(const struct glsl_type *type);
    fs_inst *get_instruction_generating_reg(fs_inst *start,
                                           fs_inst *end,
-                                          fs_reg reg);
+                                          const fs_reg &reg);
 
-   exec_list VARYING_PULL_CONSTANT_LOAD(fs_reg dst, fs_reg surf_index,
-                                        fs_reg varying_offset,
+   exec_list VARYING_PULL_CONSTANT_LOAD(const fs_reg &dst,
+                                        const fs_reg &surf_index,
+                                        const fs_reg &varying_offset,
                                         uint32_t const_offset);
 
    bool run();
@@ -357,7 +357,8 @@ public:
    void split_virtual_grfs();
    void compact_virtual_grfs();
    void move_uniform_array_access_to_pull_constants();
-   void setup_pull_constants();
+   void assign_constant_locations();
+   void demote_pull_constants();
    void invalidate_live_intervals();
    void calculate_live_intervals();
    void calculate_register_pressure();
@@ -374,7 +375,6 @@ public:
    bool compute_to_mrf();
    bool dead_code_eliminate();
    bool dead_code_eliminate_local();
-   bool remove_dead_constants();
    bool remove_duplicate_mrf_writes();
    bool virtual_grf_interferes(int a, int b);
    void schedule_instructions(instruction_scheduler_mode mode);
@@ -415,9 +415,10 @@ public:
    fs_reg fix_math_operand(fs_reg src);
    fs_inst *emit_math(enum opcode op, fs_reg dst, fs_reg src0);
    fs_inst *emit_math(enum opcode op, fs_reg dst, fs_reg src0, fs_reg src1);
-   void emit_lrp(fs_reg dst, fs_reg x, fs_reg y, fs_reg a);
-   void emit_minmax(uint32_t conditionalmod, fs_reg dst,
-                    fs_reg src0, fs_reg src1);
+   void emit_lrp(const fs_reg &dst, const fs_reg &x, const fs_reg &y,
+                 const fs_reg &a);
+   void emit_minmax(uint32_t conditionalmod, const fs_reg &dst,
+                    const fs_reg &src0, const fs_reg &src1);
    bool try_emit_saturate(ir_expression *ir);
    bool try_emit_mad(ir_expression *ir, int mul_arg);
    void try_replace_with_sel();
@@ -508,13 +509,17 @@ public:
    /** Number of uniform variable components visited. */
    unsigned uniforms;
 
-   /* This is the map from UNIFORM hw_reg + reg_offset as generated by
-    * the visitor to the packed uniform number after
-    * remove_dead_constants() that represents the actual uploaded
-    * uniform index.
+   /**
+    * Array mapping UNIFORM register numbers to the pull parameter index,
+    * or -1 if this uniform register isn't being uploaded as a pull constant.
+    */
+   int *pull_constant_loc;
+
+   /**
+    * Array mapping UNIFORM register numbers to the push parameter index,
+    * or -1 if this uniform register isn't being uploaded as a push constant.
     */
-   int *params_remap;
-   int nr_params_remap;
+   int *push_constant_loc;
 
    struct hash_table *variable_ht;
    fs_reg frag_depth;