diff --git a/Cargo.lock b/Cargo.lock index ee0abc2c3a..77d2c96589 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1102,6 +1102,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28091a37a5d09b555cb6628fd954da299b536433834f5b8e59eba78e0cbbf8a" dependencies = [ + "bytemuck", "libm", ] @@ -2490,6 +2491,7 @@ name = "spirv-std" version = "0.9.0" dependencies = [ "bitflags 1.3.2", + "bytemuck", "glam", "num-traits", "spirv-std-macros", diff --git a/crates/spirv-std/Cargo.toml b/crates/spirv-std/Cargo.toml index 00f6031dc5..44590a02c4 100644 --- a/crates/spirv-std/Cargo.toml +++ b/crates/spirv-std/Cargo.toml @@ -14,6 +14,7 @@ unexpected_cfgs = { level = "allow", check-cfg = ['cfg(target_arch, values("spir spirv-std-types.workspace = true spirv-std-macros.workspace = true bitflags = "1.2.1" +bytemuck = { version = "1.18.0", features = ["derive"], optional = true } [target.'cfg(target_arch = "spirv")'.dependencies] num-traits = { workspace = true, features = ["libm"] } @@ -25,3 +26,4 @@ glam = { workspace = true, default-features = true } [features] default = [] +bytemuck = ["dep:bytemuck", "glam/bytemuck"] diff --git a/crates/spirv-std/src/arch/subgroup.rs b/crates/spirv-std/src/arch/subgroup.rs index b587f0e0ad..564c9be859 100644 --- a/crates/spirv-std/src/arch/subgroup.rs +++ b/crates/spirv-std/src/arch/subgroup.rs @@ -13,7 +13,9 @@ const SUBGROUP: u32 = Scope::Subgroup as u32; /// `SubgroupMask` is a [`glam::UVec4`] representing a bitmask of all invocations within a subgroup. /// Mostly used in group ballot operations. +#[repr(transparent)] #[derive(Copy, Clone, Default, Eq, PartialEq)] +#[cfg_attr(feature = "bytemuck", derive(bytemuck::Zeroable, bytemuck::Pod))] pub struct SubgroupMask(pub glam::UVec4); /// Defines the class of group operation. diff --git a/crates/spirv-std/src/indirect_command.rs b/crates/spirv-std/src/indirect_command.rs new file mode 100644 index 0000000000..4376ee04a1 --- /dev/null +++ b/crates/spirv-std/src/indirect_command.rs @@ -0,0 +1,187 @@ +//! Indirect command structs from vulkan + +use glam::UVec3; + +/// +pub type DeviceSize = u64; + +/// +pub type DeviceAddress = u64; + +/// Structure specifying an indirect drawing command +/// +/// +#[repr(C)] +#[derive(Copy, Clone, Debug, Default)] +#[cfg_attr(feature = "bytemuck", derive(bytemuck::Zeroable, bytemuck::Pod))] +pub struct DrawIndirectCommand { + /// vertexCount is the number of vertices to draw. + pub vertex_count: u32, + /// instanceCount is the number of instances to draw. + pub instance_count: u32, + /// firstVertex is the index of the first vertex to draw. + pub first_vertex: u32, + /// firstInstance is the instance ID of the first instance to draw. + pub first_instance: u32, +} + +/// Structure specifying an indexed indirect drawing command +/// +/// +#[repr(C)] +#[derive(Copy, Clone, Debug, Default)] +#[cfg_attr(feature = "bytemuck", derive(bytemuck::Zeroable, bytemuck::Pod))] +pub struct DrawIndexedIndirectCommand { + /// indexCount is the number of vertices to draw. + pub index_count: u32, + /// instanceCount is the number of instances to draw. + pub instance_count: u32, + /// firstIndex is the base index within the index buffer. + pub first_index: u32, + /// vertexOffset is the value added to the vertex index before indexing into the vertex buffer. + pub vertex_offset: i32, + /// firstInstance is the instance ID of the first instance to draw. + pub first_instance: u32, +} + +/// Structure specifying an indirect dispatching command +/// +/// +#[repr(C)] +#[derive(Copy, Clone, Debug, Default)] +#[cfg_attr(feature = "bytemuck", derive(bytemuck::Zeroable, bytemuck::Pod))] +pub struct DispatchIndirectCommand { + /// x is the number of local workgroups to dispatch in the X dimension. + pub x: u32, + /// y is the number of local workgroups to dispatch in the Y dimension. + pub y: u32, + /// z is the number of local workgroups to dispatch in the Z dimension. + pub z: u32, +} + +impl From for DispatchIndirectCommand { + fn from(v: UVec3) -> Self { + Self { + x: v.x, + y: v.y, + z: v.z, + } + } +} + +impl From for UVec3 { + fn from(v: DispatchIndirectCommand) -> Self { + Self { + x: v.x, + y: v.y, + z: v.z, + } + } +} + +/// Structure specifying a mesh tasks draw indirect command +/// +/// +#[repr(C)] +#[derive(Copy, Clone, Debug, Default)] +#[cfg_attr(feature = "bytemuck", derive(bytemuck::Zeroable, bytemuck::Pod))] +pub struct DrawMeshTasksIndirectCommandEXT { + /// groupCountX is the number of local workgroups to dispatch in the X dimension. + pub group_count_x: u32, + /// groupCountY is the number of local workgroups to dispatch in the Y dimension. + pub group_count_y: u32, + /// groupCountZ is the number of local workgroups to dispatch in the Z dimension. + pub group_count_z: u32, +} + +impl From for DrawMeshTasksIndirectCommandEXT { + fn from(v: UVec3) -> Self { + Self { + group_count_x: v.x, + group_count_y: v.y, + group_count_z: v.z, + } + } +} + +impl From for UVec3 { + fn from(v: DrawMeshTasksIndirectCommandEXT) -> Self { + Self { + x: v.group_count_x, + y: v.group_count_y, + z: v.group_count_z, + } + } +} + +/// Structure specifying the parameters of an indirect ray tracing command +/// +/// +#[repr(C)] +#[derive(Copy, Clone, Debug, Default)] +#[cfg_attr(feature = "bytemuck", derive(bytemuck::Zeroable, bytemuck::Pod))] +pub struct TraceRaysIndirectCommandKHR { + /// width is the width of the ray trace query dimensions. + pub width: u32, + /// height is height of the ray trace query dimensions. + pub height: u32, + /// depth is depth of the ray trace query dimensions. + pub depth: u32, +} + +impl From for TraceRaysIndirectCommandKHR { + fn from(v: UVec3) -> Self { + Self { + width: v.x, + height: v.y, + depth: v.z, + } + } +} + +impl From for UVec3 { + fn from(v: TraceRaysIndirectCommandKHR) -> Self { + Self { + x: v.width, + y: v.height, + z: v.depth, + } + } +} + +/// Structure specifying the parameters of an indirect trace ray command with indirect shader binding tables +/// +/// +#[repr(C)] +#[derive(Copy, Clone, Debug, Default)] +#[cfg_attr(feature = "bytemuck", derive(bytemuck::AnyBitPattern))] +pub struct TraceRaysIndirectCommand2KHR { + /// raygenShaderRecordAddress is a `VkDeviceAddress` of the ray generation shader binding table record used by this command. + pub raygen_shader_record_address: DeviceAddress, + /// raygenShaderRecordSize is a `VkDeviceSize` number of bytes corresponding to the ray generation shader binding table record at base address raygenShaderRecordAddress. + pub raygen_shader_record_size: DeviceSize, + /// missShaderBindingTableAddress is a `VkDeviceAddress` of the first record in the miss shader binding table used by this command. + pub miss_shader_binding_table_address: DeviceAddress, + /// missShaderBindingTableSize is a `VkDeviceSize` number of bytes corresponding to the total size of the miss shader binding table at missShaderBindingTableAddress that may be accessed by this command. + pub miss_shader_binding_table_size: DeviceSize, + /// missShaderBindingTableStride is a `VkDeviceSize` number of bytes between records of the miss shader binding table. + pub miss_shader_binding_table_stride: DeviceSize, + /// hitShaderBindingTableAddress is a `VkDeviceAddress` of the first record in the hit shader binding table used by this command. + pub hit_shader_binding_table_address: DeviceAddress, + /// hitShaderBindingTableSize is a `VkDeviceSize` number of bytes corresponding to the total size of the hit shader binding table at hitShaderBindingTableAddress that may be accessed by this command. + pub hit_shader_binding_table_size: DeviceSize, + /// hitShaderBindingTableStride is a `VkDeviceSize` number of bytes between records of the hit shader binding table. + pub hit_shader_binding_table_stride: DeviceSize, + /// callableShaderBindingTableAddress is a `VkDeviceAddress` of the first record in the callable shader binding table used by this command. + pub callable_shader_binding_table_address: DeviceAddress, + /// callableShaderBindingTableSize is a `VkDeviceSize` number of bytes corresponding to the total size of the callable shader binding table at callableShaderBindingTableAddress that may be accessed by this command. + pub callable_shader_binding_table_size: DeviceSize, + /// callableShaderBindingTableStride is a `VkDeviceSize` number of bytes between records of the callable shader binding table. + pub callable_shader_binding_table_stride: DeviceSize, + /// width is the width of the ray trace query dimensions. + pub width: u32, + /// height is height of the ray trace query dimensions. + pub height: u32, + /// depth is depth of the ray trace query dimensions. + pub depth: u32, +} diff --git a/crates/spirv-std/src/lib.rs b/crates/spirv-std/src/lib.rs index 175099537a..f50e719fe0 100644 --- a/crates/spirv-std/src/lib.rs +++ b/crates/spirv-std/src/lib.rs @@ -99,6 +99,7 @@ pub mod arch; pub mod byte_addressable_buffer; pub mod float; pub mod image; +pub mod indirect_command; pub mod integer; pub mod memory; pub mod number; diff --git a/crates/spirv-std/src/memory.rs b/crates/spirv-std/src/memory.rs index b8eccfaab3..8710482d15 100644 --- a/crates/spirv-std/src/memory.rs +++ b/crates/spirv-std/src/memory.rs @@ -29,6 +29,8 @@ pub enum Scope { bitflags::bitflags! { /// Memory semantics to determine how some operations should function - used when calling such /// configurable operations. + #[repr(transparent)] + #[cfg_attr(feature = "bytemuck", derive(bytemuck::Zeroable, bytemuck::Pod))] pub struct Semantics: u32 { /// No memory semantics. const NONE = 0; diff --git a/crates/spirv-std/src/ray_tracing.rs b/crates/spirv-std/src/ray_tracing.rs index 39803599b8..4c9f345f54 100644 --- a/crates/spirv-std/src/ray_tracing.rs +++ b/crates/spirv-std/src/ray_tracing.rs @@ -141,6 +141,8 @@ bitflags::bitflags! { /// `NO_OPAQUE`, `CULL_OPAQUE`, `CULL_NO_OPAQUE`, only one of /// `CULL_BACK_FACING_TRIANGLES` and `CULL_FRONT_FACING_TRIANGLES` may /// be set. + #[repr(transparent)] + #[cfg_attr(feature = "bytemuck", derive(bytemuck::Zeroable, bytemuck::Pod))] pub struct RayFlags: u32 { /// No flags specified. const NONE = 0; diff --git a/examples/shaders/shared/Cargo.toml b/examples/shaders/shared/Cargo.toml index 830b48d02c..66b69c4369 100644 --- a/examples/shaders/shared/Cargo.toml +++ b/examples/shaders/shared/Cargo.toml @@ -9,4 +9,4 @@ repository.workspace = true [dependencies] spirv-std = { workspace = true } -bytemuck = { version = "1.6.3", features = ["derive"] } +bytemuck = { version = "1.18.0", features = ["derive"] } diff --git a/tests/ui/arch/debug_printf_type_checking.stderr b/tests/ui/arch/debug_printf_type_checking.stderr index b027cc7b34..7213a02020 100644 --- a/tests/ui/arch/debug_printf_type_checking.stderr +++ b/tests/ui/arch/debug_printf_type_checking.stderr @@ -75,9 +75,9 @@ help: the return type of this call is `u32` due to the type of the argument pass | | | this argument influences the return type of `spirv_std` note: function defined here - --> $SPIRV_STD_SRC/lib.rs:138:8 + --> $SPIRV_STD_SRC/lib.rs:139:8 | -138 | pub fn debug_printf_assert_is_type(ty: T) -> T { +139 | pub fn debug_printf_assert_is_type(ty: T) -> T { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: this error originates in the macro `debug_printf` (in Nightly builds, run with -Z macro-backtrace for more info) help: change the type of the numeric literal from `u32` to `f32` @@ -102,9 +102,9 @@ help: the return type of this call is `f32` due to the type of the argument pass | | | this argument influences the return type of `spirv_std` note: function defined here - --> $SPIRV_STD_SRC/lib.rs:138:8 + --> $SPIRV_STD_SRC/lib.rs:139:8 | -138 | pub fn debug_printf_assert_is_type(ty: T) -> T { +139 | pub fn debug_printf_assert_is_type(ty: T) -> T { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: this error originates in the macro `debug_printf` (in Nightly builds, run with -Z macro-backtrace for more info) help: change the type of the numeric literal from `f32` to `u32` @@ -129,12 +129,12 @@ error[E0277]: the trait bound `{float}: Vector` is not satisfied > and 5 others note: required by a bound in `debug_printf_assert_is_vector` - --> $SPIRV_STD_SRC/lib.rs:145:8 + --> $SPIRV_STD_SRC/lib.rs:146:8 | -143 | pub fn debug_printf_assert_is_vector< +144 | pub fn debug_printf_assert_is_vector< | ----------------------------- required by a bound in this function -144 | TY: crate::scalar::Scalar, -145 | V: crate::vector::Vector, +145 | TY: crate::scalar::Scalar, +146 | V: crate::vector::Vector, | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `debug_printf_assert_is_vector` = note: this error originates in the macro `debug_printf` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -155,9 +155,9 @@ help: the return type of this call is `Vec2` due to the type of the argument pas | | | this argument influences the return type of `spirv_std` note: function defined here - --> $SPIRV_STD_SRC/lib.rs:138:8 + --> $SPIRV_STD_SRC/lib.rs:139:8 | -138 | pub fn debug_printf_assert_is_type(ty: T) -> T { +139 | pub fn debug_printf_assert_is_type(ty: T) -> T { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: this error originates in the macro `debug_printf` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/arch/subgroup/subgroup_ballot.stderr b/tests/ui/arch/subgroup/subgroup_ballot.stderr index 13676166e7..b0e37a1e11 100644 --- a/tests/ui/arch/subgroup/subgroup_ballot.stderr +++ b/tests/ui/arch/subgroup/subgroup_ballot.stderr @@ -1,9 +1,9 @@ %1 = OpFunction %2 None %3 %4 = OpFunctionParameter %2 %5 = OpLabel -OpLine %6 379 8 +OpLine %6 381 8 %7 = OpGroupNonUniformBallot %8 %9 %4 -OpLine %6 415 8 +OpLine %6 417 8 %10 = OpGroupNonUniformInverseBallot %2 %9 %7 OpNoLine OpReturnValue %10 diff --git a/tests/ui/arch/subgroup/subgroup_ballot_bit_count.stderr b/tests/ui/arch/subgroup/subgroup_ballot_bit_count.stderr index 319877327e..4db8589b64 100644 --- a/tests/ui/arch/subgroup/subgroup_ballot_bit_count.stderr +++ b/tests/ui/arch/subgroup/subgroup_ballot_bit_count.stderr @@ -1,7 +1,7 @@ %1 = OpFunction %2 None %3 %4 = OpFunctionParameter %5 %6 = OpLabel -OpLine %7 491 8 +OpLine %7 493 8 %8 = OpGroupNonUniformBallotBitCount %2 %9 Reduce %4 OpNoLine OpReturnValue %8 diff --git a/tests/ui/arch/subgroup/subgroup_broadcast_first.stderr b/tests/ui/arch/subgroup/subgroup_broadcast_first.stderr index 84f784d58e..d0ce7e733b 100644 --- a/tests/ui/arch/subgroup/subgroup_broadcast_first.stderr +++ b/tests/ui/arch/subgroup/subgroup_broadcast_first.stderr @@ -1,7 +1,7 @@ %1 = OpFunction %2 None %3 %4 = OpFunctionParameter %2 %5 = OpLabel -OpLine %6 346 8 +OpLine %6 348 8 %7 = OpGroupNonUniformBroadcastFirst %2 %8 %4 OpNoLine OpReturnValue %7 diff --git a/tests/ui/arch/subgroup/subgroup_elect.stderr b/tests/ui/arch/subgroup/subgroup_elect.stderr index 73bf0b2778..b142160f81 100644 --- a/tests/ui/arch/subgroup/subgroup_elect.stderr +++ b/tests/ui/arch/subgroup/subgroup_elect.stderr @@ -1,6 +1,6 @@ %1 = OpFunction %2 None %3 %4 = OpLabel -OpLine %5 181 8 +OpLine %5 183 8 %6 = OpGroupNonUniformElect %2 %7 OpNoLine OpReturnValue %6 diff --git a/tests/ui/arch/subgroup/subgroup_i_add_clustered.stderr b/tests/ui/arch/subgroup/subgroup_i_add_clustered.stderr index f52c1c0632..df82e0a5c5 100644 --- a/tests/ui/arch/subgroup/subgroup_i_add_clustered.stderr +++ b/tests/ui/arch/subgroup/subgroup_i_add_clustered.stderr @@ -1,7 +1,7 @@ %1 = OpFunction %2 None %3 %4 = OpFunctionParameter %2 %5 = OpLabel -OpLine %6 782 8 +OpLine %6 784 8 %7 = OpGroupNonUniformIAdd %2 %8 ClusteredReduce %4 %9 OpNoLine OpReturnValue %7 diff --git a/tests/ui/arch/subgroup/subgroup_i_add_exclusive_scan.stderr b/tests/ui/arch/subgroup/subgroup_i_add_exclusive_scan.stderr index bf7dd9f2b9..1f496bf279 100644 --- a/tests/ui/arch/subgroup/subgroup_i_add_exclusive_scan.stderr +++ b/tests/ui/arch/subgroup/subgroup_i_add_exclusive_scan.stderr @@ -1,7 +1,7 @@ %1 = OpFunction %2 None %3 %4 = OpFunctionParameter %2 %5 = OpLabel -OpLine %6 741 8 +OpLine %6 743 8 %7 = OpGroupNonUniformIAdd %2 %8 ExclusiveScan %4 OpNoLine OpReturnValue %7 diff --git a/tests/ui/arch/subgroup/subgroup_i_add_inclusive_scan.stderr b/tests/ui/arch/subgroup/subgroup_i_add_inclusive_scan.stderr index cb69054815..15694c1f66 100644 --- a/tests/ui/arch/subgroup/subgroup_i_add_inclusive_scan.stderr +++ b/tests/ui/arch/subgroup/subgroup_i_add_inclusive_scan.stderr @@ -1,7 +1,7 @@ %1 = OpFunction %2 None %3 %4 = OpFunctionParameter %2 %5 = OpLabel -OpLine %6 741 8 +OpLine %6 743 8 %7 = OpGroupNonUniformIAdd %2 %8 InclusiveScan %4 OpNoLine OpReturnValue %7 diff --git a/tests/ui/arch/subgroup/subgroup_i_add_reduce.stderr b/tests/ui/arch/subgroup/subgroup_i_add_reduce.stderr index 6501d5ce1d..fe9ead48a9 100644 --- a/tests/ui/arch/subgroup/subgroup_i_add_reduce.stderr +++ b/tests/ui/arch/subgroup/subgroup_i_add_reduce.stderr @@ -1,7 +1,7 @@ %1 = OpFunction %2 None %3 %4 = OpFunctionParameter %2 %5 = OpLabel -OpLine %6 741 8 +OpLine %6 743 8 %7 = OpGroupNonUniformIAdd %2 %8 Reduce %4 OpNoLine OpReturnValue %7