i965/gs: add GS visitors

Graphics / Mesa 3D Graphics Library / Mesa - Paul Berry [gmail.com] - 23 August 2013 13:03 UTC

This patch introduces the vec4_gs_visitor class, which translates geometry shaders from GLSL IR to back-end opcodes.

This class is derived from vec4_visitor (which is also the base class for vec4_vs_visitor), so as a result most of the back end code is shared. The only parts that differ are:

- Geometry shaders use a different input payload organization, since the inputs need to match up with the outputs of the previous pipeline stage (vec4_gs_visitor::setup_payload() and
vec4_gs_visitor::setup_varying_inputs()).

- Geometry shader input array dereferences need a special stride computation, since all geometry shader inputs are interleaved into one giant array (vec4_gs_visitor::compute_array_stride()).

- There are no geometry shader system values (vec4_gs_visitor::make_reg_for_system_value()).

- At the beginning of a geometry shader, extra data in R0 needs to be zeroed out, and a vertex counter needs to be initialized (vec4_gs_visitor::emit_prolog()).

- When EmitVertex() appears in the shader, the current contents of output variables need to be emitted to the URB, and the vertex counter needs to be incremented (vec4_gs_visitor::visit(ir_emit_vertex *)).

- When generating a URB_WRITE message to output vertex data, the current state of the vertex counter needs to be used to store a write offset in the message header (vec4_gs_visitor::emit_urb_write_header()).

- The URB_WRITE message that outputs vertex data needs to be sent using GS_OPCODE_URB_WRITE, since VS_OPCODE_URB_WRITE would overwrite the offsets in the message header (vec4_gs_visitor::emit_urb_write_opcode()).

- At the end of a geometry shader, the final vertex count needs to be delivered using a URB WRITE message (vec4_gs_visitor::emit_thread_end()).

- EndPrimitive() functionality is not implemented yet (vec4_gs_visitor::visit(ir_end_primitive *)).

- There is no support for assembly shaders (vec4_gs_visitor::emit_program_code()).

v2: Make num_input_vertices const. Refer to registers as rN rather than gN, for consistency with the PRM. Fix misspelling. Improve comment in the ir_emit_vertex visitor explaining why we emit vertices inside a conditional. Enclose the conditional code in the ir_emit_vertex visitor between curly braces.

16512ba i965/gs: add GS visitors.
src/mesa/drivers/dri/i965/Makefile.sources | 1 +
src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp | 259 +++++++++++++++++++++
src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.h | 91 ++++++++
3 files changed, 351 insertions(+)

Upstream: cgit.freedesktop.org


  • Share