-
Notifications
You must be signed in to change notification settings - Fork 33
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add vulkan indirect command structs #34
Merged
Merged
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
86f16a3
indirect command structs: added, mostly copied from ash
Firestar99 6ea946e
indirect command structs: fixed doc lints
Firestar99 6df3860
project: add optional bytemuck dependency to mark structs as Pod
Firestar99 6cc7f95
bless compiletest
Firestar99 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,187 @@ | ||
//! Indirect command structs from vulkan | ||
|
||
use glam::UVec3; | ||
|
||
/// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkDeviceSize.html> | ||
pub type DeviceSize = u64; | ||
|
||
/// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkDeviceAddress.html> | ||
pub type DeviceAddress = u64; | ||
|
||
/// Structure specifying an indirect drawing command | ||
/// | ||
/// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkDrawIndirectCommand.html> | ||
#[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 | ||
/// | ||
/// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkDrawIndexedIndirectCommand.html> | ||
#[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 | ||
/// | ||
/// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkDispatchIndirectCommand.html> | ||
#[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<UVec3> for DispatchIndirectCommand { | ||
fn from(v: UVec3) -> Self { | ||
Self { | ||
x: v.x, | ||
y: v.y, | ||
z: v.z, | ||
} | ||
} | ||
} | ||
|
||
impl From<DispatchIndirectCommand> 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 | ||
/// | ||
/// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkDrawMeshTasksIndirectCommandEXT.html> | ||
#[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<UVec3> 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<DrawMeshTasksIndirectCommandEXT> 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 | ||
/// | ||
/// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkTraceRaysIndirectCommandKHR.html> | ||
#[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<UVec3> for TraceRaysIndirectCommandKHR { | ||
fn from(v: UVec3) -> Self { | ||
Self { | ||
width: v.x, | ||
height: v.y, | ||
depth: v.z, | ||
} | ||
} | ||
} | ||
|
||
impl From<TraceRaysIndirectCommandKHR> 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 | ||
/// | ||
/// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkTraceRaysIndirectCommand2KHR.html> | ||
#[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, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
I've added bytemuck as an optional dependency to mark all the
*IndirectCommand
structs as Pod, as most graphics APIs will require this. Should we make the bytemuck dependency required, eg. not hidden behind a feature?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.
I think keeping
bytemuck
optional is good. It's true that most graphics projects will have it somewhere in the tree, but I don't think we should be deciding how folks marshal data to the GPU.