nx_shader_front_gate_t217.nx source
↩ module page · 56 lines · 3176 B
1import "nx_wgsl.nx"
2import "nx_fs_create_lib.nx"
3static fg_fail:i64
4static fg_count:i64
5func fg_color(m:*i64,red:*u8,green:*u8)->i64{
6 let c:i64=sir_ctor(m,T_V4F);sir_arg(m,c,sir_lit(m,red,T_F32));sir_arg(m,c,sir_lit(m,green,T_F32));sir_arg(m,c,sir_lit(m,"0.0",T_F32));sir_arg(m,c,sir_lit(m,"1.0",T_F32));return c
7}
8func fg_source(mode:i64)->*i64{
9 let m:*i64=sir_new();sir_fragout(m,"fc",T_V4F,0)
10 if mode==1||mode==7{sir_vary(m,"shade",T_F32,0,0)}
11 var name:*u8="main";if mode==4{name="helper"}
12 let f:i64=sir_func(m,name,T_V4F);var input:*u8="isFront";if mode==7{input="vin"}
13 let p:i64=sir_param_front_facing(m,f,input)
14 if mode==1{sir_param_position(m,f,"pixel")}
15 if mode==2{sir_set(m,p,SIR_TY,T_F32)}
16 if mode==5{sir_param_front_facing(m,f,"alsoFront")}
17 if mode==6{sir_stmt(m,f,sir_var(m,input,T_BOOL,sir_lit(m,"true",T_BOOL)))}
18 sir_stmt(m,f,sir_return(m,sir_select(m,sir_ident(m,input,T_BOOL),fg_color(m,"1.0","0.0"),fg_color(m,"0.0","1.0"),T_V4F)))
19 return m
20}
21func fg_contains(s:*u8,n:i64,word:*u8)->i64{
22 let k:i64=sir_slen(word);if k>n{return 0};var i:i64=0
23 while i<=n-k{var j:i64=0;while j<k{if s[i+j]!=word[j]{break};j=j+1};if j==k{return 1};i=i+1};return 0
24}
25func fg_save(path:*u8,b:*u8,n:i64)->i64{
26 let rc:i64=fxc_create(path,b,n);if rc==n{return 1};if rc!=FXC_EXISTS{return 0}
27 let z:*i64=sys_mmap_try(8) as *i64;if (z as i64)<=0{return 0};let a:*u8=sys_read_file(path,z);if (a as i64)<=0{return 0};if z[0]!=n{return 0}
28 var i:i64=0;while i<n{if a[i]!=b[i]{return 0};i=i+1};sys_free_file(a,z[0]);sys_munmap_direct(z as *u8,8);return 1
29}
30func main()->i64{
31 var mode:i64=0
32 while mode<8{
33 var dialect:i64=0
34 while dialect<2{
35 let m:*i64=fg_source(mode);let b:*u8=sys_mmap_try(WG_EMIT_CAP);let tr:*i64=sys_mmap_try(WG_TRACE_CAP*8) as *i64;let nt:*i64=sys_mmap_try(8) as *i64
36 if (b as i64)<=0||(tr as i64)<=0||(nt as i64)<=0{return 3};nt[0]=0
37 var stage:i64=STAGE_FRAGMENT;if mode==3{stage=STAGE_VERTEX}
38 var n:i64=0;if dialect==0{n=glsl_emit_module(m,stage,b,WG_EMIT_CAP,tr,WG_TRACE_CAP,nt)}else{n=wgsl_emit_module(m,stage,b,WG_EMIT_CAP,tr,WG_TRACE_CAP,nt)}
39 var ok:i64=0
40 if mode<2{
41 if n>0&&sir_refused(m)==0{
42 var needle:*u8="gl_FrontFacing";if dialect==1{needle="@builtin(front_facing) isFront:bool"}
43 ok=fg_contains(b,n,needle)
44 if mode==1&&dialect==1{if fg_contains(b,n,"vin:VIO,@builtin(front_facing) isFront:bool")==0{ok=0}}
45 var path:*u8="/tmp/front-facing-plain-t217.glsl";if mode==1{path="/tmp/front-facing-vary-t217.glsl"};if dialect==1{path="/tmp/front-facing-plain-t217.wgsl";if mode==1{path="/tmp/front-facing-vary-t217.wgsl"}}
46 if fg_save(path,b,n)!=1{ok=0}
47 }
48 }else{if n<0&&sir_refused(m)!=0{ok=1}}
49 fg_count=fg_count+1;if ok!=1{fg_fail=fg_fail+1}
50 fsx_puts("FRONT mode=");fsx_putn(mode);fsx_puts(" dialect=");fsx_putn(dialect);fsx_puts(" bytes=");fsx_putn(n);fsx_puts(" pass=");fsx_putn(ok);fsx_puts("\n")
51 sys_munmap_direct(b,WG_EMIT_CAP);sys_munmap_direct(tr as *u8,WG_TRACE_CAP*8);sys_munmap_direct(nt as *u8,8)
52 dialect=dialect+1
53 };mode=mode+1
54 }
55 fsx_puts("FRONT tested=");fsx_putn(fg_count);fsx_puts(" failed=");fsx_putn(fg_fail);fsx_puts("\n");if fg_fail!=0{return 1};return 0
56}