use ash::vk;
use crate::pipeline::pipeline_layout::PipelineLayoutCreateInfo;
use crate::ShaderCreateInfo;
#[derive(Debug, Hash, PartialEq, Eq, Clone)]
pub struct ComputePipelineCreateInfo {
pub shader: Option<ShaderCreateInfo>,
pub(crate) name: String,
pub(crate) layout: PipelineLayoutCreateInfo,
pub(crate) persistent: bool,
}
impl ComputePipelineCreateInfo {
pub(crate) fn to_vk(&self, layout: vk::PipelineLayout) -> vk::ComputePipelineCreateInfo {
vk::ComputePipelineCreateInfo {
s_type: vk::StructureType::COMPUTE_PIPELINE_CREATE_INFO,
p_next: std::ptr::null(),
flags: Default::default(),
stage: Default::default(),
layout,
base_pipeline_handle: Default::default(),
base_pipeline_index: 0,
}
}
}
#[derive(Debug)]
pub struct ComputePipelineBuilder {
inner: ComputePipelineCreateInfo,
}
impl ComputePipelineBuilder {
pub fn new(name: impl Into<String>) -> Self {
Self {
inner: ComputePipelineCreateInfo {
shader: None,
name: name.into(),
layout: Default::default(),
persistent: false,
},
}
}
pub fn set_shader(mut self, shader: ShaderCreateInfo) -> Self {
self.inner.shader = Some(shader);
self
}
pub fn persistent(mut self) -> Self {
self.inner.persistent = true;
self
}
pub fn build(self) -> ComputePipelineCreateInfo {
self.inner
}
pub fn name(&self) -> &str {
&self.inner.name
}
}