nx_cast_projection_capture_t235.nx source
↩ module page · 50 lines · 2165 B
1// Projection metadata is consumed only at line boundaries in the same pinned shader capture.
2import "nx_shader_ir.nx"
3import "nx_cast_projection_contract_t234.nx"
4func cpr_field(buf:*u8,n:i64,key:*u8)->i64{
5 if n<=0{return 0-1}
6 if (buf as i64)<=0{return 0-1}
7 let k:i64=rk_slen(key);var start:i64=0;var found:i64=0;var value:i64=0-1
8 while start<n{
9 var end:i64=start
10 while end<n{if buf[end]==(10 as u8){break};end=end+1}
11 var key_equal:i64=0
12 if end-start>=k{
13 key_equal=1;var j:i64=0
14 while j<k{if buf[start+j]!=key[j]{key_equal=0};j=j+1}
15 }
16 if key_equal==1{
17 if end==n{return 0-1}
18 found=found+1;if found>1{return 0-1}
19 value=rk_lm_decimal(buf,start+k,end)
20 if value<0{return 0-1}
21 }
22 start=end+1
23 }
24 if found!=1{return 0-1};return value
25}
26func cpr_read(buf:*u8,n:i64,fields:*i64)->i64{
27 var i:i64=0;while i<5{fields[i]=0;i=i+1}
28 let version:i64=cpr_field(buf,n,"cast_projection_version=")
29 let near:i64=cpr_field(buf,n,"cast_projection_near_num=")
30 let far:i64=cpr_field(buf,n,"cast_projection_far_num=")
31 let guard:i64=cpr_field(buf,n,"cast_projection_guard_num=")
32 let den:i64=cpr_field(buf,n,"cast_projection_den=")
33 let q:i64=cpr_field(buf,n,"cast_projection_near_q8=")
34 if version!=1||q<=0{return 0}
35 if csp_valid(near,far,guard,den)!=1{return 0}
36 if csp_near_q8_for(near,den)!=q{return 0}
37 fields[0]=near;fields[1]=far;fields[2]=guard;fields[3]=den;fields[4]=q;return 1
38}
39func cpr_emit(out:*u8,pos:i64,buf:*u8,n:i64)->i64{
40 let fields:*i64=sys_mmap_try(5*__size_of(i64)) as *i64
41 if (fields as i64)<=0{gsb_failed=1;return gpe_ap(out,pos,"const NXCP=null;\n")}
42 let valid:i64=cpr_read(buf,n,fields)
43 if valid!=1{sys_munmap_direct(fields as *u8,5*__size_of(i64));gsb_failed=1;return gpe_ap(out,pos,"const NXCP=null;\n")}
44 var p:i64=gpe_ap(out,pos,"const NXCP={version:1,nearQ8:")
45 p=rk_num(out,p,fields[4]);p=gpe_ap(out,p,",nearNumerator:");p=rk_num(out,p,fields[0])
46 p=gpe_ap(out,p,",farNumerator:");p=rk_num(out,p,fields[1])
47 p=gpe_ap(out,p,",guardNumerator:");p=rk_num(out,p,fields[2])
48 p=gpe_ap(out,p,",denominator:");p=rk_num(out,p,fields[3]);p=gpe_ap(out,p,"};\n")
49 sys_munmap_direct(fields as *u8,5*__size_of(i64));return p
50}