Add compute pipeline builder

This commit is contained in:
Jarrod Doyle 2024-04-26 21:19:13 +01:00
parent 83f3606000
commit 8c1383792b
Signed by: Jayrude
GPG Key ID: 38B57B16E7C0ADF7
2 changed files with 52 additions and 1 deletions

View File

@ -8,7 +8,7 @@ pub use self::{
bind_group::{BindGroupBuilder, BindGroupLayoutBuilder}, bind_group::{BindGroupBuilder, BindGroupLayoutBuilder},
buffer::{BufferExt, BulkBufferBuilder}, buffer::{BufferExt, BulkBufferBuilder},
context::{Context, ContextBuilder}, context::{Context, ContextBuilder},
pipeline::RenderPipelineBuilder, pipeline::{ComputePipelineBuilder, RenderPipelineBuilder},
texture::{Texture, TextureBuilder}, texture::{Texture, TextureBuilder},
}; };

View File

@ -106,3 +106,54 @@ impl<'a> RenderPipelineBuilder<'a> {
}) })
} }
} }
pub struct ComputePipelineBuilder<'a> {
label: &'a str,
shader: &'a wgpu::ShaderModule,
layout_descriptor: Option<wgpu::PipelineLayoutDescriptor<'a>>,
}
impl<'a> ComputePipelineBuilder<'a> {
pub fn new(label: &'a str, shader: &'a wgpu::ShaderModule) -> Self {
Self {
label,
shader,
layout_descriptor: None,
}
}
pub fn with_layout(
mut self,
label: &'a str,
bind_group_layouts: &'a [&wgpu::BindGroupLayout],
push_constant_ranges: &'a [wgpu::PushConstantRange],
) -> Self {
let layout_descriptor = wgpu::PipelineLayoutDescriptor {
label: Some(label),
bind_group_layouts,
push_constant_ranges,
};
self.layout_descriptor = Some(layout_descriptor);
self
}
pub fn build(self, context: &Context) -> wgpu::ComputePipeline {
let raw_layout;
let layout = if let Some(descriptor) = self.layout_descriptor {
raw_layout = context.device.create_pipeline_layout(&descriptor);
Some(&raw_layout)
} else {
None
};
context
.device
.create_compute_pipeline(&wgpu::ComputePipelineDescriptor {
label: Some(self.label),
layout,
module: self.shader,
entry_point: "compute",
})
}
}