A standalone Vulkan inference engine (engine/) for DLSS presets K and M that runs from weights extracted from the user's own nvngx_dlss.dll, with d4r's own input, network and reconstruction shaders or the native HIP network layers, recorded into the game's command list by the shim. Opt-in ([Engine] Enabled / D4R_ENGINE=1); anything uncovered falls back to the CUDA/ZLUDA path with the reason logged. Byte-identical to NGX's CUDA backend under the phase-capable reference (1706x960 -> 2560x1440, native HIP network, eleven frames, RX 9070 XT): - K render- and display-resolution motion vectors, HDR and LDR - K game-supplied exposure and automatic exposure with any pre-exposure and exposure scale (one residual: effective exposure exactly 2 or 4) - K and M with the DLSS indicator's inverted-axis parameters - M with any exposure settings (NGX ignores them for M) K packages need the current compile_k.py (marker D4RO0003). Also: HIP shared buffers are pooled across feature recreation (ROCm leaks destroyed imports), hipnet.bin must match the preset, M-only games do not load the K model, install_d4r_runtime.sh stages k, k-ldr, m, m-ldr with hip/, the activation table has a generator (gen_activation_m.py), and package_release.sh can bundle the engine's shaders (never its weights). Signed-off-by: woutermans <[email protected]>
271 lines
11 KiB
GLSL
271 lines
11 KiB
GLSL
// Expansion activations are functions of the 256 E4M3 codes, not arbitrary floats. Each row packs binary16
|
|
// sigmoid, tanh and the separate-half-op gate .5*tanh(.5*x)+.5. This avoids GLSL half transcendental lowering,
|
|
// which differs from the accuracy reference by one half ulp and then crosses normalized-store thresholds.
|
|
// Computed by gen_activation_m.py from those formulas alone (sigmoid's f32 exp2(-1.442695*x), correctly rounded
|
|
// binary16 tanh); `gen_activation_m.py --check` verifies this table. All four expansion surfaces replay
|
|
// bit-identically against the captured reset frame with it.
|
|
const uvec2 ACT[256] = uvec2[256](
|
|
uvec2(0x00003800u, 0x00003800u),
|
|
uvec2(0x18003801u, 0x00003801u),
|
|
uvec2(0x1c003802u, 0x00003802u),
|
|
uvec2(0x1e003803u, 0x00003803u),
|
|
uvec2(0x20003804u, 0x00003804u),
|
|
uvec2(0x21003805u, 0x00003805u),
|
|
uvec2(0x22003806u, 0x00003806u),
|
|
uvec2(0x23003807u, 0x00003807u),
|
|
uvec2(0x24003808u, 0x00003808u),
|
|
uvec2(0x24803809u, 0x00003809u),
|
|
uvec2(0x2500380au, 0x0000380au),
|
|
uvec2(0x2580380bu, 0x0000380bu),
|
|
uvec2(0x2600380cu, 0x0000380cu),
|
|
uvec2(0x2680380du, 0x0000380du),
|
|
uvec2(0x2700380eu, 0x0000380eu),
|
|
uvec2(0x277f380fu, 0x0000380fu),
|
|
uvec2(0x27ff3810u, 0x00003810u),
|
|
uvec2(0x28803812u, 0x00003812u),
|
|
uvec2(0x28ff3814u, 0x00003814u),
|
|
uvec2(0x297f3816u, 0x00003816u),
|
|
uvec2(0x29ff3818u, 0x00003818u),
|
|
uvec2(0x2a7f381au, 0x0000381au),
|
|
uvec2(0x2afe381cu, 0x0000381cu),
|
|
uvec2(0x2b7e381eu, 0x0000381eu),
|
|
uvec2(0x2bfd3820u, 0x00003820u),
|
|
uvec2(0x2c7e3824u, 0x00003824u),
|
|
uvec2(0x2cfd3828u, 0x00003828u),
|
|
uvec2(0x2d7d382cu, 0x0000382cu),
|
|
uvec2(0x2dfc3830u, 0x00003830u),
|
|
uvec2(0x2e7a3834u, 0x00003834u),
|
|
uvec2(0x2ef93838u, 0x00003838u),
|
|
uvec2(0x2f77383cu, 0x0000383cu),
|
|
uvec2(0x2ff53840u, 0x00003840u),
|
|
uvec2(0x30783848u, 0x00003848u),
|
|
uvec2(0x30f63850u, 0x00003850u),
|
|
uvec2(0x31723858u, 0x00003858u),
|
|
uvec2(0x31ee3860u, 0x00003860u),
|
|
uvec2(0x32693868u, 0x00003868u),
|
|
uvec2(0x32e43870u, 0x00003870u),
|
|
uvec2(0x335e3877u, 0x00003877u),
|
|
uvec2(0x33d6387fu, 0x0000387fu),
|
|
uvec2(0x3463388fu, 0x0000388fu),
|
|
uvec2(0x34d8389fu, 0x0000389fu),
|
|
uvec2(0x354b38aeu, 0x000038aeu),
|
|
uvec2(0x35bc38beu, 0x000038beu),
|
|
uvec2(0x362a38cdu, 0x000038cdu),
|
|
uvec2(0x369638dcu, 0x000038dcu),
|
|
uvec2(0x36ff38ecu, 0x000038ecu),
|
|
uvec2(0x376538fbu, 0x000038fbu),
|
|
uvec2(0x38143919u, 0x00003919u),
|
|
uvec2(0x38703936u, 0x00003936u),
|
|
uvec2(0x38c53953u, 0x00003953u),
|
|
uvec2(0x3915396fu, 0x0000396fu),
|
|
uvec2(0x395e398bu, 0x0000398au),
|
|
uvec2(0x39a239a5u, 0x000039a6u),
|
|
uvec2(0x39df39c0u, 0x000039c0u),
|
|
uvec2(0x3a1839d9u, 0x000039d9u),
|
|
uvec2(0x3a793a0au, 0x00003a0au),
|
|
uvec2(0x3ac93a38u, 0x00003a38u),
|
|
uvec2(0x3b0a3a63u, 0x00003a62u),
|
|
uvec2(0x3b3e3a8au, 0x00003a8au),
|
|
uvec2(0x3b673aafu, 0x00003aafu),
|
|
uvec2(0x3b883ad1u, 0x00003ad1u),
|
|
uvec2(0x3ba23af0u, 0x00003af0u),
|
|
uvec2(0x3bb63b0cu, 0x00003b0cu),
|
|
uvec2(0x3bd33b3du, 0x00003b3cu),
|
|
uvec2(0x3be53b65u, 0x00003b64u),
|
|
uvec2(0x3bef3b85u, 0x00003b85u),
|
|
uvec2(0x3bf63b9fu, 0x00003b9fu),
|
|
uvec2(0x3bfa3bb4u, 0x00003bb4u),
|
|
uvec2(0x3bfc3bc4u, 0x00003bc4u),
|
|
uvec2(0x3bfe3bd1u, 0x00003bd1u),
|
|
uvec2(0x3bff3bdbu, 0x00003bdbu),
|
|
uvec2(0x3bff3be9u, 0x00003beau),
|
|
uvec2(0x3c003bf2u, 0x00003bf2u),
|
|
uvec2(0x3c003bf8u, 0x00003bf8u),
|
|
uvec2(0x3c003bfbu, 0x00003bfbu),
|
|
uvec2(0x3c003bfdu, 0x00003bfdu),
|
|
uvec2(0x3c003bfeu, 0x00003bfeu),
|
|
uvec2(0x3c003bffu, 0x00003bffu),
|
|
uvec2(0x3c003bffu, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x3c003c00u, 0x00003c00u),
|
|
uvec2(0x7e007e00u, 0x00007e00u),
|
|
uvec2(0x80003800u, 0x00003800u),
|
|
uvec2(0x980037feu, 0x000037feu),
|
|
uvec2(0x9c0037fcu, 0x000037fcu),
|
|
uvec2(0x9e0037fau, 0x000037fau),
|
|
uvec2(0xa00037f8u, 0x000037f8u),
|
|
uvec2(0xa10037f6u, 0x000037f6u),
|
|
uvec2(0xa20037f4u, 0x000037f4u),
|
|
uvec2(0xa30037f2u, 0x000037f2u),
|
|
uvec2(0xa40037f0u, 0x000037f0u),
|
|
uvec2(0xa48037eeu, 0x000037eeu),
|
|
uvec2(0xa50037ecu, 0x000037ecu),
|
|
uvec2(0xa58037eau, 0x000037eau),
|
|
uvec2(0xa60037e8u, 0x000037e8u),
|
|
uvec2(0xa68037e6u, 0x000037e6u),
|
|
uvec2(0xa70037e4u, 0x000037e4u),
|
|
uvec2(0xa77f37e2u, 0x000037e2u),
|
|
uvec2(0xa7ff37e0u, 0x000037e0u),
|
|
uvec2(0xa88037dcu, 0x000037dcu),
|
|
uvec2(0xa8ff37d8u, 0x000037d8u),
|
|
uvec2(0xa97f37d4u, 0x000037d4u),
|
|
uvec2(0xa9ff37d0u, 0x000037d0u),
|
|
uvec2(0xaa7f37ccu, 0x000037ccu),
|
|
uvec2(0xaafe37c8u, 0x000037c8u),
|
|
uvec2(0xab7e37c4u, 0x000037c4u),
|
|
uvec2(0xabfd37c0u, 0x000037c0u),
|
|
uvec2(0xac7e37b8u, 0x000037b8u),
|
|
uvec2(0xacfd37b0u, 0x000037b0u),
|
|
uvec2(0xad7d37a8u, 0x000037a8u),
|
|
uvec2(0xadfc37a0u, 0x000037a0u),
|
|
uvec2(0xae7a3798u, 0x00003798u),
|
|
uvec2(0xaef93790u, 0x00003790u),
|
|
uvec2(0xaf773788u, 0x00003788u),
|
|
uvec2(0xaff53780u, 0x00003780u),
|
|
uvec2(0xb0783770u, 0x00003770u),
|
|
uvec2(0xb0f63760u, 0x00003760u),
|
|
uvec2(0xb1723750u, 0x00003750u),
|
|
uvec2(0xb1ee3741u, 0x00003740u),
|
|
uvec2(0xb2693731u, 0x00003731u),
|
|
uvec2(0xb2e43721u, 0x00003721u),
|
|
uvec2(0xb35e3711u, 0x00003711u),
|
|
uvec2(0xb3d63701u, 0x00003701u),
|
|
uvec2(0xb46336e2u, 0x000036e2u),
|
|
uvec2(0xb4d836c3u, 0x000036c2u),
|
|
uvec2(0xb54b36a3u, 0x000036a4u),
|
|
uvec2(0xb5bc3684u, 0x00003684u),
|
|
uvec2(0xb62a3666u, 0x00003666u),
|
|
uvec2(0xb6963647u, 0x00003647u),
|
|
uvec2(0xb6ff3629u, 0x00003628u),
|
|
uvec2(0xb765360au, 0x0000360au),
|
|
uvec2(0xb81435cfu, 0x000035ceu),
|
|
uvec2(0xb8703594u, 0x00003594u),
|
|
uvec2(0xb8c5355au, 0x0000355au),
|
|
uvec2(0xb9153522u, 0x00003522u),
|
|
uvec2(0xb95e34ebu, 0x000034ebu),
|
|
uvec2(0xb9a234b5u, 0x000034b5u),
|
|
uvec2(0xb9df3481u, 0x00003480u),
|
|
uvec2(0xba18344eu, 0x0000344eu),
|
|
uvec2(0xba7933d8u, 0x000033d8u),
|
|
uvec2(0xbac93320u, 0x00003320u),
|
|
uvec2(0xbb0a3275u, 0x00003276u),
|
|
uvec2(0xbb3e31d6u, 0x000031d6u),
|
|
uvec2(0xbb673144u, 0x00003144u),
|
|
uvec2(0xbb8830bdu, 0x000030bcu),
|
|
uvec2(0xbba23041u, 0x00003042u),
|
|
uvec2(0xbbb62fa1u, 0x00002fa0u),
|
|
uvec2(0xbbd32e1au, 0x00002e1cu),
|
|
uvec2(0xbbe52cdbu, 0x00002cdcu),
|
|
uvec2(0xbbef2bb1u, 0x00002bb0u),
|
|
uvec2(0xbbf62a12u, 0x00002a10u),
|
|
uvec2(0xbbfa28c7u, 0x000028c8u),
|
|
uvec2(0xbbfc2781u, 0x00002780u),
|
|
uvec2(0xbbfe25e2u, 0x000025e0u),
|
|
uvec2(0xbbff249bu, 0x000024a0u),
|
|
uvec2(0xbbff21a0u, 0x000021a0u),
|
|
uvec2(0xbc001edau, 0x00001ec0u),
|
|
uvec2(0xbc001c2bu, 0x00001c40u),
|
|
uvec2(0xbc001910u, 0x00001900u),
|
|
uvec2(0xbc001626u, 0x00001600u),
|
|
uvec2(0xbc001377u, 0x00001400u),
|
|
uvec2(0xbc001087u, 0x00001000u),
|
|
uvec2(0xbc000d7fu, 0x00000c00u),
|
|
uvec2(0xbc00080bu, 0x00000c00u),
|
|
uvec2(0xbc0002fau, 0x00000000u),
|
|
uvec2(0xbc000118u, 0x00000000u),
|
|
uvec2(0xbc000067u, 0x00000000u),
|
|
uvec2(0xbc000026u, 0x00000000u),
|
|
uvec2(0xbc00000eu, 0x00000000u),
|
|
uvec2(0xbc000005u, 0x00000000u),
|
|
uvec2(0xbc000002u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0xbc000000u, 0x00000000u),
|
|
uvec2(0x7e00fe00u, 0x00007e00u)
|
|
);
|
|
uint actIndex(float16_t v) { uint h = uint(float16BitsToUint16(v)); uint a = h & 32767u; if (a > 0x7c00u) return ((h >> 8u) & 128u) | 127u; return ((h >> 8u) & 128u) | (a >= 0x2400u ? (a >> 7u) - 64u : uint(abs(float(v)) * 512.0)); }
|
|
float16_t sig16(float16_t v) { return uint16BitsToFloat16(uint16_t(ACT[actIndex(v)].x & 65535u)); }
|
|
float16_t tan16(float16_t v) { return uint16BitsToFloat16(uint16_t(ACT[actIndex(v)].x >> 16u)); }
|
|
float16_t gate16(float16_t v) { return uint16BitsToFloat16(uint16_t(ACT[actIndex(v)].y)); }
|
|
f16vec4 tan16(f16vec4 v) { return f16vec4(tan16(v.x),tan16(v.y),tan16(v.z),tan16(v.w)); }
|
|
f16vec4 gate16(f16vec4 v) { return f16vec4(gate16(v.x),gate16(v.y),gate16(v.z),gate16(v.w)); }
|