diff options
| -rw-r--r-- | source/slang/hlsl.meta.slang | 6 | ||||
| -rw-r--r-- | source/slang/hlsl.meta.slang.h | 16 | ||||
| -rw-r--r-- | tests/bugs/vk-structured-buffer-load.hlsl | 12 | ||||
| -rw-r--r-- | tests/bugs/vk-structured-buffer-load.hlsl.glsl | 20 |
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; } |
