summaryrefslogtreecommitdiffstats
path: root/source/slang
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2018-02-26 16:28:24 -0800
committerGitHub <noreply@github.com>2018-02-26 16:28:24 -0800
commit372900b5a30de76e86ebc380ce9ad618afea6fdf (patch)
tree1fd674f84cdc60646e51b4038232e28fac4fdf4d /source/slang
parentc3bc49624891d9799975ae4a47e598961eea8aab (diff)
Add GLSL translations for bit manipulation intrinsics (#430)
The following translations are added: * HLSL `countbits` becomes GLSL `bitCount` * HLSL `firstbitlow` becomes GLSL `findLSB` * HLSL `firstbithight` becomes GLSL `findMSB` * HLSL `rerverseBits` becomes GLSL `bitfieldReverse` There are currently no HLSL equivalents for the bitfield insert/extract operations in GLSL. In the future we could expose those as intrinsics under their GLSL names, with HLSL translations, if desired.
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/hlsl.meta.slang16
-rw-r--r--source/slang/hlsl.meta.slang.h16
2 files changed, 32 insertions, 0 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index 5f3f0aa67..03b48e805 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -356,6 +356,7 @@ __generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> cosh(vector<T
__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> cosh(matrix<T,N,M> x);
// Population count
+__target_intrinsic(glsl, "bitCount")
uint countbits(uint value);
// Cross product
@@ -515,17 +516,29 @@ __generic<let N : int> vector<uint,N> f32tof16(vector<float,N> value);
__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> faceforward(vector<T,N> n, vector<T,N> i, vector<T,N> ng);
// Find first set bit starting at high bit and working down
+__target_intrinsic(glsl,"findMSB")
int firstbithigh(int value);
+
+__target_intrinsic(glsl,"findMSB")
__generic<let N : int> vector<int,N> firstbithigh(vector<int,N> value);
+__target_intrinsic(glsl,"findMSB")
uint firstbithigh(uint value);
+
+__target_intrinsic(glsl,"findMSB")
__generic<let N : int> vector<uint,N> firstbithigh(vector<uint,N> value);
// Find first set bit starting at low bit and working up
+__target_intrinsic(glsl,"findLSB")
int firstbitlow(int value);
+
+__target_intrinsic(glsl,"findLSB")
__generic<let N : int> vector<int,N> firstbitlow(vector<int,N> value);
+__target_intrinsic(glsl,"findLSB")
uint firstbitlow(uint value);
+
+__target_intrinsic(glsl,"findLSB")
__generic<let N : int> vector<uint,N> firstbitlow(vector<uint,N> value);
// Floor (HLSL SM 1.0)
@@ -815,7 +828,10 @@ __generic<T : __BuiltinFloatingPointType, let N : int>
vector<T,N> refract(vector<T,N> i, vector<T,N> n, float eta);
// Reverse order of bits
+__target_intrinsic(glsl, "bitfieldReverse")
uint reversebits(uint value);
+
+__target_intrinsic(glsl, "bitfieldReverse")
__generic<let N : int> vector<uint,N> reversebits(vector<uint,N> value);
// Round-to-nearest
diff --git a/source/slang/hlsl.meta.slang.h b/source/slang/hlsl.meta.slang.h
index eae31a75a..6351f2c8b 100644
--- a/source/slang/hlsl.meta.slang.h
+++ b/source/slang/hlsl.meta.slang.h
@@ -359,6 +359,7 @@ sb << "__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> cosh(v
sb << "__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> matrix<T,N,M> cosh(matrix<T,N,M> x);\n";
sb << "\n";
sb << "// Population count\n";
+sb << "__target_intrinsic(glsl, \"bitCount\")\n";
sb << "uint countbits(uint value);\n";
sb << "\n";
sb << "// Cross product\n";
@@ -518,17 +519,29 @@ sb << "// Flip surface normal to face forward, if needed\n";
sb << "__generic<T : __BuiltinFloatingPointType, let N : int> vector<T,N> faceforward(vector<T,N> n, vector<T,N> i, vector<T,N> ng);\n";
sb << "\n";
sb << "// Find first set bit starting at high bit and working down\n";
+sb << "__target_intrinsic(glsl,\"findMSB\")\n";
sb << "int firstbithigh(int value);\n";
+sb << "\n";
+sb << "__target_intrinsic(glsl,\"findMSB\")\n";
sb << "__generic<let N : int> vector<int,N> firstbithigh(vector<int,N> value);\n";
sb << "\n";
+sb << "__target_intrinsic(glsl,\"findMSB\")\n";
sb << "uint firstbithigh(uint value);\n";
+sb << "\n";
+sb << "__target_intrinsic(glsl,\"findMSB\")\n";
sb << "__generic<let N : int> vector<uint,N> firstbithigh(vector<uint,N> value);\n";
sb << "\n";
sb << "// Find first set bit starting at low bit and working up\n";
+sb << "__target_intrinsic(glsl,\"findLSB\")\n";
sb << "int firstbitlow(int value);\n";
+sb << "\n";
+sb << "__target_intrinsic(glsl,\"findLSB\")\n";
sb << "__generic<let N : int> vector<int,N> firstbitlow(vector<int,N> value);\n";
sb << "\n";
+sb << "__target_intrinsic(glsl,\"findLSB\")\n";
sb << "uint firstbitlow(uint value);\n";
+sb << "\n";
+sb << "__target_intrinsic(glsl,\"findLSB\")\n";
sb << "__generic<let N : int> vector<uint,N> firstbitlow(vector<uint,N> value);\n";
sb << "\n";
sb << "// Floor (HLSL SM 1.0)\n";
@@ -818,7 +831,10 @@ sb << "__generic<T : __BuiltinFloatingPointType, let N : int>\n";
sb << "vector<T,N> refract(vector<T,N> i, vector<T,N> n, float eta);\n";
sb << "\n";
sb << "// Reverse order of bits\n";
+sb << "__target_intrinsic(glsl, \"bitfieldReverse\")\n";
sb << "uint reversebits(uint value);\n";
+sb << "\n";
+sb << "__target_intrinsic(glsl, \"bitfieldReverse\")\n";
sb << "__generic<let N : int> vector<uint,N> reversebits(vector<uint,N> value);\n";
sb << "\n";
sb << "// Round-to-nearest\n";