[Mesa-dev] [PATCH 07/12] nir: Don't use ffma in nir_lower_wpos_ytransform().

Kenneth Graunke kenneth at whitecape.org
Wed May 18 22:00:12 UTC 2016


ffma is an explicitly fused multiply add with higher precision.
The optimizer will take care of promoting mul/add to fma when
it's beneficial to do so.

This fixes failures on Gen4-5 when using this pass, as those platforms
don't actually implement fma().

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/compiler/nir/nir_lower_wpos_ytransform.c | 20 ++++++++------------
 1 file changed, 8 insertions(+), 12 deletions(-)

diff --git a/src/compiler/nir/nir_lower_wpos_ytransform.c b/src/compiler/nir/nir_lower_wpos_ytransform.c
index 36e25b9..ccf0fd3 100644
--- a/src/compiler/nir/nir_lower_wpos_ytransform.c
+++ b/src/compiler/nir/nir_lower_wpos_ytransform.c
@@ -123,19 +123,15 @@ emit_wpos_adjustment(lower_wpos_ytransform_state *state,
     * inversion/identity, or the other way around if we're drawing to an FBO.
     */
    if (invert) {
-      /* MAD wpos_temp.y, wpos_input, wpostrans.xxxx, wpostrans.yyyy
-       */
-      wpos_temp_y = nir_ffma(b,
-                             nir_channel(b, wpos_temp, 1),
-                             nir_channel(b, wpostrans, 0),
-                             nir_channel(b, wpostrans, 1));
+      /* wpos_temp.y = wpos_input * wpostrans.xxxx + wpostrans.yyyy */
+      wpos_temp_y = nir_fadd(b, nir_fmul(b, nir_channel(b, wpos_temp, 1),
+                                            nir_channel(b, wpostrans, 0)),
+                                nir_channel(b, wpostrans, 1));
    } else {
-      /* MAD wpos_temp.y, wpos_input, wpostrans.zzzz, wpostrans.wwww
-       */
-      wpos_temp_y = nir_ffma(b,
-                             nir_channel(b, wpos_temp, 1),
-                             nir_channel(b, wpostrans, 2),
-                             nir_channel(b, wpostrans, 3));
+      /* wpos_temp.y = wpos_input * wpostrans.zzzz + wpostrans.wwww */
+      wpos_temp_y = nir_fadd(b, nir_fmul(b, nir_channel(b, wpos_temp, 1),
+                                            nir_channel(b, wpostrans, 2)),
+                                nir_channel(b, wpostrans, 3));
    }
 
    wpos_temp = nir_vec4(b,
-- 
2.8.2



More information about the mesa-dev mailing list