mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 07:10:15 +01:00
nir: Add helpers for creating variables and adding them to lists
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
This commit is contained in:
parent
635daef76e
commit
eb893c220c
4 changed files with 99 additions and 46 deletions
|
|
@ -389,35 +389,10 @@ nir_visitor::visit(ir_variable *ir)
|
|||
|
||||
var->interface_type = ir->get_interface_type();
|
||||
|
||||
switch (var->data.mode) {
|
||||
case nir_var_local:
|
||||
exec_list_push_tail(&impl->locals, &var->node);
|
||||
break;
|
||||
|
||||
case nir_var_global:
|
||||
exec_list_push_tail(&shader->globals, &var->node);
|
||||
break;
|
||||
|
||||
case nir_var_shader_in:
|
||||
exec_list_push_tail(&shader->inputs, &var->node);
|
||||
break;
|
||||
|
||||
case nir_var_shader_out:
|
||||
exec_list_push_tail(&shader->outputs, &var->node);
|
||||
break;
|
||||
|
||||
case nir_var_uniform:
|
||||
case nir_var_shader_storage:
|
||||
exec_list_push_tail(&shader->uniforms, &var->node);
|
||||
break;
|
||||
|
||||
case nir_var_system_value:
|
||||
exec_list_push_tail(&shader->system_values, &var->node);
|
||||
break;
|
||||
|
||||
default:
|
||||
unreachable("not reached");
|
||||
}
|
||||
if (var->data.mode == nir_var_local)
|
||||
nir_function_impl_add_variable(impl, var);
|
||||
else
|
||||
nir_shader_add_variable(shader, var);
|
||||
|
||||
_mesa_hash_table_insert(var_table, ir, var);
|
||||
this->var = var;
|
||||
|
|
@ -2074,13 +2049,10 @@ nir_visitor::visit(ir_constant *ir)
|
|||
* constant initializer and return a dereference.
|
||||
*/
|
||||
|
||||
nir_variable *var = ralloc(this->shader, nir_variable);
|
||||
var->name = ralloc_strdup(var, "const_temp");
|
||||
var->type = ir->type;
|
||||
var->data.mode = nir_var_local;
|
||||
nir_variable *var =
|
||||
nir_local_variable_create(this->impl, ir->type, "const_temp");
|
||||
var->data.read_only = true;
|
||||
var->constant_initializer = constant_copy(ir, var);
|
||||
exec_list_push_tail(&this->impl->locals, &var->node);
|
||||
|
||||
this->deref_head = nir_deref_var_create(this->shader, var);
|
||||
this->deref_tail = &this->deref_head->deref;
|
||||
|
|
|
|||
|
|
@ -103,6 +103,72 @@ nir_reg_remove(nir_register *reg)
|
|||
exec_node_remove(®->node);
|
||||
}
|
||||
|
||||
void
|
||||
nir_shader_add_variable(nir_shader *shader, nir_variable *var)
|
||||
{
|
||||
switch (var->data.mode) {
|
||||
case nir_var_local:
|
||||
assert(!"nir_shader_add_variable cannot be used for local variables");
|
||||
break;
|
||||
|
||||
case nir_var_global:
|
||||
exec_list_push_tail(&shader->globals, &var->node);
|
||||
break;
|
||||
|
||||
case nir_var_shader_in:
|
||||
exec_list_push_tail(&shader->inputs, &var->node);
|
||||
break;
|
||||
|
||||
case nir_var_shader_out:
|
||||
exec_list_push_tail(&shader->outputs, &var->node);
|
||||
break;
|
||||
|
||||
case nir_var_uniform:
|
||||
case nir_var_shader_storage:
|
||||
exec_list_push_tail(&shader->uniforms, &var->node);
|
||||
break;
|
||||
|
||||
case nir_var_system_value:
|
||||
exec_list_push_tail(&shader->system_values, &var->node);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
nir_variable *
|
||||
nir_variable_create(nir_shader *shader, nir_variable_mode mode,
|
||||
const struct glsl_type *type, const char *name)
|
||||
{
|
||||
nir_variable *var = rzalloc(shader, nir_variable);
|
||||
var->name = ralloc_strdup(var, name);
|
||||
var->type = type;
|
||||
var->data.mode = mode;
|
||||
|
||||
if ((mode == nir_var_shader_in && shader->stage != MESA_SHADER_VERTEX) ||
|
||||
(mode == nir_var_shader_out && shader->stage != MESA_SHADER_FRAGMENT))
|
||||
var->data.interpolation = INTERP_QUALIFIER_SMOOTH;
|
||||
|
||||
if (mode == nir_var_shader_in || mode == nir_var_uniform)
|
||||
var->data.read_only = true;
|
||||
|
||||
nir_shader_add_variable(shader, var);
|
||||
|
||||
return var;
|
||||
}
|
||||
|
||||
nir_variable *
|
||||
nir_local_variable_create(nir_function_impl *impl,
|
||||
const struct glsl_type *type, const char *name)
|
||||
{
|
||||
nir_variable *var = rzalloc(impl->overload->function->shader, nir_variable);
|
||||
var->name = ralloc_strdup(var, name);
|
||||
var->type = type;
|
||||
var->data.mode = nir_var_local;
|
||||
|
||||
nir_function_impl_add_variable(impl, var);
|
||||
|
||||
return var;
|
||||
}
|
||||
|
||||
nir_function *
|
||||
nir_function_create(nir_shader *shader, const char *name)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1559,6 +1559,26 @@ nir_register *nir_local_reg_create(nir_function_impl *impl);
|
|||
|
||||
void nir_reg_remove(nir_register *reg);
|
||||
|
||||
/** Adds a variable to the appropreate list in nir_shader */
|
||||
void nir_shader_add_variable(nir_shader *shader, nir_variable *var);
|
||||
|
||||
static inline void
|
||||
nir_function_impl_add_variable(nir_function_impl *impl, nir_variable *var)
|
||||
{
|
||||
assert(var->data.mode == nir_var_local);
|
||||
exec_list_push_tail(&impl->locals, &var->node);
|
||||
}
|
||||
|
||||
/** creates a variable, sets a few defaults, and adds it to the list */
|
||||
nir_variable *nir_variable_create(nir_shader *shader,
|
||||
nir_variable_mode mode,
|
||||
const struct glsl_type *type,
|
||||
const char *name);
|
||||
/** creates a local variable and adds it to the list */
|
||||
nir_variable *nir_local_variable_create(nir_function_impl *impl,
|
||||
const struct glsl_type *type,
|
||||
const char *name);
|
||||
|
||||
/** creates a function and adds it to the shader's list of functions */
|
||||
nir_function *nir_function_create(nir_shader *shader, const char *name);
|
||||
|
||||
|
|
|
|||
|
|
@ -958,11 +958,10 @@ setup_registers_and_variables(struct ptn_compile *c)
|
|||
for (int i = 0; i < num_inputs; i++) {
|
||||
if (!(c->prog->InputsRead & BITFIELD64_BIT(i)))
|
||||
continue;
|
||||
nir_variable *var = rzalloc(shader, nir_variable);
|
||||
var->type = glsl_vec4_type();
|
||||
var->data.read_only = true;
|
||||
var->data.mode = nir_var_shader_in;
|
||||
var->name = ralloc_asprintf(var, "in_%d", i);
|
||||
|
||||
nir_variable *var =
|
||||
nir_variable_create(shader, nir_var_shader_in, glsl_vec4_type(),
|
||||
ralloc_asprintf(shader, "in_%d", i));
|
||||
var->data.location = i;
|
||||
var->data.index = 0;
|
||||
|
||||
|
|
@ -992,12 +991,9 @@ setup_registers_and_variables(struct ptn_compile *c)
|
|||
nir_ssa_def *f001 = nir_vec4(b, &load_x->dest.ssa, nir_imm_float(b, 0.0),
|
||||
nir_imm_float(b, 0.0), nir_imm_float(b, 1.0));
|
||||
|
||||
nir_variable *fullvar = rzalloc(shader, nir_variable);
|
||||
fullvar->type = glsl_vec4_type();
|
||||
fullvar->data.mode = nir_var_local;
|
||||
fullvar->name = "fogcoord_tmp";
|
||||
exec_list_push_tail(&b->impl->locals, &fullvar->node);
|
||||
|
||||
nir_variable *fullvar =
|
||||
nir_local_variable_create(b->impl, glsl_vec4_type(),
|
||||
"fogcoord_tmp");
|
||||
nir_intrinsic_instr *store =
|
||||
nir_intrinsic_instr_create(shader, nir_intrinsic_store_var);
|
||||
store->num_components = 4;
|
||||
|
|
@ -1015,7 +1011,6 @@ setup_registers_and_variables(struct ptn_compile *c)
|
|||
}
|
||||
}
|
||||
|
||||
exec_list_push_tail(&shader->inputs, &var->node);
|
||||
c->input_vars[i] = var;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue