blob: ee243abef6a414e1849f6394d75eaf1935fbc78b [file] [log] [blame] [edit]
//===--- hlsl_compat_overloads.h - Extra HLSL overloads for intrinsics ----===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef _HLSL_COMPAT_OVERLOADS_H_
#define _HLSL_COMPAT_OVERLOADS_H_
namespace hlsl {
// Note: Functions in this file are sorted alphabetically, then grouped by base
// element type, and the element types are sorted by size, then signed integer,
// unsigned integer and floating point. Keeping this ordering consistent will
// help keep this file manageable as it grows.
#define _DXC_DEPRECATED_64BIT_FN(fn) \
[[deprecated("In 202x 64 bit API lowering for " #fn " is deprecated. " \
"Explicitly cast parameters to 32 or 16 bit types.")]]
#define _DXC_DEPRECATED_INT_FN(fn) \
[[deprecated("In 202x int lowering for " #fn " is deprecated. " \
"Explicitly cast parameters to float types.")]]
#define _DXC_DEPRECATED_VEC_SCALAR_FN(fn) \
[[deprecated("In 202x mismatched vector/scalar lowering for " #fn " is " \
"deprecated. Explicitly cast parameters.")]]
#define _DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(fn) \
_DXC_DEPRECATED_64BIT_FN(fn) \
constexpr float fn(double V) { return fn((float)V); } \
_DXC_DEPRECATED_64BIT_FN(fn) \
constexpr float2 fn(double2 V) { return fn((float2)V); } \
_DXC_DEPRECATED_64BIT_FN(fn) \
constexpr float3 fn(double3 V) { return fn((float3)V); } \
_DXC_DEPRECATED_64BIT_FN(fn) \
constexpr float4 fn(double4 V) { return fn((float4)V); }
#define _DXC_COMPAT_BINARY_DOUBLE_OVERLOADS(fn) \
_DXC_DEPRECATED_64BIT_FN(fn) \
constexpr float fn(double V1, double V2) { \
return fn((float)V1, (float)V2); \
} \
_DXC_DEPRECATED_64BIT_FN(fn) \
constexpr float2 fn(double2 V1, double2 V2) { \
return fn((float2)V1, (float2)V2); \
} \
_DXC_DEPRECATED_64BIT_FN(fn) \
constexpr float3 fn(double3 V1, double3 V2) { \
return fn((float3)V1, (float3)V2); \
} \
_DXC_DEPRECATED_64BIT_FN(fn) \
constexpr float4 fn(double4 V1, double4 V2) { \
return fn((float4)V1, (float4)V2); \
}
#define _DXC_COMPAT_TERNARY_DOUBLE_OVERLOADS(fn) \
_DXC_DEPRECATED_64BIT_FN(fn) \
constexpr float fn(double V1, double V2, double V3) { \
return fn((float)V1, (float)V2, (float)V3); \
} \
_DXC_DEPRECATED_64BIT_FN(fn) \
constexpr float2 fn(double2 V1, double2 V2, double2 V3) { \
return fn((float2)V1, (float2)V2, (float2)V3); \
} \
_DXC_DEPRECATED_64BIT_FN(fn) \
constexpr float3 fn(double3 V1, double3 V2, double3 V3) { \
return fn((float3)V1, (float3)V2, (float3)V3); \
} \
_DXC_DEPRECATED_64BIT_FN(fn) \
constexpr float4 fn(double4 V1, double4 V2, double4 V3) { \
return fn((float4)V1, (float4)V2, (float4)V3); \
}
#define _DXC_COMPAT_UNARY_INTEGER_OVERLOADS(fn) \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float fn(int V) { return fn((float)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float2 fn(int2 V) { return fn((float2)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float3 fn(int3 V) { return fn((float3)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float4 fn(int4 V) { return fn((float4)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float fn(uint V) { return fn((float)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float2 fn(uint2 V) { return fn((float2)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float3 fn(uint3 V) { return fn((float3)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float4 fn(uint4 V) { return fn((float4)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float fn(int64_t V) { return fn((float)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float2 fn(int64_t2 V) { return fn((float2)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float3 fn(int64_t3 V) { return fn((float3)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float4 fn(int64_t4 V) { return fn((float4)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float fn(uint64_t V) { return fn((float)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float2 fn(uint64_t2 V) { return fn((float2)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float3 fn(uint64_t3 V) { return fn((float3)V); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float4 fn(uint64_t4 V) { return fn((float4)V); }
#define _DXC_COMPAT_BINARY_INTEGER_OVERLOADS(fn) \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float fn(int V1, int V2) { return fn((float)V1, (float)V2); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float2 fn(int2 V1, int2 V2) { return fn((float2)V1, (float2)V2); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float3 fn(int3 V1, int3 V2) { return fn((float3)V1, (float3)V2); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float4 fn(int4 V1, int4 V2) { return fn((float4)V1, (float4)V2); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float fn(uint V1, uint V2) { return fn((float)V1, (float)V2); } \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float2 fn(uint2 V1, uint2 V2) { \
return fn((float2)V1, (float2)V2); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float3 fn(uint3 V1, uint3 V2) { \
return fn((float3)V1, (float3)V2); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float4 fn(uint4 V1, uint4 V2) { \
return fn((float4)V1, (float4)V2); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float fn(int64_t V1, int64_t V2) { \
return fn((float)V1, (float)V2); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float2 fn(int64_t2 V1, int64_t2 V2) { \
return fn((float2)V1, (float2)V2); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float3 fn(int64_t3 V1, int64_t3 V2) { \
return fn((float3)V1, (float3)V2); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float4 fn(int64_t4 V1, int64_t4 V2) { \
return fn((float4)V1, (float4)V2); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float fn(uint64_t V1, uint64_t V2) { \
return fn((float)V1, (float)V2); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float2 fn(uint64_t2 V1, uint64_t2 V2) { \
return fn((float2)V1, (float2)V2); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float3 fn(uint64_t3 V1, uint64_t3 V2) { \
return fn((float3)V1, (float3)V2); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float4 fn(uint64_t4 V1, uint64_t4 V2) { \
return fn((float4)V1, (float4)V2); \
}
#define _DXC_COMPAT_TERNARY_INTEGER_OVERLOADS(fn) \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float fn(int V1, int V2, int V3) { \
return fn((float)V1, (float)V2, (float)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float2 fn(int2 V1, int2 V2, int2 V3) { \
return fn((float2)V1, (float2)V2, (float2)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float3 fn(int3 V1, int3 V2, int3 V3) { \
return fn((float3)V1, (float3)V2, (float3)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float4 fn(int4 V1, int4 V2, int4 V3) { \
return fn((float4)V1, (float4)V2, (float4)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float fn(uint V1, uint V2, uint V3) { \
return fn((float)V1, (float)V2, (float)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float2 fn(uint2 V1, uint2 V2, uint2 V3) { \
return fn((float2)V1, (float2)V2, (float2)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float3 fn(uint3 V1, uint3 V2, uint3 V3) { \
return fn((float3)V1, (float3)V2, (float3)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float4 fn(uint4 V1, uint4 V2, uint4 V3) { \
return fn((float4)V1, (float4)V2, (float4)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float fn(int64_t V1, int64_t V2, int64_t V3) { \
return fn((float)V1, (float)V2, (float)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float2 fn(int64_t2 V1, int64_t2 V2, int64_t2 V3) { \
return fn((float2)V1, (float2)V2, (float2)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float3 fn(int64_t3 V1, int64_t3 V2, int64_t3 V3) { \
return fn((float3)V1, (float3)V2, (float3)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float4 fn(int64_t4 V1, int64_t4 V2, int64_t4 V3) { \
return fn((float4)V1, (float4)V2, (float4)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float fn(uint64_t V1, uint64_t V2, uint64_t V3) { \
return fn((float)V1, (float)V2, (float)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float2 fn(uint64_t2 V1, uint64_t2 V2, uint64_t2 V3) { \
return fn((float2)V1, (float2)V2, (float2)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float3 fn(uint64_t3 V1, uint64_t3 V2, uint64_t3 V3) { \
return fn((float3)V1, (float3)V2, (float3)V3); \
} \
_DXC_DEPRECATED_INT_FN(fn) \
constexpr float4 fn(uint64_t4 V1, uint64_t4 V2, uint64_t4 V3) { \
return fn((float4)V1, (float4)V2, (float4)V3); \
}
//===----------------------------------------------------------------------===//
// acos builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(acos)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(acos)
//===----------------------------------------------------------------------===//
// asin builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(asin)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(asin)
//===----------------------------------------------------------------------===//
// atan builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(atan)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(atan)
//===----------------------------------------------------------------------===//
// atan2 builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_BINARY_DOUBLE_OVERLOADS(atan2)
_DXC_COMPAT_BINARY_INTEGER_OVERLOADS(atan2)
//===----------------------------------------------------------------------===//
// ceil builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(ceil)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(ceil)
//===----------------------------------------------------------------------===//
// clamp builtins overloads
//===----------------------------------------------------------------------===//
template <typename T, uint N>
_DXC_DEPRECATED_VEC_SCALAR_FN(clamp)
constexpr __detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>> clamp(
vector<T, N> p0, vector<T, N> p1, T p2) {
return clamp(p0, p1, (vector<T, N>)p2);
}
template <typename T, uint N>
_DXC_DEPRECATED_VEC_SCALAR_FN(clamp)
constexpr __detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>> clamp(
vector<T, N> p0, T p1, vector<T, N> p2) {
return clamp(p0, (vector<T, N>)p1, p2);
}
template <typename T, uint N>
_DXC_DEPRECATED_VEC_SCALAR_FN(clamp)
constexpr __detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>> clamp(
vector<T, N> p0, T p1, T p2) {
return clamp(p0, (vector<T, N>)p1, (vector<T, N>)p2);
}
//===----------------------------------------------------------------------===//
// cos builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(cos)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(cos)
//===----------------------------------------------------------------------===//
// cosh builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(cosh)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(cosh)
//===----------------------------------------------------------------------===//
// degrees builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(degrees)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(degrees)
//===----------------------------------------------------------------------===//
// exp builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(exp)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(exp)
//===----------------------------------------------------------------------===//
// exp2 builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(exp2)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(exp2)
//===----------------------------------------------------------------------===//
// floor builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(floor)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(floor)
//===----------------------------------------------------------------------===//
// frac builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(frac)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(frac)
//===----------------------------------------------------------------------===//
// isinf builtins overloads
//===----------------------------------------------------------------------===//
_DXC_DEPRECATED_64BIT_FN(fn)
constexpr bool isinf(double V) { return isinf((float)V); }
_DXC_DEPRECATED_64BIT_FN(fn)
constexpr bool2 isinf(double2 V) { return isinf((float2)V); }
_DXC_DEPRECATED_64BIT_FN(fn)
constexpr bool3 isinf(double3 V) { return isinf((float3)V); }
_DXC_DEPRECATED_64BIT_FN(fn)
constexpr bool4 isinf(double4 V) { return isinf((float4)V); }
//===----------------------------------------------------------------------===//
// isnan builtins overloads
//===----------------------------------------------------------------------===//
constexpr bool isnan(double V) { return isnan((float)V); }
constexpr bool2 isnan(double2 V) { return isnan((float2)V); }
constexpr bool3 isnan(double3 V) { return isnan((float3)V); }
constexpr bool4 isnan(double4 V) { return isnan((float4)V); }
//===----------------------------------------------------------------------===//
// lerp builtins overloads
//===----------------------------------------------------------------------===//
template <typename T, uint N>
_DXC_DEPRECATED_VEC_SCALAR_FN(lerp)
constexpr __detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>> lerp(
vector<T, N> x, vector<T, N> y, T s) {
return lerp(x, y, (vector<T, N>)s);
}
_DXC_COMPAT_TERNARY_DOUBLE_OVERLOADS(lerp)
_DXC_COMPAT_TERNARY_INTEGER_OVERLOADS(lerp)
//===----------------------------------------------------------------------===//
// log builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(log)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(log)
//===----------------------------------------------------------------------===//
// log10 builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(log10)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(log10)
//===----------------------------------------------------------------------===//
// log2 builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(log2)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(log2)
//===----------------------------------------------------------------------===//
// max builtins overloads
//===----------------------------------------------------------------------===//
template <typename T, uint N>
_DXC_DEPRECATED_VEC_SCALAR_FN(max)
constexpr __detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>> max(
vector<T, N> p0, T p1) {
return max(p0, (vector<T, N>)p1);
}
template <typename T, uint N>
_DXC_DEPRECATED_VEC_SCALAR_FN(max)
constexpr __detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>> max(
T p0, vector<T, N> p1) {
return max((vector<T, N>)p0, p1);
}
//===----------------------------------------------------------------------===//
// min builtins overloads
//===----------------------------------------------------------------------===//
template <typename T, uint N>
_DXC_DEPRECATED_VEC_SCALAR_FN(min)
constexpr __detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>> min(
vector<T, N> p0, T p1) {
return min(p0, (vector<T, N>)p1);
}
template <typename T, uint N>
_DXC_DEPRECATED_VEC_SCALAR_FN(min)
constexpr __detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>> min(
T p0, vector<T, N> p1) {
return min((vector<T, N>)p0, p1);
}
//===----------------------------------------------------------------------===//
// normalize builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(normalize)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(normalize)
//===----------------------------------------------------------------------===//
// pow builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_BINARY_DOUBLE_OVERLOADS(pow)
_DXC_COMPAT_BINARY_INTEGER_OVERLOADS(pow)
//===----------------------------------------------------------------------===//
// rsqrt builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(rsqrt)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(rsqrt)
//===----------------------------------------------------------------------===//
// round builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(round)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(round)
//===----------------------------------------------------------------------===//
// sin builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(sin)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(sin)
//===----------------------------------------------------------------------===//
// sinh builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(sinh)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(sinh)
//===----------------------------------------------------------------------===//
// sqrt builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(sqrt)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(sqrt)
//===----------------------------------------------------------------------===//
// step builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_BINARY_DOUBLE_OVERLOADS(step)
_DXC_COMPAT_BINARY_INTEGER_OVERLOADS(step)
//===----------------------------------------------------------------------===//
// tan builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(tan)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(tan)
//===----------------------------------------------------------------------===//
// tanh builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(tanh)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(tanh)
//===----------------------------------------------------------------------===//
// trunc builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(trunc)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(trunc)
//===----------------------------------------------------------------------===//
// radians builtins overloads
//===----------------------------------------------------------------------===//
_DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(radians)
_DXC_COMPAT_UNARY_INTEGER_OVERLOADS(radians)
} // namespace hlsl
#endif // _HLSL_COMPAT_OVERLOADS_H_