code wiki / (root) / nx_clip_depth_contract_gate.nx

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}