Neg modifier for source in MIN and MAX ops is ignored. Tested on git 89b9ef9. I tested it only on NV96. shader with: float x = -sin(uv.x); float d = max(0.0, x); generates: EMIT: presin f32 $r0 $r0 (8) EMIT: sin f32 $r0 $r0 (8) EMIT: mov u32 $r1 0x00000000 (8) EMIT: max f32 $r2 neg $r0 $r1 (8) Shader output is identical to version without unary minus. Only difference is lack of neg modifier. After disabling modifiers shader works as expected: --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp @@ -85,8 +85,8 @@ static const struct opProperties _initProps[] = { OP_ADD, 0x3, 0x0, 0x0, 0x8, 0x2, 0x1, 0x1, 0x2 }, { OP_SUB, 0x3, 0x0, 0x0, 0x0, 0x2, 0x1, 0x1, 0x2 }, { OP_MUL, 0x3, 0x0, 0x0, 0x0, 0x2, 0x1, 0x1, 0x2 }, - { OP_MAX, 0x3, 0x3, 0x0, 0x0, 0x2, 0x1, 0x1, 0x0 }, - { OP_MIN, 0x3, 0x3, 0x0, 0x0, 0x2, 0x1, 0x1, 0x0 }, + { OP_MAX, 0x0, 0x3, 0x0, 0x0, 0x2, 0x1, 0x1, 0x0 }, + { OP_MIN, 0x0, 0x3, 0x0, 0x0, 0x2, 0x1, 0x1, 0x0 }, { OP_MAD, 0x7, 0x0, 0x0, 0x0, 0x6, 0x1, 0x1, 0x0 }, // special constraint { OP_ABS, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0 }, { OP_NEG, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0 }, After this change: EMIT: presin f32 $r0 $r0 (8) EMIT: sin f32 $r0 $r0 (8) EMIT: mov u32 $r1 0x00000000 (8) EMIT: neg f32 $r0 $r0 (8) EMIT: max f32 $r2 $r0 $r1 (8)
Great find! However the min/max ops can actually take the neg modifiers (on either arg), but the emit logic didn't have that hooked up somehow. Does http://patchwork.freedesktop.org/patch/37356/ resolve your issue?
(In reply to Ilia Mirkin from comment #1) Yes, this patch solved my issue.
Pushed as 7d07083c upstream, should be backported to 10.3 and 10.4 releases.
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.