[Mesa-dev] [PATCH] mesa: Add abs input modifier to base for POW in ffvertex_prog
Daniel Scharrer
daniel at constexpr.org
Thu Oct 1 13:01:52 PDT 2015
On 2015-10-01 21:45, Ilia Mirkin wrote:
> On Thu, Oct 1, 2015 at 8:36 AM, Daniel Scharrer <daniel at constexpr.org> wrote:
>> 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 at constexpr.org>
>> Cc: "10.6 11.0" <mesa-stable at lists.freedesktop.org>
>
> Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
>
> This also fixes the trace in question on nouveau (tested with a
> GK208). Nice find! I did some digging in the ARB_vertex_program spec,
> and it explicitly says that LG2(negative) is undefined, and that POW
> can be expressed as EX2 + LG2, so the compilers are well within their
> right to compile the program as they have been.
>
> Let me know if you need me to push this out for you.
Yeah, I don't have commit access.
>
> -ilia
>
>> ---
>> src/mesa/main/ffvertex_prog.c | 17 ++++++++++++++---
>> 1 file changed, 14 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/mesa/main/ffvertex_prog.c b/src/mesa/main/ffvertex_prog.c
>> index 95b428d..a6183b4 100644
>> --- a/src/mesa/main/ffvertex_prog.c
>> +++ b/src/mesa/main/ffvertex_prog.c
>> @@ -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);
>> --
>> 2.6.0
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
--
Daniel Scharrer
http://constexpr.org/
More information about the mesa-dev
mailing list