9#ifndef _HLSL_COMPAT_OVERLOADS_H_
10#define _HLSL_COMPAT_OVERLOADS_H_
19#define _DXC_DEPRECATED_64BIT_FN(fn) \
20 [[deprecated("In 202x 64 bit API lowering for " #fn " is deprecated. " \
21 "Explicitly cast parameters to 32 or 16 bit types.")]]
23#define _DXC_DEPRECATED_INT_FN(fn) \
24 [[deprecated("In 202x int lowering for " #fn " is deprecated. " \
25 "Explicitly cast parameters to float types.")]]
27#define _DXC_DEPRECATED_VEC_SCALAR_FN(fn) \
28 [[deprecated("In 202x mismatched vector/scalar lowering for " #fn " is " \
29 "deprecated. Explicitly cast parameters.")]]
31#define _DXC_DEPRECATED_SCALAR_FN(ty1, ty2, fn) \
32 [[deprecated("In 202x mismatched " #ty1 "/" #ty2 " lowering for " #fn " is " \
33 "deprecated. Explicitly cast parameters.")]]
35#define _DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(fn) \
36 _DXC_DEPRECATED_64BIT_FN(fn) \
37 constexpr float fn(double V) { return fn((float)V); } \
38 _DXC_DEPRECATED_64BIT_FN(fn) \
39 constexpr float2 fn(double2 V) { return fn((float2)V); } \
40 _DXC_DEPRECATED_64BIT_FN(fn) \
41 constexpr float3 fn(double3 V) { return fn((float3)V); } \
42 _DXC_DEPRECATED_64BIT_FN(fn) \
43 constexpr float4 fn(double4 V) { return fn((float4)V); }
45#define _DXC_COMPAT_BINARY_DOUBLE_OVERLOADS(fn) \
46 _DXC_DEPRECATED_64BIT_FN(fn) \
47 constexpr float fn(double V1, double V2) { \
48 return fn((float)V1, (float)V2); \
50 _DXC_DEPRECATED_64BIT_FN(fn) \
51 constexpr float2 fn(double2 V1, double2 V2) { \
52 return fn((float2)V1, (float2)V2); \
54 _DXC_DEPRECATED_64BIT_FN(fn) \
55 constexpr float3 fn(double3 V1, double3 V2) { \
56 return fn((float3)V1, (float3)V2); \
58 _DXC_DEPRECATED_64BIT_FN(fn) \
59 constexpr float4 fn(double4 V1, double4 V2) { \
60 return fn((float4)V1, (float4)V2); \
62 template <uint R, uint C> \
63 _DXC_DEPRECATED_64BIT_FN(fn) \
64 constexpr matrix<float, R, C> fn(matrix<double, R, C> V1, \
65 matrix<double, R, C> V2) { \
66 return fn((matrix<float, R, C>)V1, (matrix<float, R, C>)V2); \
69#define _DXC_COMPAT_TERNARY_DOUBLE_OVERLOADS(fn) \
70 _DXC_DEPRECATED_64BIT_FN(fn) \
71 constexpr float fn(double V1, double V2, double V3) { \
72 return fn((float)V1, (float)V2, (float)V3); \
74 _DXC_DEPRECATED_64BIT_FN(fn) \
75 constexpr float2 fn(double2 V1, double2 V2, double2 V3) { \
76 return fn((float2)V1, (float2)V2, (float2)V3); \
78 _DXC_DEPRECATED_64BIT_FN(fn) \
79 constexpr float3 fn(double3 V1, double3 V2, double3 V3) { \
80 return fn((float3)V1, (float3)V2, (float3)V3); \
82 _DXC_DEPRECATED_64BIT_FN(fn) \
83 constexpr float4 fn(double4 V1, double4 V2, double4 V3) { \
84 return fn((float4)V1, (float4)V2, (float4)V3); \
87#define _DXC_COMPAT_UNARY_INTEGER_OVERLOADS(fn) \
88 _DXC_DEPRECATED_INT_FN(fn) \
89 constexpr float fn(int V) { return fn((float)V); } \
90 _DXC_DEPRECATED_INT_FN(fn) \
91 constexpr float2 fn(int2 V) { return fn((float2)V); } \
92 _DXC_DEPRECATED_INT_FN(fn) \
93 constexpr float3 fn(int3 V) { return fn((float3)V); } \
94 _DXC_DEPRECATED_INT_FN(fn) \
95 constexpr float4 fn(int4 V) { return fn((float4)V); } \
96 _DXC_DEPRECATED_INT_FN(fn) \
97 constexpr float fn(uint V) { return fn((float)V); } \
98 _DXC_DEPRECATED_INT_FN(fn) \
99 constexpr float2 fn(uint2 V) { return fn((float2)V); } \
100 _DXC_DEPRECATED_INT_FN(fn) \
101 constexpr float3 fn(uint3 V) { return fn((float3)V); } \
102 _DXC_DEPRECATED_INT_FN(fn) \
103 constexpr float4 fn(uint4 V) { return fn((float4)V); } \
104 _DXC_DEPRECATED_INT_FN(fn) \
105 constexpr float fn(int64_t V) { return fn((float)V); } \
106 _DXC_DEPRECATED_INT_FN(fn) \
107 constexpr float2 fn(int64_t2 V) { return fn((float2)V); } \
108 _DXC_DEPRECATED_INT_FN(fn) \
109 constexpr float3 fn(int64_t3 V) { return fn((float3)V); } \
110 _DXC_DEPRECATED_INT_FN(fn) \
111 constexpr float4 fn(int64_t4 V) { return fn((float4)V); } \
112 _DXC_DEPRECATED_INT_FN(fn) \
113 constexpr float fn(uint64_t V) { return fn((float)V); } \
114 _DXC_DEPRECATED_INT_FN(fn) \
115 constexpr float2 fn(uint64_t2 V) { return fn((float2)V); } \
116 _DXC_DEPRECATED_INT_FN(fn) \
117 constexpr float3 fn(uint64_t3 V) { return fn((float3)V); } \
118 _DXC_DEPRECATED_INT_FN(fn) \
119 constexpr float4 fn(uint64_t4 V) { return fn((float4)V); }
121#define _DXC_COMPAT_BINARY_INTEGER_OVERLOADS(fn) \
122 _DXC_DEPRECATED_INT_FN(fn) \
123 constexpr float fn(int V1, int V2) { return fn((float)V1, (float)V2); } \
124 _DXC_DEPRECATED_INT_FN(fn) \
125 constexpr float2 fn(int2 V1, int2 V2) { return fn((float2)V1, (float2)V2); } \
126 _DXC_DEPRECATED_INT_FN(fn) \
127 constexpr float3 fn(int3 V1, int3 V2) { return fn((float3)V1, (float3)V2); } \
128 _DXC_DEPRECATED_INT_FN(fn) \
129 constexpr float4 fn(int4 V1, int4 V2) { return fn((float4)V1, (float4)V2); } \
130 _DXC_DEPRECATED_INT_FN(fn) \
131 constexpr float fn(uint V1, uint V2) { return fn((float)V1, (float)V2); } \
132 _DXC_DEPRECATED_INT_FN(fn) \
133 constexpr float2 fn(uint2 V1, uint2 V2) { \
134 return fn((float2)V1, (float2)V2); \
136 _DXC_DEPRECATED_INT_FN(fn) \
137 constexpr float3 fn(uint3 V1, uint3 V2) { \
138 return fn((float3)V1, (float3)V2); \
140 _DXC_DEPRECATED_INT_FN(fn) \
141 constexpr float4 fn(uint4 V1, uint4 V2) { \
142 return fn((float4)V1, (float4)V2); \
144 _DXC_DEPRECATED_INT_FN(fn) \
145 constexpr float fn(int64_t V1, int64_t V2) { \
146 return fn((float)V1, (float)V2); \
148 _DXC_DEPRECATED_INT_FN(fn) \
149 constexpr float2 fn(int64_t2 V1, int64_t2 V2) { \
150 return fn((float2)V1, (float2)V2); \
152 _DXC_DEPRECATED_INT_FN(fn) \
153 constexpr float3 fn(int64_t3 V1, int64_t3 V2) { \
154 return fn((float3)V1, (float3)V2); \
156 _DXC_DEPRECATED_INT_FN(fn) \
157 constexpr float4 fn(int64_t4 V1, int64_t4 V2) { \
158 return fn((float4)V1, (float4)V2); \
160 _DXC_DEPRECATED_INT_FN(fn) \
161 constexpr float fn(uint64_t V1, uint64_t V2) { \
162 return fn((float)V1, (float)V2); \
164 _DXC_DEPRECATED_INT_FN(fn) \
165 constexpr float2 fn(uint64_t2 V1, uint64_t2 V2) { \
166 return fn((float2)V1, (float2)V2); \
168 _DXC_DEPRECATED_INT_FN(fn) \
169 constexpr float3 fn(uint64_t3 V1, uint64_t3 V2) { \
170 return fn((float3)V1, (float3)V2); \
172 _DXC_DEPRECATED_INT_FN(fn) \
173 constexpr float4 fn(uint64_t4 V1, uint64_t4 V2) { \
174 return fn((float4)V1, (float4)V2); \
176 template <uint R, uint C> \
177 _DXC_DEPRECATED_INT_FN(fn) \
178 constexpr matrix<float, R, C> fn(matrix<int, R, C> V1, \
179 matrix<int, R, C> V2) { \
180 return fn((matrix<float, R, C>)V1, (matrix<float, R, C>)V2); \
182 template <uint R, uint C> \
183 _DXC_DEPRECATED_INT_FN(fn) \
184 constexpr matrix<float, R, C> fn(matrix<uint, R, C> V1, \
185 matrix<uint, R, C> V2) { \
186 return fn((matrix<float, R, C>)V1, (matrix<float, R, C>)V2); \
188 template <uint R, uint C> \
189 _DXC_DEPRECATED_INT_FN(fn) \
190 constexpr matrix<float, R, C> fn(matrix<int64_t, R, C> V1, \
191 matrix<int64_t, R, C> V2) { \
192 return fn((matrix<float, R, C>)V1, (matrix<float, R, C>)V2); \
194 template <uint R, uint C> \
195 _DXC_DEPRECATED_INT_FN(fn) \
196 constexpr matrix<float, R, C> fn(matrix<uint64_t, R, C> V1, \
197 matrix<uint64_t, R, C> V2) { \
198 return fn((matrix<float, R, C>)V1, (matrix<float, R, C>)V2); \
201#define _DXC_COMPAT_TERNARY_INTEGER_OVERLOADS(fn) \
202 _DXC_DEPRECATED_INT_FN(fn) \
203 constexpr float fn(int V1, int V2, int V3) { \
204 return fn((float)V1, (float)V2, (float)V3); \
206 _DXC_DEPRECATED_INT_FN(fn) \
207 constexpr float2 fn(int2 V1, int2 V2, int2 V3) { \
208 return fn((float2)V1, (float2)V2, (float2)V3); \
210 _DXC_DEPRECATED_INT_FN(fn) \
211 constexpr float3 fn(int3 V1, int3 V2, int3 V3) { \
212 return fn((float3)V1, (float3)V2, (float3)V3); \
214 _DXC_DEPRECATED_INT_FN(fn) \
215 constexpr float4 fn(int4 V1, int4 V2, int4 V3) { \
216 return fn((float4)V1, (float4)V2, (float4)V3); \
218 _DXC_DEPRECATED_INT_FN(fn) \
219 constexpr float fn(uint V1, uint V2, uint V3) { \
220 return fn((float)V1, (float)V2, (float)V3); \
222 _DXC_DEPRECATED_INT_FN(fn) \
223 constexpr float2 fn(uint2 V1, uint2 V2, uint2 V3) { \
224 return fn((float2)V1, (float2)V2, (float2)V3); \
226 _DXC_DEPRECATED_INT_FN(fn) \
227 constexpr float3 fn(uint3 V1, uint3 V2, uint3 V3) { \
228 return fn((float3)V1, (float3)V2, (float3)V3); \
230 _DXC_DEPRECATED_INT_FN(fn) \
231 constexpr float4 fn(uint4 V1, uint4 V2, uint4 V3) { \
232 return fn((float4)V1, (float4)V2, (float4)V3); \
234 _DXC_DEPRECATED_INT_FN(fn) \
235 constexpr float fn(int64_t V1, int64_t V2, int64_t V3) { \
236 return fn((float)V1, (float)V2, (float)V3); \
238 _DXC_DEPRECATED_INT_FN(fn) \
239 constexpr float2 fn(int64_t2 V1, int64_t2 V2, int64_t2 V3) { \
240 return fn((float2)V1, (float2)V2, (float2)V3); \
242 _DXC_DEPRECATED_INT_FN(fn) \
243 constexpr float3 fn(int64_t3 V1, int64_t3 V2, int64_t3 V3) { \
244 return fn((float3)V1, (float3)V2, (float3)V3); \
246 _DXC_DEPRECATED_INT_FN(fn) \
247 constexpr float4 fn(int64_t4 V1, int64_t4 V2, int64_t4 V3) { \
248 return fn((float4)V1, (float4)V2, (float4)V3); \
250 _DXC_DEPRECATED_INT_FN(fn) \
251 constexpr float fn(uint64_t V1, uint64_t V2, uint64_t V3) { \
252 return fn((float)V1, (float)V2, (float)V3); \
254 _DXC_DEPRECATED_INT_FN(fn) \
255 constexpr float2 fn(uint64_t2 V1, uint64_t2 V2, uint64_t2 V3) { \
256 return fn((float2)V1, (float2)V2, (float2)V3); \
258 _DXC_DEPRECATED_INT_FN(fn) \
259 constexpr float3 fn(uint64_t3 V1, uint64_t3 V2, uint64_t3 V3) { \
260 return fn((float3)V1, (float3)V2, (float3)V3); \
262 _DXC_DEPRECATED_INT_FN(fn) \
263 constexpr float4 fn(uint64_t4 V1, uint64_t4 V2, uint64_t4 V3) { \
264 return fn((float4)V1, (float4)V2, (float4)V3); \
267#define _DXC_COMPAT_FLOAT_TO_BOOL_OVERLOADS(fn) \
268 _DXC_DEPRECATED_64BIT_FN(fn) \
269 constexpr bool fn(double V) { return fn((float)V); } \
270 _DXC_DEPRECATED_64BIT_FN(fn) \
271 constexpr bool2 fn(double2 V) { return fn((float2)V); } \
272 _DXC_DEPRECATED_64BIT_FN(fn) \
273 constexpr bool3 fn(double3 V) { return fn((float3)V); } \
274 _DXC_DEPRECATED_64BIT_FN(fn) \
275 constexpr bool4 fn(double4 V) { return fn((float4)V); } \
276 template <uint R, uint C> \
277 _DXC_DEPRECATED_64BIT_FN(fn) \
278 constexpr matrix<bool, R, C> fn(matrix<double, R, C> V) { \
279 return fn((matrix<float, R, C>)V); \
321template <
typename T, u
int N>
324 vector<T, N> p0, vector<T, N> p1, T p2) {
325 return clamp(p0, p1, (vector<T, N>)p2);
328template <
typename T, u
int N>
331 vector<T, N> p0, T p1, vector<T, N> p2) {
332 return clamp(p0, (vector<T, N>)p1, p2);
335template <
typename T, u
int N>
338 vector<T, N> p0, T p1, T p2) {
339 return clamp(p0, (vector<T, N>)p1, (vector<T, N>)p2);
413template <
typename T, u
int N>
416 vector<T, N> x, vector<T, N> y, T s) {
417 return lerp(x, y, (vector<T, N>)s);
448template <
typename T, u
int N>
450constexpr
__detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>>
max(
451 vector<T, N> p0, T p1) {
452 return max(p0, (vector<T, N>)p1);
455template <
typename T, u
int N>
457constexpr
__detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>>
max(
458 T p0, vector<T, N> p1) {
459 return max((vector<T, N>)p0, p1);
463constexpr
float max(
float p0,
int p1) {
return max(p0, (
float)p1); }
466constexpr
float max(
int p0,
float p1) {
return max((
float)p0, p1); }
472template <
typename T, u
int N>
474constexpr
__detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>>
min(
475 vector<T, N> p0, T p1) {
476 return min(p0, (vector<T, N>)p1);
479template <
typename T, u
int N>
481constexpr
__detail::enable_if_t<(N > 1 && N <= 4), vector<T, N>>
min(
482 T p0, vector<T, N> p1) {
483 return min((vector<T, N>)p0, p1);
487constexpr
float min(
float p0,
int p1) {
return min(p0, (
float)p1); }
490constexpr
float min(
int p0,
float p1) {
return min((
float)p0, p1); }
__DEVICE__ bool isnan(float __x)
Test for a NaN.
__DEVICE__ bool isfinite(float __x)
Test for finite value.
__DEVICE__ bool isinf(float __x)
Test for infinity value (+ve or -ve) .
__DEVICE__ int min(int __a, int __b)
__DEVICE__ int max(int __a, int __b)
__DEVICE__ double rsqrt(double __a)
#define _DXC_DEPRECATED_VEC_SCALAR_FN(fn)
#define _DXC_COMPAT_BINARY_DOUBLE_OVERLOADS(fn)
#define _DXC_COMPAT_TERNARY_INTEGER_OVERLOADS(fn)
#define _DXC_COMPAT_UNARY_DOUBLE_OVERLOADS(fn)
#define _DXC_DEPRECATED_SCALAR_FN(ty1, ty2, fn)
#define _DXC_COMPAT_TERNARY_DOUBLE_OVERLOADS(fn)
#define _DXC_COMPAT_UNARY_INTEGER_OVERLOADS(fn)
#define _DXC_COMPAT_FLOAT_TO_BOOL_OVERLOADS(fn)
#define _DXC_COMPAT_BINARY_INTEGER_OVERLOADS(fn)
constexpr __detail::enable_if_t<(N > 1 &&N<=4), vector< T, N > > lerp(vector< T, N > x, vector< T, N > y, T s)
constexpr __detail::enable_if_t<(N > 1 &&N<=4), vector< T, N > > max(vector< T, N > p0, T p1)
constexpr __detail::enable_if_t<(N > 1 &&N<=4), vector< T, N > > min(vector< T, N > p0, T p1)
constexpr __detail::enable_if_t<(N > 1 &&N<=4), vector< T, N > > clamp(vector< T, N > p0, vector< T, N > p1, T p2)
float __ovld __cnfn step(float, float)
Returns 0.0 if x < edge, otherwise it returns 1.0.
float __ovld __cnfn radians(float)
Converts degrees to radians, i.e.
float __ovld __cnfn degrees(float)
Converts radians to degrees, i.e.
char __ovld __cnfn clamp(char, char, char)
Returns min(max(x, minval), maxval).
float __ovld __cnfn normalize(float)
Returns a vector in the same direction as p but with a length of 1.