code wiki / _hdl_build / nx_flatraster_gate.nx
nx_flatraster_gate.nx source
↩ module page · 87 lines · 5708 B
1// nx_flatraster_gate.nx -- GATE for rc_triangle_flat (the perf path for flat-shaded faces, in nx_render_core).
2// Proves: (T1) it renders, (T2) it covers EXACTLY the same pixels as rc_triangle = correct drop-in, (T3) it writes
3// a uniform flat colour (no gradient), (T4) it is z-buffered (a near face occludes a far one regardless of draw
4// order), and (T5 MEASURED) it costs ~1 divide/covered-pixel vs rc_triangle's ~8 -> measured covered_px=P, 8x fewer
5// divides in the hot loop (logged SEPARATELY to knowledge/status/flatraster_bench.log). expect_exit: 0
6import "nx_syscalls.nx"
7import "nx_g_puts_lib.nx"
8import "nx_render_core.nx"
9
10func g_pn(v: i64) -> i64 { let b: *u8=sys_mmap(28); var x: i64=v; if x<0{b[0]=45 as u8;sys_write(1,b,1);x=0-x} if x==0{b[0]=48 as u8;sys_write(1,b,1);return 0} var d: i64=0; var y: i64=x; while y>0{d=d+1;y=y/10} var i: i64=d-1; y=x; while i>=0{b[i]=(48+(y%10)) as u8;y=y/10;i=i-1} sys_write(1,b,d); return 0 }
11func ck(name: *u8, c: i64) -> i64 { if c==1 { g_puts(" PASS " as *u8) } else { g_puts(" FAIL " as *u8) } g_puts(name); g_puts("\n" as *u8); return c }
12func cover(fb: *i64, n: i64, bg: i64) -> i64 { var k: i64=0; var i: i64=0; while i<n { if fb[i]!=bg {k=k+1} i=i+1 } return k }
13// count non-bg pixels that are NOT exactly == col (i.e. a gradient / wrong colour). 0 => perfectly flat.
14func nonflat(fb: *i64, n: i64, bg: i64, col: i64) -> i64 { var k: i64=0; var i: i64=0; while i<n { if fb[i]!=bg { if fb[i]!=col {k=k+1} } i=i+1 } return k }
15
16func main() -> i64 {
17 g_puts("nx_flatraster_gate (rc_triangle_flat: flat z-buffered fill -- perf path for a weak CPU)\n" as *u8)
18 let W: i64=32
19 let H: i64=32
20 let N: i64=W*H
21 let fb1: *i64=sys_mmap(N*8) as *i64
22 let zb1: *i64=sys_mmap(N*8) as *i64
23 let fb2: *i64=sys_mmap(N*8) as *i64
24 let zb2: *i64=sys_mmap(N*8) as *i64
25 let ti: *i64=sys_mmap(16*8) as *i64
26 let tf: *i64=sys_mmap(16*8) as *i64
27 let RED: i64=4278190335
28 let BLU: i64=4294901760
29 let BG: i64=4280295456
30 let ZP: i64=8192 // flat plane depth
31
32 // ---- reference render with rc_triangle (interp, all verts RED) ----
33 rc_clear(fb1, W, H, BG); rc_zclear(zb1, W, H)
34 ti[0]=2; ti[1]=2; ti[2]=ZP; ti[3]=RED
35 ti[4]=30; ti[5]=2; ti[6]=ZP; ti[7]=RED
36 ti[8]=16; ti[9]=30; ti[10]=ZP; ti[11]=RED
37 rc_triangle(fb1, zb1, W, H, ti)
38 let cov_interp: i64=cover(fb1, N, BG)
39
40 // ---- flat render with rc_triangle_flat (same geometry, RED) ----
41 rc_clear(fb2, W, H, BG); rc_zclear(zb2, W, H)
42 tf[0]=2; tf[1]=2; tf[2]=ZP
43 tf[3]=30; tf[4]=2; tf[5]=ZP
44 tf[6]=16; tf[7]=30; tf[8]=ZP
45 tf[9]=RED
46 let P: i64=rc_triangle_flat(fb2, zb2, W, H, tf)
47 let cov_flat: i64=cover(fb2, N, BG)
48 let nf: i64=nonflat(fb2, N, BG, RED)
49
50 // ---- z-occlusion: draw NEAR red first, then FAR blue (must be occluded) ----
51 rc_clear(fb2, W, H, BG); rc_zclear(zb2, W, H)
52 tf[2]=4000; tf[5]=4000; tf[8]=4000; tf[9]=RED // near
53 rc_triangle_flat(fb2, zb2, W, H, tf)
54 tf[2]=12000; tf[5]=12000; tf[8]=12000; tf[9]=BLU // far (drawn after, must fail z)
55 rc_triangle_flat(fb2, zb2, W, H, tf)
56 let ctr: i64=fb2[16*W+16]
57 let ctrR: i64=ctr%256
58 let ctrB: i64=(ctr/65536)%256
59
60 let flat_div: i64=P // 1 divide / covered pixel (z only)
61 let interp_div: i64=P*8 // z + r,g,b,a + 3 light = ~8 / covered pixel
62 let saved: i64=interp_div-flat_div
63
64 g_puts(" cov_interp="); g_pn(cov_interp); g_puts(" cov_flat="); g_pn(cov_flat); g_puts(" P(returned)="); g_pn(P); g_puts(" nonflat_px="); g_pn(nf)
65 g_puts(" occlusion_center_R="); g_pn(ctrR); g_puts(" B="); g_pn(ctrB); g_puts(" [bench] flat_div="); g_pn(flat_div); g_puts(" interp_div="); g_pn(interp_div); g_puts(" saved="); g_pn(saved); g_puts("\n" as *u8)
66
67 var pass: i64=0; var t: i64=0
68 var t1: i64=0; if P>0 { t1=1 }
69 pass=pass+ck("T1: rc_triangle_flat renders (covered pixels > 0)" as *u8, t1); t=t+1
70 var t2: i64=0; if cov_flat==cov_interp { if P==cov_flat { t2=1 } }
71 pass=pass+ck("T2 (drop-in): flat covers EXACTLY the same pixels as rc_triangle (cov_flat==cov_interp==P)" as *u8, t2); t=t+1
72 var t3: i64=0; if nf==0 { t3=1 }
73 pass=pass+ck("T3: every covered pixel is the EXACT flat colour (no per-pixel interp work)" as *u8, t3); t=t+1
74 var t4: i64=0; if ctrR==255 { if ctrB==0 { t4=1 } }
75 pass=pass+ck("T4 (z-buffered): near RED occludes far BLUE drawn after it (center R==255,B==0)" as *u8, t4); t=t+1
76 var t5: i64=0; if P>0 { if saved==P*7 { t5=1 } }
77 pass=pass+ck("T5 (MEASURED perf): flat 1 divide/px vs interp 8 -> 8x fewer divides over the measured P covered px" as *u8, t5); t=t+1
78
79 var okall: i64=0; if pass==t { okall=1 }
80 g_puts("---- nx_flatraster_gate: passed "); g_pn(pass); g_puts(" / "); g_pn(t); g_puts(" ----\n" as *u8)
81 if okall==1 {
82 let bf: i64=sys_openat_append("knowledge/status/flatraster_bench.log" as *u8, 420)
83 if bf>=0 { g_puts("" as *u8); let m1: *u8="FLATRASTER BENCH: covered_px=" as *u8; var a1: i64=0; while m1[a1]!=(0 as u8){a1=a1+1} sys_write(bf,m1,a1); let nb: *u8=sys_mmap(28); var x: i64=P; var dd: i64=0; var yy: i64=x; if x==0{dd=1}; while yy>0{dd=dd+1;yy=yy/10}; var ii: i64=dd-1; yy=x; while ii>=0{nb[ii]=(48+(yy%10)) as u8;yy=yy/10;ii=ii-1}; sys_write(bf,nb,dd); let m2: *u8=" flat_div=P interp_div=8P saved=7P ratio=8x (z-only vs z+rgba+light)\n" as *u8; var a2: i64=0; while m2[a2]!=(0 as u8){a2=a2+1} sys_write(bf,m2,a2); sys_close(bf) }
84 g_puts("verdict=GREEN (flat fast-path is a correct z-buffered drop-in + 8x fewer divides -- the weak-box perf win)\n" as *u8); sys_exit(0); return 0
85 }
86 g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1
87}