aboutsummaryrefslogtreecommitdiffstats
path: root/src/compiler/glsl/lower_packed_varyings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/glsl/lower_packed_varyings.cpp')
-rw-r--r--src/compiler/glsl/lower_packed_varyings.cpp28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/compiler/glsl/lower_packed_varyings.cpp b/src/compiler/glsl/lower_packed_varyings.cpp
index d91aa22c2a4..825cc9ee8cd 100644
--- a/src/compiler/glsl/lower_packed_varyings.cpp
+++ b/src/compiler/glsl/lower_packed_varyings.cpp
@@ -169,7 +169,8 @@ public:
unsigned gs_input_vertices,
exec_list *out_instructions,
exec_list *out_variables,
- bool disable_varying_packing);
+ bool disable_varying_packing,
+ bool xfb_enabled);
void run(struct gl_shader *shader);
@@ -234,6 +235,7 @@ private:
exec_list *out_variables;
bool disable_varying_packing;
+ bool xfb_enabled;
};
} /* anonymous namespace */
@@ -241,7 +243,8 @@ private:
lower_packed_varyings_visitor::lower_packed_varyings_visitor(
void *mem_ctx, unsigned locations_used, ir_variable_mode mode,
unsigned gs_input_vertices, exec_list *out_instructions,
- exec_list *out_variables, bool disable_varying_packing)
+ exec_list *out_variables, bool disable_varying_packing,
+ bool xfb_enabled)
: mem_ctx(mem_ctx),
locations_used(locations_used),
packed_varyings((ir_variable **)
@@ -251,7 +254,8 @@ lower_packed_varyings_visitor::lower_packed_varyings_visitor(
gs_input_vertices(gs_input_vertices),
out_instructions(out_instructions),
out_variables(out_variables),
- disable_varying_packing(disable_varying_packing)
+ disable_varying_packing(disable_varying_packing),
+ xfb_enabled(xfb_enabled)
{
}
@@ -660,10 +664,18 @@ lower_packed_varyings_visitor::needs_lowering(ir_variable *var)
if (var->data.explicit_location)
return false;
- if (disable_varying_packing)
+ /* Override disable_varying_packing if the var is only used by transform
+ * feedback. Also override it if transform feedback is enabled and the
+ * variable is an array, struct or matrix as the elements of these types
+ * will always has the same interpolation and therefore asre safe to pack.
+ */
+ const glsl_type *type = var->type;
+ if (disable_varying_packing && !var->data.is_xfb_only &&
+ !((type->is_array() || type->is_record() || type->is_matrix()) &&
+ xfb_enabled))
return false;
- const glsl_type *type = var->type->without_array();
+ type = type->without_array();
if (type->vector_elements == 4 && !type->is_double())
return false;
return true;
@@ -716,7 +728,8 @@ lower_packed_varyings_gs_splicer::visit_leave(ir_emit_vertex *ev)
void
lower_packed_varyings(void *mem_ctx, unsigned locations_used,
ir_variable_mode mode, unsigned gs_input_vertices,
- gl_shader *shader, bool disable_varying_packing)
+ gl_shader *shader, bool disable_varying_packing,
+ bool xfb_enabled)
{
exec_list *instructions = shader->ir;
ir_function *main_func = shader->symbols->get_function("main");
@@ -728,7 +741,8 @@ lower_packed_varyings(void *mem_ctx, unsigned locations_used,
gs_input_vertices,
&new_instructions,
&new_variables,
- disable_varying_packing);
+ disable_varying_packing,
+ xfb_enabled);
visitor.run(shader);
if (mode == ir_var_shader_out) {
if (shader->Stage == MESA_SHADER_GEOMETRY) {