i965/vs: Add virtual function make_reg_for_system_value().
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)
The system values handled by vec4_visitor::visit(ir_variable *) are
VS-specific (vertex ID and instance ID).  This patch moves the
handling of those values into a new virtual function,
make_reg_for_system_value(), so that this VS-specific code won't be
inherited by geomtry shaders.

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.h
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp

index cd3b6e70305f679bab2b56dc5b187b6b0bddb263..6bc0d304f12bc37faa67070d0b134b79bf88b6b0 100644 (file)
@@ -482,6 +482,7 @@ public:
    void dump_instructions();
 
 protected:
+   virtual dst_reg *make_reg_for_system_value(ir_variable *ir) = 0;
    virtual int setup_attributes(int payload_reg) = 0;
    virtual void emit_prolog() = 0;
    virtual void emit_program_code() = 0;
@@ -499,6 +500,7 @@ public:
                    void *mem_ctx);
 
 protected:
+   virtual dst_reg *make_reg_for_system_value(ir_variable *ir);
    virtual int setup_attributes(int payload_reg);
    virtual void emit_prolog();
    virtual void emit_program_code();
index 407c9e7100b0573cc919a97d7751bf4f62788846..41d41e17366f52ff400dede05eb1f7bc289c1e44 100644 (file)
@@ -1015,6 +1015,33 @@ vec4_vs_visitor::emit_prolog()
    }
 }
 
+
+dst_reg *
+vec4_vs_visitor::make_reg_for_system_value(ir_variable *ir)
+{
+   /* VertexID is stored by the VF as the last vertex element, but
+    * we don't represent it with a flag in inputs_read, so we call
+    * it VERT_ATTRIB_MAX, which setup_attributes() picks up on.
+    */
+   dst_reg *reg = new(mem_ctx) dst_reg(ATTR, VERT_ATTRIB_MAX);
+   prog_data->uses_vertexid = true;
+
+   switch (ir->location) {
+   case SYSTEM_VALUE_VERTEX_ID:
+      reg->writemask = WRITEMASK_X;
+      break;
+   case SYSTEM_VALUE_INSTANCE_ID:
+      reg->writemask = WRITEMASK_Y;
+      break;
+   default:
+      assert(!"not reached");
+      break;
+   }
+
+   return reg;
+}
+
+
 void
 vec4_visitor::visit(ir_variable *ir)
 {
@@ -1068,24 +1095,7 @@ vec4_visitor::visit(ir_variable *ir)
       break;
 
    case ir_var_system_value:
-      /* VertexID is stored by the VF as the last vertex element, but
-       * we don't represent it with a flag in inputs_read, so we call
-       * it VERT_ATTRIB_MAX, which setup_attributes() picks up on.
-       */
-      reg = new(mem_ctx) dst_reg(ATTR, VERT_ATTRIB_MAX);
-      prog_data->uses_vertexid = true;
-
-      switch (ir->location) {
-      case SYSTEM_VALUE_VERTEX_ID:
-        reg->writemask = WRITEMASK_X;
-        break;
-      case SYSTEM_VALUE_INSTANCE_ID:
-        reg->writemask = WRITEMASK_Y;
-        break;
-      default:
-        assert(!"not reached");
-        break;
-      }
+      reg = make_reg_for_system_value(ir);
       break;
 
    default:
index 60a993e105b839a1114d0c497259ede7b887ab54..7c507f86d027b6af4158e9abfb12dff9350d0b29 100644 (file)
@@ -54,6 +54,12 @@ public:
    }
 
 protected:
+   virtual dst_reg *make_reg_for_system_value(ir_variable *ir)
+   {
+      assert(!"Not reached");
+      return NULL;
+   }
+
    virtual int setup_attributes(int payload_reg)
    {
       assert(!"Not reached");