From: Josh Simmons Date: Sat, 25 May 2024 13:41:30 +0000 (+0200) Subject: narcissus-gpu: Add push constants to pipeline layout X-Git-Url: https://git.nega.tv//gitweb.cgi?a=commitdiff_plain;h=f2dfddc1ae0e0b5cf53c7258eb2dcd22f6907d56;p=josh%2Fnarcissus narcissus-gpu: Add push constants to pipeline layout --- diff --git a/engine/narcissus-gpu/src/backend/vulkan/convert.rs b/engine/narcissus-gpu/src/backend/vulkan/convert.rs index e94f747..3813cbe 100644 --- a/engine/narcissus-gpu/src/backend/vulkan/convert.rs +++ b/engine/narcissus-gpu/src/backend/vulkan/convert.rs @@ -7,7 +7,7 @@ use crate::{ 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] @@ -190,6 +190,15 @@ pub fn vulkan_shader_stage_flags(stage_flags: ShaderStageFlags) -> vk::ShaderSta 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 { diff --git a/engine/narcissus-gpu/src/backend/vulkan/mod.rs b/engine/narcissus-gpu/src/backend/vulkan/mod.rs index c5ec0d0..4b89dc6 100644 --- a/engine/narcissus-gpu/src/backend/vulkan/mod.rs +++ b/engine/narcissus-gpu/src/backend/vulkan/mod.rs @@ -2692,6 +2692,19 @@ impl VulkanDevice { .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() }; @@ -2718,9 +2731,18 @@ impl VulkanDevice { }); 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(); diff --git a/engine/narcissus-gpu/src/lib.rs b/engine/narcissus-gpu/src/lib.rs index c44aaac..26447b1 100644 --- a/engine/narcissus-gpu/src/lib.rs +++ b/engine/narcissus-gpu/src/lib.rs @@ -394,9 +394,17 @@ pub struct DepthBias { 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> { diff --git a/title/shark/src/pipelines/basic.rs b/title/shark/src/pipelines/basic.rs index 1fa174a..ffb6723 100644 --- a/title/shark/src/pipelines/basic.rs +++ b/title/shark/src/pipelines/basic.rs @@ -48,6 +48,7 @@ impl BasicPipeline { let layout = &PipelineLayout { bind_group_layouts: &[uniforms_bind_group_layout, storage_bind_group_layout], + push_constant_ranges: &[], }; let pipeline = gpu.create_graphics_pipeline(&GraphicsPipelineDesc { diff --git a/title/shark/src/pipelines/display_transform.rs b/title/shark/src/pipelines/display_transform.rs index 9ba4ec9..0133787 100644 --- a/title/shark/src/pipelines/display_transform.rs +++ b/title/shark/src/pipelines/display_transform.rs @@ -27,6 +27,7 @@ impl DisplayTransformPipeline { let layout = &PipelineLayout { bind_group_layouts: &[bind_group_layout], + push_constant_ranges: &[], }; let pipeline = gpu.create_compute_pipeline(&ComputePipelineDesc { diff --git a/title/shark/src/pipelines/primitive_2d.rs b/title/shark/src/pipelines/primitive_2d.rs index 01cc833..2af7742 100644 --- a/title/shark/src/pipelines/primitive_2d.rs +++ b/title/shark/src/pipelines/primitive_2d.rs @@ -74,6 +74,7 @@ impl Primitive2dPipeline { let layout = &PipelineLayout { bind_group_layouts: &[bind_group_layout], + push_constant_ranges: &[], }; let coarse_bin_pipeline = gpu.create_compute_pipeline(&ComputePipelineDesc {