From 3fc4813449f40872cff2320e66785619376cd119 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Wed, 27 Feb 2019 10:38:51 -0500 Subject: * Add 'identity' version of bit casts (asint, asuint, asfloat) for scalar and vector (#864) * Added identity bit casts for matrix (cos no op). We don't support matrix asint on glsl targets * Added tests in bit-cast.slang --- source/slang/hlsl.meta.slang | 82 ++++++++++++++++++++++++++++++------------ source/slang/hlsl.meta.slang.h | 82 ++++++++++++++++++++++++++++++------------ 2 files changed, 118 insertions(+), 46 deletions(-) (limited to 'source') diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index fc02395d4..e51016a53 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -375,30 +375,37 @@ double asdouble(uint lowbits, uint highbits); // Reinterpret bits as a float (HLSL SM 4.0) +// GLSL Scalar __target_intrinsic(glsl, "intBitsToFloat") float asfloat(int x); __target_intrinsic(glsl, "uintBitsToFloat") float asfloat(uint x); +__target_intrinsic(glsl, "$0") +float asfloat(float x); +// GLSL Vector +__generic +__target_intrinsic(glsl, "$0") +vector asfloat(vector x); __generic __target_intrinsic(glsl, "intBitsToFloat") vector asfloat(vector< int,N> x); - __generic __target_intrinsic(glsl, "uintBitsToFloat") vector asfloat(vector x); -float asfloat( int x); -__target_intrinsic(glsl, uintBitsToFloat) +// GLSL Matrix (only identity for now) +__generic +__target_intrinsic(glsl, "$0") +matrix asfloat(matrix x); + +// Pass thru to HLSL +float asfloat(float x); float asfloat(uint x); -__generic -__target_intrinsic(glsl, intBitsAsFloat) -vector asfloat(vector< int,N> x); -__generic -__target_intrinsic(glsl, uintBitsAsFloat) -vector asfloat(vector x); +float asfloat(int x); __generic matrix asfloat(matrix< int,N,M> x); __generic matrix asfloat(matrix x); +__generic matrix asfloat(matrix x); // Inverse sine (HLSL SM 1.0) __generic T asin(T x); @@ -407,31 +414,42 @@ __generic matrix __target_intrinsic(glsl, "floatBitsToInt") vector asint(vector x); - -__target_intrinsic(glsl, "int($0)") -int asint(uint x); - __generic __target_intrinsic(glsl, "ivec$N0($0)") vector asint(vector x); +__generic +__target_intrinsic(glsl, "$0") +vector asint(vector x); + +// GLSL Matrix (just identity for now) + +__generic +__target_intrinsic(glsl, "$0") +matrix asint(matrix x); + +// Pass thru HLSL int asint(float x); -__target_intrinsic(glsl, "uint($0)") +int asint(int x); int asint(uint x); -__generic -__target_intrinsic(glsl, floatBitsToInt) -vector asint(vector x); -__generic -vector asint(vector x); +__generic vector asint(vector x); +__generic vector asint(vector x); __generic matrix asint(matrix x); __generic matrix asint(matrix x); +__generic matrix asint(matrix x); // Reinterpret bits of double as a uint (HLSL SM 5.0) @@ -442,26 +460,44 @@ void asuint(double value, out uint lowbits, out uint highbits); void asuint(double value, out uint lowbits, out uint highbits); // Reinterpret bits as a uint (HLSL SM 4.0) + +// GLSL Scalar __target_intrinsic(glsl, "floatBitsToUint") uint asuint(float x); +__target_intrinsic(glsl, "uint($0)") +uint asuint(int x); +__target_intrinsic(glsl, "$0") +uint asuint(uint x); +// GLSL Vector __generic __target_intrinsic(glsl, "floatBitsToUint") vector asuint(vector x); - -__target_intrinsic(glsl, "uint($0)") -uint asuint(int x); - __generic __target_intrinsic(glsl, "uvec$N0($0)") vector asuint(vector x); +__generic +__target_intrinsic(glsl, "$0") +vector asuint(vector x); + +// GLSL Matrix (Identity only for now) +__generic +__target_intrinsic(glsl, "$0") +matrix asuint(matrix x); + +// Pass thru HLSL uint asuint(float x); uint asuint(int x); +uint asuint(uint x); + __generic vector asuint(vector x); __generic vector asuint(vector x); +__generic vector asuint(vector x); + __generic matrix asuint(matrix x); __generic matrix asuint(matrix x); +__generic matrix asuint(matrix x); // Inverse tangent (HLSL SM 1.0) __generic T atan(T x); diff --git a/source/slang/hlsl.meta.slang.h b/source/slang/hlsl.meta.slang.h index 1dcf55f2a..5132fbc29 100644 --- a/source/slang/hlsl.meta.slang.h +++ b/source/slang/hlsl.meta.slang.h @@ -420,30 +420,37 @@ SLANG_RAW("double asdouble(uint lowbits, uint highbits);\n") SLANG_RAW("\n") SLANG_RAW("// Reinterpret bits as a float (HLSL SM 4.0)\n") SLANG_RAW("\n") +SLANG_RAW("// GLSL Scalar\n") SLANG_RAW("__target_intrinsic(glsl, \"intBitsToFloat\")\n") SLANG_RAW("float asfloat(int x);\n") SLANG_RAW("__target_intrinsic(glsl, \"uintBitsToFloat\")\n") SLANG_RAW("float asfloat(uint x);\n") +SLANG_RAW("__target_intrinsic(glsl, \"$0\")\n") +SLANG_RAW("float asfloat(float x);\n") SLANG_RAW("\n") +SLANG_RAW("// GLSL Vector\n") +SLANG_RAW("__generic\n") +SLANG_RAW("__target_intrinsic(glsl, \"$0\")\n") +SLANG_RAW("vector asfloat(vector x);\n") SLANG_RAW("__generic\n") SLANG_RAW("__target_intrinsic(glsl, \"intBitsToFloat\")\n") SLANG_RAW("vector asfloat(vector< int,N> x);\n") -SLANG_RAW("\n") SLANG_RAW("__generic\n") SLANG_RAW("__target_intrinsic(glsl, \"uintBitsToFloat\")\n") SLANG_RAW("vector asfloat(vector x);\n") SLANG_RAW("\n") -SLANG_RAW("float asfloat( int x);\n") -SLANG_RAW("__target_intrinsic(glsl, uintBitsToFloat)\n") +SLANG_RAW("// GLSL Matrix (only identity for now)\n") +SLANG_RAW("__generic\n") +SLANG_RAW("__target_intrinsic(glsl, \"$0\")\n") +SLANG_RAW("matrix asfloat(matrix x);\n") +SLANG_RAW("\n") +SLANG_RAW("// Pass thru to HLSL\n") +SLANG_RAW("float asfloat(float x);\n") SLANG_RAW("float asfloat(uint x);\n") -SLANG_RAW("__generic\n") -SLANG_RAW("__target_intrinsic(glsl, intBitsAsFloat)\n") -SLANG_RAW("vector asfloat(vector< int,N> x);\n") -SLANG_RAW("__generic\n") -SLANG_RAW("__target_intrinsic(glsl, uintBitsAsFloat)\n") -SLANG_RAW("vector asfloat(vector x);\n") +SLANG_RAW("float asfloat(int x);\n") SLANG_RAW("__generic matrix asfloat(matrix< int,N,M> x);\n") SLANG_RAW("__generic matrix asfloat(matrix x);\n") +SLANG_RAW("__generic matrix asfloat(matrix x);\n") SLANG_RAW("\n") SLANG_RAW("// Inverse sine (HLSL SM 1.0)\n") SLANG_RAW("__generic T asin(T x);\n") @@ -452,31 +459,42 @@ SLANG_RAW("__generic m SLANG_RAW("\n") SLANG_RAW("// Reinterpret bits as an int (HLSL SM 4.0)\n") SLANG_RAW("\n") +SLANG_RAW("// GLSL scalar\n") SLANG_RAW("__target_intrinsic(glsl, \"floatBitsToInt\")\n") SLANG_RAW("int asint(float x);\n") +SLANG_RAW("__target_intrinsic(glsl, \"int($0)\")\n") +SLANG_RAW("int asint(uint x);\n") +SLANG_RAW("__target_intrinsic(glsl, \"$0\")\n") +SLANG_RAW("int asint(int x);\n") SLANG_RAW("\n") +SLANG_RAW("// GLSL Vector\n") SLANG_RAW("__generic\n") SLANG_RAW("__target_intrinsic(glsl, \"floatBitsToInt\")\n") SLANG_RAW("vector asint(vector x);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"int($0)\")\n") -SLANG_RAW("int asint(uint x);\n") -SLANG_RAW("\n") SLANG_RAW("__generic\n") SLANG_RAW("__target_intrinsic(glsl, \"ivec$N0($0)\")\n") SLANG_RAW("vector asint(vector x);\n") +SLANG_RAW("__generic\n") +SLANG_RAW("__target_intrinsic(glsl, \"$0\")\n") +SLANG_RAW("vector asint(vector x);\n") +SLANG_RAW("\n") +SLANG_RAW("// GLSL Matrix (just identity for now)\n") +SLANG_RAW("\n") +SLANG_RAW("__generic\n") +SLANG_RAW("__target_intrinsic(glsl, \"$0\")\n") +SLANG_RAW("matrix asint(matrix x);\n") +SLANG_RAW("\n") +SLANG_RAW("// Pass thru HLSL\n") SLANG_RAW("\n") SLANG_RAW("int asint(float x);\n") -SLANG_RAW("__target_intrinsic(glsl, \"uint($0)\")\n") +SLANG_RAW("int asint(int x);\n") SLANG_RAW("int asint(uint x);\n") SLANG_RAW("\n") -SLANG_RAW("__generic \n") -SLANG_RAW("__target_intrinsic(glsl, floatBitsToInt)\n") -SLANG_RAW("vector asint(vector x);\n") -SLANG_RAW("__generic \n") -SLANG_RAW("vector asint(vector x);\n") +SLANG_RAW("__generic vector asint(vector x);\n") +SLANG_RAW("__generic vector asint(vector x);\n") SLANG_RAW("__generic matrix asint(matrix x);\n") SLANG_RAW("__generic matrix asint(matrix x);\n") +SLANG_RAW("__generic matrix asint(matrix x);\n") SLANG_RAW("\n") SLANG_RAW("// Reinterpret bits of double as a uint (HLSL SM 5.0)\n") SLANG_RAW("\n") @@ -487,26 +505,44 @@ SLANG_RAW("\n") SLANG_RAW("void asuint(double value, out uint lowbits, out uint highbits);\n") SLANG_RAW("\n") SLANG_RAW("// Reinterpret bits as a uint (HLSL SM 4.0)\n") +SLANG_RAW("\n") +SLANG_RAW("// GLSL Scalar\n") SLANG_RAW("__target_intrinsic(glsl, \"floatBitsToUint\")\n") SLANG_RAW("uint asuint(float x);\n") +SLANG_RAW("__target_intrinsic(glsl, \"uint($0)\")\n") +SLANG_RAW("uint asuint(int x);\n") +SLANG_RAW("__target_intrinsic(glsl, \"$0\")\n") +SLANG_RAW("uint asuint(uint x);\n") SLANG_RAW("\n") +SLANG_RAW("// GLSL Vector\n") SLANG_RAW("__generic\n") SLANG_RAW("__target_intrinsic(glsl, \"floatBitsToUint\")\n") SLANG_RAW("vector asuint(vector x);\n") -SLANG_RAW("\n") -SLANG_RAW("__target_intrinsic(glsl, \"uint($0)\")\n") -SLANG_RAW("uint asuint(int x);\n") -SLANG_RAW("\n") SLANG_RAW("__generic\n") SLANG_RAW("__target_intrinsic(glsl, \"uvec$N0($0)\")\n") SLANG_RAW("vector asuint(vector x);\n") +SLANG_RAW("__generic\n") +SLANG_RAW("__target_intrinsic(glsl, \"$0\")\n") +SLANG_RAW("vector asuint(vector x);\n") +SLANG_RAW("\n") +SLANG_RAW("// GLSL Matrix (Identity only for now)\n") +SLANG_RAW("__generic\n") +SLANG_RAW("__target_intrinsic(glsl, \"$0\")\n") +SLANG_RAW("matrix asuint(matrix x);\n") +SLANG_RAW("\n") +SLANG_RAW("// Pass thru HLSL\n") SLANG_RAW("\n") SLANG_RAW("uint asuint(float x);\n") SLANG_RAW("uint asuint(int x);\n") +SLANG_RAW("uint asuint(uint x);\n") +SLANG_RAW("\n") SLANG_RAW("__generic vector asuint(vector x);\n") SLANG_RAW("__generic vector asuint(vector x);\n") +SLANG_RAW("__generic vector asuint(vector x);\n") +SLANG_RAW("\n") SLANG_RAW("__generic matrix asuint(matrix x);\n") SLANG_RAW("__generic matrix asuint(matrix x);\n") +SLANG_RAW("__generic matrix asuint(matrix x);\n") SLANG_RAW("\n") SLANG_RAW("// Inverse tangent (HLSL SM 1.0)\n") SLANG_RAW("__generic T atan(T x);\n") -- cgit v1.2.3