i965/vec4: Virtualize setup_payload instead of setup_attributes.
authorPaul Berry <stereotype441@gmail.com>
Sat, 13 Jul 2013 16:03:18 +0000 (09:03 -0700)
committerPaul Berry <stereotype441@gmail.com>
Fri, 23 Aug 2013 18:02:51 +0000 (11:02 -0700)
When I initially generalized the vec4_visitor class in preparation for
geometry shaders, I assumed that the setup_attributes() function would
need to be different between vertex and geometry shaders, but its
caller, setup_payload(), could be shared.  So I made
setup_attributes() a virtual function.

It turns out this isn't true; setup_payload() needs to be different
too, since the geometry shader payload sometimes includes an extra
register (primitive ID) that has to come before uniforms.

So setup_payload() needs to be the virtual function instead of
setup_attributes().

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_vec4.cpp
src/mesa/drivers/dri/i965/brw_vec4.h
src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp

index bfef8e0829bd6eb59c7ce21679d7cbb8c71d596b..abdf3abd4be797610ff5e479a890ef9073f1676f 100644 (file)
@@ -1288,7 +1288,7 @@ vec4_visitor::setup_uniforms(int reg)
 }
 
 void
-vec4_visitor::setup_payload(void)
+vec4_vs_visitor::setup_payload(void)
 {
    int reg = 0;
 
index 587cb45c60c11be3cf24b427fa09f1b0b2ce7b0f..171f14dbfa78f7962e4c20e9dd2e6300ebb2fd69 100644 (file)
@@ -367,7 +367,6 @@ public:
    void setup_uniform_values(ir_variable *ir);
    void setup_builtin_uniform_values(ir_variable *ir);
    int setup_uniforms(int payload_reg);
-   void setup_payload();
    bool reg_allocate_trivial();
    bool reg_allocate();
    void evaluate_spill_costs(float *spill_costs, bool *no_spill);
@@ -539,7 +538,7 @@ protected:
    void emit_vertex();
    void lower_attributes_to_hw_regs(const int *attribute_map);
    virtual dst_reg *make_reg_for_system_value(ir_variable *ir) = 0;
-   virtual int setup_attributes(int payload_reg) = 0;
+   virtual void setup_payload() = 0;
    virtual void emit_prolog() = 0;
    virtual void emit_program_code() = 0;
    virtual void emit_thread_end() = 0;
@@ -562,7 +561,7 @@ public:
 
 protected:
    virtual dst_reg *make_reg_for_system_value(ir_variable *ir);
-   virtual int setup_attributes(int payload_reg);
+   virtual void setup_payload();
    virtual void emit_prolog();
    virtual void emit_program_code();
    virtual void emit_thread_end();
@@ -570,6 +569,7 @@ protected:
    virtual vec4_instruction *emit_urb_write_opcode(bool complete);
 
 private:
+   int setup_attributes(int payload_reg);
    void setup_vp_regs();
    dst_reg get_vp_dst_reg(const prog_dst_register &dst);
    src_reg get_vp_src_reg(const prog_src_register &src);
index e14130531156a2567fc73903bbd38241957748eb..ab4498b4eed381bf15c9b11f134237d9be1d81ba 100644 (file)
@@ -60,10 +60,9 @@ protected:
       return NULL;
    }
 
-   virtual int setup_attributes(int payload_reg)
+   virtual void setup_payload()
    {
       assert(!"Not reached");
-      return 0;
    }
 
    virtual void emit_prolog()