From e522421df2554114848d4baf49d793aabd6df602 Mon Sep 17 00:00:00 2001 From: chyyran <ronny@ronnychan.ca> Date: Fri, 24 Feb 2023 01:06:54 -0500 Subject: [PATCH] presets: move resolve to values --- librashader-presets/src/parse/mod.rs | 3 +- librashader-presets/src/parse/preset.rs | 201 ------------------------ librashader-presets/src/parse/value.rs | 199 ++++++++++++++++++++++- 3 files changed, 199 insertions(+), 204 deletions(-) delete mode 100644 librashader-presets/src/parse/preset.rs diff --git a/librashader-presets/src/parse/mod.rs b/librashader-presets/src/parse/mod.rs index c98ffd9..23427d8 100644 --- a/librashader-presets/src/parse/mod.rs +++ b/librashader-presets/src/parse/mod.rs @@ -1,6 +1,5 @@ use std::path::Path; -mod preset; mod value; pub(crate) use value::Value; @@ -8,7 +7,7 @@ pub(crate) use value::ShaderType; pub(crate) use value::ShaderStage; use crate::error::ParsePresetError; -use crate::parse::preset::resolve_values; +use value::resolve_values; use crate::slang::parse_preset; use crate::ShaderPreset; diff --git a/librashader-presets/src/parse/preset.rs b/librashader-presets/src/parse/preset.rs deleted file mode 100644 index f981d99..0000000 --- a/librashader-presets/src/parse/preset.rs +++ /dev/null @@ -1,201 +0,0 @@ -use librashader_common::ImageFormat; -use crate::parse::ShaderType; -use crate::parse::value::Value; -use crate::{ParameterConfig, remove_if, Scale2D, Scaling, ShaderPassConfig, ShaderPath, ShaderPreset, TextureConfig}; - -pub fn resolve_values(mut values: Vec<Value>) -> ShaderPreset { - let textures: Vec<TextureConfig> = values - .drain_filter(|f| matches!(*f, Value::Texture { .. })) - .map(|value| { - if let Value::Texture { - name, - filter_mode, - wrap_mode, - mipmap, - path, - } = value - { - TextureConfig { - name, - path, - wrap_mode, - filter_mode, - mipmap, - } - } else { - unreachable!("values should all be of type Texture") - } - }) - .collect(); - let parameters: Vec<ParameterConfig> = values - .drain_filter(|f| matches!(*f, Value::Parameter { .. })) - .map(|value| { - if let Value::Parameter(name, value) = value { - ParameterConfig { name, value } - } else { - unreachable!("values should be all of type parameters") - } - }) - .collect(); - - let mut shaders = Vec::new(); - let shader_count = - remove_if(&mut values, |v| matches!(*v, Value::ShaderCount(_))).map_or(0, |value| { - if let Value::ShaderCount(count) = value { - count - } else { - unreachable!("value should be of type shader_count") - } - }); - - #[cfg(feature = "parse_legacy_glsl")] - let feedback_pass = remove_if(&mut values, |v| matches!(*v, Value::FeedbackPass(_))) - .map(|value| { - if let Value::FeedbackPass(pass) = value { - pass - } else { - unreachable!("value should be of type feedback_pass") - } - }) - .unwrap_or(0); - - for shader in 0..shader_count { - if let Some(Value::Shader(id, ShaderType::Slang, name)) = remove_if( - &mut values, - |v| matches!(*v, Value::Shader(shader_index, ShaderType::Slang, _) if shader_index == shader), - ) { - let shader_values: Vec<Value> = values - .drain_filter(|v| v.shader_index() == Some(shader)) - .collect(); - let scale_type = shader_values.iter().find_map(|f| match f { - Value::ScaleType(_, value) => Some(*value), - _ => None, - }); - - let mut scale_type_x = shader_values.iter().find_map(|f| match f { - Value::ScaleTypeX(_, value) => Some(*value), - _ => None, - }); - - let mut scale_type_y = shader_values.iter().find_map(|f| match f { - Value::ScaleTypeY(_, value) => Some(*value), - _ => None, - }); - - if scale_type.is_some() { - // scale takes priority - // https://github.com/libretro/RetroArch/blob/fcbd72dbf3579eb31721fbbf0d89a139834bcce9/gfx/video_shader_parse.c#L310 - scale_type_x = scale_type; - scale_type_y = scale_type; - } - - let scale_valid = scale_type_x.is_some() || scale_type_y.is_some(); - - let scale = shader_values.iter().find_map(|f| match f { - Value::Scale(_, value) => Some(*value), - _ => None, - }); - - let mut scale_x = shader_values.iter().find_map(|f| match f { - Value::ScaleX(_, value) => Some(*value), - _ => None, - }); - - let mut scale_y = shader_values.iter().find_map(|f| match f { - Value::ScaleY(_, value) => Some(*value), - _ => None, - }); - - if scale.is_some() { - // scale takes priority - // https://github.com/libretro/RetroArch/blob/fcbd72dbf3579eb31721fbbf0d89a139834bcce9/gfx/video_shader_parse.c#L310 - scale_x = scale; - 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, - source_path: ShaderPath::Slang(name), - alias: shader_values.iter().find_map(|f| match f { - Value::Alias(_, value) => Some(value.to_string()), - _ => None, - }), - filter: shader_values - .iter() - .find_map(|f| match f { - Value::FilterMode(_, value) => Some(*value), - _ => None, - }) - .unwrap_or_default(), - wrap_mode: shader_values - .iter() - .find_map(|f| match f { - Value::WrapMode(_, value) => Some(*value), - _ => None, - }) - .unwrap_or_default(), - frame_count_mod: shader_values - .iter() - .find_map(|f| match f { - Value::FrameCountMod(_, value) => Some(*value), - _ => None, - }) - .unwrap_or(0), - framebuffer_format_override: framebuffer_format, - mipmap_input: shader_values - .iter() - .find_map(|f| match f { - Value::MipmapInput(_, value) => Some(*value), - _ => None, - }) - .unwrap_or(false), - scaling: Scale2D { - valid: scale_valid, - x: Scaling { - scale_type: scale_type_x.unwrap_or_default(), - factor: scale_x.unwrap_or_default(), - }, - y: Scaling { - scale_type: scale_type_y.unwrap_or_default(), - factor: scale_y.unwrap_or_default(), - }, - }, - }; - - shaders.push(shader) - } - } - - ShaderPreset { - #[cfg(feature = "parse_legacy_glsl")] - feedback_pass, - shader_count, - shaders, - textures, - parameters, - } -} diff --git a/librashader-presets/src/parse/value.rs b/librashader-presets/src/parse/value.rs index 303a82f..d740436 100644 --- a/librashader-presets/src/parse/value.rs +++ b/librashader-presets/src/parse/value.rs @@ -1,4 +1,4 @@ -use crate::{ScaleFactor, ScaleType}; +use crate::{ParameterConfig, remove_if, Scale2D, ScaleFactor, ScaleType, Scaling, ShaderPassConfig, ShaderPath, ShaderPreset, TextureConfig}; use librashader_common::{FilterMode, ImageFormat, WrapMode}; use std::path::PathBuf; @@ -66,3 +66,200 @@ impl Value { } } } + +pub fn resolve_values(mut values: Vec<Value>) -> ShaderPreset { + let textures: Vec<TextureConfig> = values + .drain_filter(|f| matches!(*f, Value::Texture { .. })) + .map(|value| { + if let Value::Texture { + name, + filter_mode, + wrap_mode, + mipmap, + path, + } = value + { + TextureConfig { + name, + path, + wrap_mode, + filter_mode, + mipmap, + } + } else { + unreachable!("values should all be of type Texture") + } + }) + .collect(); + let parameters: Vec<ParameterConfig> = values + .drain_filter(|f| matches!(*f, Value::Parameter { .. })) + .map(|value| { + if let Value::Parameter(name, value) = value { + ParameterConfig { name, value } + } else { + unreachable!("values should be all of type parameters") + } + }) + .collect(); + + let mut shaders = Vec::new(); + let shader_count = + remove_if(&mut values, |v| matches!(*v, Value::ShaderCount(_))).map_or(0, |value| { + if let Value::ShaderCount(count) = value { + count + } else { + unreachable!("value should be of type shader_count") + } + }); + + #[cfg(feature = "parse_legacy_glsl")] + let feedback_pass = remove_if(&mut values, |v| matches!(*v, Value::FeedbackPass(_))) + .map(|value| { + if let Value::FeedbackPass(pass) = value { + pass + } else { + unreachable!("value should be of type feedback_pass") + } + }) + .unwrap_or(0); + + for shader in 0..shader_count { + if let Some(Value::Shader(id, ShaderType::Slang, name)) = remove_if( + &mut values, + |v| matches!(*v, Value::Shader(shader_index, ShaderType::Slang, _) if shader_index == shader), + ) { + let shader_values: Vec<Value> = values + .drain_filter(|v| v.shader_index() == Some(shader)) + .collect(); + let scale_type = shader_values.iter().find_map(|f| match f { + Value::ScaleType(_, value) => Some(*value), + _ => None, + }); + + let mut scale_type_x = shader_values.iter().find_map(|f| match f { + Value::ScaleTypeX(_, value) => Some(*value), + _ => None, + }); + + let mut scale_type_y = shader_values.iter().find_map(|f| match f { + Value::ScaleTypeY(_, value) => Some(*value), + _ => None, + }); + + if scale_type.is_some() { + // scale takes priority + // https://github.com/libretro/RetroArch/blob/fcbd72dbf3579eb31721fbbf0d89a139834bcce9/gfx/video_shader_parse.c#L310 + scale_type_x = scale_type; + scale_type_y = scale_type; + } + + let scale_valid = scale_type_x.is_some() || scale_type_y.is_some(); + + let scale = shader_values.iter().find_map(|f| match f { + Value::Scale(_, value) => Some(*value), + _ => None, + }); + + let mut scale_x = shader_values.iter().find_map(|f| match f { + Value::ScaleX(_, value) => Some(*value), + _ => None, + }); + + let mut scale_y = shader_values.iter().find_map(|f| match f { + Value::ScaleY(_, value) => Some(*value), + _ => None, + }); + + if scale.is_some() { + // scale takes priority + // https://github.com/libretro/RetroArch/blob/fcbd72dbf3579eb31721fbbf0d89a139834bcce9/gfx/video_shader_parse.c#L310 + scale_x = scale; + 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, + source_path: ShaderPath::Slang(name), + alias: shader_values.iter().find_map(|f| match f { + Value::Alias(_, value) => Some(value.to_string()), + _ => None, + }), + filter: shader_values + .iter() + .find_map(|f| match f { + Value::FilterMode(_, value) => Some(*value), + _ => None, + }) + .unwrap_or_default(), + wrap_mode: shader_values + .iter() + .find_map(|f| match f { + Value::WrapMode(_, value) => Some(*value), + _ => None, + }) + .unwrap_or_default(), + frame_count_mod: shader_values + .iter() + .find_map(|f| match f { + Value::FrameCountMod(_, value) => Some(*value), + _ => None, + }) + .unwrap_or(0), + framebuffer_format_override: framebuffer_format, + mipmap_input: shader_values + .iter() + .find_map(|f| match f { + Value::MipmapInput(_, value) => Some(*value), + _ => None, + }) + .unwrap_or(false), + scaling: Scale2D { + valid: scale_valid, + x: Scaling { + scale_type: scale_type_x.unwrap_or_default(), + factor: scale_x.unwrap_or_default(), + }, + y: Scaling { + scale_type: scale_type_y.unwrap_or_default(), + factor: scale_y.unwrap_or_default(), + }, + }, + }; + + shaders.push(shader) + } + } + + ShaderPreset { + #[cfg(feature = "parse_legacy_glsl")] + feedback_pass, + shader_count, + shaders, + textures, + parameters, + } +}