glsl: make packed varying helper needs_lowering() external

We will use this helper to correctly calculate xfb offsets in the
following patch.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18175>
This commit is contained in:
Timothy Arceri
2022-08-22 11:08:32 +10:00
committed by Marge Bot
parent ff7c59672f
commit 04e7ed8323
2 changed files with 24 additions and 9 deletions

View File

@@ -113,6 +113,11 @@ void gl_nir_link_assign_xfb_resources(const struct gl_constants *consts,
bool gl_nir_link_uniform_blocks(struct gl_shader_program *prog); bool gl_nir_link_uniform_blocks(struct gl_shader_program *prog);
bool lower_packed_varying_needs_lowering(nir_shader *shader, nir_variable *var,
bool xfb_enabled,
bool disable_xfb_packing,
bool disable_varying_packing);
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
#endif #endif

View File

@@ -209,8 +209,10 @@ struct lower_packed_varyings_state
bool ifc_exposed_to_query_api; bool ifc_exposed_to_query_api;
}; };
static bool bool
needs_lowering(struct lower_packed_varyings_state *state, nir_variable *var) lower_packed_varying_needs_lowering(nir_shader *shader, nir_variable *var,
bool xfb_enabled, bool disable_xfb_packing,
bool disable_varying_packing)
{ {
/* Things composed of vec4's, varyings with explicitly assigned /* Things composed of vec4's, varyings with explicitly assigned
* locations or varyings marked as must_be_shader_input (which might be used * locations or varyings marked as must_be_shader_input (which might be used
@@ -220,7 +222,7 @@ needs_lowering(struct lower_packed_varyings_state *state, nir_variable *var)
return false; return false;
const struct glsl_type *type = var->type; const struct glsl_type *type = var->type;
if (nir_is_arrayed_io(var, state->shader->info.stage) || var->data.per_view) { if (nir_is_arrayed_io(var, shader->info.stage) || var->data.per_view) {
assert(glsl_type_is_array(type)); assert(glsl_type_is_array(type));
type = glsl_get_array_element(type); type = glsl_get_array_element(type);
} }
@@ -228,9 +230,9 @@ needs_lowering(struct lower_packed_varyings_state *state, nir_variable *var)
/* Some drivers (e.g. panfrost) don't support packing of transform /* Some drivers (e.g. panfrost) don't support packing of transform
* feedback varyings. * feedback varyings.
*/ */
if (state->disable_xfb_packing && var->data.is_xfb && if (disable_xfb_packing && var->data.is_xfb &&
!(glsl_type_is_array(type) || glsl_type_is_struct(type) || glsl_type_is_matrix(type)) && !(glsl_type_is_array(type) || glsl_type_is_struct(type) || glsl_type_is_matrix(type)) &&
state->xfb_enabled) xfb_enabled)
return false; return false;
/* Override disable_varying_packing if the var is only used by transform /* Override disable_varying_packing if the var is only used by transform
@@ -238,9 +240,9 @@ needs_lowering(struct lower_packed_varyings_state *state, nir_variable *var)
* variable is an array, struct or matrix as the elements of these types * variable is an array, struct or matrix as the elements of these types
* will always have the same interpolation and therefore are safe to pack. * will always have the same interpolation and therefore are safe to pack.
*/ */
if (state->disable_varying_packing && !var->data.is_xfb_only && if (disable_varying_packing && !var->data.is_xfb_only &&
!((glsl_type_is_array(type) || glsl_type_is_struct(type) || glsl_type_is_matrix(type)) && !((glsl_type_is_array(type) || glsl_type_is_struct(type) || glsl_type_is_matrix(type)) &&
state->xfb_enabled)) xfb_enabled))
return false; return false;
type = glsl_without_array(type); type = glsl_without_array(type);
@@ -899,7 +901,11 @@ static void
lower_output_var(struct lower_packed_varyings_state *state, nir_variable *var) lower_output_var(struct lower_packed_varyings_state *state, nir_variable *var)
{ {
if (var->data.mode != state->mode || if (var->data.mode != state->mode ||
var->data.location < VARYING_SLOT_VAR0 || !needs_lowering(state, var)) var->data.location < VARYING_SLOT_VAR0 ||
!lower_packed_varying_needs_lowering(state->shader, var,
state->xfb_enabled,
state->disable_xfb_packing,
state->disable_varying_packing))
return; return;
/* Skip any new packed varyings we just added */ /* Skip any new packed varyings we just added */
@@ -980,7 +986,11 @@ lower_packed_inputs(struct lower_packed_varyings_state *state)
*/ */
nir_foreach_shader_in_variable_safe(var, state->shader) { nir_foreach_shader_in_variable_safe(var, state->shader) {
if (var->data.mode != state->mode || if (var->data.mode != state->mode ||
var->data.location < VARYING_SLOT_VAR0 || !needs_lowering(state, var)) var->data.location < VARYING_SLOT_VAR0 ||
!lower_packed_varying_needs_lowering(state->shader, var,
state->xfb_enabled,
state->disable_xfb_packing,
state->disable_varying_packing))
continue; continue;
/* Skip any new packed varyings we just added */ /* Skip any new packed varyings we just added */