preset: generalize framebuffer format override
This commit is contained in:
parent
31235971db
commit
c86d39bf5a
|
@ -1,3 +1,4 @@
|
|||
use librashader_common::ImageFormat;
|
||||
use crate::parse::remove_if;
|
||||
use crate::parse::value::Value;
|
||||
use crate::{ParameterConfig, Scale2D, Scaling, ShaderPassConfig, ShaderPreset, TextureConfig};
|
||||
|
@ -112,6 +113,30 @@ pub fn resolve_values(mut values: Vec<Value>) -> ShaderPreset {
|
|||
scale_y = scale;
|
||||
}
|
||||
|
||||
let srgb_frambuffer = shader_values
|
||||
.iter()
|
||||
.find_map(|f| match f {
|
||||
Value::SrgbFramebuffer(_, value) => Some(*value),
|
||||
_ => None,
|
||||
})
|
||||
.unwrap_or(false);
|
||||
|
||||
let float_framebuffer = shader_values
|
||||
.iter()
|
||||
.find_map(|f| match f {
|
||||
Value::FloatFramebuffer(_, value) => Some(*value),
|
||||
_ => None,
|
||||
})
|
||||
.unwrap_or(false);
|
||||
|
||||
let framebuffer_format = if srgb_frambuffer {
|
||||
Some(ImageFormat::R8G8B8A8Srgb)
|
||||
} else if float_framebuffer {
|
||||
Some(ImageFormat::R16G16B16A16Sfloat)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let shader = ShaderPassConfig {
|
||||
id,
|
||||
name,
|
||||
|
@ -140,20 +165,7 @@ pub fn resolve_values(mut values: Vec<Value>) -> ShaderPreset {
|
|||
_ => None,
|
||||
})
|
||||
.unwrap_or(0),
|
||||
srgb_framebuffer: shader_values
|
||||
.iter()
|
||||
.find_map(|f| match f {
|
||||
Value::SrgbFramebuffer(_, value) => Some(*value),
|
||||
_ => None,
|
||||
})
|
||||
.unwrap_or(false),
|
||||
float_framebuffer: shader_values
|
||||
.iter()
|
||||
.find_map(|f| match f {
|
||||
Value::FloatFramebuffer(_, value) => Some(*value),
|
||||
_ => None,
|
||||
})
|
||||
.unwrap_or(false),
|
||||
framebuffer_format_override: framebuffer_format,
|
||||
mipmap_input: shader_values
|
||||
.iter()
|
||||
.find_map(|f| match f {
|
||||
|
|
|
@ -19,10 +19,11 @@ pub struct ShaderPassConfig {
|
|||
pub wrap_mode: WrapMode,
|
||||
/// The number to which to wrap the frame count before passing it to the uniforms.
|
||||
pub frame_count_mod: u32,
|
||||
/// Whether or not this shader pass expects an SRGB framebuffer output.
|
||||
pub srgb_framebuffer: bool,
|
||||
/// Whether or not this shader pass expects an float framebuffer output.
|
||||
pub float_framebuffer: bool,
|
||||
/// If the preset overrides the framebuffer format, get the format override.
|
||||
///
|
||||
/// The precedence is always SRGB, then float. For quark shaders, this is
|
||||
/// specified in the shader manifest.
|
||||
pub framebuffer_format_override: Option<ImageFormat>,
|
||||
/// Whether or not to generate mipmaps for the input texture before passing to the shader.
|
||||
pub mipmap_input: bool,
|
||||
/// Specifies the scaling of the output framebuffer for this shader pass.
|
||||
|
@ -30,18 +31,6 @@ pub struct ShaderPassConfig {
|
|||
}
|
||||
|
||||
impl ShaderPassConfig {
|
||||
/// If the framebuffer expects a different format than what was defined in the
|
||||
/// shader source, returns such format.
|
||||
#[inline(always)]
|
||||
pub fn get_format_override(&self) -> Option<ImageFormat> {
|
||||
if self.srgb_framebuffer {
|
||||
return Some(ImageFormat::R8G8B8A8Srgb);
|
||||
} else if self.float_framebuffer {
|
||||
return Some(ImageFormat::R16G16B16A16Sfloat);
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn get_frame_count(&self, count: usize) -> u32 {
|
||||
(if self.frame_count_mod > 0 {
|
||||
|
|
|
@ -432,7 +432,7 @@ impl FilterChainD3D12 {
|
|||
librashader_reflect::back::dxil::ShaderModel::ShaderModel6_0,
|
||||
))?;
|
||||
|
||||
let render_format = if let Some(format) = config.get_format_override() {
|
||||
let render_format = if let Some(format) = config.framebuffer_format_override {
|
||||
format
|
||||
} else if source.format != ImageFormat::Unknown {
|
||||
source.format
|
||||
|
|
|
@ -428,7 +428,7 @@ impl FilterChainVulkan {
|
|||
|
||||
let render_pass_format = if !use_render_pass {
|
||||
vk::Format::UNDEFINED
|
||||
} else if let Some(format) = config.get_format_override() {
|
||||
} else if let Some(format) = config.framebuffer_format_override {
|
||||
format.into()
|
||||
} else if source.format != ImageFormat::Unknown {
|
||||
source.format.into()
|
||||
|
|
|
@ -13,7 +13,7 @@ pub trait FilterPassMeta {
|
|||
#[inline(always)]
|
||||
fn get_format(&self) -> ImageFormat {
|
||||
let fb_format = self.framebuffer_format();
|
||||
if let Some(format) = self.config().get_format_override() {
|
||||
if let Some(format) = self.config().framebuffer_format_override {
|
||||
format
|
||||
} else if fb_format == ImageFormat::Unknown {
|
||||
ImageFormat::R8G8B8A8Unorm
|
||||
|
|
Loading…
Reference in a new issue