@@ -123,37 +123,51 @@ BOOST_PP_SEQ_FOR_EACH_I(NBL_HLSL_IMPL_DEFINE_STRUCT_MEMBER,IDENTIFIER,MEMBER_SEQ
123
123
}
124
124
#endif
125
125
126
- #include <boost/preprocessor/seq/for_each_i.hpp>
127
- #include <boost/preprocessor/seq/size.hpp>
128
- // MEMBER_SEQ is to be a sequence of variable name and type (identifier0,Type0)...(identifierN,TypeN) @see NBL_HLSL_IMPL_DEFINE_STRUCT_GET_MEMBER_TYPE
129
- // the VA_ARGS is the struct alignment for alignas, usage example
130
- // ```
131
- // NBL_HLSL_DEFINE_STRUCT((MyStruct2),
132
- // ((a, float32_t))
133
- // ((b, int32_t))
134
- // ((c, int32_t2))
135
- // );
136
- // ```
137
- #define NBL_HLSL_DEFINE_STRUCT (IDENTIFIER,MEMBER_SEQ, ...) template<> \
126
+ // some weird stuff to handle alignment
127
+ #define NBL_HLSL_IMPL_DEFINE_STRUCT_BEGIN (IDENTIFIER,MEMBER_SEQ) template<> \
138
128
struct ::nbl::hlsl::bda::member_count<NBL_EVAL IDENTIFIER > \
139
129
{ \
140
130
NBL_CONSTEXPR_STATIC_INLINE uint32_t value = BOOST_PP_SEQ_SIZE (MEMBER_SEQ); \
141
131
}; \
142
132
BOOST_PP_SEQ_FOR_EACH_I (NBL_HLSL_IMPL_DEFINE_STRUCT_MEMBER_TYPE,IDENTIFIER,MEMBER_SEQ) \
143
133
template <> \
144
134
struct ::nbl::hlsl::alignment_of<NBL_EVAL IDENTIFIER > \
145
- { \
146
- NBL_CONSTEXPR_STATIC_INLINE uint32_t value = nbl::hlsl::conditional_value<true __VA_OPT__ (&&false ),uint32_t,::nbl::hlsl::bda::impl::default_alignment_v<NBL_EVAL IDENTIFIER >,__VA_OPT__ ((__VA_ARGS__)-)0 >::value; \
147
- }; \
135
+ {
136
+ #define NBL_HLSL_IMPL_DEFINE_STRUCT_END (IDENTIFIER,MEMBER_SEQ,...) }; \
148
137
template<> \
149
138
struct ::nbl::hlsl::size_of<NBL_EVAL IDENTIFIER > \
150
139
{ \
151
140
using type = NBL_EVAL IDENTIFIER; \
152
141
NBL_CONSTEXPR_STATIC_INLINE uint32_t __last_member_ix_v = ::nbl::hlsl::bda::member_count_v<type>-1 ; \
153
- NBL_CONSTEXPR_STATIC_INLINE uint64_t __last_member_offset_v = ::nbl::hlsl::bda::member_offset_v<type,__last_member_ix_v>; \
154
- NBL_CONSTEXPR_STATIC_INLINE uint64_t __last_member_size_v = ::nbl::hlsl::size_of_v<::nbl::hlsl::bda::member_type_t<type,__last_member_ix_v> >; \
155
- NBL_CONSTEXPR_STATIC_INLINE uint32_t value = ::nbl::hlsl::mpl::align_up_v<__last_member_offset_v+__last_member_size_v,alignment_of_v<type > >; \
142
+ NBL_CONSTEXPR_STATIC_INLINE uint64_t __last_member_offset_v = ::nbl::hlsl::bda::member_offset_v<type, __last_member_ix_v>; \
143
+ NBL_CONSTEXPR_STATIC_INLINE uint64_t __last_member_size_v = ::nbl::hlsl::size_of_v<::nbl::hlsl::bda::member_type_t<type, __last_member_ix_v> >; \
144
+ NBL_CONSTEXPR_STATIC_INLINE uint32_t value = ::nbl::hlsl::mpl::align_up_v<__last_member_offset_v + __last_member_size_v, alignment_of_v<type > >; \
145
+ \
146
+ __VA_ARGS__ \
147
+ \
156
148
}; \
157
149
struct NBL_HLSL_IMPL_DEFINE_STRUCT (IDENTIFIER,MEMBER_SEQ)
158
150
151
+ #include <boost/preprocessor/seq/for_each_i.hpp>
152
+ #include <boost/preprocessor/seq/size.hpp>
153
+ // MEMBER_SEQ is to be a sequence of variable name and type (identifier0,Type0)...(identifierN,TypeN) @see NBL_HLSL_IMPL_DEFINE_STRUCT_GET_MEMBER_TYPE
154
+ // the VA_ARGS is the struct alignment for alignas, usage example
155
+ // ```
156
+ // NBL_HLSL_DEFINE_STRUCT((MyStruct2),
157
+ // ((a, float32_t))
158
+ // ((b, int32_t))
159
+ // ((c, int32_t2)),
160
+ //
161
+ // ... block of code for the methods ...
162
+ //
163
+ // );
164
+ // ```
165
+ #define NBL_HLSL_DEFINE_STRUCT (IDENTIFIER,MEMBER_SEQ,...) NBL_HLSL_IMPL_DEFINE_STRUCT_BEGIN (IDENTIFIER,MEMBER_SEQ) \
166
+ NBL_CONSTEXPR_STATIC_INLINE uint32_t value = ::nbl::hlsl::bda::impl::default_alignment_v<NBL_EVAL IDENTIFIER >; \
167
+ NBL_HLSL_IMPL_DEFINE_STRUCT_END (IDENTIFIER,MEMBER_SEQ,__VA_ARGS__)
168
+ // version allowing custom alignment on whole struct
169
+ #define NBL_HLSL_DEFINE_ALIGNAS_STRUCT (IDENTIFIER,ALIGNMENT,MEMBER_SEQ,...) NBL_HLSL_IMPL_DEFINE_STRUCT_BEGIN (IDENTIFIER,MEMBER_SEQ) \
170
+ NBL_CONSTEXPR_STATIC_INLINE uint32_t value = ALIGNMENT; \
171
+ NBL_HLSL_IMPL_DEFINE_STRUCT_END (IDENTIFIER,MEMBER_SEQ,__VA_ARGS__)
172
+
159
173
#endif
0 commit comments