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}