preprocess: store parameters in FxHashMap
This commit is contained in:
parent
3b89c065fa
commit
40e4ce908f
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -814,6 +814,7 @@ version = "0.1.0-beta.6"
|
|||
dependencies = [
|
||||
"librashader-common",
|
||||
"nom",
|
||||
"rustc-hash",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
|
|
|
@ -194,10 +194,6 @@ impl LibrashaderError {
|
|||
None
|
||||
}
|
||||
|
||||
pub(crate) fn panic(panic: Box<dyn Any + Send + 'static>) -> libra_error_t {
|
||||
LibrashaderError::UnknownError(panic).export()
|
||||
}
|
||||
|
||||
pub(crate) fn export(self) -> libra_error_t {
|
||||
NonNull::new(Box::into_raw(Box::new(self)))
|
||||
}
|
||||
|
|
|
@ -141,7 +141,7 @@ extern_fn! {
|
|||
}
|
||||
|
||||
extern_fn! {
|
||||
/// Get a list of runtime parameter names.
|
||||
/// Get a list of runtime parameters.
|
||||
///
|
||||
/// ## Safety
|
||||
/// - `preset` must be null or a valid and aligned pointer to a shader preset.
|
||||
|
|
|
@ -15,6 +15,7 @@ description = "RetroArch shaders for all."
|
|||
thiserror = "1.0.37"
|
||||
nom = "7.1.1"
|
||||
librashader-common = { path = "../librashader-common", version = "0.1.0-beta.6" }
|
||||
rustc-hash = "1.1.0"
|
||||
|
||||
[features]
|
||||
default = [ "line_directives" ]
|
||||
|
|
|
@ -7,6 +7,7 @@ use crate::include::read_source;
|
|||
pub use error::*;
|
||||
use librashader_common::ImageFormat;
|
||||
use std::path::Path;
|
||||
use rustc_hash::FxHashMap;
|
||||
|
||||
/// The source file for a single shader pass.
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
|
@ -21,7 +22,7 @@ pub struct ShaderSource {
|
|||
pub name: Option<String>,
|
||||
|
||||
/// The list of shader parameters found in the shader source.
|
||||
pub parameters: Vec<ShaderParameter>,
|
||||
pub parameters: FxHashMap<String, ShaderParameter>,
|
||||
|
||||
/// The image format the shader expects.
|
||||
pub format: ImageFormat,
|
||||
|
@ -71,12 +72,14 @@ pub(crate) fn load_shader_source(path: impl AsRef<Path>) -> Result<ShaderSource,
|
|||
let source = read_source(path)?;
|
||||
let meta = pragma::parse_pragma_meta(&source)?;
|
||||
let text = stage::process_stages(&source)?;
|
||||
let parameters = FxHashMap::from_iter(meta.parameters.into_iter()
|
||||
.map(|p| (p.id.clone(), p)));
|
||||
|
||||
Ok(ShaderSource {
|
||||
vertex: text.vertex,
|
||||
fragment: text.fragment,
|
||||
name: meta.name,
|
||||
parameters: meta.parameters,
|
||||
parameters,
|
||||
format: meta.format,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -224,16 +224,16 @@ where
|
|||
}
|
||||
|
||||
struct UboData {
|
||||
id: u32,
|
||||
descriptor_set: u32,
|
||||
// id: u32,
|
||||
// descriptor_set: u32,
|
||||
binding: u32,
|
||||
size: u32,
|
||||
}
|
||||
|
||||
struct TextureData<'a> {
|
||||
id: u32,
|
||||
// id: u32,
|
||||
// descriptor_set: u32,
|
||||
name: &'a str,
|
||||
descriptor_set: u32,
|
||||
binding: u32,
|
||||
}
|
||||
|
||||
|
@ -276,9 +276,9 @@ where
|
|||
|
||||
let size = ast.get_declared_struct_size(ubo.base_type_id)?;
|
||||
Ok(UboData {
|
||||
descriptor_set,
|
||||
// descriptor_set,
|
||||
// id: ubo.id,
|
||||
binding,
|
||||
id: ubo.id,
|
||||
size,
|
||||
})
|
||||
}
|
||||
|
@ -538,9 +538,9 @@ where
|
|||
}
|
||||
|
||||
Ok(TextureData {
|
||||
id: texture.id,
|
||||
// id: texture.id,
|
||||
// descriptor_set,
|
||||
name: &texture.name,
|
||||
descriptor_set,
|
||||
binding,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -426,7 +426,7 @@ impl FilterChainD3D11 {
|
|||
let spirv = GlslangCompilation::compile(&source)?;
|
||||
let reflect = HLSL::from_compilation(spirv)?;
|
||||
|
||||
for parameter in source.parameters.iter() {
|
||||
for parameter in source.parameters.values() {
|
||||
uniform_semantics.insert(
|
||||
parameter.id.clone(),
|
||||
UniformSemantic::Unique(Semantic {
|
||||
|
|
|
@ -173,7 +173,7 @@ impl<T: GLInterface> FilterChainImpl<T> {
|
|||
let spirv = GlslangCompilation::compile(&source)?;
|
||||
let reflect = GLSL::from_compilation(spirv)?;
|
||||
|
||||
for parameter in source.parameters.iter() {
|
||||
for parameter in source.parameters.values() {
|
||||
uniform_semantics.insert(
|
||||
parameter.id.clone(),
|
||||
UniformSemantic::Unique(Semantic {
|
||||
|
|
|
@ -297,7 +297,7 @@ impl FilterChainVulkan {
|
|||
let spirv = GlslangCompilation::compile(&source)?;
|
||||
let reflect = SPIRV::from_compilation(spirv)?;
|
||||
|
||||
for parameter in source.parameters.iter() {
|
||||
for parameter in source.parameters.values() {
|
||||
uniform_semantics.insert(
|
||||
parameter.id.clone(),
|
||||
UniformSemantic::Unique(Semantic {
|
||||
|
|
|
@ -99,7 +99,7 @@ where
|
|||
pass_feedback: impl Iterator<Item = Option<impl AsRef<Self::InputTexture>>>,
|
||||
original_history: impl Iterator<Item = Option<impl AsRef<Self::InputTexture>>>,
|
||||
lookup_textures: impl Iterator<Item = (usize, impl AsRef<Self::InputTexture>)>,
|
||||
parameter_defaults: &[ShaderParameter],
|
||||
parameter_defaults: &HashMap<String, ShaderParameter, impl BuildHasher>,
|
||||
runtime_parameters: &HashMap<String, f32, impl BuildHasher>,
|
||||
) {
|
||||
// Bind MVP
|
||||
|
@ -238,13 +238,12 @@ where
|
|||
{
|
||||
let id = id.as_str();
|
||||
|
||||
let default = parameter_defaults
|
||||
.iter()
|
||||
.find(|&p| p.id == id)
|
||||
let default = parameter_defaults.get(id)
|
||||
.map(|f| f.initial)
|
||||
.unwrap_or(0f32);
|
||||
|
||||
let value = *runtime_parameters.get(id).unwrap_or(&default);
|
||||
let value = *runtime_parameters.get(id)
|
||||
.unwrap_or(&default);
|
||||
|
||||
uniform_storage.bind_scalar(offset.offset(), value, offset.context());
|
||||
}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
use librashader_common::Size;
|
||||
use librashader_reflect::reflect::semantics::MemberOffset;
|
||||
use std::marker::PhantomData;
|
||||
|
||||
|
|
|
@ -47,7 +47,9 @@ pub mod presets {
|
|||
let iters: Result<Vec<Vec<ShaderParameter>>, PreprocessError> = preset
|
||||
.shaders
|
||||
.iter()
|
||||
.map(|s| ShaderSource::load(&s.name).map(|s| s.parameters))
|
||||
.map(|s| ShaderSource::load(&s.name).map(|s|
|
||||
s.parameters.into_values()
|
||||
.collect()))
|
||||
.into_iter()
|
||||
.collect();
|
||||
let iters = iters?;
|
||||
|
|
Loading…
Reference in a new issue