glsl: Allow dot() on scalars, and throw out dotlike().
In all uses of dotlike() we're writing generic code that operates on 1-4 component vectors. That our IR requires ir_binop_dot expressions' operands to be 2+ component vectors is an implementation detail that's not important when implementing built-in functions with dot(), which is defined for scalar floats in GLSL. Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
6cbc64c3cb
commit
c049dd4396
|
@ -3049,7 +3049,7 @@ builtin_builder::_length(const glsl_type *type)
|
|||
ir_variable *x = in_var(type, "x");
|
||||
MAKE_SIG(glsl_type::float_type, always_available, 1, x);
|
||||
|
||||
body.emit(ret(sqrt(dotlike(x, x))));
|
||||
body.emit(ret(sqrt(dot(x, x))));
|
||||
|
||||
return sig;
|
||||
}
|
||||
|
@ -3139,7 +3139,7 @@ builtin_builder::_faceforward(const glsl_type *type)
|
|||
ir_variable *Nref = in_var(type, "Nref");
|
||||
MAKE_SIG(type, always_available, 3, N, I, Nref);
|
||||
|
||||
body.emit(if_tree(less(dotlike(Nref, I), imm(0.0f)),
|
||||
body.emit(if_tree(less(dot(Nref, I), imm(0.0f)),
|
||||
ret(N), ret(neg(N))));
|
||||
|
||||
return sig;
|
||||
|
@ -3153,7 +3153,7 @@ builtin_builder::_reflect(const glsl_type *type)
|
|||
MAKE_SIG(type, always_available, 2, I, N);
|
||||
|
||||
/* I - 2 * dot(N, I) * N */
|
||||
body.emit(ret(sub(I, mul(imm(2.0f), mul(dotlike(N, I), N)))));
|
||||
body.emit(ret(sub(I, mul(imm(2.0f), mul(dot(N, I), N)))));
|
||||
|
||||
return sig;
|
||||
}
|
||||
|
@ -3167,7 +3167,7 @@ builtin_builder::_refract(const glsl_type *type)
|
|||
MAKE_SIG(type, always_available, 3, I, N, eta);
|
||||
|
||||
ir_variable *n_dot_i = body.make_temp(glsl_type::float_type, "n_dot_i");
|
||||
body.emit(assign(n_dot_i, dotlike(N, I)));
|
||||
body.emit(assign(n_dot_i, dot(N, I)));
|
||||
|
||||
/* From the GLSL 1.10 specification:
|
||||
* k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I))
|
||||
|
|
|
@ -251,13 +251,8 @@ ir_expression *round_even(operand a)
|
|||
return expr(ir_unop_round_even, a);
|
||||
}
|
||||
|
||||
ir_expression *dot(operand a, operand b)
|
||||
{
|
||||
return expr(ir_binop_dot, a, b);
|
||||
}
|
||||
|
||||
/* dot for vectors, mul for scalars */
|
||||
ir_expression *dotlike(operand a, operand b)
|
||||
ir_expression *dot(operand a, operand b)
|
||||
{
|
||||
assert(a.val->type == b.val->type);
|
||||
|
||||
|
|
|
@ -139,7 +139,6 @@ ir_expression *carry(operand a, operand b);
|
|||
ir_expression *borrow(operand a, operand b);
|
||||
ir_expression *round_even(operand a);
|
||||
ir_expression *dot(operand a, operand b);
|
||||
ir_expression *dotlike(operand a, operand b);
|
||||
ir_expression *clamp(operand a, operand b, operand c);
|
||||
ir_expression *saturate(operand a);
|
||||
ir_expression *abs(operand a);
|
||||
|
|
Loading…
Reference in New Issue