code wiki / (root) / nx_pe_dll_d3d11tex.nx

nx_pe_dll_d3d11tex.nx source

↩ module page · 206 lines · 10702 B

1// nx_pe_dll_d3d11tex.nx -- TEXTURING through the real D3D11 API. 14 methods; adds the texture resource path: 2// CreateTexture2D [dev slot 5] -> CreateShaderResourceView [dev slot 7] -> PSSetShaderResources [ctx slot 8] -> textured 3// Draw [ctx slot 13]. The Draw samples the bound 64x64 RGBA texture 1:1 (identity: texel(x,y)=fragment(x,y)) into the RT. 4// Graded vs WARP's textured triangle (knowledge/warp_textured.ppm, UV=screen/64 + point sampling = the same 1:1 map). 5// Method bodies = sovereign nx_cc NishiLang; vtables+glue = sovereign emitter. All slots from <d3d11.h>. 6// Input /tmp/nishi_export_lib.s Output knowledge/nishi_d3d11tex.dll license_tier: ORIGINAL expect_exit: 0 7import "nx_syscalls.nx" 8import "nxasm_x86.nx" 9import "nx_pe_writer.nx" 10 11const N_DEV: i64 = 43 12const N_CTX: i64 = 108 13const N_METH: i64 = 14 14 15func d11_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 16func d11_putn(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 } 17func d11_wstr(buf: *u8, off: i64, s: *u8) -> i64 { var i: i64=0; while s[i]!=(0 as u8){ buf[off+i]=s[i]; i=i+1 } buf[off+i]=0 as u8; return i+1 } 18 19func d11_assemble(src: *u8, n: i64, out: *u8, out_cap: i64, names: *i64, offs: *i64, cnt: i64) -> i64 { 20 let lab_off: *i64 = sys_mmap(ASM_MAX_LABELS * 8) as *i64 21 let lab_len: *i64 = sys_mmap(ASM_MAX_LABELS * 8) as *i64 22 let lab_addr: *i64 = sys_mmap(ASM_MAX_LABELS * 8) as *i64 23 let lab_sec: *i64 = sys_mmap(ASM_MAX_LABELS * 8) as *i64 24 let op0: *i64 = sys_mmap(72) as *i64 // 9 slots for SIB (matches nxasm_x86) 25 let op1: *i64 = sys_mmap(72) as *i64 26 let op2: *i64 = sys_mmap(72) as *i64 // API DRIFT FIX: axc_pass gained op2 27 let scratch: *u8 = sys_mmap(64) 28 let posbox: *i64 = sys_mmap(16) as *i64 29 let n_lab_box: *i64 = sys_mmap(16) as *i64 30 n_lab_box[0] = 0 31 let lh: *i64 = sys_mmap(ASM_LH_SIZE * 8) as *i64 32 let text_size: i64 = axc_pass(src, n, out, 0, 0, lab_off, lab_len, lab_addr, lab_sec, n_lab_box, lh, op0, op1, op2, scratch, posbox) 33 if text_size < 0 { return text_size } 34 let n_lab: i64 = n_lab_box[0] 35 var k: i64 = 0 36 while k < n_lab { 37 if lab_sec[k] == 1 { lab_addr[k] = lab_addr[k] + text_size } 38 var m: i64 = 0 39 while m < cnt { if axc_tok_is(src, lab_off[k], lab_len[k], names[m] as *u8) == 1 { offs[m] = lab_addr[k] } m = m + 1 } 40 k = k + 1 41 } 42 axc_lh_build(src, lab_off, lab_len, n_lab, lh) 43 let total: i64 = axc_pass(src, n, out, text_size, 1, lab_off, lab_len, lab_addr, lab_sec, n_lab_box, lh, op0, op1, op2, scratch, posbox) 44 if total < 0 { return total } 45 if total > out_cap { return 0 - 200 } 46 return total 47} 48 49func d11_thunk(buf: *u8, tco: i64, moff: i64) -> i64 { 50 let t: i64 = 0x200 + tco 51 _w8(buf,t+0,0x57); _w8(buf,t+1,0x56) 52 _w8(buf,t+2,0x48); _w8(buf,t+3,0x89); _w8(buf,t+4,0xCF) 53 _w8(buf,t+5,0x48); _w8(buf,t+6,0x89); _w8(buf,t+7,0xD6) 54 _w8(buf,t+8,0x4C); _w8(buf,t+9,0x89); _w8(buf,t+10,0xC2) 55 _w8(buf,t+11,0x4C); _w8(buf,t+12,0x89); _w8(buf,t+13,0xC9) 56 _w8(buf,t+14,0x48); _w8(buf,t+15,0x83); _w8(buf,t+16,0xEC); _w8(buf,t+17,0x08) 57 _w8(buf,t+18,0xE8); _w32(buf, t+19, moff - (tco + 23)) 58 _w8(buf,t+23,0x48); _w8(buf,t+24,0x83); _w8(buf,t+25,0xC4); _w8(buf,t+26,0x08) 59 _w8(buf,t+27,0x5E); _w8(buf,t+28,0x5F); _w8(buf,t+29,0xC3) 60 return 0 61} 62 63// methods: 0=qi 1=addref 2=release 3=getfl 4=notimpl 5=getctx 6=create_rtv 7=create_buffer 8=om_set_rt 9=ia_set_vb 64// 10=create_tex 11=create_srv 12=pssetsrv 13=draw_tex 65func d11_dev_slot(s: i64) -> i64 { 66 if s == 0 { return 0 } 67 if s == 1 { return 1 } 68 if s == 2 { return 2 } 69 if s == 3 { return 7 } // CreateBuffer 70 if s == 5 { return 10 } // CreateTexture2D 71 if s == 7 { return 11 } // CreateShaderResourceView 72 if s == 9 { return 6 } // CreateRenderTargetView 73 if s == 37 { return 3 } // GetFeatureLevel 74 if s == 40 { return 5 } // GetImmediateContext 75 return 4 76} 77func d11_ctx_slot(s: i64) -> i64 { 78 if s == 0 { return 0 } 79 if s == 1 { return 1 } 80 if s == 2 { return 2 } 81 if s == 8 { return 12 } // PSSetShaderResources 82 if s == 13 { return 13 } // Draw (textured) 83 if s == 18 { return 9 } // IASetVertexBuffers 84 if s == 33 { return 8 } // OMSetRenderTargets 85 return 4 86} 87 88func d11_emit(buf: *u8, code: *u8, code_len: i64, offs: *i64) -> i64 { 89 if (buf as i64) == 0 { return 0 - NX_PE_BAD_INPUT } 90 let FF: i64 = code_len + N_METH * 30 91 let DV: i64 = ((FF + 41 + 7) / 8) * 8 92 let CV: i64 = DV + N_DEV * 8 93 let text_used: i64 = CV + N_CTX * 8 94 let text_pages: i64 = (text_used + 4095) / 4096 95 let text_raw: i64 = text_pages * 4096 96 let edata_rva: i64 = 0x1000 + text_raw 97 let edata_file: i64 = 0x200 + text_raw 98 let size_of_image: i64 = edata_rva + 0x1000 99 let file_size: i64 = edata_file + 0x200 100 101 _w16(buf, 0, 0x5A4D); _w32(buf, 0x3C, 0x80); _w32(buf, 0x80, 0x00004550) 102 _w16(buf, 0x84 + 0, PE_MACHINE_AMD64); _w16(buf, 0x84 + 2, 2); _w16(buf, 0x84 + 16, 0xF0); _w16(buf, 0x84 + 18, 0x2022) 103 let O: i64 = 0x98 104 _w16(buf, O + 0, PE_OH_MAGIC_PEPLUS); _w8(buf, O + 2, 1) 105 _w32(buf, O + 4, text_raw); _w32(buf, O + 8, 0x200) 106 _w32(buf, O + 16, 0); _w32(buf, O + 20, 0x1000) 107 _w64(buf, O + 24, 0x80000000, 0x1) 108 _w32(buf, O + 32, 0x1000); _w32(buf, O + 36, 0x200) 109 _w16(buf, O + 40, 6); _w16(buf, O + 48, 6) 110 _w32(buf, O + 56, size_of_image); _w32(buf, O + 60, 0x200) 111 _w16(buf, O + 68, PE_SUBSYSTEM_CONSOLE) 112 _w64(buf, O + 72, 0x100000, 0); _w64(buf, O + 80, 0x1000, 0); _w64(buf, O + 88, 0x100000, 0); _w64(buf, O + 96, 0x1000, 0) 113 _w32(buf, O + 108, 16) 114 _w32(buf, O + 112 + 0, edata_rva); _w32(buf, O + 112 + 4, 0x56) 115 116 _emit_section_header(buf, FOFF_SECT_TBL, 46, 116, 101, 120, 116, 0, 0, 0, text_used, 0x1000, text_raw, 0x200, PE_SECT_CODE_X_R) 117 _emit_section_header(buf, FOFF_SECT_TBL + 40, 46, 101, 100, 97, 116, 97, 0, 0, 0x56, edata_rva, 0x200, edata_file, PE_SECT_DATA_R) 118 119 var i: i64 = 0 120 while i < code_len { buf[0x200 + i] = code[i]; i = i + 1 } 121 122 var j: i64 = 0 123 while j < N_METH { d11_thunk(buf, code_len + j*30, offs[j]); j = j + 1 } 124 125 let f: i64 = 0x200 + FF 126 _w8(buf,f+0,0x48); _w8(buf,f+1,0x89); _w8(buf,f+2,0xC8) 127 _w8(buf,f+3,0x48); _w8(buf,f+4,0x8D); _w8(buf,f+5,0x15); _w32(buf, f+6, DV - FF - 10) 128 _w8(buf,f+10,0x48); _w8(buf,f+11,0x89); _w8(buf,f+12,0x11) 129 _w8(buf,f+13,0x48); _w8(buf,f+14,0xC7); _w8(buf,f+15,0x41); _w8(buf,f+16,0x08); _w32(buf, f+17, 1) 130 _w8(buf,f+21,0x48); _w8(buf,f+22,0x8D); _w8(buf,f+23,0x15); _w32(buf, f+24, CV - FF - 28) 131 _w8(buf,f+28,0x48); _w8(buf,f+29,0x89); _w8(buf,f+30,0x51); _w8(buf,f+31,0x10) 132 _w8(buf,f+32,0x48); _w8(buf,f+33,0xC7); _w8(buf,f+34,0x41); _w8(buf,f+35,0x18); _w32(buf, f+36, 1) 133 _w8(buf,f+40,0xC3) 134 135 var s: i64 = 0 136 while s < N_DEV { _w64(buf, 0x200 + DV + s*8, 0x80000000 + 0x1000 + code_len + d11_dev_slot(s)*30, 1); s = s + 1 } 137 var c: i64 = 0 138 while c < N_CTX { _w64(buf, 0x200 + CV + c*8, 0x80000000 + 0x1000 + code_len + d11_ctx_slot(c)*30, 1); c = c + 1 } 139 140 let E: i64 = edata_file 141 _w32(buf, E + 12, edata_rva + 0x4A) 142 _w32(buf, E + 16, 1); _w32(buf, E + 20, 1); _w32(buf, E + 24, 1) 143 _w32(buf, E + 28, edata_rva + 0x28); _w32(buf, E + 32, edata_rva + 0x2C); _w32(buf, E + 36, edata_rva + 0x30) 144 _w32(buf, E + 0x28, 0x1000 + FF) 145 _w32(buf, E + 0x2C, edata_rva + 0x32) 146 _w16(buf, E + 0x30, 0) 147 d11_wstr(buf, E + 0x32, "nishi_d3d_create_device\x00" as *u8) 148 d11_wstr(buf, E + 0x4A, "nishicc.dll\x00" as *u8) 149 return file_size 150} 151 152func main() -> i64 { 153 d11_puts("=== nx_pe_dll_d3d11tex -- device+context DLL with a real textured Draw ===\n" as *u8) 154 let lenbox: *i64 = sys_mmap(16) as *i64 155 let src: *u8 = sys_read_file("/tmp/nishi_export_lib.s" as *u8, lenbox) 156 if (src as i64) == 0 { d11_puts("FAIL no /tmp/nishi_export_lib.s\n" as *u8); sys_exit(1); return 1 } 157 let n: i64 = lenbox[0] 158 if n <= 0 { d11_puts("FAIL empty .s\n" as *u8); sys_exit(2); return 2 } 159 160 let names: *i64 = sys_mmap(8*N_METH) as *i64 161 names[0] = "nx_dev_qi" as *u8 as i64 162 names[1] = "nx_dev_addref" as *u8 as i64 163 names[2] = "nx_dev_release" as *u8 as i64 164 names[3] = "nx_dev_getfl" as *u8 as i64 165 names[4] = "nx_dev_notimpl" as *u8 as i64 166 names[5] = "nx_dev_getctx" as *u8 as i64 167 names[6] = "nx_dev_create_rtv" as *u8 as i64 168 names[7] = "nx_dev_create_buffer" as *u8 as i64 169 names[8] = "nx_ctx_om_set_rt" as *u8 as i64 170 names[9] = "nx_ctx_ia_set_vb" as *u8 as i64 171 names[10] = "nx_dev_create_tex" as *u8 as i64 172 names[11] = "nx_dev_create_srv" as *u8 as i64 173 names[12] = "nx_ctx_pssetsrv" as *u8 as i64 174 names[13] = "nx_ctx_draw_tex" as *u8 as i64 175 let offs: *i64 = sys_mmap(8*N_METH) as *i64 176 var z: i64 = 0 177 while z < N_METH { offs[z] = 0 - 1; z = z + 1 } 178 179 let code: *u8 = sys_mmap(4194304) 180 let code_len: i64 = d11_assemble(src, n, code, 4194304, names, offs, N_METH) 181 if code_len < 0 { d11_puts("FAIL assemble rc="); d11_putn(code_len); d11_puts("\n" as *u8); sys_exit(3); return 3 } 182 var miss: i64 = 0 183 var q: i64 = 0 184 while q < N_METH { if offs[q] < 0 { d11_puts(" MISSING method "); d11_putn(q); d11_puts("\n" as *u8); miss = miss + 1 } q = q + 1 } 185 if miss > 0 { d11_puts("FAIL method(s) not found\n" as *u8); sys_exit(4); return 4 } 186 d11_puts(" code_len="); d11_putn(code_len); d11_puts("\n" as *u8) 187 188 let buf: *u8 = sys_mmap(0x80000) 189 let fsz: i64 = d11_emit(buf, code, code_len, offs) 190 if fsz < 0 { d11_puts("FAIL emit rc="); d11_putn(fsz); d11_puts("\n" as *u8); sys_exit(5); return 5 } 191 192 let fd: i64 = sys_openat_wr("knowledge/nishi_d3d11tex.dll\x00" as *u8, 0x1a4) 193 if fd < 0 { d11_puts("FAIL open output\n" as *u8); sys_exit(6); return 6 } 194 let wrote: i64 = sys_write(fd, buf, fsz) 195 sys_close(fd) 196 d11_puts(" wrote "); d11_putn(wrote); d11_puts(" bytes -> knowledge/nishi_d3d11tex.dll (textured Draw)\n" as *u8) 197 198 var fails: i64 = 0 199 if (buf[0] as i64) != 0x4D { fails=fails+1 } 200 if (buf[0x84+18] as i64) != 0x22 { fails=fails+1 } 201 if wrote != fsz { fails=fails+1 } 202 if fails == 0 { d11_puts("NX-PE-D3D11TEX GREEN -- textured-Draw DLL; harness must CreateTexture2D+Draw via real <d3d11.h>\n" as *u8); sys_exit(0); return 0 } 203 d11_puts("NX-PE-D3D11TEX RED fails="); d11_putn(fails); d11_puts("\n" as *u8) 204 sys_exit(1) 205 return 1 206}