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}