summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/hlsl.meta.slang14
-rw-r--r--tests/cross-compile/half-conversion.slang13
-rw-r--r--tests/cross-compile/half-conversion.slang.glsl42
3 files changed, 65 insertions, 4 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index 73cda7761..e9da539bf 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -1158,19 +1158,25 @@ matrix<T,N,M> exp2(matrix<T,N,M> x)
// Convert 16-bit float stored in low bits of integer
__target_intrinsic(glsl, "unpackHalf2x16($0).x")
+__glsl_version(420)
float f16tof32(uint value);
__generic<let N : int>
-__target_intrinsic(glsl, "unpackHalf2x16($0).x")
-vector<float,N> f16tof32(vector<uint,N> value);
+vector<float, N> f16tof32(vector<uint, N> value)
+{
+ VECTOR_MAP_UNARY(float, N, f16tof32, value);
+}
// Convert to 16-bit float stored in low bits of integer
__target_intrinsic(glsl, "packHalf2x16(vec2($0,0.0))")
+__glsl_version(420)
uint f32tof16(float value);
__generic<let N : int>
-__target_intrinsic(glsl, "packHalf2x16(vec2($0,0.0))")
-vector<uint,N> f32tof16(vector<float,N> value);
+vector<uint, N> f32tof16(vector<float, N> value)
+{
+ VECTOR_MAP_UNARY(uint, N, f32tof16, value);
+}
// Flip surface normal to face forward, if needed
__generic<T : __BuiltinFloatingPointType, let N : int>
diff --git a/tests/cross-compile/half-conversion.slang b/tests/cross-compile/half-conversion.slang
new file mode 100644
index 000000000..316629f81
--- /dev/null
+++ b/tests/cross-compile/half-conversion.slang
@@ -0,0 +1,13 @@
+// half-conversion.slang
+
+//TEST:CROSS_COMPILE:-target spirv-assembly -entry main -stage fragment
+
+cbuffer C
+{
+ uint4 u;
+}
+
+float4 main() : SV_Target
+{
+ return f16tof32(u);
+}
diff --git a/tests/cross-compile/half-conversion.slang.glsl b/tests/cross-compile/half-conversion.slang.glsl
new file mode 100644
index 000000000..3b7b740e4
--- /dev/null
+++ b/tests/cross-compile/half-conversion.slang.glsl
@@ -0,0 +1,42 @@
+//half-conversion.slang.glsl
+//TEST_IGNORE_FILE:
+
+#version 450
+
+struct SLANG_ParameterGroup_C_0
+{
+ uvec4 u_0;
+};
+
+layout(binding = 0)
+layout(std140) uniform _S1
+{
+ SLANG_ParameterGroup_C_0 _data;
+} C_0;
+
+vec4 f16tof32_0(uvec4 value_0)
+{
+ int i_0;
+ vec4 result_0;
+ i_0 = 0;
+ for(;;)
+ {
+ if(i_0 < 4) {} else break;
+
+ float _S2 = (unpackHalf2x16((value_0[i_0])).x);
+ result_0[i_0] = _S2;
+ int _S3 = i_0 + int(1);
+ i_0 = _S3;
+ }
+ return result_0;
+}
+
+layout(location = 0)
+out vec4 _S4;
+
+void main()
+{
+ vec4 _S5 = f16tof32_0(C_0._data.u_0);
+ _S4 = _S5;
+ return;
+}