Skip to content

Commit 7e73054

Browse files
committed
Refactored the floor function
1 parent 2f38f2a commit 7e73054

File tree

2 files changed

+47
-22
lines changed

2 files changed

+47
-22
lines changed

include/nbl/builtin/hlsl/impl/tgmath_impl.hlsl

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,50 @@ inline bool isinf_uint_impl(UnsignedInteger val)
9797
return (val & (~ieee754::traits<AsFloat>::signMask)) == ieee754::traits<AsFloat>::inf;
9898
}
9999

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+
100144
}
101145
}
102146
}

include/nbl/builtin/hlsl/tgmath.hlsl

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -85,31 +85,12 @@ inline FloatingPoint erfInv(FloatingPoint _x)
8585
return p*x;
8686
}
8787

88-
template<typename Scalar NBL_FUNC_REQUIRES(hlsl::is_floating_point_v<Scalar> && hlsl::is_scalar_v<Scalar>)
89-
inline Scalar floor(NBL_CONST_REF_ARG(Scalar) val)
88+
template<typename T>
89+
inline T floor(NBL_CONST_REF_ARG(T) val)
9090
{
91-
#ifdef __HLSL_VERSION
92-
return spirv::floor<Scalar>(val);
93-
#else
94-
return std::floor<Scalar>(val);
95-
#endif
91+
return tgmath_impl::floor_helper<T>::__call(val);
9692
}
9793

98-
template<typename Vector NBL_FUNC_REQUIRES(hlsl::is_floating_point_v<Vector>&& hlsl::is_vector_v<Vector>)
99-
inline Vector floor(NBL_CONST_REF_ARG(Vector) vec)
100-
{
101-
#ifdef __HLSL_VERSION
102-
return spirv::floor<Vector>(vec);
103-
#else
104-
Vector output;
105-
for (int32_t i = 0; i < hlsl::vector_traits<Vector>::Dimension; ++i)
106-
output[i] = std::floor(vec[i]);
107-
108-
return output;
109-
#endif
110-
}
111-
112-
11394
template<typename T, typename U>
11495
inline T lerp(NBL_CONST_REF_ARG(T) x, NBL_CONST_REF_ARG(T) y, NBL_CONST_REF_ARG(U) a)
11596
{

0 commit comments

Comments
 (0)