diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2018-02-26 16:28:24 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-02-26 16:28:24 -0800 |
| commit | 372900b5a30de76e86ebc380ce9ad618afea6fdf (patch) | |
| tree | 1fd674f84cdc60646e51b4038232e28fac4fdf4d /source/slang | |
| parent | c3bc49624891d9799975ae4a47e598961eea8aab (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.slang | 16 | ||||
| -rw-r--r-- | source/slang/hlsl.meta.slang.h | 16 |
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"; |
