mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 06:40:11 +01:00
glsl: add support for inout params to glsl_to_nir()
Supporting these means we don't have to depend on calling the GLSL IR optimisation loop for shaders that contain these parameter types. Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26755>
This commit is contained in:
parent
3d3ba9f428
commit
52dbf44d2e
2 changed files with 13 additions and 12 deletions
|
|
@ -1532,17 +1532,23 @@ nir_visitor::visit(ir_call *ir)
|
|||
ir_rvalue *param_rvalue = (ir_rvalue *) actual_node;
|
||||
ir_variable *sig_param = (ir_variable *) formal_node;
|
||||
|
||||
if (sig_param->data.mode == ir_var_function_out) {
|
||||
if (sig_param->data.mode == ir_var_function_out ||
|
||||
sig_param->data.mode == ir_var_function_inout) {
|
||||
nir_variable *out_param =
|
||||
nir_local_variable_create(this->impl, sig_param->type, "param");
|
||||
out_param->data.precision = sig_param->data.precision;
|
||||
nir_deref_instr *out_param_deref = nir_build_deref_var(&b, out_param);
|
||||
|
||||
if (sig_param->data.mode == ir_var_function_inout) {
|
||||
nir_store_deref(&b, out_param_deref,
|
||||
nir_load_deref(&b, evaluate_deref(param_rvalue)),
|
||||
~0);
|
||||
}
|
||||
|
||||
call->params[i] = nir_src_for_ssa(&out_param_deref->def);
|
||||
} else if (sig_param->data.mode == ir_var_function_in) {
|
||||
nir_def *val = evaluate_rvalue(param_rvalue);
|
||||
call->params[i] = nir_src_for_ssa(val);
|
||||
} else if (sig_param->data.mode == ir_var_function_inout) {
|
||||
unreachable("unimplemented: inout parameters");
|
||||
}
|
||||
|
||||
i++;
|
||||
|
|
@ -1559,7 +1565,8 @@ nir_visitor::visit(ir_call *ir)
|
|||
ir_rvalue *param_rvalue = (ir_rvalue *) actual_node;
|
||||
ir_variable *sig_param = (ir_variable *) formal_node;
|
||||
|
||||
if (sig_param->data.mode == ir_var_function_out) {
|
||||
if (sig_param->data.mode == ir_var_function_out ||
|
||||
sig_param->data.mode == ir_var_function_inout) {
|
||||
nir_store_deref(&b, evaluate_deref(param_rvalue),
|
||||
nir_load_deref(&b, nir_src_as_deref(call->params[i])),
|
||||
~0);
|
||||
|
|
@ -2491,7 +2498,8 @@ nir_visitor::visit(ir_constant *ir)
|
|||
void
|
||||
nir_visitor::visit(ir_dereference_variable *ir)
|
||||
{
|
||||
if (ir->variable_referenced()->data.mode == ir_var_function_out) {
|
||||
if (ir->variable_referenced()->data.mode == ir_var_function_out ||
|
||||
ir->variable_referenced()->data.mode == ir_var_function_inout) {
|
||||
unsigned i = (sig->return_type != &glsl_type_builtin_void) ? 1 : 0;
|
||||
|
||||
foreach_in_list(ir_variable, param, &sig->parameters) {
|
||||
|
|
@ -2506,8 +2514,6 @@ nir_visitor::visit(ir_dereference_variable *ir)
|
|||
return;
|
||||
}
|
||||
|
||||
assert(ir->variable_referenced()->data.mode != ir_var_function_inout);
|
||||
|
||||
struct hash_entry *entry =
|
||||
_mesa_hash_table_search(this->var_table, ir->var);
|
||||
assert(entry);
|
||||
|
|
|
|||
|
|
@ -2756,11 +2756,6 @@ public:
|
|||
return visit_stop;
|
||||
}
|
||||
|
||||
if (param->data.mode == ir_var_function_inout) {
|
||||
unsupported = true;
|
||||
return visit_stop;
|
||||
}
|
||||
|
||||
if (param->data.mode != ir_var_function_in &&
|
||||
param->data.mode != ir_var_const_in)
|
||||
continue;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue