nx_clip_depth_contract_gate.nx source
↩ module page · 81 lines · 3533 B
1import "nx_wgsl.nx"
2import "nx_gate_verdict.nx"
3import "nx_cast_eye_t138.nx"
4func clip_count(b: *u8,n: i64,s: *u8) -> i64 {
5 var sl: i64=0
6 while s[sl]!=(0 as u8) { sl=sl+1 }
7 var p: i64=0
8 var c: i64=0
9 while p+sl<=n {
10 var j: i64=0
11 while j<sl && b[p+j]==s[j] { j=j+1 }
12 if j==sl { c=c+1 }
13 p=p+1
14 }
15 return c
16}
17func clip_same(a: *u8,an: i64,b: *u8,bn: i64) -> i64 {
18 if an!=bn { return 0 }
19 var i: i64=0
20 while i<an { if a[i]!=b[i] { return 0 };i=i+1 }
21 return 1
22}
23func main() -> i64 {
24 let ctr: *i64=gv_ctr()
25 let a: *u8=sys_mmap(WG_EMIT_CAP)
26 let b: *u8=sys_mmap(WG_EMIT_CAP)
27 let tr: *i64=sys_mmap(WG_TRACE_CAP*8) as *i64
28 let tn: *i64=sys_mmap(8) as *i64
29 let native: *i64=sir_new()
30 shsrc_fullscreen_tri(native)
31 gv_check_eq("default-source-depth-native" as *u8,native[M_CLIP_DEPTH],SIR_CLIP_NATIVE,ctr)
32 tn[0]=0
33 let an: i64=wgsl_emit_module(native,STAGE_VERTEX,a,WG_EMIT_CAP,tr,WG_TRACE_CAP,tn)
34 gv_check("native-vertex-emits" as *u8,an>0,ctr)
35 gv_check_eq("native-no-remap" as *u8,clip_count(a,an,"nishiClipPosition" as *u8),0,ctr)
36 let mapped: *i64=sir_new()
37 shsrc_fullscreen_tri(mapped)
38 mapped[M_CLIP_DEPTH]=SIR_CLIP_NEGATIVE_ONE_TO_ONE
39 tn[0]=0
40 let bn: i64=wgsl_emit_module(mapped,STAGE_VERTEX,b,WG_EMIT_CAP,tr,WG_TRACE_CAP,tn)
41 gv_check("direct-return-emits" as *u8,bn>0,ctr)
42 gv_check_eq("direct-return-evaluates-expression-once" as *u8,clip_count(b,bn,"let nishiClipPosition=" as *u8),1,ctr)
43 gv_check_eq("direct-return-converts-depth" as *u8,clip_count(b,bn,"(nishiClipPosition.z+nishiClipPosition.w)*0.5" as *u8),1,ctr)
44 tn[0]=0
45 let gn: i64=glsl_emit_module(native,STAGE_VERTEX,a,WG_EMIT_CAP,tr,WG_TRACE_CAP,tn)
46 tn[0]=0
47 let gm: i64=glsl_emit_module(mapped,STAGE_VERTEX,b,WG_EMIT_CAP,tr,WG_TRACE_CAP,tn)
48 gv_check("glsl-unchanged" as *u8,gn>0 && clip_same(a,gn,b,gm),ctr)
49 let cast: *i64=sir_new()
50 shsrc_cast_vs(cast)
51 gv_check_eq("cast-declares-gl-depth" as *u8,cast[M_CLIP_DEPTH],SIR_CLIP_NEGATIVE_ONE_TO_ONE,ctr)
52 tn[0]=0
53 let cn: i64=wgsl_emit_module(cast,STAGE_VERTEX,a,WG_EMIT_CAP,tr,WG_TRACE_CAP,tn)
54 gv_check("cast-emits" as *u8,cn>0,ctr)
55 gv_check_eq("cast-normal-and-early-return-remapped" as *u8,clip_count(a,cn,"vo.bpos.z=(vo.bpos.z+vo.bpos.w)*0.5;" as *u8),2,ctr)
56 let eye: *i64=sir_new()
57 shsrc_eye_vs(eye)
58 gv_check_eq("eye-declares-gl-depth" as *u8,eye[M_CLIP_DEPTH],SIR_CLIP_NEGATIVE_ONE_TO_ONE,ctr)
59 tn[0]=0
60 let en: i64=wgsl_emit_module(eye,STAGE_VERTEX,a,WG_EMIT_CAP,tr,WG_TRACE_CAP,tn)
61 gv_check("eye-emits" as *u8,en>0,ctr)
62 gv_check_eq("eye-return-remapped-once" as *u8,clip_count(a,en,"vo.bpos.z=(vo.bpos.z+vo.bpos.w)*0.5;" as *u8),1,ctr)
63 tn[0]=0
64 let eg: i64=glsl_emit_module(eye,STAGE_VERTEX,a,WG_EMIT_CAP,tr,WG_TRACE_CAP,tn)
65 eye[M_CLIP_DEPTH]=SIR_CLIP_NATIVE
66 tn[0]=0
67 let eng: i64=glsl_emit_module(eye,STAGE_VERTEX,b,WG_EMIT_CAP,tr,WG_TRACE_CAP,tn)
68 gv_check("eye-glsl-preserved" as *u8,eg>0 && clip_same(a,eg,b,eng),ctr)
69 let bad: *i64=sir_new()
70 shsrc_fullscreen_tri(bad)
71 bad[M_CLIP_DEPTH]=0-1
72 a[0]=90 as u8
73 tn[0]=0
74 gv_check_eq("invalid-wgsl-depth-refused" as *u8,wgsl_emit_module(bad,STAGE_VERTEX,a,WG_EMIT_CAP,tr,WG_TRACE_CAP,tn),0-1,ctr)
75 gv_check_eq("refusal-before-output" as *u8,a[0] as i64,90,ctr)
76 gv_check("refusal-named" as *u8,sir_refused(bad)!=0,ctr)
77 bad[M_CLIP_DEPTH]=2
78 tn[0]=0
79 gv_check_eq("invalid-glsl-depth-refused" as *u8,glsl_emit_module(bad,STAGE_VERTEX,a,WG_EMIT_CAP,tr,WG_TRACE_CAP,tn),0-1,ctr)
80 return gv_verdict("clip-depth-contract" as *u8,ctr,"native source depth, direct return, varying return, preserved GLSL and invalid input" as *u8)
81}