mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 22:00:13 +01:00
mesa: Add abs input modifier to base for POW in ffvertex_prog
The result of POW for a negative base is undefined. Even when the result is multiplied by zero (which is the case here whenever the base is negative), the Inf and NaNs can propagate past that. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91342 Signed-off-by: Daniel Scharrer <daniel@constexpr.org> Cc: "10.6 11.0" <mesa-stable@lists.freedesktop.org> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
604ce8253a
commit
b3f9c5cc0f
1 changed files with 14 additions and 3 deletions
|
|
@ -293,9 +293,10 @@ struct ureg {
|
|||
GLuint file:4;
|
||||
GLint idx:9; /* relative addressing may be negative */
|
||||
/* sizeof(idx) should == sizeof(prog_src_reg::Index) */
|
||||
GLuint abs:1;
|
||||
GLuint negate:1;
|
||||
GLuint swz:12;
|
||||
GLuint pad:6;
|
||||
GLuint pad:5;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -324,6 +325,7 @@ static const struct ureg undef = {
|
|||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
};
|
||||
|
||||
|
|
@ -342,6 +344,7 @@ static struct ureg make_ureg(GLuint file, GLint idx)
|
|||
struct ureg reg;
|
||||
reg.file = file;
|
||||
reg.idx = idx;
|
||||
reg.abs = 0;
|
||||
reg.negate = 0;
|
||||
reg.swz = SWIZZLE_NOOP;
|
||||
reg.pad = 0;
|
||||
|
|
@ -350,6 +353,14 @@ static struct ureg make_ureg(GLuint file, GLint idx)
|
|||
|
||||
|
||||
|
||||
static struct ureg absolute( struct ureg reg )
|
||||
{
|
||||
reg.abs = 1;
|
||||
reg.negate = 0;
|
||||
return reg;
|
||||
}
|
||||
|
||||
|
||||
static struct ureg negate( struct ureg reg )
|
||||
{
|
||||
reg.negate ^= 1;
|
||||
|
|
@ -526,8 +537,8 @@ static void emit_arg( struct prog_src_register *src,
|
|||
src->File = reg.file;
|
||||
src->Index = reg.idx;
|
||||
src->Swizzle = reg.swz;
|
||||
src->Abs = reg.abs;
|
||||
src->Negate = reg.negate ? NEGATE_XYZW : NEGATE_NONE;
|
||||
src->Abs = 0;
|
||||
src->RelAddr = 0;
|
||||
/* Check that bitfield sizes aren't exceeded */
|
||||
assert(src->Index == reg.idx);
|
||||
|
|
@ -953,7 +964,7 @@ static struct ureg calculate_light_attenuation( struct tnl_program *p,
|
|||
|
||||
emit_op2(p, OPCODE_DP3, spot, 0, negate(VPpli), spot_dir_norm);
|
||||
emit_op2(p, OPCODE_SLT, slt, 0, swizzle1(spot_dir_norm,W), spot);
|
||||
emit_op2(p, OPCODE_POW, spot, 0, spot, swizzle1(attenuation, W));
|
||||
emit_op2(p, OPCODE_POW, spot, 0, absolute(spot), swizzle1(attenuation, W));
|
||||
emit_op2(p, OPCODE_MUL, att, 0, slt, spot);
|
||||
|
||||
release_temp(p, spot);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue