2021-04-25 00:08:14 +01:00
<agxml >
<enum name= "Channel" >
<value name= "R" value= "0" />
<value name= "G" value= "1" />
<value name= "B" value= "2" />
<value name= "A" value= "3" />
<value name= "1" value= "4" />
<value name= "0" value= "5" />
</enum>
<enum name= "ZS Func" >
<value name= "Never" value= "0" />
<value name= "Less" value= "1" />
<value name= "Equal" value= "2" />
<value name= "Lequal" value= "3" />
<value name= "Greater" value= "4" />
<value name= "Not Equal" value= "5" />
<value name= "Gequal" value= "6" />
<value name= "Always" value= "7" />
</enum>
<enum name= "Compare func" >
<value name= "Lequal" value= "0" />
<value name= "Gequal" value= "1" />
<value name= "Less" value= "2" />
<value name= "Greater" value= "3" />
<value name= "Equal" value= "4" />
<value name= "Not Equal" value= "5" />
<value name= "Always" value= "6" />
<value name= "Never" value= "7" />
</enum>
<enum name= "Stencil Op" >
<value name= "Keep" value= "0" />
<value name= "Zero" value= "1" />
<value name= "Replace" value= "2" />
<value name= "Incr Sat" value= "3" />
<value name= "Decr Sat" value= "4" />
<value name= "Invert" value= "5" />
<value name= "Incr Wrap" value= "6" />
<value name= "Decr Wrap" value= "7" />
</enum>
<enum name= "Polygon Mode" >
<value name= "Fill" value= "0" />
<value name= "Line" value= "1" />
<value name= "Point" value= "2" />
</enum>
<enum name= "Primitive" >
<value name= "Points" value= "0" />
<value name= "Lines" value= "1" />
<value name= "Line strip" value= "3" />
<value name= "Line loop" value= "5" />
<value name= "Triangles" value= "6" />
<value name= "Triangle strip" value= "9" />
<value name= "Triangle fan" value= "10" />
<value name= "Quads" value= "14" /> <!-- guess, confirm with piglit later XXX -->
<value name= "Quad strip" value= "15" /> <!-- guess, confirm with piglit later XXX -->
</enum>
2021-05-30 22:49:35 +01:00
<enum name= "Layout" >
<value name= "Linear" value= "0" />
<!-- Morton order with 64x64 tiles -->
<value name= "Tiled 64x64" value= "2" />
</enum>
2021-05-31 19:37:06 +01:00
<enum name= "Channels" >
<value name= "R8" value= "0x00" />
<value name= "R16" value= "0x09" />
<value name= "R8G8" value= "0x0A" />
<value name= "R5G6B5" value= "0x0B" />
<value name= "R4G4B4A4" value= "0x0C" />
<value name= "A1R5G5B5" value= "0x0D" />
<value name= "R5G5B5A1" value= "0x0E" />
<value name= "R32" value= "0x21" />
<value name= "R16G16" value= "0x23" />
<value name= "R11G11B10" value= "0x25" />
<value name= "R10G10B10A2" value= "0x26" />
<value name= "R9G9B9E5" value= "0x27" />
<value name= "R8G8B8A8" value= "0x28" />
<value name= "R32G32" value= "0x31" />
<value name= "R16G16B16A16" value= "0x32" />
<value name= "R32G32B32A32" value= "0x38" />
<value name= "GBGR 422" value= "0x40" /> <!-- Subsampled, swizzle BRG1 -->
<value name= "BGRG 422" value= "0x41" /> <!-- Subsampled, swizzle BRG1 -->
<!-- Compressed -->
<value name= "PVRTC 2bpp" value= "0x50" />
<value name= "PVRTC 4bpp" value= "0x51" />
<value name= "ETC2 RGB8" value= "0x58" />
<value name= "ETC2 RGBA8" value= "0x59" />
<value name= "ETC2 RGB8A1" value= "0x5A" />
<value name= "EAC R11" value= "0x5B" />
<value name= "EAC RG11" value= "0x5C" />
<value name= "ASTC 4x4 LDR" value= "0x60" />
<value name= "ASTC 5x4 LDR" value= "0x61" />
<value name= "ASTC 5x5 LDR" value= "0x62" />
<value name= "ASTC 6x5 LDR" value= "0x63" />
<value name= "ASTC 6x6 LDR" value= "0x64" />
<value name= "ASTC 8x5 LDR" value= "0x65" />
<value name= "ASTC 8x6 LDR" value= "0x66" />
<value name= "ASTC 8x8 LDR" value= "0x67" />
<value name= "ASTC 10x5 LDR" value= "0x68" />
<value name= "ASTC 10x6 LDR" value= "0x69" />
<value name= "ASTC 10x8 LDR" value= "0x6A" />
<value name= "ASTC 10x10 LDR" value= "0x6B" />
<value name= "ASTC 12x10 LDR" value= "0x6C" />
<value name= "ASTC 12x12 LDR" value= "0x6D" />
<value name= "BC1" value= "0x74" />
<value name= "BC2" value= "0x75" />
<value name= "BC3" value= "0x76" />
<value name= "BC4" value= "0x77" />
<value name= "BC5" value= "0x78" />
<value name= "BC6H" value= "0x79" />
<value name= "BC6H Ufloat" value= "0x7A" />
<value name= "BC7" value= "0x7B" />
</enum>
<enum name= "Texture Type" >
<value name= "Unorm" value= "0" />
<value name= "Snorm" value= "1" />
<value name= "Uint" value= "2" />
<value name= "Sint" value= "3" />
<value name= "Float" value= "4" />
<value name= "XR" value= "5" />
</enum>
2021-06-06 18:22:50 +01:00
<struct name= "Varying header" size= "4" >
2021-04-25 00:08:14 +01:00
<field name= "Slots 1" size= "8" start= "0:0" type= "uint" />
<field name= "Slots 2" size= "8" start= "0:8" type= "uint" />
</struct>
2021-06-06 18:22:50 +01:00
<enum name= "Varying Type" >
<value name= "Flat (first)" value= "0" />
<value name= "Flat (last)" value= "2" />
<value name= "Fragcoord W" value= "3" />
<value name= "Smooth" value= "7" />
<value name= "Fragcoord Z" value= "11" />
</enum>
2021-04-25 00:08:14 +01:00
<struct name= "Varying" size= "4" >
2021-06-06 18:22:50 +01:00
<field name= "Components" size= "2" start= "0" type= "uint" modifier= "minus(1)" />
<field name= "Type" size= "6" start= "2" type= "Varying Type" default= "Smooth" />
2021-04-25 00:08:14 +01:00
<field name= "Slot 1" size= "8" start= "8" type= "uint" />
<field name= "Slot 2" size= "8" start= "16" type= "uint" />
</struct>
2021-05-31 20:08:55 +01:00
<struct name= "Format" size= "2" >
<field name= "Channels" size= "7" start= "0" type= "Channels" />
<field name= "Type" size= "3" start= "7" type= "Texture Type" />
</struct>
2021-04-25 00:08:14 +01:00
<struct name= "Render Target" size= "16" >
2021-05-31 19:37:06 +01:00
<field name= "Unknown" size= "4" start= "0" type= "hex" default= "0x2" />
<field name= "Layout" size= "2" start= "4" type= "Layout" />
2021-05-31 20:08:55 +01:00
<field name= "Format" size= "10" start= "6" type= "Pixel Format" />
2021-04-25 00:08:14 +01:00
<field name= "Swizzle R" size= "2" start= "16" type= "Channel" />
<field name= "Swizzle G" size= "2" start= "18" type= "Channel" />
<field name= "Swizzle B" size= "2" start= "20" type= "Channel" />
<field name= "Swizzle A" size= "2" start= "22" type= "Channel" />
<field name= "Width" size= "14" start= "24" type= "uint" modifier= "minus(1)" />
<field name= "Height" size= "14" start= "38" type= "uint" modifier= "minus(1)" />
<field name= "Unk 52" size= "1" start= "52" type= "bool" />
<field name= "Rotate 90" size= "1" start= "53" type= "bool" default= "false" />
<field name= "Flip vertical" size= "1" start= "54" type= "bool" default= "false" />
<field name= "Unk 55" size= "9" start= "55" type= "hex" />
<field name= "Buffer" size= "36" start= "64" type= "address" modifier= "shr(4)" />
2021-05-30 23:39:51 +01:00
<!-- N.b. sRGB is not specified here -->
2021-05-30 23:01:43 +01:00
<!-- Off by 4? -->
<field name= "Stride" size= "24" start= "104" type= "hex" prefix= "AGX_RT_STRIDE" >
<value name= "Tiled" value= "0x100000" />
</field>
2021-04-25 00:08:14 +01:00
</struct>
<!-- Payloads follow, right - shifted by 4 because of course -->
<struct name= "Texture" size= "16" >
2021-05-31 19:37:06 +01:00
<field name= "Unknown" size= "4" start= "0" type= "hex" default= "0x2" />
<field name= "Layout" size= "2" start= "4" type= "Layout" />
2021-05-31 20:08:55 +01:00
<field name= "Format" size= "10" start= "6" type= "Pixel Format" />
2021-04-25 00:08:14 +01:00
<field name= "Swizzle R" size= "3" start= "16" type= "Channel" default= "R" />
<field name= "Swizzle G" size= "3" start= "19" type= "Channel" default= "G" />
<field name= "Swizzle B" size= "3" start= "22" type= "Channel" default= "B" />
<field name= "Swizzle A" size= "3" start= "25" type= "Channel" default= "A" />
<field name= "Width" size= "14" start= "28" type= "uint" modifier= "minus(1)" />
<field name= "Height" size= "14" start= "42" type= "uint" modifier= "minus(1)" />
2021-06-01 01:08:37 +01:00
<field name= "Levels" size= "6" start= "60" type= "uint" modifier= "minus(1)" />
2021-04-25 00:08:14 +01:00
<field name= "Unk 1" size= "36" start= "66" type= "hex" modifier= "shr(4)" />
2021-06-01 01:08:37 +01:00
<!-- Unknown bit set by Metal when mipmapping. Might relate to a mechanism
to switch tile size (or disable tiling altogether?) at small mip levels to
reduce wasted memory due to padding. Causing test flakiness when set. -->
<field name= "Unk mipmapped" size= "1" start= "102" type= "bool" />
2021-04-25 00:08:14 +01:00
<field name= "Compression" size= "2" start= "106" type= "hex" /> <!-- 0 for 64x64 tiling -->
<field name= "sRGB" size= "1" start= "108" type= "bool" />
2021-05-30 23:01:43 +01:00
<field name= "Unk 2" size= "1" start= "109" type= "bool" />
<field name= "Stride" size= "18" start= "110" type= "hex" modifier= "shr(4)" />
2021-04-25 00:08:14 +01:00
</struct>
<enum name= "Wrap" >
<value name= "Clamp to edge" value= "0" />
<value name= "Repeat" value= "1" />
<value name= "Mirrored repeat" value= "2" />
<value name= "Clamp to border" value= "3" />
</enum>
<enum name= "Mip filter" >
<value name= "None" value= "0" />
<value name= "Nearest" value= "1" />
<value name= "Linear" value= "2" />
</enum>
<enum name= "Border colour" >
<value name= "Transparent black" value= "0" />
<value name= "Opaque black" value= "1" />
<value name= "Opaque white" value= "2" />
</enum>
<struct name= "Sampler" size= "8" >
<field name= "Unk 1" size= "2" start= "17" type= "hex" default= "3" />
<field name= "Magnify linear" size= "1" start= "19" type= "bool" />
<field name= "Unk 2" size= "2" start= "23" type= "hex" default= "1" />
<field name= "Minify linear" size= "1" start= "25" type= "bool" />
<field name= "Mip filter" size= "2" start= "27" type= "Mip filter" />
<field name= "Wrap S" size= "3" start= "29" type= "Wrap" />
<field name= "Wrap T" size= "3" start= "32" type= "Wrap" />
<field name= "Wrap R" size= "3" start= "35" type= "Wrap" />
<field name= "Pixel coordinates" size= "1" start= "38" type= "bool" />
<field name= "Compare func" size= "3" start= "39" type= "Compare func" />
<field name= "Unk 3" size= "1" start= "42" type= "hex" default= "1" />
<field name= "Border colour" size= "2" start= "55" type= "Border colour" />
</struct>
<!-- - Identified by tag? -->
<struct name= "Viewport" size= "40" >
<field name= "Tag" size= "32" start= "0:0" type= "hex" default= "0xc00" />
<!-- Acts like a scissor at 32x32 tile boundaries, ignored unless clip tile is set -->
<field name= "Max tile X" size= "9" start= "1:0" type= "uint" modifier= "minus(1)" />
<field name= "Min tile X" size= "9" start= "1:16" type= "uint" />
<field name= "Clip tile" size= "1" start= "1:31" type= "bool" />
<field name= "Max tile Y" size= "9" start= "2:0" type= "uint" modifier= "minus(1)" />
<field name= "Min tile Y" size= "9" start= "2:16" type= "uint" />
<!-- Used to convert clip space coordinates to NDC, does not clip -->
<field name= "Translate X" size= "32" start= "4:0" type= "float" />
<field name= "Scale X" size= "32" start= "5:0" type= "float" />
<field name= "Translate Y" size= "32" start= "6:0" type= "float" />
<field name= "Scale Y" size= "32" start= "7:0" type= "float" />
2021-05-30 21:25:19 +01:00
<!-- Specifies an affine transformation from clip coordinates to viewport
depth coordinates. For APIs with clip coordinates [0, 1], this cooresponds
to near z and (far z - near z) respectively. In general, given clip
coordinate z_in, the viewport depth is given as (z_in * scale_z) +
translate_z. For example, the default [0, 1] depth buffer in OpenGL with
[-1, +1] clip coordinates is specified as scale = 1/2, bias = 1/2 -->
<field name= "Translate Z" size= "32" start= "8:0" type= "float" />
<field name= "Scale Z" size= "32" start= "9:0" type= "float" />
2021-04-25 00:08:14 +01:00
</struct>
<!-- - Pointed to from the command buffer -->
<struct name= "Scissor" size= "16" >
2021-05-28 03:29:02 +01:00
<field name= "Max X" size= "16" start= "0:0" type= "uint" />
<field name= "Min X" size= "16" start= "0:16" type= "uint" />
<field name= "Max Y" size= "16" start= "1:0" type= "uint" />
<field name= "Min Y" size= "16" start= "1:16" type= "uint" />
2021-04-25 00:08:14 +01:00
<field name= "Min Z" size= "32" start= "2:0" type= "float" />
<field name= "Max Z" size= "32" start= "3:0" type= "float" />
</struct>
<struct name= "Rasterizer face" size= "8" >
<field name= "Stencil reference" size= "8" start= "0:0" type= "hex" default= "0x00" />
2021-05-30 18:18:37 +01:00
<!-- line width is 4:4 fixed point with off - by - one applied -->
2021-07-05 21:00:45 +01:00
<field name= "Line width" size= "8" start= "0:8" type= "hex" />
<field name= "Polygon mode" size= "2" start= "0:18" type= "Polygon Mode" />
2021-04-25 00:08:14 +01:00
<field name= "Disable depth write" size= "1" start= "0:21" type= "bool" />
2021-07-05 21:00:45 +01:00
<field name= "Depth function" size= "3" start= "0:24" type= "ZS Func" />
2021-04-25 00:08:14 +01:00
<field name= "Stencil write mask" size= "8" start= "1:0" type= "hex" default= "0xFF" />
<field name= "Stencil read mask" size= "8" start= "1:8" type= "hex" default= "0xFF" />
<field name= "Depth pass" size= "3" start= "1:16" type= "Stencil Op" />
<field name= "Depth fail" size= "3" start= "1:19" type= "Stencil Op" />
<field name= "Stencil fail" size= "3" start= "1:22" type= "Stencil Op" />
<field name= "Stencil compare" size= "3" start= "1:25" type= "ZS Func" default= "Always" />
</struct>
<struct name= "Rasterizer" size= "28" >
<field name= "Tag" size= "32" start= "0:0" type= "hex" default= "0x10000b5" />
<field name= "Unk 1" size= "1" start= "1:9" type= "hex" default= "0x1" />
2021-05-28 03:33:26 +01:00
<field name= "Scissor enable" size= "1" start= "1:16" type= "bool" />
2021-04-25 00:08:14 +01:00
<field name= "Unk ZS" size= "1" start= "1:18" type= "hex" default= "0x1" />
<field name= "Unk 2" size= "2" start= "1:19" type= "hex" default= "0x0" />
<field name= "Unk fill lines" size= "1" start= "1:26" type= "hex" default= "0x0" /> <!-- set when drawing LINES -->
<field name= "Front" size= "64" start= "2:0" type= "Rasterizer face" />
<field name= "Back" size= "64" start= "4:0" type= "Rasterizer face" />
</struct>
<struct name= "Cull" size= "8" >
<field name= "Tag" size= "32" start= "0:0" type= "hex" default= "0x200000" />
<field name= "Cull front" size= "1" start= "1:0" type= "bool" />
<field name= "Cull back" size= "1" start= "1:1" type= "bool" />
2021-05-30 21:12:43 +01:00
<field name= "Unk GL 1" size= "1" start= "1:7" type= "bool" />
<field name= "Unk GL 2" size= "1" start= "1:8" type= "bool" />
2021-04-25 00:08:14 +01:00
<field name= "Depth clip" size= "1" start= "1:10" type= "bool" />
<field name= "Depth clamp" size= "1" start= "1:11" type= "bool" />
<field name= "Front face CCW" size= "1" start= "1:16" type= "bool" />
</struct>
<struct name= "Linkage" size= "16" >
<field name= "Tag" size= "32" start= "0:0" type= "hex" default= "0xC020000" />
<field name= "Unk 1" size= "32" start= "1:0" type= "hex" default= "0x100" />
<field name= "Unk 2" size= "32" start= "2:0" type= "hex" default= "0x0" />
<field name= "Varying count" size= "32" start= "3:0" type= "uint" />
</struct>
2021-05-28 03:31:08 +01:00
<!-- Indexes into the array of scissor descriptors -->
<struct name= "Set scissor" size= "8" >
<field name= "Tag" size= "32" start= "0:0" type= "hex" default= "0x100" />
<field name= "Index" size= "32" start= "1:0" type= "uint" />
</struct>
2021-04-25 00:08:14 +01:00
<!-- - Commands valid within a pipeline -->
<struct name= "Bind uniform" size= "8" >
<field name= "Tag" size= "8" start= "0:0" type= "hex" default= "0x1d" />
<field name= "Start (halfs)" size= "8" start= "0:8" type= "uint" />
<field name= "Unk" size= "4" start= "0:16" type= "hex" default= "0x0" />
<field name= "Size (halfs)" size= "4" start= "0:20" type= "uint" />
<field name= "Buffer" size= "40" start= "0:24" type= "address" />
</struct>
<struct name= "Bind texture" size= "8" >
<field name= "Tag" size= "8" start= "0:0" type= "hex" default= "0xdd" />
<field name= "Start" size= "8" start= "0:8" type= "uint" />
<field name= "Count" size= "4" start= "0:20" type= "uint" />
<field name= "Buffer" size= "40" start= "0:24" type= "address" />
</struct>
<struct name= "Bind sampler" size= "8" >
<field name= "Tag" size= "8" start= "0:0" type= "hex" default= "0x9d" />
<field name= "Start" size= "8" start= "0:8" type= "uint" />
<field name= "Count" size= "4" start= "0:20" type= "uint" />
<field name= "Buffer" size= "40" start= "0:24" type= "address" />
</struct>
<enum name= "Preshader mode" >
<value name= "Preshader" value= "3" />
<value name= "No preshader" value= "8" />
</enum>
<struct name= "Set shader" size= "24" >
<field name= "Tag" size= "8" start= "0:0" type= "hex" default= "0x4d" />
<field name= "Unk 1" size= "24" start= "0:8" type= "hex" default= "0x90" />
<field name= "Unk 2" size= "8" start= "1:0" type= "hex" default= "0x0d" /> <!-- TODO differs with stage -->
<field name= "Unk 2b" size= "8" start= "1:8" type= "uint" default= "4" />
<field name= "Code" size= "32" start= "1:16" type= "address" />
<field name= "Unk 3" size= "8" start= "2:16" type= "hex" default= "0x8d" />
<field name= "Register quadwords" size= "5" start= "2:24" type= "uint" /> <!-- 0 for max -->
<field name= "Unk 3b" size= "3" start= "2:29" type= "hex" default= "0x0" />
<field name= "Spill size" size= "8" start= "3:0" type= "hex" default= "0" /> <!-- TODO: determine relation, see docs/table.py -->
<field name= "Unk 4" size= "12" start= "3:8" type= "hex" default= "0x801" />
<field name= "Preshader mode" size= "4" start= "3:20" type= "Preshader mode" default= "No preshader" />
<field name= "Unk 6" size= "8" start= "3:24" type= "hex" default= "0x0" />
<field name= "Preshader unk" size= "16" start= "4:0" type= "hex" default= "0x0" />
<field name= "Preshader code" size= "32" start= "4:16" type= "address" />
<field name= "Unk 7" size= "16" start= "5:16" type= "hex" default= "0x0" /> <!-- blob is inconsistent -->
</struct>
<struct name= "Set shader extended" size= "32" >
<field name= "Tag" size= "8" start= "0:0" type= "hex" default= "0x4d" />
<field name= "Unk 1" size= "24" start= "0:8" type= "hex" default= "0x2010bd" />
<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..? -->
<field name= "Unk 2b" size= "8" start= "1:8" type= "uint" default= "5" />
<field name= "Code" size= "32" start= "1:16" type= "address" />
<field name= "Unk 3" size= "8" start= "2:16" type= "hex" default= "0x28d" />
<field name= "Register quadwords" size= "5" start= "2:24" type= "uint" /> <!-- 0 for max -->
<field name= "Unk 3b" size= "3" start= "2:29" type= "hex" default= "0x0" />
<field name= "Frag unk" size= "32" start= "3:0" type= "hex" default= "0xf3580100" />
<field name= "Spill size" size= "8" start= "4:0" type= "hex" default= "0" /> <!-- TODO: determine relation, see docs/table.py -->
<field name= "Unk 4" size= "12" start= "4:8" type= "hex" default= "0x801" />
<field name= "Preshader mode" size= "4" start= "4:20" type= "Preshader mode" default= "No preshader" />
<field name= "Unk 6" size= "8" start= "4:24" type= "hex" default= "0x0" />
<field name= "Preshader unk" size= "16" start= "5:0" type= "hex" default= "0x0" />
<field name= "Preshader code" size= "32" start= "5:16" type= "address" />
<field name= "Unk 7" size= "16" start= "6:16" type= "hex" default= "0x0" /> <!-- blob is inconsistent -->
<field name= "Unk 8" size= "32" start= "7:0" type= "hex" default= "0x0" /> <!-- may not exist -->
</struct>
<!-- - Command to bind a vertex pipeline, followed by subcommands. Counts are
specified in 32-bit word units. Intepretation per-shader stage.
Probably actually 17 bytes. -->
<struct name= "Bind pipeline" size= "16" >
<field name= "Tag" size= "32" start= "0:0" type= "hex" default= "0x4000002e" />
2021-07-05 17:21:06 +01:00
<field name= "Unk 1" size= "4" start= "1:0" type= "hex" default= "0x2" />
<field name= "Sampler count" start= "1:4" size= "5" type= "uint" />
<field name= "Texture count" start= "1:9" size= "3" type= "uint" />
<field name= "Unk 2" size= "4" start= "1:12" type= "hex" default= "0x1" />
2021-04-25 00:08:14 +01:00
<field name= "Input count" size= "8" start= "1:16" type= "uint" default= "0" />
<field name= "Padding 1" size= "8" start= "1:24" type= "hex" default= "0x0" />
<field name= "Pipeline" size= "32" start= "2:0" type= "address" />
<!-- Overlaps -->
<field name= "FS Varyings" size= "32" start= "3:0" type= "address" />
<field name= "VS Output count 1" size= "8" start= "3:0" type= "uint" default= "0" />
<field name= "VS Output count 2" size= "8" start= "3:8" type= "uint" default= "0" />
<field name= "Padding 2" size= "16" start= "3:16" type= "hex" default= "0x0" />
</struct>
<!-- Subcommands are packed inside sized records -->
<struct name= "Record" size= "8" >
<field name= "Size (words)" size= "8" start= "0:0" type= "uint" />
<field name= "Tag" size= "16" start= "0:8" type= "hex" default= "0x0000" />
<field name= "Data" size= "40" start= "0:24" type= "address" />
</struct>
<!-- - Command to issue a direct non - indexed draw -->
<struct name= "Draw" size= "16" >
<field name= "Unk" size= "8" start= "0:0" type= "hex" default= "0x0" />
<field name= "Primitive" size= "8" start= "0:8" type= "Primitive" />
<field name= "Command" size= "16" start= "0:16" type= "hex" default= "0x61c0" />
<field name= "Vertex count" size= "32" start= "1:0" type= "uint" />
<field name= "Instance count" size= "32" start= "2:0" type= "uint" /> <!-- must be nonzero -->
<field name= "Vertex start" size= "32" start= "3:0" type= "uint" />
</struct>
<enum name= "Index size" >
<value name= "U8" value= "0" />
<value name= "U16" value= "1" />
<value name= "U32" value= "2" />
</enum>
<struct name= "Indexed draw" size= "32" >
<field name= "Unk 1" size= "8" start= "0:0" type= "hex" default= "0x1" />
<field name= "Command" size= "24" start= "0:8" type= "hex" default= "0x400000" />
<field name= "Restart index" size= "32" start= "1:0" type= "hex" />
<field name= "Unk 2a" size= "8" start= "2:0" type= "hex" default= "0x15" />
<field name= "Primitive" size= "8" start= "2:8" type= "Primitive" />
<field name= "Restart enable" size= "1" start= "2:16" type= "bool" /> <!-- Metal sets this bit for strips -->
<field name= "Index size" size= "3" start= "2:17" type= "Index size" />
<field name= "Unk 2c" size= "4" start= "2:20" type= "hex" default= "0xF" />
<field name= "Unk 2d" size= "8" start= "2:24" type= "hex" default= "0x61" />
<field name= "Index buffer offset" size= "32" start= "3:0" type= "hex" />
<field name= "Index count" size= "32" start= "4:0" type= "uint" />
<field name= "Instance count" size= "32" start= "5:0" type= "uint" />
<field name= "Base vertex" size= "32" start= "6:0" type= "uint" />
<field name= "Index buffer size" size= "32" start= "7:0" type= "uint" modifier= "shr(2)" />
</struct>
<!-- - Command to launch a direct compute kernel -->
<struct name= "Launch" size= "36" >
<field name= "Command" size= "32" start= "0:0" type= "hex" default= "0x1002" />
<field name= "Pipeline" size= "32" start= "1:0" type= "address" />
<field name= "Group count X" size= "32" start= "2:0" type= "uint" />
<field name= "Group count Y" size= "32" start= "3:0" type= "uint" />
<field name= "Group count Z" size= "32" start= "4:0" type= "uint" />
<field name= "Local size X" size= "32" start= "5:0" type= "uint" />
<field name= "Local size Y" size= "32" start= "6:0" type= "uint" />
<field name= "Local size Z" size= "32" start= "7:0" type= "uint" />
<field name= "Unk" size= "32" start= "8:0" type= "hex" default= "0x60000160" />
</struct>
</agxml>