code wiki / _hdl_build / nx_d3d11_min_gate.nx
nx_d3d11_min_gate.nx source
↩ module page · 68 lines · 4100 B
1// nx_d3d11_min_gate.nx -- D0 spine proof: run the D3D11 frame-0 call sequence a game makes (CreateDeviceAndSwapChain
2// -> ClearRenderTargetView -> draw region -> Present) through OUR backend (nx_swgpu) + present (nx_swapchain), and
3// verify a real presented frame. This is the first rung genuinely on the D3D-GAME ladder. license_tier: ORIGINAL expect_exit: 0
4import "nx_syscalls.nx"
5import "nx_d3d11_min.nx"
6
7func hw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
8func pn(v: i64) -> i64 { let b: *u8=sys_mmap(32) as *u8; var x: i64=v; var ng: i64=0; if x<0{ng=1;x=0-x} var i: i64=31; if x==0{b[i]=48 as u8;i=i-1} while x>0{b[i]=(48+x%10) as u8;x=x/10;i=i-1} if ng==1{b[i]=45 as u8;i=i-1} sys_write(1,(b as i64+i+1) as *u8,31-i); return 0 }
9
10func main() -> i64 {
11 hw("=== nx_d3d11_min_gate -- D0: a game's frame-0 D3D11 call sequence -> our backend -> a presented frame ===\n" as *u8)
12 var fails: i64 = 0
13
14 // D3D11CreateDeviceAndSwapChain(1280,720 requested) -- backbuffer resolves to backend-native 512x384
15 let dev: *i64 = d3d_create_device_and_swapchain(1280, 720)
16 let wid: i64 = d3d_width(dev)
17 let hei: i64 = d3d_height(dev)
18 hw(" device+swapchain created, backbuffer "); pn(wid); hw("x"); pn(hei); hw("\n" as *u8)
19 var t1: i64 = 0
20 if wid == 512 { if hei == 384 { t1 = 1 } }
21 if t1 == 1 { hw("T1 PASS device + swapchain created (backbuffer 512x384)\n" as *u8) } else { fails=fails+1; hw("T1 FAIL\n" as *u8) }
22
23 // ClearRenderTargetView(cornflower blue 100,149,237) -- the iconic D3D 'hello' clear
24 d3d_clear_rtv(dev, 100, 149, 237)
25 let cf: i64 = d3d_pack(100, 149, 237)
26 let fb: *i64 = d3d_backbuffer(dev)
27 var t2: i64 = 0
28 if fb[0] == cf { if fb[10*512 + 10] == cf { t2 = 1 } }
29 if t2 == 1 { hw("T2 PASS ClearRenderTargetView filled the whole backbuffer (cornflower blue)\n" as *u8) } else { fails=fails+1; hw("T2 FAIL clear px0="); pn(fb[0]); hw(" expected "); pn(cf); hw("\n" as *u8) }
30
31 // a viewport draw region: fill a 100x100 orange rect at center (models a scissored colored draw)
32 d3d_fill_rect(dev, 206, 142, 306, 242, 255, 180, 40)
33 let og: i64 = d3d_pack(255, 180, 40)
34 let ctr: i64 = fb[192*512 + 256]
35 let out10: i64 = fb[10*512 + 10]
36 var t3: i64 = 0
37 if ctr == og { if out10 == cf { t3 = 1 } }
38 if t3 == 1 { hw("T3 PASS draw region: center is orange, outside stays cornflower (scissor/state works)\n" as *u8) } else { fails=fails+1; hw("T3 FAIL center="); pn(ctr); hw(" edge="); pn(out10); hw("\n" as *u8) }
39
40 // Present() -> a real PPM frame
41 let cap: i64 = 1048576
42 let out: *u8 = sys_mmap(cap)
43 let nb: i64 = d3d_present(dev, out, cap)
44 hw(" Present -> "); pn(nb); hw(" bytes\n" as *u8)
45 var t4: i64 = 0
46 if nb > 589824 { if (out[0] as i64) == 80 { if (out[1] as i64) == 54 { t4 = 1 } } }
47 if t4 == 1 { hw("T4 PASS Present produced a valid PPM P6 frame (header + 512x384x3 bytes)\n" as *u8) } else { fails=fails+1; hw("T4 FAIL present nb="); pn(nb); hw("\n" as *u8) }
48
49 // re-render: next frame clears to red -> state/loop works
50 d3d_clear_rtv(dev, 200, 30, 30)
51 let rd: i64 = d3d_pack(200, 30, 30)
52 var t5: i64 = 0
53 if fb[0] == rd { t5 = 1 }
54 if t5 == 1 { hw("T5 PASS re-render: a second frame clears to a new color (the render loop works)\n" as *u8) } else { fails=fails+1; hw("T5 FAIL\n" as *u8) }
55
56 // T6 artifact: re-draw frame 0 and present to a viewable PPM on disk
57 d3d_clear_rtv(dev, 100, 149, 237)
58 d3d_fill_rect(dev, 206, 142, 306, 242, 255, 180, 40)
59 let nb2: i64 = d3d_present(dev, out, cap)
60 let fd: i64 = sys_openat_wr("knowledge/nx_d3d11_frame.ppm\x00" as *u8, 0x1a4)
61 sys_write(fd, out, nb2); sys_close(fd)
62 hw("T6 artifact -> knowledge/nx_d3d11_frame.ppm ("); pn(nb2); hw(" bytes, viewable P6)\n" as *u8)
63
64 if fails == 0 { hw("NX-D3D11-MIN GREEN -- D0 spine: the D3D11 frame-0 sequence renders + presents a real frame through our stack\n" as *u8); sys_exit(0); return 0 }
65 hw("NX-D3D11-MIN RED fails="); pn(fails); hw("\n" as *u8)
66 sys_exit(1)
67 return 1
68}