diff options
Diffstat (limited to 'src/pipeline/graphics/multisample.rs')
-rw-r--r-- | src/pipeline/graphics/multisample.rs | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/pipeline/graphics/multisample.rs b/src/pipeline/graphics/multisample.rs new file mode 100644 index 0000000..67476cc --- /dev/null +++ b/src/pipeline/graphics/multisample.rs @@ -0,0 +1,80 @@ +// Copyright (c) 2016 The vulkano developers +// Licensed under the Apache License, Version 2.0 +// <LICENSE-APACHE or +// https://www.apache.org/licenses/LICENSE-2.0> or the MIT +// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, +// at your option. All files in the project carrying such +// notice may not be copied, modified, or distributed except +// according to those terms. + +//! Generates multiple fragments per framebuffer pixel when rasterizing. This can be used for +//! anti-aliasing. + +use crate::image::SampleCount; + +// TODO: handle some weird behaviors with non-floating-point targets + +/// State of the multisampling. +#[derive(Copy, Clone, Debug)] +pub struct MultisampleState { + /// The number of rasterization samples to take per pixel. The GPU will pick this many different + /// locations within each pixel and assign to each of these locations a different depth value. + /// The depth and stencil test will then be run for each sample. + /// + /// The default value is [`SampleCount::Sample1`]. + pub rasterization_samples: SampleCount, + + /// Controls the proportion (between 0.0 and 1.0) of the samples that will be run through the + /// fragment shader. + /// + /// If the value is 1.0, then all sub-pixel samples will run + /// through the shader and get a different value. If the value is 0.5, about half of the samples + /// will run through the shader and the other half will get their values from the ones which + /// went through the shader. + /// + /// If set to `Some`, the [`sample_rate_shading`](crate::device::Features::sample_rate_shading) + /// feature must be enabled on the device. + pub sample_shading: Option<f32>, + + /// A mask of bits that is ANDed with the coverage mask of each set of `rasterization_samples` + /// samples. Only the first `rasterization_samples / 32` bits are used, the rest is ignored. + /// + /// The default value is `[0xFFFFFFFF; 2]`. + pub sample_mask: [u32; 2], // 64 bits for needed for 64 SampleCount + + /// Controls whether the alpha value of the fragment will be used in an implementation-defined + /// way to determine which samples get disabled or not. For example if the alpha value is 0.5, + /// then about half of the samples will be discarded. If you render to a multisample image, this + /// means that the color will end up being mixed with whatever color was underneath, which gives + /// the same effect as alpha blending. + pub alpha_to_coverage_enable: bool, + + /// Controls whether the alpha value of all the samples will be forced to 1.0 (or the + /// maximum possible value) after the effects of `alpha_to_coverage` have been applied. + /// + /// If set to `true`, the [`alpha_to_one`](crate::device::Features::alpha_to_one) + /// feature must be enabled on the device. + pub alpha_to_one_enable: bool, +} + +impl MultisampleState { + /// Creates a `MultisampleState` with multisampling disabled. + #[inline] + pub fn new() -> MultisampleState { + MultisampleState { + rasterization_samples: SampleCount::Sample1, + sample_shading: None, + sample_mask: [0xFFFFFFFF; 2], + alpha_to_coverage_enable: false, + alpha_to_one_enable: false, + } + } +} + +impl Default for MultisampleState { + /// Returns [`MultisampleState::new()`]. + #[inline] + fn default() -> Self { + Self::new() + } +} |