mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 21:50:12 +01:00
i965/vs: Add virtual function make_reg_for_system_value().
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>
This commit is contained in:
parent
8941f73c7c
commit
42a3d63dd4
3 changed files with 36 additions and 18 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue