clang 20.0.0git
hlsl_detail.h
Go to the documentation of this file.
1//===----- detail.h - HLSL definitions for intrinsics ----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef _HLSL_HLSL_DETAILS_H_
10#define _HLSL_HLSL_DETAILS_H_
11
12namespace hlsl {
13
14namespace __detail {
15
16template <typename T, typename U> struct is_same {
17 static const bool value = false;
18};
19
20template <typename T> struct is_same<T, T> {
21 static const bool value = true;
22};
23
24template <bool B, typename T> struct enable_if {};
25
26template <typename T> struct enable_if<true, T> {
27 using Type = T;
28};
29
30template <bool B, class T = void>
32
33template <typename U, typename T, int N>
34constexpr enable_if_t<sizeof(U) == sizeof(T), vector<U, N>>
35bit_cast(vector<T, N> V) {
36 return __builtin_bit_cast(vector<U, N>, V);
37}
38
39template <typename U, typename T>
40constexpr enable_if_t<sizeof(U) == sizeof(T), U> bit_cast(T F) {
41 return __builtin_bit_cast(U, F);
42}
43
44constexpr vector<uint, 4> d3d_color_to_ubyte4_impl(vector<float, 4> V) {
45 // Use the same scaling factor used by FXC, and DXC for DXIL
46 // (i.e., 255.001953)
47 // https://github.com/microsoft/DirectXShaderCompiler/blob/070d0d5a2beacef9eeb51037a9b04665716fd6f3/lib/HLSL/HLOperationLower.cpp#L666C1-L697C2
48 // The DXC implementation refers to a comment on the following stackoverflow
49 // discussion to justify the scaling factor: "Built-in rounding, necessary
50 // because of truncation. 0.001953 * 256 = 0.5"
51 // https://stackoverflow.com/questions/52103720/why-does-d3dcolortoubyte4-multiplies-components-by-255-001953f
52 return V.zyxw * 255.001953f;
53}
54
55template <typename T>
56constexpr enable_if_t<is_same<float, T>::value || is_same<half, T>::value, T>
58 return __builtin_elementwise_abs(X);
59}
60
61template <typename T, int N>
62constexpr enable_if_t<is_same<float, T>::value || is_same<half, T>::value, T>
63length_vec_impl(vector<T, N> X) {
64 return __builtin_elementwise_sqrt(__builtin_hlsl_dot(X, X));
65}
66
67template <typename T>
68constexpr enable_if_t<is_same<float, T>::value || is_same<half, T>::value, T>
70 return length_impl(X - Y);
71}
72
73template <typename T, int N>
74constexpr enable_if_t<is_same<float, T>::value || is_same<half, T>::value, T>
75distance_vec_impl(vector<T, N> X, vector<T, N> Y) {
76#if (__has_builtin(__builtin_spirv_distance))
77 return __builtin_spirv_distance(X, Y);
78#else
79 return length_vec_impl(X - Y);
80#endif
81}
82} // namespace __detail
83} // namespace hlsl
84#endif //_HLSL_HLSL_DETAILS_H_
#define V(N, I)
Definition: ASTContext.h:3453
#define X(type, name)
Definition: Value.h:144
constexpr enable_if_t< is_same< float, T >::value||is_same< half, T >::value, T > distance_impl(T X, T Y)
Definition: hlsl_detail.h:69
constexpr vector< uint, 4 > d3d_color_to_ubyte4_impl(vector< float, 4 > V)
Definition: hlsl_detail.h:44
typename enable_if< B, T >::Type enable_if_t
Definition: hlsl_detail.h:31
constexpr enable_if_t< is_same< float, T >::value||is_same< half, T >::value, T > distance_vec_impl(vector< T, N > X, vector< T, N > Y)
Definition: hlsl_detail.h:75
constexpr enable_if_t< is_same< float, T >::value||is_same< half, T >::value, T > length_impl(T X)
Definition: hlsl_detail.h:57
constexpr enable_if_t< is_same< float, T >::value||is_same< half, T >::value, T > length_vec_impl(vector< T, N > X)
Definition: hlsl_detail.h:63
constexpr enable_if_t< sizeof(U)==sizeof(T), vector< U, N > > bit_cast(vector< T, N > V)
Definition: hlsl_detail.h:35
#define true
Definition: stdbool.h:25
static const bool value
Definition: hlsl_detail.h:17