code wiki / _hdl_build / nishi_export_lib.nx
nishi_export_lib.nx source
↩ module page · 211 lines · 12874 B
1// nishi_export_lib.nx -- REAL nx_cc-compiled NishiLang exported from sovereign DLLs. Includes:
2// - nishi_answer() / nishi_render(buf,w,h): the direct-export + arg-export + render proofs.
3// - nx_dev_render(self,buf,w,h) / nx_dev_get_info(self): COM DEVICE METHOD BODIES. nx_dev_render derives its interior
4// color from self->state (self[1]), proving object state flows through a vtable-dispatched call. These are the
5// compiled method bodies the COM-device DLL wires behind an ID3D11-shaped vtable (plumbing = sovereign emitter glue).
6// All pure integer math + caller-buffer writes -> position-independent, callable via MS-x64->SysV ABI thunks.
7// license_tier: ORIGINAL expect_exit: 0
8import "nx_syscalls.nx"
9import "nx_f32_hw.nx"
10import "nx_dxbc.nx"
11import "nx_dxbc_exec.nx"
12
13func nishi_answer() -> i64 { return 42 }
14func nx_edge(ax: i64, ay: i64, bx: i64, by: i64, px: i64, py: i64) -> i64 { return (bx-ax)*(py-ay) - (by-ay)*(px-ax) }
15
16func nishi_render(buf: *u8, w: i64, h: i64) -> i64 {
17 var sgn: i64 = 1
18 if nx_edge(32,96,64,32,96,96) < 0 { sgn = 0 - 1 }
19 var cov: i64 = 0
20 var y: i64 = 0
21 while y < h {
22 var x: i64 = 0
23 while x < w {
24 let w0: i64 = nx_edge(64,32,96,96, 2*x+1, 2*y+1) * sgn
25 let w1: i64 = nx_edge(96,96,32,96, 2*x+1, 2*y+1) * sgn
26 let w2: i64 = nx_edge(32,96,64,32, 2*x+1, 2*y+1) * sgn
27 let o: i64 = (y*w + x)*3
28 var inside: i64 = 0
29 if w0 >= 0 { if w1 >= 0 { if w2 >= 0 { inside = 1 } } }
30 if inside == 1 { buf[o]=200 as u8; buf[o+1]=100 as u8; buf[o+2]=50 as u8; cov = cov + 1 }
31 else { buf[o]=0 as u8; buf[o+1]=0 as u8; buf[o+2]=0 as u8 }
32 x = x + 1
33 }
34 y = y + 1
35 }
36 return cov
37}
38
39// COM device methods. self = *i64 object: self[0]=vtbl, self[1]=state (packed RGB color). render pulls color from state.
40func nx_dev_render(self: *i64, buf: *u8, w: i64, h: i64) -> i64 {
41 let col: i64 = self[1]
42 let cr: i64 = (col >> 16) & 255
43 let cg: i64 = (col >> 8) & 255
44 let cb: i64 = col & 255
45 var sgn: i64 = 1
46 if nx_edge(32,96,64,32,96,96) < 0 { sgn = 0 - 1 }
47 var cov: i64 = 0
48 var y: i64 = 0
49 while y < h {
50 var x: i64 = 0
51 while x < w {
52 let w0: i64 = nx_edge(64,32,96,96, 2*x+1, 2*y+1) * sgn
53 let w1: i64 = nx_edge(96,96,32,96, 2*x+1, 2*y+1) * sgn
54 let w2: i64 = nx_edge(32,96,64,32, 2*x+1, 2*y+1) * sgn
55 let o: i64 = (y*w + x)*3
56 var inside: i64 = 0
57 if w0 >= 0 { if w1 >= 0 { if w2 >= 0 { inside = 1 } } }
58 if inside == 1 { buf[o]=cr as u8; buf[o+1]=cg as u8; buf[o+2]=cb as u8; cov = cov + 1 }
59 else { buf[o]=0 as u8; buf[o+1]=0 as u8; buf[o+2]=0 as u8 }
60 x = x + 1
61 }
62 y = y + 1
63 }
64 return cov
65}
66
67func nx_dev_get_info(self: *i64) -> i64 { return self[1] }
68
69// ---- ID3D11Device COM method bodies (real IUnknown + a device method), object layout self[0]=vtbl, self[1]=refcount ----
70func nx_dev_qi(self: *i64, riid: *i64, ppv: *i64) -> i64 { ppv[0] = self as i64; self[1] = self[1] + 1; return 0 } // *ppv=this; AddRef; S_OK
71func nx_dev_addref(self: *i64) -> i64 { self[1] = self[1] + 1; return self[1] } // ULONG AddRef
72func nx_dev_release(self: *i64) -> i64 { self[1] = self[1] - 1; return self[1] } // ULONG Release
73func nx_dev_getfl(self: *i64) -> i64 { return 45056 } // D3D_FEATURE_LEVEL_11_0 = 0xB000
74func nx_dev_notimpl(self: *i64) -> i64 { return 2147500033 } // E_NOTIMPL = 0x80004001
75
76// ---- device+context 2-interface path for a real ClearRenderTargetView. object mem: [0]dev_vtbl [1]dev_rc [2]ctx_vtbl
77// [3]ctx_rc [4]rtv_buffer. context object = &mem[2]; RTV object = &mem[4] (holds the buffer ptr). ----
78func to_unorm8(bits: i64) -> i64 { return f32_int(f32_add(f32_mul(bits, f32_of(255)), f32_div(f32_of(1), f32_of(2)))) } // round(f*255), D3D UNORM
79func ld32(p: *u8, o: i64) -> i64 { return (p[o] as i64) | ((p[o+1] as i64)<<8) | ((p[o+2] as i64)<<16) | ((p[o+3] as i64)<<24) }
80func nx_dev_getctx(self: *i64, ppCtx: *i64) -> i64 { ppCtx[0] = (self as i64) + 16; return 0 } // GetImmediateContext -> &mem[2]
81func nx_dev_create_rtv(self: *i64, pRes: i64, pDesc: i64, ppRTV: *i64) -> i64 { self[4] = pRes; ppRTV[0] = (self as i64) + 32; return 0 } // RTV wraps the buffer @ &mem[4]
82func nx_ctx_clearrtv(self: *i64, rtv: *i64, colorptr: *u8) -> i64 { // ClearRenderTargetView(ctx, rtv, FLOAT[4])
83 let buf: *u8 = rtv[0] as *u8
84 let cr: i64 = to_unorm8(ld32(colorptr, 0))
85 let cg: i64 = to_unorm8(ld32(colorptr, 4))
86 let cb: i64 = to_unorm8(ld32(colorptr, 8))
87 let ca: i64 = to_unorm8(ld32(colorptr, 12))
88 var i: i64 = 0
89 while i < 4096 { buf[i*4]=cr as u8; buf[i*4+1]=cg as u8; buf[i*4+2]=cb as u8; buf[i*4+3]=ca as u8; i = i + 1 } // fill 64x64 RGBA8
90 return 0
91}
92
93// ---- real geometry Draw: CreateBuffer(verts) -> IASetVertexBuffers -> OMSetRenderTargets -> Draw. mem[5]=bound_rt(RTV)
94// mem[6]=bound_vb(buffer obj) mem[7]=buffer_storage(verts ptr). vert = 5 i64 {sx,sy,r,g,b}; barycentric color interp. ----
95func nx_dev_create_buffer(self: *i64, pDesc: i64, pInit: *i64, ppBuf: *i64) -> i64 { // CreateBuffer
96 if (pInit as i64) != 0 { self[7] = pInit[0] } // pSysMem = vertex data
97 ppBuf[0] = (self as i64) + 56 // buffer object = &mem[7]
98 return 0
99}
100func nx_ctx_om_set_rt(self: *i64, num: i64, ppRTV: *i64, dsv: i64) -> i64 { self[3] = ppRTV[0]; return 0 } // OMSetRenderTargets -> bound RT
101func nx_ctx_ia_set_vb(self: *i64, start: i64, num: i64, ppVB: *i64) -> i64 { self[4] = ppVB[0]; return 0 } // IASetVertexBuffers -> bound VB (ignores stride/offset stack args)
102// CreatePixelShader(This, pBytecode, len, pLinkage, ppShader) -- 5 args (ppShader on stack -> 5-arg thunk). handle = blob ptr.
103func nx_dev_create_shader(self: *i64, bc: i64, len: i64, link: i64, ppShader: *i64) -> i64 { ppShader[0] = bc; return 0 }
104// PSSetShader(This, pShader, ppClassInstances, num) -> bound_ps = ctx self[6] (mem[8])
105func nx_ctx_pssetshader(self: *i64, ps: i64, cinst: i64, num: i64) -> i64 { self[6] = ps; return 0 }
106
107// ---- TEXTURING: CreateTexture2D -> CreateShaderResourceView -> PSSetShaderResources -> textured Draw (identity 1:1 sample).
108// mem[9]=tex_storage (texdata ptr), mem[10]=bound_srv. RTV/VB as before. 64x64 RGBA8 texture sampled texel(x,y)=frag(x,y). ----
109func nx_dev_create_tex(self: *i64, pDesc: i64, pInit: *i64, ppTex: *i64) -> i64 { // CreateTexture2D
110 if (pInit as i64) != 0 { self[9] = pInit[0] } // pSysMem = texture data
111 ppTex[0] = (self as i64) + 72 // texture object = &mem[9]
112 return 0
113}
114func nx_dev_create_srv(self: *i64, pRes: i64, pDesc: i64, ppSRV: *i64) -> i64 { ppSRV[0] = pRes; return 0 } // CreateShaderResourceView -> SRV wraps the texture obj
115func nx_ctx_pssetsrv(self: *i64, start: i64, num: i64, ppSRV: *i64) -> i64 { self[8] = ppSRV[0]; return 0 } // PSSetShaderResources -> bound_srv = ctx self[8] (mem[10])
116func nx_ctx_draw_tex(self: *i64, vcount: i64, start: i64) -> i64 { // textured Draw
117 let srv: *i64 = self[8] as *i64
118 let texdata: *u8 = srv[0] as *u8
119 let rtv: *i64 = self[3] as *i64
120 let rt: *u8 = rtv[0] as *u8
121 let vbobj: *i64 = self[4] as *i64
122 let verts: *i64 = vbobj[0] as *i64
123 let ar: i64 = nx_edge(verts[0], verts[1], verts[5], verts[6], verts[10], verts[11])
124 var sgn: i64 = 1
125 if ar < 0 { sgn = 0 - 1 }
126 var y: i64 = 0
127 while y < 64 {
128 var x: i64 = 0
129 while x < 64 {
130 let sx: i64 = 2*x+1; let sy: i64 = 2*y+1
131 let w0: i64 = nx_edge(verts[5], verts[6], verts[10], verts[11], sx, sy) * sgn
132 let w1: i64 = nx_edge(verts[10], verts[11], verts[0], verts[1], sx, sy) * sgn
133 let w2: i64 = nx_edge(verts[0], verts[1], verts[5], verts[6], sx, sy) * sgn
134 let o: i64 = (y*64+x)*4
135 var inside: i64 = 0
136 if w0>=0 { if w1>=0 { if w2>=0 { inside=1 } } }
137 if inside == 1 { // identity sample: texel (x,y)
138 rt[o]=texdata[o]; rt[o+1]=texdata[o+1]; rt[o+2]=texdata[o+2]; rt[o+3]=texdata[o+3]
139 } else {
140 rt[o]=0 as u8; rt[o+1]=0 as u8; rt[o+2]=0 as u8; rt[o+3]=0 as u8
141 }
142 x = x + 1
143 }
144 y = y + 1
145 }
146 return 0
147}
148
149func nx_ctx_draw(self: *i64, vcount: i64, start: i64) -> i64 { // Draw -> rasterize; execute bound PS if any
150 let rtv: *i64 = self[3] as *i64
151 let rt: *u8 = rtv[0] as *u8
152 let vbobj: *i64 = self[4] as *i64
153 let verts: *i64 = vbobj[0] as *i64
154 let bound_ps: i64 = self[6]
155 var pcr: i64 = 0; var pcg: i64 = 0; var pcb: i64 = 0
156 if bound_ps != 0 { // EXECUTE the real fxc DXBC pixel shader
157 let blob: *u8 = bound_ps as *u8
158 let nc: i64 = dxbc_total_size(blob)
159 let payoff: i64 = dxbc_find(blob, nc, dx_fourcc(83, 72, 69, 88)) // 'SHEX'
160 let regs: *i64 = (self as i64 + 240) as *i64 // mem[32], 256 i64
161 let scratch: *i64 = (self as i64 + 2544) as *i64 // mem[320], 76 i64
162 sh_execute_scratch(blob, payoff, nc, regs, scratch)
163 pcr = to_unorm8(regs[64]); pcg = to_unorm8(regs[65]); pcb = to_unorm8(regs[66]) // o0.xyz -> UNORM8
164 }
165 let ar: i64 = nx_edge(verts[0], verts[1], verts[5], verts[6], verts[10], verts[11])
166 var sgn: i64 = 1
167 if ar < 0 { sgn = 0 - 1 }
168 let area: i64 = ar * sgn
169 var y: i64 = 0
170 while y < 64 {
171 var x: i64 = 0
172 while x < 64 {
173 let sx: i64 = 2*x+1; let sy: i64 = 2*y+1
174 let w0: i64 = nx_edge(verts[5], verts[6], verts[10], verts[11], sx, sy) * sgn
175 let w1: i64 = nx_edge(verts[10], verts[11], verts[0], verts[1], sx, sy) * sgn
176 let w2: i64 = nx_edge(verts[0], verts[1], verts[5], verts[6], sx, sy) * sgn
177 let o: i64 = (y*64+x)*4
178 var inside: i64 = 0
179 if w0>=0 { if w1>=0 { if w2>=0 { inside=1 } } }
180 if inside == 1 {
181 if bound_ps != 0 { // shaded: PS output color
182 rt[o]=pcr as u8; rt[o+1]=pcg as u8; rt[o+2]=pcb as u8; rt[o+3]=255 as u8
183 } else { // fixed-function: barycentric vertex-color interp
184 rt[o] = ((w0*verts[2] + w1*verts[7] + w2*verts[12] + area/2)/area) as u8
185 rt[o+1] = ((w0*verts[3] + w1*verts[8] + w2*verts[13] + area/2)/area) as u8
186 rt[o+2] = ((w0*verts[4] + w1*verts[9] + w2*verts[14] + area/2)/area) as u8
187 rt[o+3] = 255 as u8
188 }
189 } else {
190 rt[o]=0 as u8; rt[o+1]=0 as u8; rt[o+2]=0 as u8; rt[o+3]=0 as u8
191 }
192 x = x + 1
193 }
194 y = y + 1
195 }
196 return 0
197}
198
199func main() -> i64 {
200 let m: *i64 = sys_mmap(64) as *i64
201 m[1] = 7
202 let b: *u8 = sys_mmap(16)
203 var s: i64 = nishi_answer() + nishi_render(b, 0, 0) + nx_dev_render(m, b, 0, 0) + nx_dev_get_info(m)
204 s = s + nx_dev_qi(m, m, m) + nx_dev_addref(m) + nx_dev_release(m) + nx_dev_getfl(m) + nx_dev_notimpl(m)
205 s = s + nx_dev_getctx(m, m) + nx_dev_create_rtv(m, 0, 0, m) + nx_ctx_clearrtv(m, m, b) + to_unorm8(0) + ld32(b, 0)
206 s = s + nx_dev_create_buffer(m, 0, m, m) + nx_ctx_om_set_rt(m, 1, m, 0) + nx_ctx_ia_set_vb(m, 0, 1, m)
207 s = s + nx_dev_create_shader(m, 0, 0, 0, m) + nx_ctx_pssetshader(m, 0, 0, 0)
208 s = s + nx_dev_create_tex(m, 0, m, m) + nx_dev_create_srv(m, 0, 0, m) + nx_ctx_pssetsrv(m, 0, 1, m)
209 if s == 0 - 999 { s = s + nx_ctx_draw(m, 3, 0) + nx_ctx_draw_tex(m, 3, 0) } // keep draws (never taken; --build-only)
210 return s
211}