blob: 67476cc69fbd075539785f7a78b92c669cbc6444 [file] [log] [blame]
// 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()
}
}