code wiki / (root) / nx_texture_array_gate_t289.nx

nx_texture_array_gate_t289.nx source

↩ module page · 102 lines · 6053 B

1// Typed regional texture-array emission and boundary gate; GPU pixel witness is separate. 2import "nx_wgsl.nx" 3import "nx_fsops_lib.nx" 4func ta_expect(ok:i64,label:*u8)->i64{ 5 if ok!=0{sys_write(1,"PASS ",5);sys_write(1,label,sir_slen(label));sys_write(1,"\n",1);return 0} 6 sys_write(1,"FAIL ",5);sys_write(1,label,sir_slen(label));sys_write(1,"\n",1);return 1 7} 8func ta_decl_refusal(mode:i64)->i64{ 9 let m:*i64=sir_new() 10 if mode==1{sir_texture(m,"regions",T_TEX2F)} 11 if mode==2{sir_texture(m,"regions",T_TEX2AF)} 12 let f:i64=sir_func(m,"probe",T_V4F) 13 if mode==2{sir_param(m,f,"regions",T_I32)} 14 let uv:i64=sir_ctor(m,T_V2F);sir_arg(m,uv,sir_lit(m,"0.5",T_F32)) 15 let v:i64=sir_texsample_array(m,sir_ident(m,"regions",T_TEX2AF),uv,sir_lit(m,"0",T_I32)) 16 sir_stmt(m,f,sir_return(m,v)) 17 let out:*u8=sys_mmap_try(WG_EMIT_CAP) 18 let trace:*i64=sys_mmap_try(WG_TRACE_CAP*__size_of(i64)) as *i64 19 let count:*i64=sys_mmap_try(__size_of(i64)) as *i64 20 if (out as i64)<=0||(trace as i64)<=0||(count as i64)<=0{return 0} 21 count[0]=0 22 let gl:i64=glsl_emit_module(m,STAGE_PLAIN,out,WG_EMIT_CAP,trace,WG_TRACE_CAP,count) 23 let gr:i64=m[M_REFUSE] 24 m[M_REFUSE]=0;count[0]=0 25 let wg:i64=wgsl_emit_module(m,STAGE_PLAIN,out,WG_EMIT_CAP,trace,WG_TRACE_CAP,count) 26 let wr:i64=m[M_REFUSE] 27 sys_munmap_direct(out,WG_EMIT_CAP);sys_munmap_direct(trace as *u8,WG_TRACE_CAP*__size_of(i64));sys_munmap_direct(count as *u8,__size_of(i64)) 28 if gl<0 && gr!=0 && wg<0 && wr!=0{return 1} 29 return 0 30} 31func ta_binding_case(ty:i64,mode:i64)->i64{ 32 let m:*i64=sir_new() 33 sir_texture(m,"regions",ty) 34 if mode==0{sir_storage(m,"buffer",T_U32,WG_BIND_TEX_FIRST+1,0,0)} 35 if mode==1{sir_texture(m,"regions_s",T_TEX2F)} 36 if mode==2{sir_storage(m,"buffer",T_U32,WG_BIND_TEX_FIRST+2,0,0)} 37 if mode==3{sir_uniform(m,"regions_s",T_I32,0)} 38 sir_func(m,"probe",T_VOID) 39 let out:*u8=sys_mmap_try(WG_EMIT_CAP) 40 let trace:*i64=sys_mmap_try(WG_TRACE_CAP*__size_of(i64)) as *i64 41 let count:*i64=sys_mmap_try(__size_of(i64)) as *i64 42 if (out as i64)<=0||(trace as i64)<=0||(count as i64)<=0{return 0} 43 count[0]=0 44 let n:i64=wgsl_emit_module(m,STAGE_PLAIN,out,WG_EMIT_CAP,trace,WG_TRACE_CAP,count) 45 var ok:i64=0 46 if mode<2{if n<0 && m[M_REFUSE]!=0{ok=1}} 47 else{if n>0 && m[M_REFUSE]==0{ok=1}} 48 sys_munmap_direct(out,WG_EMIT_CAP);sys_munmap_direct(trace as *u8,WG_TRACE_CAP*__size_of(i64));sys_munmap_direct(count as *u8,__size_of(i64)) 49 return ok 50} 51func main(argc:i64,argv:*i64)->i64{ 52 if argc!=3{return 2} 53 var failures:i64=0 54 let m:*i64=sir_new() 55 sir_uniform(m,"layer",T_I32,0) 56 sir_texture(m,"regions",T_TEX2AF) 57 sir_texture(m,"ordinary",T_TEX2F) 58 sir_fragout(m,"fc",T_V4F,0) 59 let f:i64=sir_func(m,"main",T_VOID) 60 let uv:i64=sir_ctor(m,T_V2F);sir_arg(m,uv,sir_lit(m,"0.5",T_F32)) 61 let value:i64=sir_texsample_array(m,sir_ident(m,"regions",T_TEX2AF),uv,sir_ident(m,"layer",T_I32)) 62 failures=failures+ta_expect(value>0,"array sample accepted") 63 sir_stmt(m,f,sir_assign(m,sir_ident(m,"fc",T_V4F),value)) 64 let go:*u8=sys_mmap_try(WG_EMIT_CAP) 65 let wo:*u8=sys_mmap_try(WG_EMIT_CAP) 66 let gt:*i64=sys_mmap_try(WG_TRACE_CAP*__size_of(i64)) as *i64 67 let wt:*i64=sys_mmap_try(WG_TRACE_CAP*__size_of(i64)) as *i64 68 let gn:*i64=sys_mmap_try(__size_of(i64)) as *i64 69 let wn:*i64=sys_mmap_try(__size_of(i64)) as *i64 70 if (go as i64)<=0||(wo as i64)<=0||(gt as i64)<=0||(wt as i64)<=0||(gn as i64)<=0||(wn as i64)<=0{return 4} 71 gn[0]=0;wn[0]=0 72 let gl:i64=glsl_emit_module(m,STAGE_FRAGMENT,go,WG_EMIT_CAP,gt,WG_TRACE_CAP,gn) 73 let wg:i64=wgsl_emit_module(m,STAGE_FRAGMENT,wo,WG_EMIT_CAP,wt,WG_TRACE_CAP,wn) 74 failures=failures+ta_expect(gl>0 && m[M_REFUSE]==0,"GLSL emitted") 75 failures=failures+ta_expect(wg>0 && m[M_REFUSE]==0,"WGSL emitted") 76 if gl>0{failures=failures+ta_expect(fsx_write(argv[1] as *u8,go,gl)==gl,"GLSL artifact retained")} 77 if wg>0{failures=failures+ta_expect(fsx_write(argv[2] as *u8,wo,wg)==wg,"WGSL artifact retained")} 78 let bad:*i64=sir_new() 79 let buv:i64=sir_ctor(bad,T_V2F);sir_arg(bad,buv,sir_lit(bad,"0.5",T_F32)) 80 let reject:i64=sir_texsample_array(bad,sir_ident(bad,"regions",T_TEX2AF),buv,sir_lit(bad,"0.0",T_F32)) 81 failures=failures+ta_expect(reject==0 && bad[M_REFUSE]!=0,"float layer refused") 82 let missing:*i64=sir_new() 83 failures=failures+ta_expect(sir_texsample_array(missing,0,0,0)==0 && missing[M_REFUSE]!=0,"missing nodes refused") 84 let wrong:*i64=sir_new() 85 let wuv:i64=sir_ctor(wrong,T_V2F);sir_arg(wrong,wuv,sir_lit(wrong,"0.5",T_F32)) 86 failures=failures+ta_expect(sir_texsample_array(wrong,sir_ident(wrong,"ordinary",T_TEX2F),wuv,sir_lit(wrong,"0",T_I32))==0 && wrong[M_REFUSE]!=0,"ordinary texture refused as array") 87 failures=failures+ta_expect(sys_munmap_direct(go,WG_EMIT_CAP)==0,"GLSL buffer released") 88 failures=failures+ta_expect(sys_munmap_direct(wo,WG_EMIT_CAP)==0,"WGSL buffer released") 89 sys_munmap_direct(gt as *u8,WG_TRACE_CAP*__size_of(i64));sys_munmap_direct(wt as *u8,WG_TRACE_CAP*__size_of(i64));sys_munmap_direct(gn as *u8,__size_of(i64));sys_munmap_direct(wn as *u8,__size_of(i64)) 90 failures=failures+ta_expect(ta_decl_refusal(0),"undeclared texture refused by both backends") 91 failures=failures+ta_expect(ta_decl_refusal(1),"mismatched declaration refused by both backends") 92 failures=failures+ta_expect(ta_decl_refusal(2),"shadowed resource refused by both backends") 93 failures=failures+ta_expect(ta_binding_case(T_TEX2F,0),"2D sampler binding collision refused") 94 failures=failures+ta_expect(ta_binding_case(T_TEX2AF,0),"array sampler binding collision refused") 95 failures=failures+ta_expect(ta_binding_case(T_TEX2F,1),"2D sampler name collision refused") 96 failures=failures+ta_expect(ta_binding_case(T_TEX2AF,1),"array sampler name collision refused") 97 failures=failures+ta_expect(ta_binding_case(T_TEX2F,2),"2D disjoint storage admitted") 98 failures=failures+ta_expect(ta_binding_case(T_TEX2AF,2),"array disjoint storage admitted") 99 failures=failures+ta_expect(ta_binding_case(T_TEX2F,3),"2D uniform member same spelling admitted") 100 failures=failures+ta_expect(ta_binding_case(T_TEX2AF,3),"array uniform member same spelling admitted") 101 return failures 102}