@@ -97,6 +97,50 @@ inline bool isinf_uint_impl(UnsignedInteger val)
97
97
return (val & (~ieee754::traits<AsFloat>::signMask)) == ieee754::traits<AsFloat>::inf;
98
98
}
99
99
100
+ template<typename V NBL_STRUCT_CONSTRAINABLE>
101
+ struct floor_helper;
102
+
103
+ template<typename FloatingPoint>
104
+ NBL_PARTIAL_REQ_TOP (hlsl::is_floating_point_v<FloatingPoint>&& hlsl::is_scalar_v<FloatingPoint>)
105
+ struct floor_helper<FloatingPoint NBL_PARTIAL_REQ_BOT (hlsl::is_vector_v<FloatingPoint>) >
106
+ {
107
+ static FloatingPoint __call (NBL_CONST_REF_ARG (FloatingPoint) val)
108
+ {
109
+ #ifdef __HLSL_VERSION
110
+ return spirv::floor (val);
111
+ #else
112
+ return std::floor (val);
113
+ #endif
114
+ }
115
+ };
116
+
117
+ template<typename Vector>
118
+ NBL_PARTIAL_REQ_TOP (hlsl::is_vector_v<Vector>)
119
+ struct floor_helper<Vector NBL_PARTIAL_REQ_BOT (hlsl::is_vector_v<Vector>) >
120
+ {
121
+ static Vector __call (NBL_CONST_REF_ARG (Vector) vec)
122
+ {
123
+ #ifdef __HLSL_VERSION
124
+ return spirv::floor (vec);
125
+ #else
126
+ Vector output;
127
+ using traits = hlsl::vector_traits<Vector>;
128
+ for (uint32_t i = 0 ; i < traits::Dimension; ++i)
129
+ output[i] = floor (vec[i]);
130
+ return output;
131
+
132
+ // TODO: cherry-pick array_getters
133
+ /*array_get<Vector> getter;
134
+ array_set<Vector> setter;
135
+ Vector output;
136
+ using traits = hlsl::vector_traits<Vector>;
137
+ for (uint32_t i = 0; i < traits::Dimension; i++)
138
+ setter(output, floor_helper<traits::scalar_type>::__call(getter(vec, i)), i);
139
+ return output;*/
140
+ #endif
141
+ }
142
+ };
143
+
100
144
}
101
145
}
102
146
}
0 commit comments