code wiki / _hdl_build / nx_swgpu_gate.nx
nx_swgpu_gate.nx source
↩ module page · 96 lines · 4761 B
1// nx_swgpu_gate.nx -- gate for the SOVEREIGN SOFTWARE GPU rendering a 3D CHARACTER (Path A R5 preview).
2// T1 the HUMANOID renders: a solid block of skin pixels at 512x384
3// T2 PER-PIXEL shading gradient: wide luminance range (lit -> shadow) = real shading, not flat
4// T3 FULL FIGURE (not a blob): skin pixels present in the TOP third (head) AND BOTTOM third (feet) AND middle
5// T4 determinism: two renders byte-identical (integer pipeline, VM-vettable)
6// T5 hi-res 512x384 + PNG knowledge/nx_swchar.png (the eyeball) + a lone sphere PNG nx_swgpu.png
7// license_tier: ORIGINAL expect_exit: 0
8import "nx_syscalls.nx"
9import "nx_png.nx"
10import "nx_swgpu.nx"
11
12func hw(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
13func pn(v: i64) -> i64 {
14 let b: *u8 = sys_mmap(32) as *u8
15 var x: i64 = v
16 var neg: i64 = 0
17 if x < 0 { neg = 1; x = 0 - x }
18 var i: i64 = 31
19 if x == 0 { b[i] = 48 as u8; i = i - 1 }
20 while x > 0 { b[i] = (48 + x % 10) as u8; x = x / 10; i = i - 1 }
21 if neg == 1 { b[i] = 45 as u8; i = i - 1 }
22 sys_write(1, (b as i64 + i + 1) as *u8, 31 - i)
23 return 0
24}
25func is_skin(px: i64) -> i64 { let r: i64 = px & 255; let b: i64 = (px >> 16) & 255; if r >= b { return 1 } return 0 }
26func lum(px: i64) -> i64 { return (px & 255) + ((px >> 8) & 255) + ((px >> 16) & 255) }
27
28func main() -> i64 {
29 var fails: i64 = 0
30 let base: i64 = sys_mmap(swgpu_bytes()) as i64
31 sg_humanoid(base, 20)
32 sg_project(base, 500, 0 - 5) // slight yaw, camera 5 units back (bigger figure)
33 sg_render(base, 240, 182, 158)
34 let fb: *i64 = (base + fb_off()) as *i64
35
36 var skin: i64 = 0
37 var minl: i64 = 99999
38 var maxl: i64 = 0
39 var topthird: i64 = 0
40 var midthird: i64 = 0
41 var botthird: i64 = 0
42 var pi: i64 = 0
43 while pi < ww() * hh() {
44 if is_skin(fb[pi]) == 1 {
45 skin = skin + 1
46 let l: i64 = lum(fb[pi])
47 if l < minl { minl = l }
48 if l > maxl { maxl = l }
49 let row: i64 = pi / ww()
50 if row < hh() / 3 { topthird = topthird + 1 }
51 else { if row < hh() * 2 / 3 { midthird = midthird + 1 } else { botthird = botthird + 1 } }
52 }
53 pi = pi + 1
54 }
55 // T1
56 var t1: i64 = 1
57 if skin < 12000 { t1 = 0 }
58 if skin > 130000 { t1 = 0 }
59 if t1 == 1 { hw("T1 PASS software GPU renders the HUMANOID: " as *u8); pn(skin); hw(" body px at 512x384\n" as *u8) }
60 else { hw("T1 FAIL skin=" as *u8); pn(skin); hw("\n" as *u8); fails = fails + 1 }
61 // T2
62 let span: i64 = maxl - minl
63 if span > 200 { hw("T2 PASS per-pixel shading gradient: lum " as *u8); pn(minl); hw(".." as *u8); pn(maxl); hw(" (span " as *u8); pn(span); hw(")\n" as *u8) }
64 else { hw("T2 FAIL flat span=" as *u8); pn(span); hw("\n" as *u8); fails = fails + 1 }
65 // T3 full figure
66 var t3: i64 = 1
67 if topthird < 400 { t3 = 0 }
68 if midthird < 2000 { t3 = 0 }
69 if botthird < 400 { t3 = 0 }
70 if t3 == 1 { hw("T3 PASS FULL figure: top(head)=" as *u8); pn(topthird); hw(" mid(torso)=" as *u8); pn(midthird); hw(" bot(legs)=" as *u8); pn(botthird); hw(" -- head-to-feet, not a blob\n" as *u8) }
71 else { hw("T3 FAIL top=" as *u8); pn(topthird); hw(" mid=" as *u8); pn(midthird); hw(" bot=" as *u8); pn(botthird); hw("\n" as *u8); fails = fails + 1 }
72 // T4 determinism
73 let base2: i64 = sys_mmap(swgpu_bytes()) as i64
74 sg_humanoid(base2, 20)
75 sg_project(base2, 500, 0 - 5)
76 sg_render(base2, 240, 182, 158)
77 let fb2: *i64 = (base2 + fb_off()) as *i64
78 var diff: i64 = 0
79 pi = 0
80 while pi < ww() * hh() { if fb[pi] != fb2[pi] { diff = diff + 1 } pi = pi + 1 }
81 if diff == 0 { hw("T4 PASS determinism: two humanoid renders byte-identical\n" as *u8) }
82 else { hw("T4 FAIL diff=" as *u8); pn(diff); hw("\n" as *u8); fails = fails + 1 }
83 // T5 PNG (character) + a lone sphere PNG for the record
84 write_png(fb, ww(), hh(), "knowledge/nx_swchar.png" as *u8)
85 let base3: i64 = sys_mmap(swgpu_bytes()) as i64
86 sg_sphere(base3, 32)
87 sg_project(base3, 600, 0 - 3)
88 sg_render(base3, 224, 150, 116)
89 write_png((base3 + fb_off()) as *i64, ww(), hh(), "knowledge/nx_swgpu.png" as *u8)
90 if ww() * hh() >= 76800 * 2 { hw("T5 PASS hi-res 512x384 + PNGs knowledge/nx_swchar.png (character) + nx_swgpu.png (sphere)\n" as *u8) }
91 else { hw("T5 FAIL res\n" as *u8); fails = fails + 1 }
92
93 if fails == 0 { hw("VERDICT GREEN: nx_swgpu 5/5 -- our SOFTWARE GPU renders a per-pixel-lit hi-res 3D CHARACTER (tiled, deterministic; the sovereign SOTA path, same pipeline targets the real GPU next)\n" as *u8) }
94 else { hw("VERDICT RED fails=" as *u8); pn(fails); hw("\n" as *u8) }
95 return fails
96}