pub use self::{compute::ComputePipeline, graphics::GraphicsPipeline, layout::PipelineLayout};
use crate::{device::DeviceOwned, macros::vulkan_enum};
use std::sync::Arc;
pub mod cache;
pub mod compute;
pub mod graphics;
pub mod layout;
pub trait Pipeline: DeviceOwned {
fn bind_point(&self) -> PipelineBindPoint;
fn layout(&self) -> &Arc<PipelineLayout>;
fn num_used_descriptor_sets(&self) -> u32;
}
vulkan_enum! {
#[non_exhaustive]
PipelineBindPoint = PipelineBindPoint(i32);
Compute = COMPUTE,
Graphics = GRAPHICS,
}
vulkan_enum! {
#[non_exhaustive]
DynamicState = DynamicState(i32);
Viewport = VIEWPORT,
Scissor = SCISSOR,
LineWidth = LINE_WIDTH,
DepthBias = DEPTH_BIAS,
BlendConstants = BLEND_CONSTANTS,
DepthBounds = DEPTH_BOUNDS,
StencilCompareMask = STENCIL_COMPARE_MASK,
StencilWriteMask = STENCIL_WRITE_MASK,
StencilReference = STENCIL_REFERENCE,
CullMode = CULL_MODE {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state],
},
FrontFace = FRONT_FACE {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state],
},
PrimitiveTopology = PRIMITIVE_TOPOLOGY {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state],
},
ViewportWithCount = VIEWPORT_WITH_COUNT {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state],
},
ScissorWithCount = SCISSOR_WITH_COUNT {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state],
},
VertexInputBindingStride = VERTEX_INPUT_BINDING_STRIDE {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state],
},
DepthTestEnable = DEPTH_TEST_ENABLE {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state],
},
DepthWriteEnable = DEPTH_WRITE_ENABLE {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state],
},
DepthCompareOp = DEPTH_COMPARE_OP {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state],
},
DepthBoundsTestEnable = DEPTH_BOUNDS_TEST_ENABLE {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state],
},
StencilTestEnable = STENCIL_TEST_ENABLE {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state],
},
StencilOp = STENCIL_OP {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state],
},
RasterizerDiscardEnable = RASTERIZER_DISCARD_ENABLE {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state2],
},
DepthBiasEnable = DEPTH_BIAS_ENABLE {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state2],
},
PrimitiveRestartEnable = PRIMITIVE_RESTART_ENABLE {
api_version: V1_3,
device_extensions: [ext_extended_dynamic_state2],
},
ViewportWScaling = VIEWPORT_W_SCALING_NV {
device_extensions: [nv_clip_space_w_scaling],
},
DiscardRectangle = DISCARD_RECTANGLE_EXT {
device_extensions: [ext_discard_rectangles],
},
SampleLocations = SAMPLE_LOCATIONS_EXT {
device_extensions: [ext_sample_locations],
},
RayTracingPipelineStackSize = RAY_TRACING_PIPELINE_STACK_SIZE_KHR {
device_extensions: [khr_ray_tracing_pipeline],
},
ViewportShadingRatePalette = VIEWPORT_SHADING_RATE_PALETTE_NV {
device_extensions: [nv_shading_rate_image],
},
ViewportCoarseSampleOrder = VIEWPORT_COARSE_SAMPLE_ORDER_NV {
device_extensions: [nv_shading_rate_image],
},
ExclusiveScissor = EXCLUSIVE_SCISSOR_NV {
device_extensions: [nv_scissor_exclusive],
},
FragmentShadingRate = FRAGMENT_SHADING_RATE_KHR {
device_extensions: [khr_fragment_shading_rate],
},
LineStipple = LINE_STIPPLE_EXT {
device_extensions: [ext_line_rasterization],
},
VertexInput = VERTEX_INPUT_EXT {
device_extensions: [ext_vertex_input_dynamic_state],
},
PatchControlPoints = PATCH_CONTROL_POINTS_EXT {
device_extensions: [ext_extended_dynamic_state2],
},
LogicOp = LOGIC_OP_EXT {
device_extensions: [ext_extended_dynamic_state2],
},
ColorWriteEnable = COLOR_WRITE_ENABLE_EXT {
device_extensions: [ext_color_write_enable],
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum StateMode<F> {
Fixed(F),
Dynamic,
}
impl<T> From<Option<T>> for StateMode<T> {
fn from(val: Option<T>) -> Self {
match val {
Some(x) => StateMode::Fixed(x),
None => StateMode::Dynamic,
}
}
}
impl<T> From<StateMode<T>> for Option<T> {
fn from(val: StateMode<T>) -> Self {
match val {
StateMode::Fixed(x) => Some(x),
StateMode::Dynamic => None,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PartialStateMode<F, D> {
Fixed(F),
Dynamic(D),
}