mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 13:30:12 +01:00
nir: expose reusable linking helpers for cloning uniform loads
for the new varying optimizer Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25394>
This commit is contained in:
parent
b1bbe4e190
commit
b47b8d16d9
2 changed files with 23 additions and 12 deletions
|
|
@ -4965,6 +4965,11 @@ void nir_compact_varyings(nir_shader *producer, nir_shader *consumer,
|
||||||
void nir_link_xfb_varyings(nir_shader *producer, nir_shader *consumer);
|
void nir_link_xfb_varyings(nir_shader *producer, nir_shader *consumer);
|
||||||
bool nir_link_opt_varyings(nir_shader *producer, nir_shader *consumer);
|
bool nir_link_opt_varyings(nir_shader *producer, nir_shader *consumer);
|
||||||
void nir_link_varying_precision(nir_shader *producer, nir_shader *consumer);
|
void nir_link_varying_precision(nir_shader *producer, nir_shader *consumer);
|
||||||
|
nir_variable *nir_clone_uniform_variable(nir_shader *nir,
|
||||||
|
nir_variable *uniform);
|
||||||
|
nir_deref_instr *nir_clone_deref_instr(struct nir_builder *b,
|
||||||
|
nir_variable *var,
|
||||||
|
nir_deref_instr *deref);
|
||||||
|
|
||||||
bool nir_slot_is_sysval_output(gl_varying_slot slot,
|
bool nir_slot_is_sysval_output(gl_varying_slot slot,
|
||||||
gl_shader_stage next_shader);
|
gl_shader_stage next_shader);
|
||||||
|
|
|
||||||
|
|
@ -1166,14 +1166,19 @@ is_direct_uniform_load(nir_def *def, nir_scalar *s)
|
||||||
return !nir_deref_instr_has_indirect(deref);
|
return !nir_deref_instr_has_indirect(deref);
|
||||||
}
|
}
|
||||||
|
|
||||||
static nir_variable *
|
/**
|
||||||
get_uniform_var_in_consumer(nir_shader *consumer,
|
* Add a uniform variable from one shader to a different shader.
|
||||||
nir_variable *var_in_producer)
|
*
|
||||||
|
* \param nir The shader where to add the uniform
|
||||||
|
* \param uniform The uniform that's declared in another shader.
|
||||||
|
*/
|
||||||
|
nir_variable *
|
||||||
|
nir_clone_uniform_variable(nir_shader *nir, nir_variable *uniform)
|
||||||
{
|
{
|
||||||
/* Find if uniform already exists in consumer. */
|
/* Find if uniform already exists in consumer. */
|
||||||
nir_variable *new_var = NULL;
|
nir_variable *new_var = NULL;
|
||||||
nir_foreach_uniform_variable(v, consumer) {
|
nir_foreach_uniform_variable(v, nir) {
|
||||||
if (!strcmp(var_in_producer->name, v->name)) {
|
if (!strcmp(uniform->name, v->name)) {
|
||||||
new_var = v;
|
new_var = v;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -1181,21 +1186,22 @@ get_uniform_var_in_consumer(nir_shader *consumer,
|
||||||
|
|
||||||
/* Create a variable if not exist. */
|
/* Create a variable if not exist. */
|
||||||
if (!new_var) {
|
if (!new_var) {
|
||||||
new_var = nir_variable_clone(var_in_producer, consumer);
|
new_var = nir_variable_clone(uniform, nir);
|
||||||
nir_shader_add_variable(consumer, new_var);
|
nir_shader_add_variable(nir, new_var);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new_var;
|
return new_var;
|
||||||
}
|
}
|
||||||
|
|
||||||
static nir_deref_instr *
|
nir_deref_instr *
|
||||||
clone_deref_instr(nir_builder *b, nir_variable *var, nir_deref_instr *deref)
|
nir_clone_deref_instr(nir_builder *b, nir_variable *var,
|
||||||
|
nir_deref_instr *deref)
|
||||||
{
|
{
|
||||||
if (deref->deref_type == nir_deref_type_var)
|
if (deref->deref_type == nir_deref_type_var)
|
||||||
return nir_build_deref_var(b, var);
|
return nir_build_deref_var(b, var);
|
||||||
|
|
||||||
nir_deref_instr *parent_deref = nir_deref_instr_parent(deref);
|
nir_deref_instr *parent_deref = nir_deref_instr_parent(deref);
|
||||||
nir_deref_instr *parent = clone_deref_instr(b, var, parent_deref);
|
nir_deref_instr *parent = nir_clone_deref_instr(b, var, parent_deref);
|
||||||
|
|
||||||
/* Build array and struct deref instruction.
|
/* Build array and struct deref instruction.
|
||||||
* "deref" instr is sure to be direct (see is_direct_uniform_load()).
|
* "deref" instr is sure to be direct (see is_direct_uniform_load()).
|
||||||
|
|
@ -1235,7 +1241,7 @@ replace_varying_input_by_uniform_load(nir_shader *shader,
|
||||||
nir_intrinsic_instr *load = nir_instr_as_intrinsic(scalar->def->parent_instr);
|
nir_intrinsic_instr *load = nir_instr_as_intrinsic(scalar->def->parent_instr);
|
||||||
nir_deref_instr *deref = nir_src_as_deref(load->src[0]);
|
nir_deref_instr *deref = nir_src_as_deref(load->src[0]);
|
||||||
nir_variable *uni_var = nir_deref_instr_get_variable(deref);
|
nir_variable *uni_var = nir_deref_instr_get_variable(deref);
|
||||||
uni_var = get_uniform_var_in_consumer(shader, uni_var);
|
uni_var = nir_clone_uniform_variable(shader, uni_var);
|
||||||
|
|
||||||
bool progress = false;
|
bool progress = false;
|
||||||
nir_foreach_block(block, impl) {
|
nir_foreach_block(block, impl) {
|
||||||
|
|
@ -1259,7 +1265,7 @@ replace_varying_input_by_uniform_load(nir_shader *shader,
|
||||||
b.cursor = nir_before_instr(instr);
|
b.cursor = nir_before_instr(instr);
|
||||||
|
|
||||||
/* Clone instructions start from deref load to variable deref. */
|
/* Clone instructions start from deref load to variable deref. */
|
||||||
nir_deref_instr *uni_deref = clone_deref_instr(&b, uni_var, deref);
|
nir_deref_instr *uni_deref = nir_clone_deref_instr(&b, uni_var, deref);
|
||||||
nir_def *uni_def = nir_load_deref(&b, uni_deref);
|
nir_def *uni_def = nir_load_deref(&b, uni_deref);
|
||||||
|
|
||||||
/* Add a vector to scalar move if uniform is a vector. */
|
/* Add a vector to scalar move if uniform is a vector. */
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue