i965/vs: Make some vec4_visitor functions virtual.
authorPaul Berry <stereotype441@gmail.com>
Sun, 17 Feb 2013 16:05:52 +0000 (08:05 -0800)
committerPaul Berry <stereotype441@gmail.com>
Thu, 11 Apr 2013 16:25:25 +0000 (09:25 -0700)
This patch makes the following vec4_visitor functions virtual, since
they will need to be implemented differently for vertex and geometry
shaders.  Some of the functions are renamed to reflect their generic
purpose, rather than their VS-specific behaviour:

- setup_attributes
- emit_attribute_fixups (renamed to emit_prolog)
- emit_vertex_program_code (renamed to emit_program_code)
- emit_urb_writes (renamed to emit_thread_end)

Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_vec4.cpp
src/mesa/drivers/dri/i965/brw_vec4.h
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
src/mesa/drivers/dri/i965/brw_vec4_vp.cpp
src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp

index 5164411cc4a387a082e32ced2593afc901e91e4f..92fa16ac0f2a02d73675f7c3eaf7f43e6835c133 100644 (file)
@@ -1185,7 +1185,7 @@ vec4_visitor::dump_instructions()
 }
 
 int
-vec4_visitor::setup_attributes(int payload_reg)
+vec4_vs_visitor::setup_attributes(int payload_reg)
 {
    int nr_attributes;
    int attribute_map[VERT_ATTRIB_MAX + 1];
@@ -1405,7 +1405,7 @@ vec4_visitor::run()
    if (INTEL_DEBUG & DEBUG_SHADER_TIME)
       emit_shader_time_begin();
 
-   emit_attribute_fixups();
+   emit_prolog();
 
    /* Generate VS IR for main().  (the visitor only descends into
     * functions called "main").
@@ -1413,14 +1413,14 @@ vec4_visitor::run()
    if (shader) {
       visit_instructions(shader->ir);
    } else {
-      emit_vertex_program_code();
+      emit_program_code();
    }
    base_ir = NULL;
 
    if (c->key.base.userclip_active && !c->key.base.uses_clip_distance)
       setup_uniform_clipplane_values();
 
-   emit_urb_writes();
+   emit_thread_end();
 
    /* Before any optimization, push array accesses out to scratch
     * space where we need them to be.  This pass may allocate new
index 73dd8ec6532ee0f68c99724abeb20851952b28b8..cd3b6e70305f679bab2b56dc5b187b6b0bddb263 100644 (file)
@@ -319,7 +319,6 @@ public:
    void setup_uniform_clipplane_values();
    void setup_uniform_values(ir_variable *ir);
    void setup_builtin_uniform_values(ir_variable *ir);
-   int setup_attributes(int payload_reg);
    int setup_uniforms(int payload_reg);
    void setup_payload();
    bool reg_allocate_trivial();
@@ -403,8 +402,6 @@ public:
    void visit_instructions(const exec_list *list);
 
    void setup_vp_regs();
-   void emit_attribute_fixups();
-   void emit_vertex_program_code();
    void emit_vp_sop(uint32_t condmod, dst_reg dst,
                     src_reg src0, src_reg src1, src_reg one);
    dst_reg get_vp_dst_reg(const prog_dst_register &dst);
@@ -453,7 +450,6 @@ public:
    void emit_clip_distances(struct brw_reg reg, int offset);
    void emit_generic_urb_slot(dst_reg reg, int varying);
    void emit_urb_slot(int mrf, int varying);
-   void emit_urb_writes(void);
 
    void emit_shader_time_begin();
    void emit_shader_time_end();
@@ -484,6 +480,12 @@ public:
 
    void dump_instruction(vec4_instruction *inst);
    void dump_instructions();
+
+protected:
+   virtual int setup_attributes(int payload_reg) = 0;
+   virtual void emit_prolog() = 0;
+   virtual void emit_program_code() = 0;
+   virtual void emit_thread_end() = 0;
 };
 
 class vec4_vs_visitor : public vec4_visitor
@@ -495,6 +497,12 @@ public:
                    struct gl_shader_program *prog,
                    struct brw_shader *shader,
                    void *mem_ctx);
+
+protected:
+   virtual int setup_attributes(int payload_reg);
+   virtual void emit_prolog();
+   virtual void emit_program_code();
+   virtual void emit_thread_end();
 };
 
 /**
index 43af033cc9ae21575d28da1cc4936445f50a08e0..407c9e7100b0573cc919a97d7751bf4f62788846 100644 (file)
@@ -902,7 +902,7 @@ with_writemask(dst_reg const & r, int mask)
 }
 
 void
-vec4_visitor::emit_attribute_fixups()
+vec4_vs_visitor::emit_prolog()
 {
    dst_reg sign_recovery_shift;
    dst_reg normalize_factor;
@@ -2602,7 +2602,7 @@ align_interleaved_urb_mlen(struct brw_context *brw, int mlen)
  * The VUE layout is documented in Volume 2a.
  */
 void
-vec4_visitor::emit_urb_writes()
+vec4_vs_visitor::emit_thread_end()
 {
    /* MRF 0 is reserved for the debugger, so start with message header
     * in MRF 1.
index 13156dda07b8df06bbf667273a93c8f9f7f18854..abb64ed493875a99a31786bf49fd224895d208c4 100644 (file)
@@ -65,7 +65,7 @@ reswizzle(src_reg orig, unsigned x, unsigned y, unsigned z, unsigned w)
 }
 
 void
-vec4_visitor::emit_vertex_program_code()
+vec4_vs_visitor::emit_program_code()
 {
    this->need_all_constants_in_pull_buffer = false;
 
index 418edd2297816bf65af90126bd453e0d7330cb28..60a993e105b839a1114d0c497259ede7b887ab54 100644 (file)
@@ -52,6 +52,28 @@ public:
       : vec4_visitor(brw, c, NULL, shader_prog, NULL, NULL)
    {
    }
+
+protected:
+   virtual int setup_attributes(int payload_reg)
+   {
+      assert(!"Not reached");
+      return 0;
+   }
+
+   virtual void emit_prolog()
+   {
+      assert(!"Not reached");
+   }
+
+   virtual void emit_program_code()
+   {
+      assert(!"Not reached");
+   }
+
+   virtual void emit_thread_end()
+   {
+      assert(!"Not reached");
+   }
 };