summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Berry <stereotype441@gmail.com>2013-04-10 14:25:13 -0700
committerPaul Berry <stereotype441@gmail.com>2013-07-28 21:07:27 -0700
commitd7ecd22ea3e46f59e74c75059f566ee7b16b7401 (patch)
treeaaa42d9f5787e51cc6b35a6fd922445f017e5f33
parent2939d1da7cdec43bb346ea192f6960c963b1ccb0 (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.cpp28
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);
+ }
}