code wiki / (root) / nx_cast_projection_capture_t235.nx

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}