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 lower_packed_varying_needs_lowering(nir_shader *shader, nir_variable *var,
bool xfb_enabled,
bool disable_xfb_packing,
bool disable_varying_packing);
#ifdef __cplusplus
} /* extern "C" */
#endif

View File

@@ -209,8 +209,10 @@ struct lower_packed_varyings_state
bool ifc_exposed_to_query_api;
};
static bool
needs_lowering(struct lower_packed_varyings_state *state, nir_variable *var)
bool
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
* 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;
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));
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
* 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)) &&
state->xfb_enabled)
xfb_enabled)
return false;
/* 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
* 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)) &&
state->xfb_enabled))
xfb_enabled))
return false;
type = glsl_without_array(type);
@@ -899,7 +901,11 @@ static void
lower_output_var(struct lower_packed_varyings_state *state, nir_variable *var)
{
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;
/* 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) {
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;
/* Skip any new packed varyings we just added */