code wiki / (root) / nx_shader_front_gate_t217.nx

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}