17ec681f3Smrg<agxml>
27ec681f3Smrg  <enum name="Channel">
37ec681f3Smrg    <value name="R" value="0"/>
47ec681f3Smrg    <value name="G" value="1"/>
57ec681f3Smrg    <value name="B" value="2"/>
67ec681f3Smrg    <value name="A" value="3"/>
77ec681f3Smrg    <value name="1" value="4"/>
87ec681f3Smrg    <value name="0" value="5"/>
97ec681f3Smrg  </enum>
107ec681f3Smrg
117ec681f3Smrg  <enum name="ZS Func">
127ec681f3Smrg    <value name="Never" value="0"/>
137ec681f3Smrg    <value name="Less" value="1"/>
147ec681f3Smrg    <value name="Equal" value="2"/>
157ec681f3Smrg    <value name="Lequal" value="3"/>
167ec681f3Smrg    <value name="Greater" value="4"/>
177ec681f3Smrg    <value name="Not Equal" value="5"/>
187ec681f3Smrg    <value name="Gequal" value="6"/>
197ec681f3Smrg    <value name="Always" value="7"/>
207ec681f3Smrg  </enum>
217ec681f3Smrg
227ec681f3Smrg  <enum name="Compare func">
237ec681f3Smrg    <value name="Lequal" value="0"/>
247ec681f3Smrg    <value name="Gequal" value="1"/>
257ec681f3Smrg    <value name="Less" value="2"/>
267ec681f3Smrg    <value name="Greater" value="3"/>
277ec681f3Smrg    <value name="Equal" value="4"/>
287ec681f3Smrg    <value name="Not Equal" value="5"/>
297ec681f3Smrg    <value name="Always" value="6"/>
307ec681f3Smrg    <value name="Never" value="7"/>
317ec681f3Smrg  </enum>
327ec681f3Smrg
337ec681f3Smrg  <enum name="Stencil Op">
347ec681f3Smrg    <value name="Keep" value="0"/>
357ec681f3Smrg    <value name="Zero" value="1"/>
367ec681f3Smrg    <value name="Replace" value="2"/>
377ec681f3Smrg    <value name="Incr Sat" value="3"/>
387ec681f3Smrg    <value name="Decr Sat" value="4"/>
397ec681f3Smrg    <value name="Invert" value="5"/>
407ec681f3Smrg    <value name="Incr Wrap" value="6"/>
417ec681f3Smrg    <value name="Decr Wrap" value="7"/>
427ec681f3Smrg  </enum>
437ec681f3Smrg
447ec681f3Smrg  <enum name="Polygon Mode">
457ec681f3Smrg    <value name="Fill" value="0"/>
467ec681f3Smrg    <value name="Line" value="1"/>
477ec681f3Smrg    <value name="Point" value="2"/>
487ec681f3Smrg  </enum>
497ec681f3Smrg
507ec681f3Smrg  <enum name="Primitive">
517ec681f3Smrg    <value name="Points" value="0"/>
527ec681f3Smrg    <value name="Lines" value="1"/>
537ec681f3Smrg    <value name="Line strip" value="3"/>
547ec681f3Smrg    <value name="Line loop" value="5"/>
557ec681f3Smrg    <value name="Triangles" value="6"/>
567ec681f3Smrg    <value name="Triangle strip" value="9"/>
577ec681f3Smrg    <value name="Triangle fan" value="10"/>
587ec681f3Smrg    <value name="Quads" value="14"/> <!-- guess, confirm with piglit later XXX -->
597ec681f3Smrg    <value name="Quad strip" value="15"/> <!-- guess, confirm with piglit later XXX -->
607ec681f3Smrg  </enum>
617ec681f3Smrg
627ec681f3Smrg  <enum name="Layout">
637ec681f3Smrg    <value name="Linear" value="0"/>
647ec681f3Smrg    <!-- Morton order with 64x64 tiles -->
657ec681f3Smrg    <value name="Tiled 64x64" value="2"/>
667ec681f3Smrg  </enum>
677ec681f3Smrg
687ec681f3Smrg  <enum name="Channels">
697ec681f3Smrg    <value name="R8" value="0x00"/>
707ec681f3Smrg    <value name="R16" value="0x09"/>
717ec681f3Smrg    <value name="R8G8" value="0x0A"/>
727ec681f3Smrg    <value name="R5G6B5" value="0x0B"/>
737ec681f3Smrg    <value name="R4G4B4A4" value="0x0C"/>
747ec681f3Smrg    <value name="A1R5G5B5" value="0x0D"/>
757ec681f3Smrg    <value name="R5G5B5A1" value="0x0E"/>
767ec681f3Smrg    <value name="R32" value="0x21"/>
777ec681f3Smrg    <value name="R16G16" value="0x23"/>
787ec681f3Smrg    <value name="R11G11B10" value="0x25"/>
797ec681f3Smrg    <value name="R10G10B10A2" value="0x26"/>
807ec681f3Smrg    <value name="R9G9B9E5" value="0x27"/>
817ec681f3Smrg    <value name="R8G8B8A8" value="0x28"/>
827ec681f3Smrg    <value name="R32G32" value="0x31"/>
837ec681f3Smrg    <value name="R16G16B16A16" value="0x32"/>
847ec681f3Smrg    <value name="R32G32B32A32" value="0x38"/>
857ec681f3Smrg    <value name="GBGR 422" value="0x40"/> <!-- Subsampled, swizzle BRG1 -->
867ec681f3Smrg    <value name="BGRG 422" value="0x41"/> <!-- Subsampled, swizzle BRG1 -->
877ec681f3Smrg
887ec681f3Smrg    <!-- Compressed -->
897ec681f3Smrg    <value name="PVRTC 2bpp" value="0x50"/>
907ec681f3Smrg    <value name="PVRTC 4bpp" value="0x51"/>
917ec681f3Smrg
927ec681f3Smrg    <value name="ETC2 RGB8" value="0x58"/>
937ec681f3Smrg    <value name="ETC2 RGBA8" value="0x59"/>
947ec681f3Smrg    <value name="ETC2 RGB8A1" value="0x5A"/>
957ec681f3Smrg    <value name="EAC R11" value="0x5B"/>
967ec681f3Smrg    <value name="EAC RG11" value="0x5C"/>
977ec681f3Smrg
987ec681f3Smrg    <value name="ASTC 4x4 LDR" value="0x60"/>
997ec681f3Smrg    <value name="ASTC 5x4 LDR" value="0x61"/>
1007ec681f3Smrg    <value name="ASTC 5x5 LDR" value="0x62"/>
1017ec681f3Smrg    <value name="ASTC 6x5 LDR" value="0x63"/>
1027ec681f3Smrg    <value name="ASTC 6x6 LDR" value="0x64"/>
1037ec681f3Smrg    <value name="ASTC 8x5 LDR" value="0x65"/>
1047ec681f3Smrg    <value name="ASTC 8x6 LDR" value="0x66"/>
1057ec681f3Smrg    <value name="ASTC 8x8 LDR" value="0x67"/>
1067ec681f3Smrg    <value name="ASTC 10x5 LDR" value="0x68"/>
1077ec681f3Smrg    <value name="ASTC 10x6 LDR" value="0x69"/>
1087ec681f3Smrg    <value name="ASTC 10x8 LDR" value="0x6A"/>
1097ec681f3Smrg    <value name="ASTC 10x10 LDR" value="0x6B"/>
1107ec681f3Smrg    <value name="ASTC 12x10 LDR" value="0x6C"/>
1117ec681f3Smrg    <value name="ASTC 12x12 LDR" value="0x6D"/>
1127ec681f3Smrg
1137ec681f3Smrg    <value name="BC1" value="0x74"/>
1147ec681f3Smrg    <value name="BC2" value="0x75"/>
1157ec681f3Smrg    <value name="BC3" value="0x76"/>
1167ec681f3Smrg    <value name="BC4" value="0x77"/>
1177ec681f3Smrg    <value name="BC5" value="0x78"/>
1187ec681f3Smrg    <value name="BC6H" value="0x79"/>
1197ec681f3Smrg    <value name="BC6H Ufloat" value="0x7A"/>
1207ec681f3Smrg    <value name="BC7" value="0x7B"/>
1217ec681f3Smrg  </enum>
1227ec681f3Smrg
1237ec681f3Smrg  <enum name="Texture Type">
1247ec681f3Smrg    <value name="Unorm" value="0"/>
1257ec681f3Smrg    <value name="Snorm" value="1"/>
1267ec681f3Smrg    <value name="Uint" value="2"/>
1277ec681f3Smrg    <value name="Sint" value="3"/>
1287ec681f3Smrg    <value name="Float" value="4"/>
1297ec681f3Smrg    <value name="XR" value="5"/>
1307ec681f3Smrg  </enum>
1317ec681f3Smrg
1327ec681f3Smrg  <struct name="Varying header" size="4">
1337ec681f3Smrg    <field name="Triangle slots" size="8" start="0:0" type="uint"/>
1347ec681f3Smrg    <field name="Point slots" size="8" start="0:8" type="uint"/>
1357ec681f3Smrg  </struct>
1367ec681f3Smrg
1377ec681f3Smrg  <enum name="Varying Type">
1387ec681f3Smrg    <value name="Flat (first)" value="0"/>
1397ec681f3Smrg    <value name="Flat (last)" value="2"/>
1407ec681f3Smrg    <value name="Fragcoord W" value="3"/>
1417ec681f3Smrg    <value name="Smooth" value="7"/>
1427ec681f3Smrg    <value name="Fragcoord Z" value="11"/>
1437ec681f3Smrg    <value name="Point coordinates" value="19"/>
1447ec681f3Smrg  </enum>
1457ec681f3Smrg
1467ec681f3Smrg  <struct name="Varying" size="4">
1477ec681f3Smrg    <field name="Components" size="2" start="0" type="uint" modifier="minus(1)"/>
1487ec681f3Smrg    <field name="Type" size="6" start="2" type="Varying Type" default="Smooth"/>
1497ec681f3Smrg    <field name="Triangle slot" size="8" start="8" type="uint"/>
1507ec681f3Smrg    <field name="Point slot" size="8" start="16" type="uint"/>
1517ec681f3Smrg  </struct>
1527ec681f3Smrg
1537ec681f3Smrg  <struct name="Format" size="2">
1547ec681f3Smrg    <field name="Channels" size="7" start="0" type="Channels"/>
1557ec681f3Smrg    <field name="Type" size="3" start="7" type="Texture Type"/>
1567ec681f3Smrg  </struct>
1577ec681f3Smrg
1587ec681f3Smrg  <struct name="Render Target" size="16">
1597ec681f3Smrg    <field name="Unknown" size="4" start="0" type="hex" default="0x2"/>
1607ec681f3Smrg    <field name="Layout" size="2" start="4" type="Layout"/>
1617ec681f3Smrg    <field name="Format" size="10" start="6" type="Pixel Format"/>
1627ec681f3Smrg    <field name="Swizzle R" size="2" start="16" type="Channel"/>
1637ec681f3Smrg    <field name="Swizzle G" size="2" start="18" type="Channel"/>
1647ec681f3Smrg    <field name="Swizzle B" size="2" start="20" type="Channel"/>
1657ec681f3Smrg    <field name="Swizzle A" size="2" start="22" type="Channel"/>
1667ec681f3Smrg    <field name="Width" size="14" start="24" type="uint" modifier="minus(1)"/>
1677ec681f3Smrg    <field name="Height" size="14" start="38" type="uint" modifier="minus(1)"/>
1687ec681f3Smrg    <field name="Unk 52" size="1" start="52" type="bool"/>
1697ec681f3Smrg    <field name="Rotate 90" size="1" start="53" type="bool" default="false"/>
1707ec681f3Smrg    <field name="Flip vertical" size="1" start="54" type="bool" default="false"/>
1717ec681f3Smrg    <field name="Unk 55" size="9" start="55" type="hex"/>
1727ec681f3Smrg    <field name="Buffer" size="36" start="64" type="address" modifier="shr(4)"/>
1737ec681f3Smrg    <!-- N.b. sRGB is not specified here -->
1747ec681f3Smrg    <!-- Off by 4? -->
1757ec681f3Smrg    <field name="Stride" size="24" start="104" type="hex" prefix="AGX_RT_STRIDE">
1767ec681f3Smrg      <value name="Tiled" value="0x100000"/>
1777ec681f3Smrg    </field>
1787ec681f3Smrg  </struct>
1797ec681f3Smrg
1807ec681f3Smrg  <enum name="Texture dimension">
1817ec681f3Smrg    <value name="2D" value="2"/>
1827ec681f3Smrg    <value name="Cube" value="6"/>
1837ec681f3Smrg  </enum>
1847ec681f3Smrg
1857ec681f3Smrg  <!-- Payloads follow, right-shifted by 4 because of course -->
1867ec681f3Smrg  <struct name="Texture" size="16">
1877ec681f3Smrg    <field name="Dimension" size="4" start="0" type="Texture dimension" default="2D"/>
1887ec681f3Smrg    <field name="Layout" size="2" start="4" type="Layout"/>
1897ec681f3Smrg    <field name="Format" size="10" start="6" type="Pixel Format"/>
1907ec681f3Smrg    <field name="Swizzle R" size="3" start="16" type="Channel" default="R"/>
1917ec681f3Smrg    <field name="Swizzle G" size="3" start="19" type="Channel" default="G"/>
1927ec681f3Smrg    <field name="Swizzle B" size="3" start="22" type="Channel" default="B"/>
1937ec681f3Smrg    <field name="Swizzle A" size="3" start="25" type="Channel" default="A"/>
1947ec681f3Smrg    <field name="Width" size="14" start="28" type="uint" modifier="minus(1)"/>
1957ec681f3Smrg    <field name="Height" size="14" start="42" type="uint" modifier="minus(1)"/>
1967ec681f3Smrg    <field name="Levels" size="6" start="60" type="uint" modifier="minus(1)"/>
1977ec681f3Smrg    <field name="Address" size="36" start="66" type="hex" modifier="shr(4)"/>
1987ec681f3Smrg    <!-- Unknown bit set by Metal when mipmapping. Might relate to a mechanism
1997ec681f3Smrg    to switch tile size (or disable tiling altogether?) at small mip levels to
2007ec681f3Smrg    reduce wasted memory due to padding. Causing test flakiness when set. -->
2017ec681f3Smrg    <field name="Unk mipmapped" size="1" start="102" type="bool"/>
2027ec681f3Smrg    <field name="Compression" size="2" start="106" type="hex"/> <!-- 0 for 64x64 tiling -->
2037ec681f3Smrg    <field name="sRGB" size="1" start="108" type="bool"/>
2047ec681f3Smrg    <field name="Unk 2" size="1" start="109" type="bool"/>
2057ec681f3Smrg    <field name="Stride" size="18" start="110" type="hex" modifier="shr(4)"/>
2067ec681f3Smrg  </struct>
2077ec681f3Smrg
2087ec681f3Smrg  <enum name="Wrap">
2097ec681f3Smrg    <value name="Clamp to edge" value="0"/>
2107ec681f3Smrg    <value name="Repeat" value="1"/>
2117ec681f3Smrg    <value name="Mirrored repeat" value="2"/>
2127ec681f3Smrg    <value name="Clamp to border" value="3"/>
2137ec681f3Smrg  </enum>
2147ec681f3Smrg
2157ec681f3Smrg  <enum name="Mip filter">
2167ec681f3Smrg    <value name="None" value="0"/>
2177ec681f3Smrg    <value name="Nearest" value="1"/>
2187ec681f3Smrg    <value name="Linear" value="2"/>
2197ec681f3Smrg  </enum>
2207ec681f3Smrg
2217ec681f3Smrg  <enum name="Border colour">
2227ec681f3Smrg    <value name="Transparent black" value="0"/>
2237ec681f3Smrg    <value name="Opaque black" value="1"/>
2247ec681f3Smrg    <value name="Opaque white" value="2"/>
2257ec681f3Smrg  </enum>
2267ec681f3Smrg
2277ec681f3Smrg  <struct name="Sampler" size="8">
2287ec681f3Smrg    <field name="Unk 1" size="2" start="17" type="hex" default="3"/>
2297ec681f3Smrg    <field name="Unk 2" size="1" start="19" type="bool" default="true"/>
2307ec681f3Smrg    <field name="Magnify linear" size="1" start="23" type="bool"/>
2317ec681f3Smrg    <field name="Minify linear" size="1" start="25" type="bool"/>
2327ec681f3Smrg    <field name="Mip filter" size="2" start="27" type="Mip filter"/>
2337ec681f3Smrg    <field name="Wrap S" size="3" start="29" type="Wrap"/>
2347ec681f3Smrg    <field name="Wrap T" size="3" start="32" type="Wrap"/>
2357ec681f3Smrg    <field name="Wrap R" size="3" start="35" type="Wrap"/>
2367ec681f3Smrg    <field name="Pixel coordinates" size="1" start="38" type="bool"/>
2377ec681f3Smrg    <field name="Compare func" size="3" start="39" type="Compare func"/>
2387ec681f3Smrg    <field name="Unk 3" size="1" start="42" type="hex" default="1"/>
2397ec681f3Smrg    <field name="Border colour" size="2" start="55" type="Border colour"/>
2407ec681f3Smrg  </struct>
2417ec681f3Smrg
2427ec681f3Smrg  <!--- Identified by tag? -->
2437ec681f3Smrg  <struct name="Viewport" size="40">
2447ec681f3Smrg    <field name="Tag" size="32" start="0:0" type="hex" default="0xc00"/>
2457ec681f3Smrg
2467ec681f3Smrg    <!-- Acts like a scissor at 32x32 tile boundaries, ignored unless clip tile is set -->
2477ec681f3Smrg    <field name="Max tile X" size="9" start="1:0" type="uint" modifier="minus(1)"/>
2487ec681f3Smrg    <field name="Min tile X" size="9" start="1:16" type="uint"/>
2497ec681f3Smrg    <field name="Clip tile" size="1" start="1:31" type="bool"/>
2507ec681f3Smrg    <field name="Max tile Y" size="9" start="2:0" type="uint" modifier="minus(1)"/>
2517ec681f3Smrg    <field name="Min tile Y" size="9" start="2:16" type="uint"/>
2527ec681f3Smrg
2537ec681f3Smrg    <!-- Used to convert clip space coordinates to NDC, does not clip -->
2547ec681f3Smrg    <field name="Translate X" size="32" start="4:0" type="float"/>
2557ec681f3Smrg    <field name="Scale X" size="32" start="5:0" type="float"/>
2567ec681f3Smrg    <field name="Translate Y" size="32" start="6:0" type="float"/>
2577ec681f3Smrg    <field name="Scale Y" size="32" start="7:0" type="float"/>
2587ec681f3Smrg
2597ec681f3Smrg    <!-- Specifies an affine transformation from clip coordinates to viewport
2607ec681f3Smrg    depth coordinates. For APIs with clip coordinates [0, 1], this cooresponds
2617ec681f3Smrg    to near z and (far z - near z) respectively. In general, given clip
2627ec681f3Smrg    coordinate z_in, the viewport depth is given as (z_in * scale_z) +
2637ec681f3Smrg    translate_z.  For example, the default [0, 1] depth buffer in OpenGL with
2647ec681f3Smrg    [-1, +1] clip coordinates is specified as scale = 1/2, bias = 1/2 -->
2657ec681f3Smrg    <field name="Translate Z" size="32" start="8:0" type="float"/>
2667ec681f3Smrg    <field name="Scale Z" size="32" start="9:0" type="float"/>
2677ec681f3Smrg  </struct>
2687ec681f3Smrg
2697ec681f3Smrg  <!--- Pointed to from the command buffer -->
2707ec681f3Smrg  <struct name="Scissor" size="16">
2717ec681f3Smrg    <field name="Max X" size="16" start="0:0" type="uint"/>
2727ec681f3Smrg    <field name="Min X" size="16" start="0:16" type="uint"/>
2737ec681f3Smrg    <field name="Max Y" size="16" start="1:0" type="uint"/>
2747ec681f3Smrg    <field name="Min Y" size="16" start="1:16" type="uint"/>
2757ec681f3Smrg    <field name="Min Z" size="32" start="2:0" type="float"/>
2767ec681f3Smrg    <field name="Max Z" size="32" start="3:0" type="float"/>
2777ec681f3Smrg  </struct>
2787ec681f3Smrg
2797ec681f3Smrg  <struct name="Rasterizer face" size="8">
2807ec681f3Smrg    <field name="Stencil reference" size="8" start="0:0" type="hex"/>
2817ec681f3Smrg    <!-- line width is 4:4 fixed point with off-by-one applied -->
2827ec681f3Smrg    <field name="Line width" size="8" start="0:8" type="hex"/>
2837ec681f3Smrg    <field name="Polygon mode" size="2" start="0:18" type="Polygon Mode"/>
2847ec681f3Smrg    <field name="Disable depth write" size="1" start="0:21" type="bool"/>
2857ec681f3Smrg    <field name="Depth function" size="3" start="0:24" type="ZS Func"/>
2867ec681f3Smrg    <field name="Stencil write mask" size="8" start="1:0" type="hex"/>
2877ec681f3Smrg    <field name="Stencil read mask" size="8" start="1:8" type="hex"/>
2887ec681f3Smrg    <field name="Depth pass" size="3" start="1:16" type="Stencil Op"/>
2897ec681f3Smrg    <field name="Depth fail" size="3" start="1:19" type="Stencil Op"/>
2907ec681f3Smrg    <field name="Stencil fail" size="3" start="1:22" type="Stencil Op"/>
2917ec681f3Smrg    <field name="Stencil compare" size="3" start="1:25" type="ZS Func"/>
2927ec681f3Smrg  </struct>
2937ec681f3Smrg
2947ec681f3Smrg  <struct name="Rasterizer" size="28">
2957ec681f3Smrg    <field name="Tag" size="32" start="0:0" type="hex" default="0x10000b5"/>
2967ec681f3Smrg    <field name="Unk 1" size="1" start="1:9" type="hex" default="0x1"/>
2977ec681f3Smrg    <field name="Scissor enable" size="1" start="1:16" type="bool"/>
2987ec681f3Smrg    <field name="Unk ZS" size="1" start="1:18" type="hex" default="0x1"/>
2997ec681f3Smrg    <field name="Unk 2" size="2" start="1:19" type="hex" default="0x0"/>
3007ec681f3Smrg    <field name="Unk fill lines" size="1" start="1:26" type="hex" default="0x0"/> <!-- set when drawing LINES -->
3017ec681f3Smrg    <field name="Front" size="64" start="2:0" type="Rasterizer face"/>
3027ec681f3Smrg    <field name="Back" size="64" start="4:0" type="Rasterizer face"/>
3037ec681f3Smrg  </struct>
3047ec681f3Smrg
3057ec681f3Smrg  <struct name="Cull" size="8">
3067ec681f3Smrg    <field name="Tag" size="32" start="0:0" type="hex" default="0x200000"/>
3077ec681f3Smrg    <field name="Cull front" size="1" start="1:0" type="bool"/>
3087ec681f3Smrg    <field name="Cull back" size="1" start="1:1" type="bool"/>
3097ec681f3Smrg    <field name="Unk GL 1" size="1" start="1:7" type="bool"/>
3107ec681f3Smrg    <field name="Unk GL 2" size="1" start="1:8" type="bool"/>
3117ec681f3Smrg    <field name="Depth clip" size="1" start="1:10" type="bool"/>
3127ec681f3Smrg    <field name="Depth clamp" size="1" start="1:11" type="bool"/>
3137ec681f3Smrg    <field name="Front face CCW" size="1" start="1:16" type="bool"/>
3147ec681f3Smrg  </struct>
3157ec681f3Smrg
3167ec681f3Smrg  <struct name="Interpolation" size="20">
3177ec681f3Smrg    <field name="Tag" size="32" start="0:0" type="hex" default="0x100C0000"/>
3187ec681f3Smrg    <field name="Varying count" size="32" start="1:0" type="uint"/>
3197ec681f3Smrg  </struct>
3207ec681f3Smrg
3217ec681f3Smrg  <struct name="Linkage" size="16">
3227ec681f3Smrg    <field name="Tag" size="32" start="0:0" type="hex" default="0xC020000"/>
3237ec681f3Smrg    <field name="Unk 1" size="32" start="1:0" type="hex" default="0x100"/>
3247ec681f3Smrg    <field name="Unk 2" size="32" start="2:0" type="hex" default="0x0"/>
3257ec681f3Smrg    <field name="Varying count" size="32" start="3:0" type="uint"/>
3267ec681f3Smrg  </struct>
3277ec681f3Smrg
3287ec681f3Smrg  <!-- Indexes into the array of scissor descriptors -->
3297ec681f3Smrg  <struct name="Set scissor" size="8">
3307ec681f3Smrg    <field name="Tag" size="32" start="0:0" type="hex" default="0x100"/>
3317ec681f3Smrg    <field name="Index" size="32" start="1:0" type="uint"/>
3327ec681f3Smrg  </struct>
3337ec681f3Smrg
3347ec681f3Smrg  <!--- Commands valid within a pipeline -->
3357ec681f3Smrg  <struct name="Bind uniform" size="8">
3367ec681f3Smrg    <field name="Tag" size="8" start="0:0" type="hex" default="0x1d"/>
3377ec681f3Smrg    <field name="Start (halfs)" size="8" start="0:8" type="uint"/>
3387ec681f3Smrg    <field name="Unk" size="4" start="0:16" type="hex" default="0x0"/>
3397ec681f3Smrg    <field name="Size (halfs)" size="4" start="0:20" type="uint"/>
3407ec681f3Smrg    <field name="Buffer" size="40" start="0:24" type="address"/>
3417ec681f3Smrg  </struct>
3427ec681f3Smrg
3437ec681f3Smrg  <struct name="Bind texture" size="8">
3447ec681f3Smrg    <field name="Tag" size="8" start="0:0" type="hex" default="0xdd"/>
3457ec681f3Smrg    <field name="Start" size="8" start="0:8" type="uint"/>
3467ec681f3Smrg    <field name="Count" size="4" start="0:20" type="uint"/>
3477ec681f3Smrg    <field name="Buffer" size="40" start="0:24" type="address"/>
3487ec681f3Smrg  </struct>
3497ec681f3Smrg
3507ec681f3Smrg  <struct name="Bind sampler" size="8">
3517ec681f3Smrg    <field name="Tag" size="8" start="0:0" type="hex" default="0x9d"/>
3527ec681f3Smrg    <field name="Start" size="8" start="0:8" type="uint"/>
3537ec681f3Smrg    <field name="Count" size="4" start="0:20" type="uint"/>
3547ec681f3Smrg    <field name="Buffer" size="40" start="0:24" type="address"/>
3557ec681f3Smrg  </struct>
3567ec681f3Smrg
3577ec681f3Smrg  <enum name="Preshader mode">
3587ec681f3Smrg    <value name="Preshader" value="3"/>
3597ec681f3Smrg    <value name="No preshader" value="8"/>
3607ec681f3Smrg  </enum>
3617ec681f3Smrg
3627ec681f3Smrg  <struct name="Set shader" size="24">
3637ec681f3Smrg    <field name="Tag" size="8" start="0:0" type="hex" default="0x4d"/>
3647ec681f3Smrg    <field name="Unk 1" size="24" start="0:8" type="hex" default="0x90"/>
3657ec681f3Smrg    <field name="Unk 2" size="8" start="1:0" type="hex" default="0x0d"/> <!-- TODO differs with stage -->
3667ec681f3Smrg    <field name="Unk 2b" size="8" start="1:8" type="uint" default="4"/>
3677ec681f3Smrg    <field name="Code" size="32" start="1:16" type="address"/>
3687ec681f3Smrg    <field name="Unk 3" size="8" start="2:16" type="hex" default="0x8d"/>
3697ec681f3Smrg    <field name="Register quadwords" size="5" start="2:24" type="uint"/> <!-- 0 for max -->
3707ec681f3Smrg    <field name="Unk 3b" size="3" start="2:29" type="hex" default="0x0"/>
3717ec681f3Smrg    <field name="Spill size" size="8" start="3:0" type="hex" default="0"/> <!-- TODO: determine relation, see docs/table.py -->
3727ec681f3Smrg    <field name="Unk 4" size="12" start="3:8" type="hex" default="0x801"/>
3737ec681f3Smrg    <field name="Preshader mode" size="4" start="3:20" type="Preshader mode" default="No preshader"/>
3747ec681f3Smrg    <field name="Unk 6" size="8" start="3:24" type="hex" default="0x0"/>
3757ec681f3Smrg    <field name="Preshader unk" size="16" start="4:0" type="hex" default="0x0"/>
3767ec681f3Smrg    <field name="Preshader code" size="32" start="4:16" type="address"/>
3777ec681f3Smrg    <field name="Unk 7" size="16" start="5:16" type="hex" default="0x0"/> <!-- blob is inconsistent -->
3787ec681f3Smrg  </struct>
3797ec681f3Smrg
3807ec681f3Smrg  <struct name="Set shader extended" size="32">
3817ec681f3Smrg    <field name="Tag" size="8" start="0:0" type="hex" default="0x4d"/>
3827ec681f3Smrg    <field name="Unk 1" size="24" start="0:8" type="hex" default="0x2010bd"/>
3837ec681f3Smrg    <field name="Unk 2" size="8" start="1:0" type="hex" default="0x0d"/> <!-- 90d if ld_tile or discard is used (to disable opts), 50d for other frag, 80d for vert..? 40d for compute..? -->
3847ec681f3Smrg    <field name="Unk 2b" size="8" start="1:8" type="uint" default="5"/>
3857ec681f3Smrg    <field name="Code" size="32" start="1:16" type="address"/>
3867ec681f3Smrg    <field name="Unk 3" size="8" start="2:16" type="hex" default="0x28d"/>
3877ec681f3Smrg    <field name="Register quadwords" size="5" start="2:24" type="uint"/> <!-- 0 for max -->
3887ec681f3Smrg    <field name="Unk 3b" size="3" start="2:29" type="hex" default="0x0"/>
3897ec681f3Smrg    <field name="Frag unk" size="32" start="3:0" type="hex" default="0xf3580100"/>
3907ec681f3Smrg    <field name="Spill size" size="8" start="4:0" type="hex" default="0"/> <!-- TODO: determine relation, see docs/table.py -->
3917ec681f3Smrg    <field name="Unk 4" size="12" start="4:8" type="hex" default="0x801"/>
3927ec681f3Smrg    <field name="Preshader mode" size="4" start="4:20" type="Preshader mode" default="No preshader"/>
3937ec681f3Smrg    <field name="Unk 6" size="8" start="4:24" type="hex" default="0x0"/>
3947ec681f3Smrg    <field name="Preshader unk" size="16" start="5:0" type="hex" default="0x0"/>
3957ec681f3Smrg    <field name="Preshader code" size="32" start="5:16" type="address"/>
3967ec681f3Smrg    <field name="Unk 7" size="16" start="6:16" type="hex" default="0x0"/> <!-- blob is inconsistent -->
3977ec681f3Smrg    <field name="Unk 8" size="32" start="7:0" type="hex" default="0x0"/> <!-- may not exist -->
3987ec681f3Smrg  </struct>
3997ec681f3Smrg
4007ec681f3Smrg  <!--- Command to bind a vertex pipeline, followed by subcommands. Counts are
4017ec681f3Smrg	specified in 32-bit word units. Intepretation per-shader stage.
4027ec681f3Smrg	Probably actually 17 bytes. -->
4037ec681f3Smrg  <struct name="Bind pipeline" size="16">
4047ec681f3Smrg    <field name="Tag" size="32" start="0:0" type="hex" default="0x4000002e">
4057ec681f3Smrg      <value name="AGX_BIND_PIPELINE_VERTEX" value="0x4000002e"/>
4067ec681f3Smrg      <value name="AGX_BIND_PIPELINE_FRAGMENT" value="0x800000"/>
4077ec681f3Smrg    </field>
4087ec681f3Smrg    <field name="Unk 1" size="4" start="1:0" type="hex" default="0x2"/>
4097ec681f3Smrg    <field name="Sampler count" start="1:4" size="5" type="uint"/>
4107ec681f3Smrg    <field name="Texture count" start="1:9" size="3" type="uint"/>
4117ec681f3Smrg    <field name="Unk 2" size="4" start="1:12" type="hex" default="0x1"/>
4127ec681f3Smrg    <field name="Input count" size="8" start="1:16" type="uint" default="0"/>
4137ec681f3Smrg    <field name="Padding 1" size="8" start="1:24" type="hex" default="0x0"/>
4147ec681f3Smrg    <field name="Pipeline" size="32" start="2:0" type="address"/>
4157ec681f3Smrg
4167ec681f3Smrg    <!-- Overlaps -->
4177ec681f3Smrg    <field name="FS Varyings" size="32" start="3:0" type="address"/>
4187ec681f3Smrg    <field name="VS Output count 1" size="8" start="3:0" type="uint" default="0"/>
4197ec681f3Smrg    <field name="VS Output count 2" size="8" start="3:8" type="uint" default="0"/>
4207ec681f3Smrg    <field name="Padding 2" size="16" start="3:16" type="hex" default="0x0"/>
4217ec681f3Smrg  </struct>
4227ec681f3Smrg
4237ec681f3Smrg  <!-- Subcommands are packed inside sized records -->
4247ec681f3Smrg  <struct name="Record" size="8">
4257ec681f3Smrg    <field name="Size (words)" size="8" start="0:0" type="uint"/>
4267ec681f3Smrg    <field name="Tag" size="16" start="0:8" type="hex" default="0x0000"/>
4277ec681f3Smrg    <field name="Data" size="40" start="0:24" type="address"/>
4287ec681f3Smrg  </struct>
4297ec681f3Smrg
4307ec681f3Smrg  <!--- Command to issue a direct non-indexed draw -->
4317ec681f3Smrg  <struct name="Draw" size="16">
4327ec681f3Smrg    <field name="Unk" size="8" start="0:0" type="hex" default="0x0"/>
4337ec681f3Smrg    <field name="Primitive" size="8" start="0:8" type="Primitive"/>
4347ec681f3Smrg    <field name="Command" size="16" start="0:16" type="hex" default="0x61c0"/>
4357ec681f3Smrg    <field name="Vertex count" size="32" start="1:0" type="uint"/>
4367ec681f3Smrg    <field name="Instance count" size="32" start="2:0" type="uint"/> <!-- must be nonzero -->
4377ec681f3Smrg    <field name="Vertex start" size="32" start="3:0" type="uint"/>
4387ec681f3Smrg  </struct>
4397ec681f3Smrg
4407ec681f3Smrg  <enum name="Index size">
4417ec681f3Smrg    <value name="U8" value="0"/>
4427ec681f3Smrg    <value name="U16" value="1"/>
4437ec681f3Smrg    <value name="U32" value="2"/>
4447ec681f3Smrg  </enum>
4457ec681f3Smrg
4467ec681f3Smrg  <struct name="Indexed draw" size="32">
4477ec681f3Smrg    <field name="Unk 1" size="8" start="0:0" type="hex" default="0x1"/>
4487ec681f3Smrg    <field name="Command" size="24" start="0:8" type="hex" default="0x400000"/>
4497ec681f3Smrg    <field name="Restart index" size="32" start="1:0" type="hex"/>
4507ec681f3Smrg    <field name="Unk 2a" size="8" start="2:0" type="hex" default="0x15"/>
4517ec681f3Smrg    <field name="Primitive" size="8" start="2:8" type="Primitive"/>
4527ec681f3Smrg    <field name="Restart enable" size="1" start="2:16" type="bool"/> <!-- Metal sets this bit for strips -->
4537ec681f3Smrg    <field name="Index size" size="3" start="2:17" type="Index size"/>
4547ec681f3Smrg    <field name="Unk 2c" size="4" start="2:20" type="hex" default="0xF"/>
4557ec681f3Smrg    <field name="Unk 2d" size="8" start="2:24" type="hex" default="0x61"/>
4567ec681f3Smrg    <field name="Index buffer offset" size="32" start="3:0" type="hex"/>
4577ec681f3Smrg    <field name="Index count" size="32" start="4:0" type="uint"/>
4587ec681f3Smrg    <field name="Instance count" size="32" start="5:0" type="uint"/>
4597ec681f3Smrg    <field name="Base vertex" size="32" start="6:0" type="uint"/>
4607ec681f3Smrg    <field name="Index buffer size" size="32" start="7:0" type="uint" modifier="shr(2)"/>
4617ec681f3Smrg  </struct>
4627ec681f3Smrg
4637ec681f3Smrg  <!--- Command to launch a direct compute kernel -->
4647ec681f3Smrg  <struct name="Launch" size="36">
4657ec681f3Smrg    <field name="Command" size="32" start="0:0" type="hex" default="0x1002"/>
4667ec681f3Smrg    <field name="Pipeline" size="32" start="1:0" type="address"/>
4677ec681f3Smrg    <field name="Group count X" size="32" start="2:0" type="uint"/>
4687ec681f3Smrg    <field name="Group count Y" size="32" start="3:0" type="uint"/>
4697ec681f3Smrg    <field name="Group count Z" size="32" start="4:0" type="uint"/>
4707ec681f3Smrg    <field name="Local size X" size="32" start="5:0" type="uint"/>
4717ec681f3Smrg    <field name="Local size Y" size="32" start="6:0" type="uint"/>
4727ec681f3Smrg    <field name="Local size Z" size="32" start="7:0" type="uint"/>
4737ec681f3Smrg    <field name="Unk" size="32" start="8:0" type="hex" default="0x60000160"/>
4747ec681f3Smrg  </struct>
4757ec681f3Smrg
4767ec681f3Smrg  <!--- The rest of this file is likely software defined by macOS kernel -->
4777ec681f3Smrg  <enum name="IOGPU Attachment Type">
4787ec681f3Smrg    <value name="Colour" value="0xA"/>
4797ec681f3Smrg    <value name="Depth" value="0xC"/>
4807ec681f3Smrg  </enum>
4817ec681f3Smrg
4827ec681f3Smrg  <struct name="IOGPU Header" size="64">
4837ec681f3Smrg    <field name="Unk 0" start="0:0" size="32" default="0x10000" type="hex"/>
4847ec681f3Smrg    <field name="Total size" start="1:0" size="32" type="uint"/>
4857ec681f3Smrg    <field name="Unk 2" start="2:0" size="32" default="0x7" type="hex"/>
4867ec681f3Smrg    <field name="Attachment offset 1" start="8:0" size="32" type="uint"/>
4877ec681f3Smrg    <field name="Attachment length" start="9:0" size="32" type="uint"/>
4887ec681f3Smrg    <field name="Attachment offset 2" start="10:0" size="32" type="uint"/>
4897ec681f3Smrg    <field name="Unknown offset" start="11:0" size="32" type="uint"/>
4907ec681f3Smrg    <field name="Unk 4" start="12:0" size="32" default="0x30" type="hex"/>
4917ec681f3Smrg    <field name="Unk 5" start="13:0" size="32" default="0x01" type="hex"/>
4927ec681f3Smrg    <field name="Encoder" start="14:0" size="64" type="address"/>
4937ec681f3Smrg  </struct>
4947ec681f3Smrg
4957ec681f3Smrg  <struct name="IOGPU Attachment" size="24">
4967ec681f3Smrg    <field name="Unk 0" start="0:0" size="16" default="0x100" type="hex"/>
4977ec681f3Smrg    <field name="Address" start="0:16" size="48" type="address"/>
4987ec681f3Smrg    <field name="Type" start="2:16" size="16" type="IOGPU Attachment Type"/>
4997ec681f3Smrg    <field name="Unk 1" start="3:0" size="32" type="hex"/>
5007ec681f3Smrg    <field name="Unk 2" start="4:0" size="3" type="hex"/>
5017ec681f3Smrg    <field name="Bytes per pixel" start="4:3" size="5" type="uint"/>
5027ec681f3Smrg    <field name="Unk 3" start="4:16" size="4" type="hex" default="0xC"/>
5037ec681f3Smrg    <!-- Percent of total attachment space used for this attachment, expressed
5047ec681f3Smrg         in a decimal percentage [0, 100] <field name="Percent" start="5:16" -->
5057ec681f3Smrg    <field name="Percent" start="5:16" size="16" type="uint"/>
5067ec681f3Smrg  </struct>
5077ec681f3Smrg</agxml>
508