From: Paul Berry Date: Sun, 17 Feb 2013 16:05:52 +0000 (-0800) Subject: i965/vs: Make some vec4_visitor functions virtual. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8941f73c7ccb3c6cfa965a19f346e4b6ead6abdb;p=mesa.git i965/vs: Make some vec4_visitor functions virtual. 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 Reviewed-by: Eric Anholt Reviewed-by: Kenneth Graunke --- 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"); + } };