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}