}
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];
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").
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
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();
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);
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();
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
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();
};
/**
}
void
-vec4_visitor::emit_attribute_fixups()
+vec4_vs_visitor::emit_prolog()
{
dst_reg sign_recovery_shift;
dst_reg normalize_factor;
* 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.
: 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");
+ }
};