summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnuj Phogat <anuj.phogat@gmail.com>2019-05-10 13:22:31 -0700
committerAnuj Phogat <anuj.phogat@gmail.com>2019-05-15 23:30:30 +0000
commita42163cbbc1abe02b7db4ade74b569f455942d1a (patch)
treee7e2f6eb4ab9094a8985314f1d2d42772ab446d4
parentd305409db51b998f99330ebd27044758ef207abf (diff)
compiler: Add lowering support for 64-bit saturate operations to software
Fixes 7 Khronos GL CTS tests: KHR-GL45.gpu_shader_fp64.builtin.smoothstep_dvec{double, 2, 3, 4} KHR-GL45.gpu_shader_fp64.builtin.smoothstep_against_scalar_dvec{2, 3, 4} Suggested-by: Jason Ekstrand <jason@jlekstrand.net> Signed-off-by: Anuj Phogat <anuj.phogat@gmail.com> Reviewed-by: Matt Turner <mattst88@gmail.com>
-rw-r--r--src/compiler/glsl/float64.glsl12
-rw-r--r--src/compiler/nir/nir_lower_double_ops.c3
2 files changed, 15 insertions, 0 deletions
diff --git a/src/compiler/glsl/float64.glsl b/src/compiler/glsl/float64.glsl
index 415dde3907c..babfad20e9c 100644
--- a/src/compiler/glsl/float64.glsl
+++ b/src/compiler/glsl/float64.glsl
@@ -218,6 +218,18 @@ __fge64(uint64_t a, uint64_t b)
return !__flt64_nonnan(a, b);
}
+uint64_t
+__fsat64(uint64_t __a)
+{
+ if (__flt64(__a, 0ul))
+ return 0ul;
+
+ if (__fge64(__a, 0x3FF0000000000000ul /* 1.0 */))
+ return 0x3FF0000000000000ul;
+
+ return __a;
+}
+
/* Adds the 64-bit value formed by concatenating `a0' and `a1' to the 64-bit
* value formed by concatenating `b0' and `b1'. Addition is modulo 2^64, so
* any carry out is lost. The result is broken into two 32-bit pieces which
diff --git a/src/compiler/nir/nir_lower_double_ops.c b/src/compiler/nir/nir_lower_double_ops.c
index 18fe08c7d5d..04ec2a82801 100644
--- a/src/compiler/nir/nir_lower_double_ops.c
+++ b/src/compiler/nir/nir_lower_double_ops.c
@@ -550,6 +550,9 @@ lower_doubles_instr_to_soft(nir_builder *b, nir_alu_instr *instr,
case nir_op_ffma:
name = "__ffma64";
break;
+ case nir_op_fsat:
+ name = "__fsat64";
+ break;
default:
return false;
}