glsl: remove interpolateAt* instructions for demoted inputs
This fixes 8 fs-interpolateat* piglit crashes on radeonsi, because it can't handle non-input operands in interpolateAt*. Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
@@ -593,6 +593,11 @@ remove_unused_shader_inputs_and_outputs(bool is_separate_shader_object,
|
|||||||
*/
|
*/
|
||||||
if (var->data.is_unmatched_generic_inout && !var->data.is_xfb_only) {
|
if (var->data.is_unmatched_generic_inout && !var->data.is_xfb_only) {
|
||||||
assert(var->data.mode != ir_var_temporary);
|
assert(var->data.mode != ir_var_temporary);
|
||||||
|
|
||||||
|
/* Assign zeros to demoted inputs to allow more optimizations. */
|
||||||
|
if (var->data.mode == ir_var_shader_in && !var->constant_value)
|
||||||
|
var->constant_value = ir_constant::zero(var, var->type);
|
||||||
|
|
||||||
var->data.mode = ir_var_auto;
|
var->data.mode = ir_var_auto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -961,6 +961,16 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
|
|||||||
return ir->operands[2];
|
return ir->operands[2];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* Remove interpolateAt* instructions for demoted inputs. They are
|
||||||
|
* assigned a constant expression to facilitate this.
|
||||||
|
*/
|
||||||
|
case ir_unop_interpolate_at_centroid:
|
||||||
|
case ir_binop_interpolate_at_offset:
|
||||||
|
case ir_binop_interpolate_at_sample:
|
||||||
|
if (op_const[0])
|
||||||
|
return ir->operands[0];
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user