nx_gpu_capture_store_lib.nx source
↩ module page · 44 lines · 2515 B
1// Validated GPU capture -> immutable append-only row, composing existing capture retry/CAS storage.
2import "nx_gpu_capture_lib.nx"
3import "nx_world_capture_meta.nx"
4import "nx_capture_append_lib.nx"
5import "nx_base64.nx"
6const GCS_VALIDATION_BASE: i64=-300
7const GCS_BAD_META: i64=-201
8const GCS_BODY_LIMIT: i64=-202
9const GCS_WORK_BYTES: i64=256
10// Row: id + seven normalized metadata columns + NXGT1 + base64(exact validated body).
11// Positive result=new row, zero=identical retry; negative preserves existing capture history.
12func gcs_append(prefix: *u8,query: *u8,qn: i64,body: *u8,bn: i64,max_body: i64,max_rows: i64) -> i64 {
13 if bn<0 || max_body<0 || bn>max_body { return GCS_BODY_LIMIT }
14 // Bound output-size arithmetic independently of a caller's policy.
15 if bn>(9223372036854775807-WCM_OUT_CAP-CA_HASH_BYTES-32)/4 { return GCS_BODY_LIMIT }
16 let work: *i64=sys_mmap(GCS_WORK_BYTES) as *i64
17 let checked: i64=gtc_validate(body,bn,max_rows,work)
18 if checked<0 { sys_munmap(work as *u8,GCS_WORK_BYTES); return GCS_VALIDATION_BASE+checked }
19 let meta: *u8=sys_mmap(WCM_OUT_CAP)
20 let mn: i64=wcm_parse(query,qn,work,meta,WCM_OUT_CAP)
21 var valid: i64=1
22 if mn<0 { valid=0 } else {
23 if wcm_equal(query,work[8],work[9],"webgpu" as *u8)==0 { valid=0 }
24 if wcm_equal(query,work[10],work[11],"gpu-pass" as *u8)==0 { valid=0 }
25 }
26 if valid==0 { sys_munmap(meta,WCM_OUT_CAP); sys_munmap(work as *u8,GCS_WORK_BYTES); return GCS_BAD_META }
27 let raw: *u8=sys_mmap(32)
28 let hashes: *u8=sys_mmap((CA_HASH_BYTES+1)*2)
29 let fp: *u8=((hashes as i64)+CA_HASH_BYTES+1) as *u8
30 var identity_end: i64=0; var separators: i64=0
31 while identity_end<mn { if meta[identity_end]==9 as u8 { separators=separators+1; if separators==2 { break } }; identity_end=identity_end+1 }
32 ca_fingerprint(work as *Sha256,raw,hashes,"nishi.gpu.capture.id.v1\n" as *u8,meta,identity_end,meta,0)
33 ca_fingerprint(work as *Sha256,raw,fp,"nishi.gpu.capture.payload.v1\n" as *u8,meta,mn,body,bn)
34 let rowcap: i64=CA_HASH_BYTES+1+mn+1+6+((bn+2)/3)*4+1
35 let row: *u8=sys_mmap(rowcap)
36 var o: i64=ss_cat(row,0,hashes); row[o]=9 as u8; o=o+1
37 var i: i64=0; while i<mn { row[o]=meta[i]; o=o+1; i=i+1 }
38 row[o]=9 as u8; o=o+1; o=ss_cat(row,o,"NXGT1\t" as *u8)
39 o=o+b64_encode(body,bn,((row as i64)+o) as *u8); row[o]=10 as u8; o=o+1
40 let result: i64=ca_append_once(prefix,hashes,fp,row,o)
41 sys_munmap(row,rowcap); sys_munmap(hashes,(CA_HASH_BYTES+1)*2); sys_munmap(raw,32)
42 sys_munmap(meta,WCM_OUT_CAP); sys_munmap(work as *u8,GCS_WORK_BYTES)
43 return result
44}