Skip to content

Commit 2fe66d9

Browse files
committed
reflect: put vars to end with running link pass to fix naga ordering
1 parent ed8bf63 commit 2fe66d9

File tree

5 files changed

+131
-105
lines changed

5 files changed

+131
-105
lines changed

librashader-reflect/src/back/wgsl.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,12 @@ mod test {
5656

5757
#[test]
5858
pub fn test_into() {
59+
let result =
60+
ShaderSource::load("../test/shaders_slang/crt/shaders/slotmask.slang").unwrap();
61+
5962
// let result = ShaderSource::load("../test/shaders_slang/crt/shaders/crt-royale/src/crt-royale-scanlines-horizontal-apply-mask.slang").unwrap();
6063
// let result = ShaderSource::load("../test/shaders_slang/crt/shaders/crt-royale/src/crt-royale-scanlines-horizontal-apply-mask.slang").unwrap();
61-
let result = ShaderSource::load("../test/basic.slang").unwrap();
64+
// let result = ShaderSource::load("../test/basic.slang").unwrap();
6265

6366
let mut uniform_semantics: FastHashMap<ShortString, UniformSemantic> = Default::default();
6467

librashader-reflect/src/front/spirv_passes/link_input_outputs.rs

+29-5
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,30 @@ impl<'a> LinkInputs<'a> {
9898
pub fn do_pass(&mut self) {
9999
self.trim_inputs();
100100
self.downgrade_outputs();
101+
self.put_vertex_variables_to_end();
102+
}
103+
104+
fn put_vertex_variables_to_end(&mut self) {
105+
// this is easier than doing proper topo sort.
106+
// we need it so that all type definitions are valid before
107+
// being referred to by a variable.
108+
let mut vars = Vec::new();
109+
110+
self.vert_builder
111+
.module_mut()
112+
.types_global_values
113+
.retain(|instr| {
114+
if instr.class.opcode == spirv::Op::Variable {
115+
vars.push(instr.clone());
116+
return false;
117+
};
118+
true
119+
});
120+
121+
self.vert_builder
122+
.module_mut()
123+
.types_global_values
124+
.append(&mut vars);
101125
}
102126

103127
/// Downgrade dead inputs corresponding to outputs to global variables, keeping existing mappings.
@@ -111,7 +135,7 @@ impl<'a> LinkInputs<'a> {
111135
let mut pointer_types_to_downgrade = FxHashSet::default();
112136

113137
// Map from Pointer type to pointee
114-
let mut pointer_type_pointee = Vec::new();
138+
let mut pointer_type_pointee = FxHashMap::default();
115139

116140
// Map from StorageClass Output to StorageClass Private
117141
let mut downgraded_pointer_types = FxHashMap::default();
@@ -152,18 +176,18 @@ impl<'a> LinkInputs<'a> {
152176
continue;
153177
};
154178

155-
pointer_type_pointee.push((id, pointee_type));
179+
pointer_type_pointee.insert(id, pointee_type);
156180
}
157181
}
158182

159183
// Create pointer types for everything we saw above with Private storage class.
160184
// We don't have to deal with OpTypeForwardPointer, because PhysicalStorageBuffer
161185
// is not valid in slang shaders, and we're only working with Vulkan inputs.
162-
for (pointer_type, pointee_type) in pointer_type_pointee.into_iter() {
186+
for (pointer_type, pointee_type) in pointer_type_pointee.iter() {
163187
// Create a new private type
164188
let private_pointer_type =
165189
self.vert_builder
166-
.type_pointer(None, StorageClass::Private, pointee_type);
190+
.type_pointer(None, StorageClass::Private, *pointee_type);
167191

168192
// Add it to the mapping
169193
downgraded_pointer_types.insert(pointer_type, private_pointer_type);
@@ -196,7 +220,7 @@ impl<'a> LinkInputs<'a> {
196220
continue;
197221
};
198222

199-
let Some(new_type) = downgraded_pointer_types.get(&result_type) else {
223+
let Some(new_type) = downgraded_pointer_types.get(&*result_type) else {
200224
// We should have created one above.
201225
continue;
202226
};

librashader-reflect/src/reflect/cross/mod.rs

+47-50
Original file line numberDiff line numberDiff line change
@@ -829,54 +829,51 @@ mod test {
829829
use crate::reflect::semantics::{Semantic, ShaderSemantics, UniformSemantic, UniqueSemantics};
830830
use librashader_common::map::{FastHashMap, ShortString};
831831
use librashader_preprocess::ShaderSource;
832-
use spirv_cross::glsl::{CompilerOptions, Version};
833-
use spirv_cross::hlsl::ShaderModel;
834-
use spirv_cross::{glsl, hlsl};
835-
836-
#[test]
837-
pub fn test_into() {
838-
let result = ShaderSource::load("../test/basic.slang").unwrap();
839-
let mut uniform_semantics: FastHashMap<ShortString, UniformSemantic> = Default::default();
840-
841-
for (_index, param) in result.parameters.iter().enumerate() {
842-
uniform_semantics.insert(
843-
param.1.id.clone(),
844-
UniformSemantic::Unique(Semantic {
845-
semantics: UniqueSemantics::FloatParameter,
846-
index: (),
847-
}),
848-
);
849-
}
850-
let spirv = Glslang::compile(&result).unwrap();
851-
let mut reflect = CrossReflect::<hlsl::Target>::try_from(&spirv).unwrap();
852-
let shader_reflection = reflect
853-
.reflect(
854-
0,
855-
&ShaderSemantics {
856-
uniform_semantics,
857-
texture_semantics: Default::default(),
858-
},
859-
)
860-
.unwrap();
861-
let mut opts = hlsl::CompilerOptions::default();
862-
opts.shader_model = ShaderModel::V3_0;
863-
864-
let compiled: ShaderCompilerOutput<String, CrossHlslContext> =
865-
<CrossReflect<hlsl::Target> as CompileShader<HLSL>>::compile(
866-
reflect,
867-
Some(ShaderModel::V3_0),
868-
)
869-
.unwrap();
870-
871-
println!("{:?}", shader_reflection.meta);
872-
println!("{}", compiled.fragment);
873-
println!("{}", compiled.vertex);
874-
875-
// // eprintln!("{shader_reflection:#?}");
876-
// eprintln!("{}", compiled.fragment)
877-
// let mut loader = rspirv::dr::Loader::new();
878-
// rspirv::binary::parse_words(spirv.fragment.as_binary(), &mut loader).unwrap();
879-
// let module = loader.module();
880-
// println!("{:#}", module.disassemble());
881-
}
832+
833+
// #[test]
834+
// pub fn test_into() {
835+
// let result = ShaderSource::load("../test/basic.slang").unwrap();
836+
// let mut uniform_semantics: FastHashMap<ShortString, UniformSemantic> = Default::default();
837+
//
838+
// for (_index, param) in result.parameters.iter().enumerate() {
839+
// uniform_semantics.insert(
840+
// param.1.id.clone(),
841+
// UniformSemantic::Unique(Semantic {
842+
// semantics: UniqueSemantics::FloatParameter,
843+
// index: (),
844+
// }),
845+
// );
846+
// }
847+
// let spirv = Glslang::compile(&result).unwrap();
848+
// let mut reflect = CrossReflect::<hlsl::Target>::try_from(&spirv).unwrap();
849+
// let shader_reflection = reflect
850+
// .reflect(
851+
// 0,
852+
// &ShaderSemantics {
853+
// uniform_semantics,
854+
// texture_semantics: Default::default(),
855+
// },
856+
// )
857+
// .unwrap();
858+
// let mut opts = hlsl::CompilerOptions::default();
859+
// opts.shader_model = ShaderModel::V3_0;
860+
//
861+
// let compiled: ShaderCompilerOutput<String, CrossHlslContext> =
862+
// <CrossReflect<hlsl::Target> as CompileShader<HLSL>>::compile(
863+
// reflect,
864+
// Some(ShaderModel::V3_0),
865+
// )
866+
// .unwrap();
867+
//
868+
// println!("{:?}", shader_reflection.meta);
869+
// println!("{}", compiled.fragment);
870+
// println!("{}", compiled.vertex);
871+
//
872+
// // // eprintln!("{shader_reflection:#?}");
873+
// // eprintln!("{}", compiled.fragment)
874+
// // let mut loader = rspirv::dr::Loader::new();
875+
// // rspirv::binary::parse_words(spirv.fragment.as_binary(), &mut loader).unwrap();
876+
// // let module = loader.module();
877+
// // println!("{:#}", module.disassemble());
878+
// }
882879
}

librashader-reflect/src/reflect/naga/mod.rs

+13-11
Original file line numberDiff line numberDiff line change
@@ -1046,25 +1046,27 @@ impl ReflectShader for NagaReflect {
10461046

10471047
#[cfg(test)]
10481048
mod test {
1049+
use crate::front::ShaderInputCompiler;
10491050
use crate::reflect::semantics::{Semantic, TextureSemantics, UniformSemantic};
10501051
use librashader_common::map::FastHashMap;
10511052
use librashader_preprocess::ShaderSource;
10521053
use librashader_presets::ShaderPreset;
10531054

10541055
// #[test]
10551056
// pub fn test_into() {
1056-
// let result = ShaderSource::load("../test/slang-shaders/crt/shaders/crt-royale/src/crt-royale-scanlines-horizontal-apply-mask.slang").unwrap();
1057-
// let compilation = crate::front::GlslangCompilation::try_from(&result).unwrap();
1057+
// let result = ShaderSource::load("../test/slang-shaders/misc/shaders/simple_color_controls.slang").unwrap();
1058+
// let compilation = crate::front::Glslang::compile(&result).unwrap();
10581059
//
1059-
// let mut loader = rspirv::dr::Loader::new();
1060-
// rspirv::binary::parse_words(compilation.vertex.as_binary(), &mut loader).unwrap();
1061-
// let module = loader.module();
1062-
//
1063-
// let outputs: Vec<&Instruction> = module
1064-
// .types_global_values
1065-
// .iter()
1066-
// .filter(|i| i.class.opcode == Op::Variable)
1067-
// .collect();
1060+
// crate::front::n
1061+
// // let mut loader = rspirv::dr::Loader::new();
1062+
// // rspirv::binary::parse_words(compilation.vertex.as_binary(), &mut loader).unwrap();
1063+
// // let module = loader.module();
1064+
// //
1065+
// // let outputs: Vec<&Instruction> = module
1066+
// // .types_global_values
1067+
// // .iter()
1068+
// // .filter(|i| i.class.opcode == Op::Variable)
1069+
// // .collect();
10681070
//
10691071
// println!("{outputs:#?}");
10701072
// }

librashader-reflect/src/reflect/naga/msl.rs

+38-38
Original file line numberDiff line numberDiff line change
@@ -165,42 +165,42 @@ mod test {
165165
use bitflags::Flags;
166166
use librashader_common::map::{FastHashMap, ShortString};
167167
use librashader_preprocess::ShaderSource;
168-
use spirv_cross::msl;
169-
170-
#[test]
171-
pub fn test_into() {
172-
let result = ShaderSource::load("../test/basic.slang").unwrap();
173-
174-
let mut uniform_semantics: FastHashMap<ShortString, UniformSemantic> = Default::default();
175-
176-
for (_index, param) in result.parameters.iter().enumerate() {
177-
uniform_semantics.insert(
178-
param.1.id.clone(),
179-
UniformSemantic::Unique(Semantic {
180-
semantics: UniqueSemantics::FloatParameter,
181-
index: (),
182-
}),
183-
);
184-
}
185-
186-
let compilation = crate::front::SpirvCompilation::try_from(&result).unwrap();
187-
188-
let mut msl = <MSL as FromCompilation<_, Naga>>::from_compilation(compilation).unwrap();
189-
190-
msl.reflect(
191-
0,
192-
&ShaderSemantics {
193-
uniform_semantics,
194-
texture_semantics: Default::default(),
195-
},
196-
)
197-
.expect("");
198-
199-
let compiled = msl.compile(Some(msl::Version::V2_0)).unwrap();
200-
201-
println!(
202-
"{:?}",
203-
compiled.context.fragment.translation_info.entry_point_names
204-
);
205-
}
168+
// use spirv_cross::msl;
169+
170+
// #[test]
171+
// pub fn test_into() {
172+
// let result = ShaderSource::load("../test/basic.slang").unwrap();
173+
//
174+
// let mut uniform_semantics: FastHashMap<ShortString, UniformSemantic> = Default::default();
175+
//
176+
// for (_index, param) in result.parameters.iter().enumerate() {
177+
// uniform_semantics.insert(
178+
// param.1.id.clone(),
179+
// UniformSemantic::Unique(Semantic {
180+
// semantics: UniqueSemantics::FloatParameter,
181+
// index: (),
182+
// }),
183+
// );
184+
// }
185+
//
186+
// let compilation = crate::front::SpirvCompilation::try_from(&result).unwrap();
187+
//
188+
// let mut msl = <MSL as FromCompilation<_, Naga>>::from_compilation(compilation).unwrap();
189+
//
190+
// msl.reflect(
191+
// 0,
192+
// &ShaderSemantics {
193+
// uniform_semantics,
194+
// texture_semantics: Default::default(),
195+
// },
196+
// )
197+
// .expect("");
198+
//
199+
// let compiled = msl.compile(Some(msl::Version::V2_0)).unwrap();
200+
//
201+
// println!(
202+
// "{:?}",
203+
// compiled.context.fragment.translation_info.entry_point_names
204+
// );
205+
// }
206206
}

0 commit comments

Comments
 (0)