|
|
|
@ -12,7 +12,7 @@ fn test_emit() {
|
|
|
|
|
(dec out-color:*v4f32o Output)
|
|
|
|
|
(entry main Fragment OriginUpperLeft (:frag-coord :out-color))
|
|
|
|
|
(fun (main) :<>
|
|
|
|
|
(store-ptr (out-color)
|
|
|
|
|
(store-ptr out-color
|
|
|
|
|
(v4f32i (/ (.xy (load-ptr frag-coord))
|
|
|
|
|
(v2f32 1920.0 1080.0))
|
|
|
|
|
1.0
|
|
|
|
@ -49,3 +49,58 @@ fn test_type_parse() {
|
|
|
|
|
assert_eq!(parse_type(&"f32".to_string()), Float(32));
|
|
|
|
|
assert_eq!(parse_type(&"s32".to_string()), Int(32));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_block_ssa() {
|
|
|
|
|
use crate::compiler::backend::*;
|
|
|
|
|
use crate::compiler::*;
|
|
|
|
|
use crate::parser::*;
|
|
|
|
|
let src = "
|
|
|
|
|
(module Shader Logical GLSL450)
|
|
|
|
|
(import :std GLSL.std.450)
|
|
|
|
|
(bind (out-color:*f32) (Location 0))
|
|
|
|
|
(dec out-color:*f32 Output)
|
|
|
|
|
(entry main Fragment OriginUpperLeft (:out-color))
|
|
|
|
|
(fun (main) :<>
|
|
|
|
|
(store-ptr out-color 1.0))
|
|
|
|
|
";
|
|
|
|
|
let ast = parse(tokenize(src));
|
|
|
|
|
let mut module = meta_compile(ast.unwrap()).unwrap();
|
|
|
|
|
let fun = module.functions.pop().unwrap();
|
|
|
|
|
let block = fun.ast.unwrap();
|
|
|
|
|
let block = block
|
|
|
|
|
.list()
|
|
|
|
|
.unwrap()
|
|
|
|
|
.get(0)
|
|
|
|
|
.unwrap()
|
|
|
|
|
.clone();
|
|
|
|
|
println!("{:#?}", block);
|
|
|
|
|
let mut vars = vec![];
|
|
|
|
|
let mut constants = vec![];
|
|
|
|
|
let mut counter = Box::new(0);
|
|
|
|
|
let mut stack = vec![];
|
|
|
|
|
let mut out = vec![];
|
|
|
|
|
for v in &module.globals {
|
|
|
|
|
vars.push((v.name.clone(), v.typ.clone()));
|
|
|
|
|
}
|
|
|
|
|
compile_ast_ssa(
|
|
|
|
|
block,
|
|
|
|
|
&mut vars,
|
|
|
|
|
&mut constants,
|
|
|
|
|
&mut counter,
|
|
|
|
|
&mut stack,
|
|
|
|
|
&mut out,
|
|
|
|
|
);
|
|
|
|
|
println!("\n---constants:---\n{:#?}\n------", constants);
|
|
|
|
|
println!("\n---vars:---\n{:#?}\n------", vars);
|
|
|
|
|
println!("\n---stack:---\n{:#?}\n------", stack);
|
|
|
|
|
println!("\n---counter---\n{}\n------", counter);
|
|
|
|
|
println!("\n---out---");
|
|
|
|
|
for (a, b) in &out {
|
|
|
|
|
match a {
|
|
|
|
|
Some(a) => println!("%{} = {}", a, b),
|
|
|
|
|
None => println!("{}", b),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
println!("------");
|
|
|
|
|
}
|
|
|
|
|