<div dir="ltr">On 20 August 2013 11:30, Paul Berry <span dir="ltr"><<a href="mailto:stereotype441@gmail.com" target="_blank">stereotype441@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">When I initially generaized the vec4_visitor class in preparation for<br>
geometry shaders, I assumed that the setup_attributes() function would<br>
need to be different between vertex and geometry shaders, but its<br>
caller, setup_payload(), could be shared.  So I made<br>
setup_attributes() a virtual function.<br></blockquote><div><br></div><div>>From our in-person code review yesterday:<br><br>s/generaized/generalized/ in the commit message.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<br>
It turns out this isn't true; setup_payload() needs to be different<br>
too, since the geometry shader payload sometimes includes an extra<br>
register (primitive ID) that has to come before uniforms.<br>
<br>
So setup_payload() needs to be the virtual function instead of<br>
setup_attributes().<br>
---<br>
 src/mesa/drivers/dri/i965/brw_vec4.cpp                    | 2 +-<br>
 src/mesa/drivers/dri/i965/brw_vec4.h                      | 6 +++---<br>
 src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp | 3 +--<br>
 3 files changed, 5 insertions(+), 6 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp<br>
index bfef8e0..abdf3ab 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_vec4.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp<br>
@@ -1288,7 +1288,7 @@ vec4_visitor::setup_uniforms(int reg)<br>
 }<br>
<br>
 void<br>
-vec4_visitor::setup_payload(void)<br>
+vec4_vs_visitor::setup_payload(void)<br>
 {<br>
    int reg = 0;<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h<br>
index 587cb45..171f14d 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_vec4.h<br>
+++ b/src/mesa/drivers/dri/i965/brw_vec4.h<br>
@@ -367,7 +367,6 @@ public:<br>
    void setup_uniform_values(ir_variable *ir);<br>
    void setup_builtin_uniform_values(ir_variable *ir);<br>
    int setup_uniforms(int payload_reg);<br>
-   void setup_payload();<br>
    bool reg_allocate_trivial();<br>
    bool reg_allocate();<br>
    void evaluate_spill_costs(float *spill_costs, bool *no_spill);<br>
@@ -539,7 +538,7 @@ protected:<br>
    void emit_vertex();<br>
    void lower_attributes_to_hw_regs(const int *attribute_map);<br>
    virtual dst_reg *make_reg_for_system_value(ir_variable *ir) = 0;<br>
-   virtual int setup_attributes(int payload_reg) = 0;<br>
+   virtual void setup_payload() = 0;<br>
    virtual void emit_prolog() = 0;<br>
    virtual void emit_program_code() = 0;<br>
    virtual void emit_thread_end() = 0;<br>
@@ -562,7 +561,7 @@ public:<br>
<br>
 protected:<br>
    virtual dst_reg *make_reg_for_system_value(ir_variable *ir);<br>
-   virtual int setup_attributes(int payload_reg);<br>
+   virtual void setup_payload();<br>
    virtual void emit_prolog();<br>
    virtual void emit_program_code();<br>
    virtual void emit_thread_end();<br>
@@ -570,6 +569,7 @@ protected:<br>
    virtual vec4_instruction *emit_urb_write_opcode(bool complete);<br>
<br>
 private:<br>
+   int setup_attributes(int payload_reg);<br>
    void setup_vp_regs();<br>
    dst_reg get_vp_dst_reg(const prog_dst_register &dst);<br>
    src_reg get_vp_src_reg(const prog_src_register &src);<br>
diff --git a/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp b/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp<br>
index e141305..ab4498b 100644<br>
--- a/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp<br>
+++ b/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp<br>
@@ -60,10 +60,9 @@ protected:<br>
       return NULL;<br>
    }<br>
<br>
-   virtual int setup_attributes(int payload_reg)<br>
+   virtual void setup_payload()<br>
    {<br>
       assert(!"Not reached");<br>
-      return 0;<br>
    }<br>
<br>
    virtual void emit_prolog()<br>
<span class=""><font color="#888888">--<br>
1.8.3.4<br>
<br>
</font></span></blockquote></div><br></div></div>