|  |  |  | @ -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!("------"); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |