summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Stepinski <rob.stepinski@gmail.com>2019-03-20 17:13:48 -0400
committerTim Foley <tfoleyNV@users.noreply.github.com>2019-03-20 14:13:48 -0700
commitfb29281b9061eb5e9b75d1362f2c824d01a8b3d4 (patch)
treeb3fee168100eff3357169afbe9b698a3d97f7164
parent662fcca6d3156d7645761ac967038e5ff068fe99 (diff)
Add support for scalar rcp() intrinsic for GLSL (#918)
-rw-r--r--source/slang/hlsl.meta.slang6
-rw-r--r--source/slang/hlsl.meta.slang.h16
-rw-r--r--tests/bugs/vk-structured-buffer-load.hlsl12
-rw-r--r--tests/bugs/vk-structured-buffer-load.hlsl.glsl20
4 files changed, 45 insertions, 9 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index a12e45c36..40bd02597 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -1133,7 +1133,11 @@ __generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> radians(vecto
__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> radians(matrix<T,N,M> x);
// Approximate reciprocal
-__generic<T : __BuiltinFloatingPointType> T rcp(T x);
+__generic<T : __BuiltinFloatingPointType>
+__target_intrinsic(glsl, "1.0/($0)")
+T rcp(T x);
+
+// TODO: vector and matrix approx. reciprocals needto be deconstructed for GLSL
__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> rcp(vector<T,N> x);
__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> rcp(matrix<T,N,M> x);
diff --git a/source/slang/hlsl.meta.slang.h b/source/slang/hlsl.meta.slang.h
index a82a733ac..e40e12962 100644
--- a/source/slang/hlsl.meta.slang.h
+++ b/source/slang/hlsl.meta.slang.h
@@ -1209,9 +1209,17 @@ SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> ra
SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> radians(matrix<T,N,M> x);\n")
SLANG_RAW("\n")
SLANG_RAW("// Approximate reciprocal\n")
-SLANG_RAW("__generic<T : __BuiltinFloatingPointType> T rcp(T x);\n")
-SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> rcp(vector<T,N> x);\n")
-SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> rcp(matrix<T,N,M> x);\n")
+SLANG_RAW("__generic<T : __BuiltinFloatingPointType>\n")
+SLANG_RAW("__target_intrinsic(glsl, \"1.0/($0)\")\n")
+SLANG_RAW("T rcp(T x);\n")
+SLANG_RAW("\n")
+SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n")
+SLANG_RAW("__target_intrinsic(glsl, \"1.0/($0)\")\n")
+SLANG_RAW("vector<T,N> rcp(vector<T,N> x);\n")
+SLANG_RAW("\n")
+SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>\n")
+SLANG_RAW("__target_intrinsic(glsl, \"1.0/($0)\")\n")
+SLANG_RAW("matrix<T,N,M> rcp(matrix<T,N,M> x);\n")
SLANG_RAW("\n")
SLANG_RAW("// Reflect incident vector across plane with given normal\n")
SLANG_RAW("__generic<T : __BuiltinFloatingPointType, let N : int>\n")
@@ -1531,7 +1539,7 @@ for (int aa = 0; aa < kBaseBufferAccessLevelCount; ++aa)
sb << "};\n";
}
-SLANG_RAW("#line 1458 \"hlsl.meta.slang\"")
+SLANG_RAW("#line 1466 \"hlsl.meta.slang\"")
SLANG_RAW("\n")
SLANG_RAW("\n")
SLANG_RAW("\n")
diff --git a/tests/bugs/vk-structured-buffer-load.hlsl b/tests/bugs/vk-structured-buffer-load.hlsl
index daedc5b66..a5f518f93 100644
--- a/tests/bugs/vk-structured-buffer-load.hlsl
+++ b/tests/bugs/vk-structured-buffer-load.hlsl
@@ -1,5 +1,7 @@
//TEST:CROSS_COMPILE: -profile lib_6_3 -entry HitMain -stage closesthit -target spirv-assembly
+#define USE_RCP 0
+
struct ParameterBlockTest
{
SamplerState sam;
@@ -19,7 +21,13 @@ void HitMain(inout RayHitInfoPacked RayData, BuiltInTriangleIntersectionAttribut
float HitT = RayTCurrent();
RayData.PackedHitInfoA.x = HitT;
uint offs = 0;
+ uint use_rcp = USE_RCP;
float offsfloat = gParamBlock.sbuf.Load(offs);
-
- RayData.PackedHitInfoA.y = rsqrt(offsfloat);
+
+ use_rcp |= HitT > 0.0;
+
+ if (use_rcp)
+ RayData.PackedHitInfoA.y = rcp(offsfloat);
+ else
+ RayData.PackedHitInfoA.y = rsqrt(offsfloat);
}
diff --git a/tests/bugs/vk-structured-buffer-load.hlsl.glsl b/tests/bugs/vk-structured-buffer-load.hlsl.glsl
index 8060cc921..1cf0b00a7 100644
--- a/tests/bugs/vk-structured-buffer-load.hlsl.glsl
+++ b/tests/bugs/vk-structured-buffer-load.hlsl.glsl
@@ -29,11 +29,27 @@ void main()
float HitT_0 = (gl_HitTNV);
_S2.PackedHitInfoA_0.x = HitT_0;
+ const uint use_rcp_0 = uint(0);
+
float offsfloat_0 = ((gParamBlock_sbuf_0)._data[(int(uint(0)))]);
- float _S4 = inversesqrt(offsfloat_0);
- _S2.PackedHitInfoA_0.y = _S4;
+
+ if(bool(use_rcp_0 | uint(HitT_0 > 0.00000000000000000000)))
+ {
+
+ float _S4 = (1.0/((offsfloat_0)));
+
+ _S2.PackedHitInfoA_0.y = _S4;
+
+ }
+ else
+ {
+ float _S5 = (inversesqrt((offsfloat_0)));
+
+ _S2.PackedHitInfoA_0.y = _S5;
+
+ }
return;
}