5
5
#define _NBL_BUILTIN_HLSL_ALGORITHM_INCLUDED_
6
6
7
7
#include "nbl/builtin/hlsl/functional.hlsl"
8
+ #include "nbl/builtin/hlsl/math/intutil.hlsl"
8
9
9
10
namespace nbl
10
11
{
@@ -91,16 +92,10 @@ NBL_CONSTEXPR_INLINE_FUNC void swap(NBL_REF_ARG(T) lhs, NBL_REF_ARG(T) rhs)
91
92
namespace impl
92
93
{
93
94
94
- // TODO: move this to some other header
95
- bool isNPoT (const uint x)
96
- {
97
- return x&(x-1 );
98
- }
99
-
100
95
template<class Accessor, class Comparator>
101
96
struct bound_t
102
97
{
103
- static bound_t<Accessor,Comparator> setup (uint begin, const uint end, const typename Accessor::value_type _value, const Comparator _comp)
98
+ static bound_t<Accessor,Comparator> setup (uint32_t begin, const uint32_t end, const typename Accessor::value_type _value, const Comparator _comp)
104
99
{
105
100
bound_t<Accessor,Comparator> retval;
106
101
retval.comp = _comp;
@@ -111,12 +106,12 @@ struct bound_t
111
106
}
112
107
113
108
114
- uint operator ()(NBL_REF_ARG (Accessor) accessor)
109
+ uint32_t operator ()(NBL_REF_ARG (Accessor) accessor)
115
110
{
116
111
if (isNPoT (len))
117
112
{
118
- const uint newLen = 0x1u<<firstbithigh (len);
119
- const uint testPoint = it+(len-newLen);
113
+ const uint32_t newLen = 0x1u<<nbl::hlsl:: findMSB (len);
114
+ const uint32_t testPoint = it+(len-newLen);
120
115
len = newLen;
121
116
comp_step (accessor,testPoint);
122
117
}
@@ -133,24 +128,24 @@ struct bound_t
133
128
void iteration (NBL_REF_ARG (Accessor) accessor)
134
129
{
135
130
len >>= 1 ;
136
- const uint mid = it+len;
131
+ const uint32_t mid = it+len;
137
132
comp_step (accessor,mid);
138
133
}
139
134
140
- void comp_step (NBL_REF_ARG (Accessor) accessor, const uint testPoint, const uint rightBegin)
135
+ void comp_step (NBL_REF_ARG (Accessor) accessor, const uint32_t testPoint, const uint32_t rightBegin)
141
136
{
142
137
if (comp (accessor[testPoint],value))
143
138
it = rightBegin;
144
139
}
145
- void comp_step (NBL_REF_ARG (Accessor) accessor, const uint testPoint)
140
+ void comp_step (NBL_REF_ARG (Accessor) accessor, const uint32_t testPoint)
146
141
{
147
142
comp_step (accessor,testPoint,testPoint);
148
143
}
149
144
150
145
Comparator comp;
151
146
typename Accessor::value_type value;
152
- uint it;
153
- uint len;
147
+ uint32_t it;
148
+ uint32_t len;
154
149
};
155
150
156
151
template<class Accessor, class Comparator>
@@ -168,14 +163,14 @@ struct lower_to_upper_comparator_transform_t
168
163
169
164
170
165
template<class Accessor, class Comparator>
171
- uint lower_bound (NBL_REF_ARG (Accessor) accessor, const uint begin, const uint end, const typename Accessor::value_type value, const Comparator comp)
166
+ uint32_t lower_bound (NBL_REF_ARG (Accessor) accessor, const uint32_t begin, const uint32_t end, const typename Accessor::value_type value, const Comparator comp)
172
167
{
173
168
impl::bound_t<Accessor,Comparator> implementation = impl::bound_t<Accessor,Comparator>::setup (begin,end,value,comp);
174
169
return implementation (accessor);
175
170
}
176
171
177
172
template<class Accessor, class Comparator>
178
- uint upper_bound (NBL_REF_ARG (Accessor) accessor, const uint begin, const uint end, const typename Accessor::value_type value, const Comparator comp)
173
+ uint32_t upper_bound (NBL_REF_ARG (Accessor) accessor, const uint32_t begin, const uint32_t end, const typename Accessor::value_type value, const Comparator comp)
179
174
{
180
175
//using TransformedComparator = impl::lower_to_upper_comparator_transform_t<Accessor,Comparator>;
181
176
//TransformedComparator transformedComparator;
@@ -191,7 +186,7 @@ namespace impl
191
186
192
187
// extra indirection due to https://github.com/microsoft/DirectXShaderCompiler/issues/4771
193
188
template<class Accessor, typename T>
194
- uint lower_bound (NBL_REF_ARG (Accessor) accessor, const uint begin, const uint end, const T value)
189
+ uint32_t lower_bound (NBL_REF_ARG (Accessor) accessor, const uint32_t begin, const uint32_t end, const T value)
195
190
{
196
191
//using Comparator = nbl::hlsl::less<T>;
197
192
//Comparator comp;
@@ -200,7 +195,7 @@ uint lower_bound(NBL_REF_ARG(Accessor) accessor, const uint begin, const uint en
200
195
return nbl::hlsl::lower_bound<Accessor, nbl::hlsl::less <T> >(accessor,begin,end,value,comp);
201
196
}
202
197
template<class Accessor, typename T>
203
- uint upper_bound (NBL_REF_ARG (Accessor) accessor, const uint begin, const uint end, const T value)
198
+ uint32_t upper_bound (NBL_REF_ARG (Accessor) accessor, const uint32_t begin, const uint32_t end, const T value)
204
199
{
205
200
//using Comparator = nbl::hlsl::less<T>;
206
201
//Comparator comp;
@@ -212,12 +207,12 @@ uint upper_bound(NBL_REF_ARG(Accessor) accessor, const uint begin, const uint en
212
207
}
213
208
214
209
template<class Accessor>
215
- uint lower_bound (NBL_REF_ARG (Accessor) accessor, const uint begin, const uint end, const typename Accessor::value_type value)
210
+ uint32_t lower_bound (NBL_REF_ARG (Accessor) accessor, const uint32_t begin, const uint32_t end, const typename Accessor::value_type value)
216
211
{
217
212
return impl::lower_bound<Accessor,typename Accessor::value_type>(accessor,begin,end,value);
218
213
}
219
214
template<class Accessor>
220
- uint upper_bound (NBL_REF_ARG (Accessor) accessor, const uint begin, const uint end, const typename Accessor::value_type value)
215
+ uint32_t upper_bound (NBL_REF_ARG (Accessor) accessor, const uint32_t begin, const uint32_t end, const typename Accessor::value_type value)
221
216
{
222
217
return impl::upper_bound<Accessor,typename Accessor::value_type>(accessor,begin,end,value);
223
218
}
0 commit comments