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:

committed by
Marge Bot

parent
ff7c59672f
commit
04e7ed8323
@@ -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
|
||||||
|
@@ -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 */
|
||||||
|
Reference in New Issue
Block a user