i965/gs: Refactor ir_emit_vertex and ir_end_primitive

So the implementation is independent of GLSL IR and the visit methods of the
vec4 visitor. This way we will be able to reuse that implementation directly
from the NIR vec4 backend.

Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
This commit is contained in:
Iago Toral Quiroga
2015-06-29 13:37:31 +02:00
committed by Jason Ekstrand
parent 38fc4a91cd
commit 7ade42755f
4 changed files with 33 additions and 4 deletions
+2
View File
@@ -463,6 +463,8 @@ protected:
virtual void emit_urb_write_header(int mrf) = 0;
virtual vec4_instruction *emit_urb_write_opcode(bool complete) = 0;
virtual int compute_array_stride(ir_dereference_array *ir);
virtual void gs_emit_vertex(int stream_id);
virtual void gs_end_primitive();
private:
/**
@@ -467,7 +467,7 @@ vec4_gs_visitor::set_stream_control_data_bits(unsigned stream_id)
}
void
vec4_gs_visitor::visit(ir_emit_vertex *ir)
vec4_gs_visitor::gs_emit_vertex(int stream_id)
{
this->current_annotation = "emit vertex: safety check";
@@ -481,7 +481,7 @@ vec4_gs_visitor::visit(ir_emit_vertex *ir)
* be recorded by transform feedback, we can simply discard all geometry
* bound to these streams when transform feedback is disabled.
*/
if (ir->stream_id() > 0 && shader_prog->TransformFeedback.NumVarying == 0)
if (stream_id > 0 && shader_prog->TransformFeedback.NumVarying == 0)
return;
/* To ensure that we don't output more vertices than the shader specified
@@ -560,7 +560,7 @@ vec4_gs_visitor::visit(ir_emit_vertex *ir)
c->prog_data.control_data_format ==
GEN7_GS_CONTROL_DATA_FORMAT_GSCTL_SID) {
this->current_annotation = "emit vertex: Stream control data bits";
set_stream_control_data_bits(ir->stream_id());
set_stream_control_data_bits(stream_id);
}
this->current_annotation = "emit vertex: increment vertex count";
@@ -573,7 +573,13 @@ vec4_gs_visitor::visit(ir_emit_vertex *ir)
}
void
vec4_gs_visitor::visit(ir_end_primitive *)
vec4_gs_visitor::visit(ir_emit_vertex *ir)
{
gs_emit_vertex(ir->stream_id());
}
void
vec4_gs_visitor::gs_end_primitive()
{
/* We can only do EndPrimitive() functionality when the control data
* consists of cut bits. Fortunately, the only time it isn't is when the
@@ -623,6 +629,12 @@ vec4_gs_visitor::visit(ir_end_primitive *)
emit(OR(dst_reg(this->control_data_bits), this->control_data_bits, mask));
}
void
vec4_gs_visitor::visit(ir_end_primitive *)
{
gs_end_primitive();
}
static const unsigned *
generate_assembly(struct brw_context *brw,
struct gl_shader_program *shader_prog,
@@ -87,6 +87,8 @@ protected:
virtual int compute_array_stride(ir_dereference_array *ir);
virtual void visit(ir_emit_vertex *);
virtual void visit(ir_end_primitive *);
virtual void gs_emit_vertex(int stream_id);
virtual void gs_end_primitive();
protected:
int setup_varying_inputs(int payload_reg, int *attribute_map,
@@ -2993,12 +2993,25 @@ vec4_visitor::visit(ir_if *ir)
emit(BRW_OPCODE_ENDIF);
}
void
vec4_visitor::gs_emit_vertex(int stream_id)
{
unreachable("not reached");
}
void
vec4_visitor::visit(ir_emit_vertex *)
{
unreachable("not reached");
}
void
vec4_visitor::gs_end_primitive()
{
unreachable("not reached");
}
void
vec4_visitor::visit(ir_end_primitive *)
{