diff options
author | Paul Berry <stereotype441@gmail.com> | 2013-04-10 14:25:13 -0700 |
---|---|---|
committer | Paul Berry <stereotype441@gmail.com> | 2013-07-28 21:07:27 -0700 |
commit | d7ecd22ea3e46f59e74c75059f566ee7b16b7401 (patch) | |
tree | aaa42d9f5787e51cc6b35a6fd922445f017e5f33 | |
parent | 2939d1da7cdec43bb346ea192f6960c963b1ccb0 (diff) |
glsl: Modify varying packing to use a temporary exec_list.
This patch modifies lower_packed_varyings to store the packing code it
generates in a temporary exec_list, and then splice that list into the
shader's main() function when it's done. This paves the way for
supporting geometry shader outputs, where we'll have to splice a clone
of the packing code before every call to EmitVertex().
As a side benefit, varying packing code is now emitted in the same
order for inputs and outputs; this should make debug output a little
easier to read.
-rw-r--r-- | src/glsl/lower_packed_varyings.cpp | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/src/glsl/lower_packed_varyings.cpp b/src/glsl/lower_packed_varyings.cpp index da5face86b..fc28da2cfd 100644 --- a/src/glsl/lower_packed_varyings.cpp +++ b/src/glsl/lower_packed_varyings.cpp @@ -94,7 +94,7 @@ public: unsigned locations_used, ir_variable_mode mode, unsigned gs_input_vertices, - exec_list *main_instructions); + exec_list *out_instructions); void run(exec_list *instructions); @@ -155,16 +155,17 @@ private: const unsigned gs_input_vertices; /** - * List of instructions corresponding to the main() function. This is - * where we add instructions to pack or unpack the varyings. + * Exec list into which the visitor should insert the packing instructions. + * Caller provides this list; it should insert the instructions into the + * appropriate place in the shader once the visitor has finished running. */ - exec_list *main_instructions; + exec_list *out_instructions; }; lower_packed_varyings_visitor::lower_packed_varyings_visitor( void *mem_ctx, unsigned location_base, unsigned locations_used, ir_variable_mode mode, unsigned gs_input_vertices, - exec_list *main_instructions) + exec_list *out_instructions) : mem_ctx(mem_ctx), location_base(location_base), locations_used(locations_used), @@ -173,7 +174,7 @@ lower_packed_varyings_visitor::lower_packed_varyings_visitor( locations_used)), mode(mode), gs_input_vertices(gs_input_vertices), - main_instructions(main_instructions) + out_instructions(out_instructions) { } @@ -393,11 +394,11 @@ lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue, if (this->mode == ir_var_shader_out) { ir_assignment *assignment = this->bitwise_assign_pack(swizzle, rvalue); - this->main_instructions->push_tail(assignment); + this->out_instructions->push_tail(assignment); } else { ir_assignment *assignment = this->bitwise_assign_unpack(rvalue, swizzle); - this->main_instructions->push_head(assignment); + this->out_instructions->push_tail(assignment); } return fine_location + components; } @@ -545,9 +546,16 @@ lower_packed_varyings(void *mem_ctx, unsigned location_base, exec_list void_parameters; ir_function_signature *main_func_sig = main_func->matching_signature(&void_parameters); - exec_list *main_instructions = &main_func_sig->body; + exec_list new_instructions; lower_packed_varyings_visitor visitor(mem_ctx, location_base, locations_used, mode, - gs_input_vertices, main_instructions); + gs_input_vertices, &new_instructions); visitor.run(instructions); + if (mode == ir_var_shader_out) { + /* Shader outputs need to be lowered at the end of main() */ + main_func_sig->body.append_list(&new_instructions); + } else { + /* Shader inputs need to be lowered at the beginning of main() */ + main_func_sig->body.head->insert_before(&new_instructions); + } } |