Skip to content

Commit 8bd2853

Browse files
committed
new concept macro to evaluate valid expressions
1 parent 81366a7 commit 8bd2853

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

include/nbl/builtin/hlsl/concepts.hlsl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,24 @@ NBL_CONSTEXPR bool NBL_CONCEPT_NAME = BOOST_PP_SEQ_FOR_EACH_I(NBL_IMPL_CONCEPT_E
118118
// TODO: counterparts of all the other concepts
119119

120120
#endif
121+
122+
#include <boost/preprocessor/comparison/not_equal.hpp>
123+
#include <boost/preprocessor/punctuation/comma_if.hpp>
124+
125+
#define NBL_IMPL_EXPR_DECLVAL(r,data,i,_T) BOOST_PP_COMMA_IF(BOOST_PP_NOT_EQUAL(i,0)) experimental::declval<_T>()
126+
#define NBL_IMPL_EXPR_DECL_TEMP_ARG(r,data,i,_T) BOOST_PP_COMMA_IF(BOOST_PP_NOT_EQUAL(i,0)) typename _T
127+
#define NBL_IMPL_EXPR_ITER_TEMP_ARG(r,data,i,_T) BOOST_PP_COMMA_IF(BOOST_PP_NOT_EQUAL(i,0)) _T
128+
#define NBL_VALID_EXPRESSION(CONCEPT_NAME, FUNCTION_NAME, ARG_TYPE_LIST, ARG_TYPE_SET)\
129+
namespace impl\
130+
{\
131+
template<BOOST_PP_SEQ_FOR_EACH_I(NBL_IMPL_EXPR_DECL_TEMP_ARG, _, ARG_TYPE_LIST), typename enable=void>\
132+
struct CONCEPT_NAME : false_type {};\
133+
template<BOOST_PP_SEQ_FOR_EACH_I(NBL_IMPL_EXPR_DECL_TEMP_ARG, _, ARG_TYPE_LIST)>\
134+
struct CONCEPT_NAME<BOOST_PP_SEQ_FOR_EACH_I(NBL_IMPL_EXPR_ITER_TEMP_ARG, _, ARG_TYPE_LIST), make_void_t<decltype(FUNCTION_NAME<BOOST_PP_SEQ_FOR_EACH_I(NBL_IMPL_EXPR_ITER_TEMP_ARG, _, ARG_TYPE_LIST)>(BOOST_PP_SEQ_FOR_EACH_I(NBL_IMPL_EXPR_DECLVAL, _, ARG_TYPE_SET)))> > : true_type {};\
135+
}\
136+
template<BOOST_PP_SEQ_FOR_EACH_I(NBL_IMPL_EXPR_DECL_TEMP_ARG, _, ARG_TYPE_LIST)>\
137+
NBL_BOOL_CONCEPT CONCEPT_NAME = impl::CONCEPT_NAME<BOOST_PP_SEQ_FOR_EACH_I(NBL_IMPL_EXPR_ITER_TEMP_ARG, _, ARG_TYPE_LIST)>::value;\
138+
121139
}
122140
}
123141
}

include/nbl/builtin/hlsl/glsl_compat/core.hlsl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,8 @@ struct equal_helper;
245245
#ifdef __HLSL_VERSION
246246

247247
template<typename Vectorial>
248-
NBL_PARTIAL_REQ_TOP(always_true<decltype(spirv::IEqual<Vectorial>(experimental::declval<Vectorial>(),experimental::declval<Vectorial>()))> && concepts::Vectorial<Vectorial> && concepts::Integral<Vectorial>)
249-
struct equal_helper<Vectorial NBL_PARTIAL_REQ_BOT(always_true<decltype(spirv::IEqual<Vectorial>(experimental::declval<Vectorial>(),experimental::declval<Vectorial>()))> && concepts::Vectorial<Vectorial> && concepts::Integral<Vectorial>) >
248+
NBL_PARTIAL_REQ_TOP(spirv::EqualIntrinsicCallable<Vectorial> && concepts::Vectorial<Vectorial> && concepts::Integral<Vectorial>)
249+
struct equal_helper<Vectorial NBL_PARTIAL_REQ_BOT(spirv::EqualIntrinsicCallable<Vectorial> && concepts::Vectorial<Vectorial> && concepts::Integral<Vectorial>) >
250250
{
251251
using return_t = vector<bool, vector_traits<Vectorial>::Dimension>;
252252

@@ -257,8 +257,8 @@ struct equal_helper<Vectorial NBL_PARTIAL_REQ_BOT(always_true<decltype(spirv::IE
257257
};
258258

259259
template<typename Vectorial>
260-
NBL_PARTIAL_REQ_TOP(always_true<decltype(spirv::FOrdEqual<Vectorial>(experimental::declval<Vectorial>(),experimental::declval<Vectorial>()))> && concepts::Vectorial<Vectorial> && concepts::FloatingPoint<Vectorial>)
261-
struct equal_helper<Vectorial NBL_PARTIAL_REQ_BOT(always_true<decltype(spirv::FOrdEqual<Vectorial>(experimental::declval<Vectorial>(),experimental::declval<Vectorial>()))> && concepts::Vectorial<Vectorial> && concepts::FloatingPoint<Vectorial>) >
260+
NBL_PARTIAL_REQ_TOP(spirv::EqualIntrinsicCallable<Vectorial> && concepts::Vectorial<Vectorial> && concepts::FloatingPoint<Vectorial>)
261+
struct equal_helper<Vectorial NBL_PARTIAL_REQ_BOT(spirv::EqualIntrinsicCallable<Vectorial> && concepts::Vectorial<Vectorial> && concepts::FloatingPoint<Vectorial>) >
262262
{
263263
using return_t = vector<bool, vector_traits<Vectorial>::Dimension>;
264264

include/nbl/builtin/hlsl/spirv_intrinsics/core.hlsl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,13 +356,17 @@ template<typename T NBL_FUNC_REQUIRES(concepts::FloatingPoint<T> || concepts::Fl
356356
[[vk::ext_instruction(spv::OpFOrdEqual)]]
357357
conditional_t<is_vector_v<T>, vector<bool, vector_traits<T>::Dimension>, bool> FOrdEqual(T lhs, T rhs);
358358

359+
NBL_VALID_EXPRESSION(IEqualIsCallable, IEqual, (T), (T)(T))
360+
NBL_VALID_EXPRESSION(FOrdEqualIsCallable, FOrdEqual, (T), (T)(T))
361+
362+
template<typename T>
363+
NBL_BOOL_CONCEPT EqualIntrinsicCallable = IEqualIsCallable<T> || FOrdEqualIsCallable<T>;
359364

360365
template<typename T, typename U NBL_FUNC_REQUIRES(concepts::Boolean<U> && (!concepts::Vector<U> || (concepts::Vector<T> && vector_traits<T>::Dimension==vector_traits<U>::Dimension)))
361366
[[vk::ext_instruction(spv::OpSelect)]]
362367
T select(U a, T x, T y);
363368

364-
template<typename T, typename U>
365-
NBL_BOOL_CONCEPT SelectIsCallable = always_true<decltype(spirv::select(experimental::declval<U>(),experimental::declval<T>(),experimental::declval<T>()))>;
369+
NBL_VALID_EXPRESSION(SelectIsCallable, select, (T)(U), (U)(T)(T))
366370

367371
}
368372

0 commit comments

Comments
 (0)