summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4.cpp8
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4.h16
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp4
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4_vp.cpp2
-rw-r--r--src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp22
5 files changed, 41 insertions, 11 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp
index 5164411cc4a..92fa16ac0f2 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
@@ -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
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h
index 73dd8ec6532..cd3b6e70305 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.h
+++ b/src/mesa/drivers/dri/i965/brw_vec4.h
@@ -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();
};
/**
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index 43af033cc9a..407c9e7100b 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -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.
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_vp.cpp b/src/mesa/drivers/dri/i965/brw_vec4_vp.cpp
index 13156dda07b..abb64ed4938 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_vp.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_vp.cpp
@@ -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;
diff --git a/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp b/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp
index 418edd22978..60a993e105b 100644
--- a/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp
+++ b/src/mesa/drivers/dri/i965/test_vec4_register_coalesce.cpp
@@ -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");
+ }
};