ff_fragment_shader: Don't generate swizzles for scalar combiner inputs

There are a couple scenarios where the source could be zero and the
operand could be either SRC_ALPHA or ONE_MINUS_SRC_ALPHA.  For
example, if the source was ZERO.  This would result in something like
(0).w, and a later call to ir_validate would get angry.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=42517
This commit is contained in:
Ian Romanick
2011-12-22 17:37:26 -08:00
parent 0ed11e3331
commit 4535874c1a
+10 -6
View File
@@ -632,15 +632,19 @@ emit_combine_source(struct texenv_fragment_program *p,
new(p->mem_ctx) ir_constant(1.0f),
src);
case OPR_SRC_ALPHA:
return new(p->mem_ctx) ir_swizzle(src, 3, 3, 3, 3, 1);
case OPR_SRC_ALPHA:
return src->type->is_scalar()
? src : (ir_rvalue *) new(p->mem_ctx) ir_swizzle(src, 3, 3, 3, 3, 1);
case OPR_ONE_MINUS_SRC_ALPHA: {
ir_rvalue *const scalar = (src->type->is_scalar())
? src : (ir_rvalue *) new(p->mem_ctx) ir_swizzle(src, 3, 3, 3, 3, 1);
case OPR_ONE_MINUS_SRC_ALPHA:
return new(p->mem_ctx) ir_expression(ir_binop_sub,
new(p->mem_ctx) ir_constant(1.0f),
new(p->mem_ctx) ir_swizzle(src,
3, 3,
3, 3, 1));
scalar);
}
case OPR_ZERO:
return new(p->mem_ctx) ir_constant(0.0f);
case OPR_ONE: