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}