Microsoft changed its D3D12 matrix spec twice in 12 days, then took two fixes from one outsider

Microsoft changed its D3D12 matrix spec twice in 12 days, then took two fixes from one outsider

The draft specification for matrix maths in Direct3D 12 changed shape on October 6, 12 days after the previous rewrite of the same document, and it is still a draft. Microsoft then merged two fixes into its public DirectX headers on October 9 at 23:08 UTC, both of them written by the same contributor outside the company.

The specification is D3D12LinearAlgebraRuntimeFeatureSupport, the document that says how a game asks a driver which matrix operations the hardware can do, and it now reads "Version 0.10 (Draft)". That version arrived with pull request 257, opened on October 2 and merged at 20:42 UTC on October 6 by Microsoft's Jesse Natalie. Its own changelog line is the summary: "Matrix construction takes an M×N shape plus Use, Scope, and ThreadGroupSize. Supported constructions are the A, B, and accumulator matrices of the wave-scope and threadgroup-scope multiplication tables." The document was read at 21:46 UTC on October 10.

A query that now asks three more questions

Where a construction query used to describe a matrix by its dimensions, it now carries the matrix's role, the scope it is built at and the size of the thread group building it. Role is one of A, B or accumulator, and the spec warns that the answer depends on it: "Register layout depends on this role, so the same component type and dimensions can be supported for one use and unsupported for another."

Scope has three values and the query covers two of them. "D3D12_LINEAR_ALGEBRA_MATRIX_SCOPE_THREAD is present so the values match HLSL; a construction query with that scope returns Supported = FALSE," the spec says, because "thread-scope vector-matrix dimensions are not part of this query". The third field, ThreadGroupSize, "is the number of threads in the group constructing the matrix", and must be zero at wave scope. Where a driver supports a range, it reports an inclusive range of minimum and maximum group sizes, and "drivers whose support is not contiguous in threadgroup size emit a separate entry per contiguous range".

The previous change was 12 days earlier. Pull request 256 was merged at 15:46 UTC on September 24 and rewrote the tier 1 vector-matrix table, pairing input and output formats differently and splitting one "Native" column into native inputs and native outputs. This is the plumbing under neural rendering and upscaling in Direct3D games, and it is still moving.

Both header fixes came from the same outsider

The shipping headers moved as well. On October 9 at 23:08 UTC, Jesse Natalie merged pull request 279, "D3DX12GetCopyableFootprints: reject subresource index equal to the subresource count", and pull request 280, "d3d12: declare D3D12_RT_FORMAT_ARRAY with a typedef", into DirectX-Headers. Both came from one outside contributor, Joel Kiptoo, working in his own fork, and the two had been open since September 29 and September 30. The last version refresh of those headers by Microsoft itself, "Update headers for 1.619.5", landed on July 31.

Neither fix is dramatic: one rejects an out of range subresource index that the helper previously accepted, and the other changes how a format array structure is declared. Both pull request pages were read at 21:47 UTC on October 10.

Version 0.10 is a specification rather than a shipping API, and the document still carries the word Draft after its number. The Direct3D features that do reach games arrive unevenly: Gears of War: E-Day got Microsoft's shader delivery work first, with Nvidia and Intel support following later.

Leave a Comment

Your email address will not be published. Required fields are marked *