From 372900b5a30de76e86ebc380ce9ad618afea6fdf Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Mon, 26 Feb 2018 16:28:24 -0800 Subject: 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. --- source/slang/hlsl.meta.slang | 16 ++++++++++++++++ source/slang/hlsl.meta.slang.h | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) (limited to 'source') 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 vector cosh(vector matrix cosh(matrix x); // Population count +__target_intrinsic(glsl, "bitCount") uint countbits(uint value); // Cross product @@ -515,17 +516,29 @@ __generic vector f32tof16(vector value); __generic vector faceforward(vector n, vector i, vector 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 vector firstbithigh(vector value); +__target_intrinsic(glsl,"findMSB") uint firstbithigh(uint value); + +__target_intrinsic(glsl,"findMSB") __generic vector firstbithigh(vector 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 vector firstbitlow(vector value); +__target_intrinsic(glsl,"findLSB") uint firstbitlow(uint value); + +__target_intrinsic(glsl,"findLSB") __generic vector firstbitlow(vector value); // Floor (HLSL SM 1.0) @@ -815,7 +828,10 @@ __generic vector refract(vector i, vector n, float eta); // Reverse order of bits +__target_intrinsic(glsl, "bitfieldReverse") uint reversebits(uint value); + +__target_intrinsic(glsl, "bitfieldReverse") __generic vector reversebits(vector 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 vector cosh(v sb << "__generic matrix cosh(matrix 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 vector faceforward(vector n, vector i, vector 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 vector firstbithigh(vector 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 vector firstbithigh(vector 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 vector firstbitlow(vector 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 vector firstbitlow(vector value);\n"; sb << "\n"; sb << "// Floor (HLSL SM 1.0)\n"; @@ -818,7 +831,10 @@ sb << "__generic\n"; sb << "vector refract(vector i, vector 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 vector reversebits(vector value);\n"; sb << "\n"; sb << "// Round-to-nearest\n"; -- cgit v1.2.3