-
Notifications
You must be signed in to change notification settings - Fork 246
Add ScalarOrVector<S> trait
#1030
base: main
Are you sure you want to change the base?
Add ScalarOrVector<S> trait
#1030
Conversation
| type Scalar; | ||
|
|
||
| /// The dimension of the vector, or 1 if it is a scalar | ||
| const DIM: usize; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you use std::num::NonZeroUsize here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, theoretically you could do it, but I am not sure if it is currently supported in Rust-Gpu.
|
I like the general idea but if rust-gpu doesn't use it internally I'm not really seeing why it should add these things, rather than putting them in a separate crate for people to use? |
|
@oisyn Yea the thing is, my plan is to add support for subgroup operations after this PR has been merged, and there are some ops like |
|
Right! I would suggest adding this trait as part of that work. |
| impl_vector_or_scalar! { | ||
| for bool, 2: unsafe impl ScalarOrVector for glam::BVec2; | ||
| for bool, 3: unsafe impl ScalarOrVector for glam::BVec3; | ||
| for bool, 4: unsafe impl ScalarOrVector for glam::BVec4; | ||
|
|
||
| for f32, 2: unsafe impl ScalarOrVector for glam::Vec2; | ||
| for f32, 3: unsafe impl ScalarOrVector for glam::Vec3; | ||
| for f32, 4: unsafe impl ScalarOrVector for glam::Vec4; | ||
|
|
||
| for f64, 2: unsafe impl ScalarOrVector for glam::DVec2; | ||
| for f64, 3: unsafe impl ScalarOrVector for glam::DVec3; | ||
| for f64, 4: unsafe impl ScalarOrVector for glam::DVec4; | ||
|
|
||
| for u32, 2: unsafe impl ScalarOrVector for glam::UVec2; | ||
| for u32, 3: unsafe impl ScalarOrVector for glam::UVec3; | ||
| for u32, 4: unsafe impl ScalarOrVector for glam::UVec4; | ||
|
|
||
| for i32, 2: unsafe impl ScalarOrVector for glam::IVec2; | ||
| for i32, 3: unsafe impl ScalarOrVector for glam::IVec3; | ||
| for i32, 4: unsafe impl ScalarOrVector for glam::IVec4; | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It would be nicer to make this one per line, like i32: IVec2 => 2, IVec3 => 3, IVec4 => 4;
Also, you can make the macro implement both Vector and ScalarOrVector at the same time.
* subgroup: add trait VectorOrScalar, representing either a vector or a scalar type * subgroup: added all non-uniform subgroup operations * subgroup: remove all target_feature cfgs, replaced with docs * subgroup: added all subgroupBarrier*() functions from glsl * subgroup: added non group-op tests * subgroup: fixed asm for instructions taking GROUP_OP generic * subgroup: added tests for group-op instructions * gitignore: added rustc-ice* error reports * subgroup: added test for subgroup buildins * subgroup: make SubgroupMask a struct to prevent implicit casts to and from UVec4 * subgroup: fixed clippy lints * subgroup: drop the `non_uniform` from all subgroup functions, matching glsl * changelog: add subgroup intrinsics PR * subgroup: make VectorOrScalar trait match discussions in EmbarkStudios/rust-gpu#1030 * cleanup: remove internal type F32x2 for glam::Vec2 --------- Co-authored-by: Firestar99 <[email protected]>
This PR adds the
ScalarOrVector<S>trait which represents types that can be either a scalar or a vector!Motivation:
I am currently adding support for subgroup operations, and for example
OpGroupNonUniformIAdds result type must be scalar or vector of integer type, so it would be useful to have this trait.