Skip to content

Measured program behaviour

Frostbite (skate.)ShadersApplies toskate.

The following observations describe specific stock compiled programs. Shared instructions or similar bindings do not establish the same meaning for every shader family. Observed

Static producer/consumer pairing across globals and dingolevel_root finds T0.xy = 0.4995*v + 0.4995 in 7,516 of 7,557 G-buffer pixel programs. A set of 195 screen-addressed consumer textures decodes these values as 2*x-1. The role of the pair is unresolved; the inspected model does not establish a normal unfolding or normalization step. Observed

The sampled large lighting compute programs read their t4–t8 lanes directly. The hashed binding names do not identify the semantic role of those textures. Observed

Instanced vertex programs find an instance’s world transform in two structured buffers. An instance table holds records of one to three words, one of which names a header element of a matrix table. The matrix table has a 16-byte stride: a header element followed by three matrix rows; when the header is zero, the rows follow it directly. Observed · programs executed with every buffer read logged

The instance number is added to a constant word before it indexes the instance table: setting that word to 3 moves the first record read by three records. Observed · programs executed with every buffer read logged

The word at byte 4252 of the pass constant buffer at b4, the w beside the camera position in words 1060–1062, is read by none of the inspected programs. A text scan of the programs’ lifted code reports it read, because the DXIL loads whole four-word registers; only a trace of which words reach an output tells the two apart. Observed

Measured hat vertex programs read instance data at t0 and a headered float4 matrix table at t67. For an instance header element H, bit zero enables an offset encoded in bits 1–16 of header word zero. Let that enabled offset be offset (zero when disabled), and X = H + 1 + offset. The element at X contains translation added after the weighted joint sum; its w component is unused in these measured outputs. Observed

Joint j uses three rows starting at X + 3 + bit18 + 3*j. Header bit 18 shifts those rows by one element without shifting X. The elements X+1 and X+2 are not read in the measured paths. Four of five distinct hat vertex programs, covering twelve of thirteen stages, follow this arrangement. Observed

The fifth program also accesses a second block at the unshifted H+1 and H+4–6 offsets. Giving those inputs distinct values does not move the three inspected outputs, but this does not prove the block dead for every output or execution path. Observed

Thirty inspected hat input layouts store blend indices as four u16 integers and weights as four normalized bytes. Their sections’ 386-entry bone palettes are identity mappings. The animation rig and render skeleton are documented separately under rigs and ECLP. Observed

What are the semantic roles of the paired G-buffer channels and second hat block?

The measured encodings and accesses establish operations and dependencies, but not those inputs’ complete engine meaning. Unknown