BindingType, BlendMode, BufferUsageFlags, ClearValue, ColorSpace, CompareOp, CullingMode,
FrontFace, ImageAspectFlags, ImageDimension, ImageFormat, ImageSubresourceLayers,
ImageSubresourceRange, ImageTiling, ImageUsageFlags, IndexType, LoadOp, PolygonMode,
- PresentMode, ShaderStageFlags, StencilOp, StencilOpState, StoreOp, Topology,
+ PresentMode, PushConstantRange, ShaderStageFlags, StencilOp, StencilOpState, StoreOp, Topology,
};
#[must_use]
flags
}
+#[must_use]
+pub fn vulkan_push_constant_range(push_constant_range: PushConstantRange) -> vk::PushConstantRange {
+ vk::PushConstantRange {
+ stage_flags: vulkan_shader_stage_flags(push_constant_range.stage_flags),
+ offset: push_constant_range.offset,
+ size: push_constant_range.size,
+ }
+}
+
#[must_use]
pub fn vulkan_descriptor_type(binding_type: BindingType) -> vk::DescriptorType {
match binding_type {
.as_bytes(),
);
}
+ for push_constant_range in pipeline_layout.push_constant_ranges {
+ assert!(
+ push_constant_range.offset & 3 == 0,
+ "push constant offsets must be 4 byte aligned"
+ );
+ assert!(
+ push_constant_range.size & 3 == 0,
+ "push constant sizes must be 4 byte aligned"
+ );
+ hasher.update(&push_constant_range.stage_flags.as_raw().to_le_bytes());
+ hasher.update(&push_constant_range.offset.to_le_bytes());
+ hasher.update(&push_constant_range.size.to_le_bytes());
+ }
hasher.finalize()
};
});
let set_layouts = arena.alloc_slice_fill_iter(set_layouts_iter);
+ let push_constant_ranges_iter = pipeline_layout
+ .push_constant_ranges
+ .iter()
+ .copied()
+ .map(vulkan_push_constant_range);
+ let push_constant_ranges =
+ arena.alloc_slice_fill_iter(push_constant_ranges_iter);
+
let pipeline_layout = {
let create_info = vk::PipelineLayoutCreateInfo {
set_layouts: set_layouts.into(),
+ push_constant_ranges: push_constant_ranges.into(),
..default()
};
let mut pipeline_layout = vk::PipelineLayout::null();
pub slope_factor: f32,
}
+#[derive(Clone, Copy, PartialEq, Eq, Hash)]
+pub struct PushConstantRange {
+ pub stage_flags: ShaderStageFlags,
+ pub offset: u32,
+ pub size: u32,
+}
+
#[derive(PartialEq, Eq, Hash)]
pub struct PipelineLayout<'a> {
pub bind_group_layouts: &'a [BindGroupLayout],
+ pub push_constant_ranges: &'a [PushConstantRange],
}
pub struct GraphicsPipelineAttachments<'a> {
let layout = &PipelineLayout {
bind_group_layouts: &[uniforms_bind_group_layout, storage_bind_group_layout],
+ push_constant_ranges: &[],
};
let pipeline = gpu.create_graphics_pipeline(&GraphicsPipelineDesc {
let layout = &PipelineLayout {
bind_group_layouts: &[bind_group_layout],
+ push_constant_ranges: &[],
};
let pipeline = gpu.create_compute_pipeline(&ComputePipelineDesc {
let layout = &PipelineLayout {
bind_group_layouts: &[bind_group_layout],
+ push_constant_ranges: &[],
};
let coarse_bin_pipeline = gpu.create_compute_pipeline(&ComputePipelineDesc {