blob: ef4f8ad702bf0ffd3f47114431c7a745b2d61044 [file] [log] [blame] [edit]
<?xml version="1.0" ?>
<genxml>
<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="Visibility Mode">
<value name="None" value="0"/>
<value name="Counting" value="2"/>
<value name="Boolean" value="3"/>
</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="11"/>
<value name="Quads" value="14"/>
<value name="Quad strip" value="15"/>
</enum>
<enum name="Object Type">
<value name="Triangle" value="0"/>
<value name="Line" value="1"/>
<value name="Point sprite UV=10" value="2"/>
<value name="Point sprite UV=01" value="4"/>
<!-- Line-filled tri. Point-filled tri. UV. Rect. Match RGX. -->
</enum>
<enum name="Layout">
<value name="Linear" value="0"/>
<!-- Default layout if no other layout is set -->
<value name="Null" value="1"/>
<!-- Morton order -->
<value name="Twiddled" value="2"/>
<!-- With a metadata buffer -->
<value name="Compressed" value="3"/>
</enum>
<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"/>
<!-- Software-defined value selected not to clash with the hardware values.
Texture buffer reads from this format are lowered. It is invalid to
use this format for anything else. -->
<value name="R32G32B32 (Emulated)" value="0x36"/>
<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"/>
<!-- For LDR use with UNORM/no-sRGB, for sRGB use with UNORM/sRGB, for HDR
use with FLOAT/no-sRGB -->
<value name="ASTC 4x4" value="0x60"/>
<value name="ASTC 5x4" value="0x61"/>
<value name="ASTC 5x5" value="0x62"/>
<value name="ASTC 6x5" value="0x63"/>
<value name="ASTC 6x6" value="0x64"/>
<value name="ASTC 8x5" value="0x65"/>
<value name="ASTC 8x6" value="0x66"/>
<value name="ASTC 8x8" value="0x67"/>
<value name="ASTC 10x5" value="0x68"/>
<value name="ASTC 10x6" value="0x69"/>
<value name="ASTC 10x8" value="0x6A"/>
<value name="ASTC 10x10" value="0x6B"/>
<value name="ASTC 12x10" value="0x6C"/>
<value name="ASTC 12x12" 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>
<struct name="CF binding header" size="4">
<field name="Number of 32-bit slots" size="8" start="0:0" type="uint"/>
<field name="Number of coefficient registers" size="8" start="0:8" type="uint"/>
</struct>
<enum name="Shade model">
<value name="Flat vertex 0" value="0"/>
<value name="Flat vertex 2" value="2"/>
<value name="Linear" value="3"/>
<value name="Flat vertex 1" value="6"/>
<value name="Perspective" value="7"/>
</enum>
<enum name="Coefficient source">
<value name="Varying" value="0"/>
<value name="Fragcoord Z" value="1"/>
<value name="Point coord" value="2"/>
<value name="Primitive ID" value="3"/>
<!-- Vec2 only -->
<value name="Barycentric coord" value="5"/>
</enum>
<struct name="CF binding" size="4">
<field name="Components" size="2" start="0" type="uint" modifier="minus(1)"/>
<field name="Shade model" size="3" start="2" type="Shade model"/>
<field name="Source" size="3" start="5" type="Coefficient source"/>
<field name="Base slot" size="8" start="8" type="uint"/>
<field name="Base coefficient register" size="8" start="16" type="uint"/>
</struct>
<enum name="Texture dimension">
<value name="1D" value="0"/>
<value name="1D Array" value="1"/>
<value name="2D" value="2"/>
<value name="2D Array" value="3"/>
<value name="2D Multisampled" value="4"/>
<value name="3D" value="5"/>
<value name="Cube" value="6"/>
<value name="Cube Array" value="7"/>
<value name="2D Array Multisampled" value="8"/>
</enum>
<enum name="Sample Count">
<value name="2" value="0"/>
<value name="4" value="1"/>
</enum>
<!-- Beginning of software-defined metadata used to implement image atomics
and multisampled image writes. For atomics, information could be
recovered from the PBE descriptor, but it is convenient to compute on the
CPU where we have ail.
This descriptor (or a pointer to it, if the extended form is used) is stashed
in the last 8 bytes of a PBE descriptor. Ordinarily used for
acceleration buffers or linear layer stride. We forbid atomics and
multisampled writes to compressed images and linear 2D arrays, leaving this
area free.
-->
<struct name="Atomic (software)" size="16">
<field name="Base" size="33" start="0" type="address" modifier="shr(7)"/>
<field name="Tile width" size="3" start="33" type="uint" modifier="log2" default="1"/>
<field name="Tile height" size="3" start="36" type="uint" modifier="log2" default="1"/>
<field name="Tiles per row" size="15" start="39" type="uint"/>
<field name="Sample count" size="2" start="54" type="uint" modifier="log2" default="1"/>
<!-- Extended fields begin here -->
<field name="Layer stride (pixels)" size="32" start="64" type="uint"/>
</struct>
<struct name="PBE Buffer (software)" size="8">
<!-- Not necessarily aligned -->
<field name="Base" size="40" start="0" type="address"/>
</struct>
<!-- End of software defined data structures -->
<struct name="PBE" size="24">
<field name="Dimension" size="4" start="0" type="Texture dimension" default="2D"/>
<field name="Layout" size="2" start="4" type="Layout"/>
<field name="Channels" size="7" start="6" type="Channels"/>
<field name="Type" size="3" start="13" type="Texture Type"/>
<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="Samples" size="1" start="56" type="Sample Count"/>
<field name="Unk mipmapped" size="1" start="58" type="bool"/>
<field name="Compressed 1" size="1" start="59" type="bool"/>
<field name="Buffer" size="36" start="64" type="address" modifier="shr(4)"/>
<field name="Level" size="4" start="100" type="uint"/>
<!-- If layout is not linear. Layers must be zero unless rendering to an
array texture (with a layered framebuffer) -->
<field name="Levels" size="4" start="104" type="uint" modifier="minus(1)"/>
<field name="Layers" size="14" start="108" type="uint" modifier="minus(1)" default="1"/>
<field name="Page-aligned layers" size="1" start="124" type="bool"/>
<!-- Should writes to this image convert to sRGB?
Note that imageblock writes do not use this flag, instead doing the
conversion when writing into the tilebuffer. -->
<field name="sRGB" size="1" start="125" type="bool"/>
<!-- Read the next word (set for compression or linear 2D arrays) -->
<field name="Extended" size="1" start="127" type="bool"/>
<!-- If layout is linear. Off by 4? -->
<field name="Stride" size="21" start="104" type="hex"/>
<!-- If layout is compressed -->
<field name="Acceleration buffer" size="64" start="128" type="address" modifier="shr(4)"/>
<!-- If layout is linear, stride has the minus 1 encoded -->
<field name="Depth (linear)" size="11" start="128" type="uint" modifier="minus(1)" default="1"/>
<field name="Layer stride (linear)" size="27" start="139" type="uint" modifier="shr(7)"/>
<!-- If neither, for software use -->
<field name="Software-defined" size="64" start="128" type="hex"/>
</struct>
<struct name="Texture" size="24">
<field name="Dimension" size="4" start="0" type="Texture dimension"/>
<field name="Layout" size="2" start="4" type="Layout"/>
<field name="Channels" size="7" start="6" type="Channels"/>
<field name="Type" size="3" start="13" type="Texture Type"/>
<field name="Swizzle R" size="3" start="16" type="Channel"/>
<field name="Swizzle G" size="3" start="19" type="Channel"/>
<field name="Swizzle B" size="3" start="22" type="Channel"/>
<field name="Swizzle A" size="3" start="25" type="Channel"/>
<field name="Width" size="14" start="28" type="uint" modifier="minus(1)" default="1"/>
<field name="Height" size="14" start="42" type="uint" modifier="minus(1)" default="1"/>
<field name="First level" size="4" start="56" type="uint"/>
<field name="Last level" size="4" start="60" type="uint"/>
<field name="Samples" size="1" start="64" type="Sample Count"/>
<field name="Address" size="36" start="66" type="hex" modifier="shr(4)"/>
<!-- 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"/>
<field name="Compressed 1" size="1" start="103" type="bool"/>
<!-- This is set when no texture is bound, with layout 1 -->
<field name="Null" size="1" start="105" type="bool"/>
<field name="Compression" size="2" start="106" type="hex"/> <!-- 0 for uncompressed -->
<field name="sRGB" size="1" start="108" type="bool"/>
<field name="sRGB 2-channel" size="1" start="109" type="bool"/>
<field name="Stride" size="18" start="110" type="hex" modifier="shr(4)"/>
<!-- Note that 3D/arrays cannot be linear. -->
<field name="Depth" size="14" start="110" type="uint" modifier="minus(1)" default="1"/>
<field name="Page-aligned layers" size="1" start="126" type="bool"/>
<!-- Read the next word (set for compression or linear 2D arrays) -->
<field name="Extended" size="1" start="127" type="bool"/>
<!-- If layout is compressed -->
<field name="Acceleration buffer" size="64" start="128" type="address" modifier="shr(4)"/>
<!-- If layout is linear, stride has the minus 1 encoded -->
<field name="Depth (linear)" size="11" start="128" type="uint" modifier="minus(1)" default="1"/>
<field name="Layer stride (linear)" size="27" start="139" type="uint" modifier="shr(7)"/>
<!-- Buffer texture size -->
<field name="Software-defined" size="64" start="128" type="hex"/>
</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"/>
<value name="Clamp (GL)" value="4"/>
<value name="Mirrored clamp to edge" value="5"/>
</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"/>
<value name="Custom" value="3"/>
</enum>
<enum name="Filter">
<value name="Nearest" value="0"/>
<value name="Linear" value="1"/>
<value name="Bicubic" value="2"/>
</enum>
<struct name="Sampler" size="8">
<field name="Minimum LOD" size="10" start="0" type="lod" default="0.0"/>
<field name="Maximum LOD" size="10" start="10" type="lod" default="INFINITY"/>
<field name="Maximum anisotropy" size="3" start="20" type="uint" default="1" modifier="log2"/>
<field name="Magnify" size="2" start="23" type="Filter"/>
<field name="Minify" size="2" start="25" type="Filter"/>
<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="Compare enable" size="1" start="42" type="bool"/>
<field name="Border colour" size="2" start="55" type="Border colour"/>
<field name="Seamful cube maps" size="1" start="57" type="bool"/>
</struct>
<struct name="Border" size="16">
<field name="Channel 0" size="32" start="0:0" type="hex"/>
<field name="Channel 1" size="32" start="1:0" type="hex"/>
<field name="Channel 2" size="32" start="2:0" type="hex"/>
<field name="Channel 3" size="32" start="3:0" type="hex"/>
</struct>
<!--- Pointed to from the command buffer -->
<struct name="Scissor" size="16">
<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"/>
<field name="Min Z" size="32" start="2:0" type="float"/>
<field name="Max Z" size="32" start="3:0" type="float"/>
</struct>
<!-- Note: this structure is not padded. It really is 12 bytes -->
<struct name="Depth bias" size="12">
<field name="Depth bias" size="32" start="0:0" type="float"/>
<field name="Slope scale" size="32" start="1:0" type="float"/>
<field name="Clamp" size="32" start="2:0" type="float"/>
</struct>
<enum name="Sampler states">
<value name="0" value="0"/>
<value name="4 compact" value="1"/>
<value name="8 compact" value="2"/>
<value name="12 compact" value="3"/>
<value name="16 compact" value="4"/>
<value name="8 extended" value="6"/>
<value name="16 extended" value="7"/>
</enum>
<struct name="Counts" size="4">
<field name="Unknown 0" size="1" start="0" type="hex" default="0"/>
<field name="Uniforms" size="3" start="1" type="uint" modifier="groups(64)"/>
<field name="Texture states" size="5" start="4" type="uint" modifier="groups(8)"/>
<field name="Sampler states" size="3" start="9" type="Sampler states"/>
<field name="Preshader GPRs" size="4" start="12" type="uint" modifier="groups(16)"/>
<!-- Only for fragment shaders -->
<field name="Unknown" size="16" start="16" type="hex"/>
</struct>
<!-- PPP state starts -->
<struct name="PPP Header" size="4">
<field name="Fragment control" size="1" start="0" type="bool"/>
<field name="Fragment control 2" size="1" start="1" type="bool"/>
<field name="Fragment front face" size="1" start="2" type="bool"/>
<field name="Fragment front face 2" size="1" start="3" type="bool"/>
<field name="Fragment front stencil" size="1" start="4" type="bool"/>
<field name="Fragment back face" size="1" start="5" type="bool"/>
<field name="Fragment back face 2" size="1" start="6" type="bool"/>
<field name="Fragment back stencil" size="1" start="7" type="bool"/>
<field name="Depth bias/scissor" size="1" start="8" type="bool"/>
<field name="Region clip" size="1" start="10" type="bool"/>
<field name="Viewport" size="1" start="11" type="bool"/>
<field name="Viewport count" size="4" start="12" type="uint" default="1" modifier="minus(1)"/>
<field name="W clamp" size="1" start="16" type="bool"/>
<field name="Output select" size="1" start="17" type="bool"/>
<field name="Varying counts 32" size="1" start="18" type="bool"/>
<field name="Varying counts 16" size="1" start="19" type="bool"/>
<field name="Cull" size="1" start="21" type="bool"/>
<field name="Cull 2" size="1" start="22" type="bool"/>
<field name="Fragment shader" size="1" start="23" type="bool"/>
<field name="Occlusion query" size="1" start="24" type="bool"/>
<field name="Occlusion query 2" size="1" start="25" type="bool"/>
<field name="Output unknown" size="1" start="26" type="bool"/>
<field name="Output size" size="1" start="27" type="bool"/>
<field name="Varying word 2" size="1" start="28" type="bool"/>
</struct>
<!-- Acts like a scissor at 32x32 tile boundaries, ignored unless clip tile is set -->
<struct name="Region clip" size="8">
<field name="Max X" size="9" start="0" type="uint" modifier="minus(1)"/>
<field name="Min X" size="9" start="16" type="uint"/>
<field name="Enable" size="1" start="31" type="bool"/>
<field name="Max Y" size="9" start="32" type="uint" modifier="minus(1)"/>
<field name="Min Y" size="9" start="48" type="uint"/>
</struct>
<struct name="Viewport control" size="4">
<!-- so far only seen zeroes, but it stands to reason this is meant as a
control word for the viewports -->
</struct>
<!-- Used to convert clip space coordinates to NDC, does not clip -->
<struct name="Viewport" size="24">
<field name="Translate X" size="32" start="0:0" type="float"/>
<field name="Scale X" size="32" start="1:0" type="float"/>
<field name="Translate Y" size="32" start="2:0" type="float"/>
<field name="Scale Y" size="32" start="3:0" type="float"/>
<field name="Translate Z" size="32" start="4:0" type="float"/>
<field name="Scale Z" size="32" start="5:0" type="float"/>
</struct>
<struct name="Fragment face" size="4">
<field name="Stencil reference" size="8" start="0" type="hex"/>
<!-- line width is 4:4 fixed point with off-by-one applied -->
<field name="Line width" size="8" start="8" type="hex"/>
<field name="Polygon mode" size="2" start="18" type="Polygon Mode"/>
<field name="Disable depth write" size="1" start="21" type="bool"/>
<field name="Unk - visibility test internal" size="2" start="22" type="hex"/>
<field name="Depth function" size="3" start="24" type="ZS Func"/>
</struct>
<enum name="Conservative depth">
<value name="Any" value="0"/>
<value name="Greater" value="1"/>
<value name="Less" value="2"/>
<value name="Unchanged" value="3"/>
</enum>
<struct name="Fragment face 2" size="4">
<!-- If either disable is zeroed, depth is written -->
<field name="Disable depth write" size="1" start="21" type="bool" default="true"/>
<!-- If depth written from FS -->
<field name="Conservative depth" size="2" start="22" type="Conservative depth" default="Unchanged"/>
<!-- Both depth functions must pass -->
<field name="Depth function" size="3" start="24" type="ZS Func" default="Always"/>
<field name="Object type" size="4" start="28" type="Object Type"/>
</struct>
<struct name="Fragment stencil" size="4">
<field name="Write mask" size="8" start="0" type="hex"/>
<field name="Read mask" size="8" start="8" type="hex"/>
<field name="Depth pass" size="3" start="16" type="Stencil Op"/>
<field name="Depth fail" size="3" start="19" type="Stencil Op"/>
<field name="Stencil fail" size="3" start="22" type="Stencil Op"/>
<field name="Compare" size="3" start="25" type="ZS Func"/>
</struct>
<enum name="Pass type">
<value name="Opaque" value="0"/>
<value name="Translucent" value="1"/>
<value name="Punch through" value="2"/>
<value name="Translucent punch through" value="3"/>
<!-- See PASSTYPE in rogue_ppp.xml if more values are observed on AGX...
Translucent punch through seems notably different though? -->
</enum>
<struct name="Fragment control" size="4">
<field name="Unk 1" size="1" start="9" type="bool" default="true"/>
<field name="Visibility mode" size="2" start="14" type="Visibility Mode"/>
<field name="Scissor enable" size="1" start="16" type="bool"/>
<field name="Depth bias enable" size="1" start="17" type="bool"/>
<field name="Stencil test enable" size="1" start="18" type="bool"/>
<field name="Two-sided stencil" size="1" start="19" type="bool"/>
<field name="Tag write disable" size="1" start="21" type="bool"/>
<field name="Sample mask after depth/stencil" size="1" start="25" type="bool"/>
<field name="Disable tri merging" size="1" start="26" type="bool"/>
<field name="Pass type" size="3" start="29" type="Pass type"/>
</struct>
<struct name="Fragment occlusion query" size="4">
<!-- 64-bit index into occlusion result buffer -->
<field name="Index" size="15" start="17" type="uint"/>
</struct>
<struct name="Fragment occlusion query 2" size="4">
<field name="Unknown" size="17" start="0" type="hex"/>
</struct>
<struct name="W Clamp" size="4">
<field name="W Clamp" size="32" start="0" type="float"/>
</struct>
<enum name="PPP Vertex">
<value name="0" value="1"/>
<value name="1" value="2"/>
<value name="2" value="3"/>
</enum>
<struct name="Cull" size="4">
<field name="Cull front" size="1" start="0" type="bool"/>
<field name="Cull back" size="1" start="1" type="bool"/>
<field name="Flat shading vertex" size="2" start="7" type="PPP Vertex"/>
<field name="Depth clip" size="1" start="10" type="bool"/>
<field name="Depth clamp" size="1" start="11" type="bool"/>
<field name="Front face CCW" size="1" start="16" type="bool"/>
<field name="Rasterizer discard" size="1" start="17" type="bool"/>
</struct>
<struct name="Cull 2" size="4">
<field name="Unknown 2" size="8" start="0" type="hex" default="0xa0"/>
<field name="Draw clipped edges" size="1" start="9" type="bool"/>
<field name="Needs Primitive ID" size="1" start="12" type="bool"/>
<field name="Primitive MSAA" size="1" start="15" type="bool"/>
<field name="Rasterizer discard" size="1" start="17" type="bool"/>
</struct>
<struct name="Varying Counts" size="4">
<field name="Smooth" size="8" start="0" type="uint"/>
<field name="Flat" size="8" start="8" type="uint"/>
<field name="Linear" size="8" start="16" type="uint"/>
</struct>
<struct name="Varying 2" size="8">
<!-- TODO -->
</struct>
<struct name="Output Select" size="4">
<field name="Clip distance plane 0" size="1" start="0" type="bool"/>
<field name="Clip distance plane 1" size="1" start="1" type="bool"/>
<field name="Clip distance plane 2" size="1" start="2" type="bool"/>
<field name="Clip distance plane 3" size="1" start="3" type="bool"/>
<field name="Clip distance plane 4" size="1" start="4" type="bool"/>
<field name="Clip distance plane 5" size="1" start="5" type="bool"/>
<field name="Clip distance plane 6" size="1" start="6" type="bool"/>
<field name="Clip distance plane 7" size="1" start="7" type="bool"/>
<field name="Clip distance plane 8" size="1" start="8" type="bool"/>
<field name="Clip distance plane 9" size="1" start="9" type="bool"/>
<field name="Clip distance plane 10" size="1" start="10" type="bool"/>
<field name="Clip distance plane 11" size="1" start="11" type="bool"/>
<field name="Clip distance plane 12" size="1" start="12" type="bool"/>
<field name="Clip distance plane 13" size="1" start="13" type="bool"/>
<field name="Clip distance plane 14" size="1" start="14" type="bool"/>
<field name="Clip distance plane 15" size="1" start="15" type="bool"/>
<field name="Varyings" size="1" start="16" type="bool"/>
<field name="Point size" size="1" start="18" type="bool"/>
<!-- For layered rendering, enable both and write the 2x16-bit tuple from
the vertex shader (layer, (viewport << u) + (u & layer)). So far unclear
what u is supposed to be. If u=0, this simplifies to the expected (layer,
viewport) at least. -->
<field name="Viewport target" size="1" start="19" type="bool"/>
<field name="Render target" size="1" start="20" type="bool"/>
<field name="Frag coord Z" size="1" start="21" type="bool"/>
<field name="Barycentric coordinates" size="1" start="22" type="bool"/>
</struct>
<struct name="Output Unknown" size="4">
<!-- So far always zero -->
</struct>
<struct name="Output Size" size="4">
<field name="Count" size="32" start="0" type="uint"/>
</struct>
<!-- Indexes into the scissor and depth bias arrays -->
<struct name="Depth bias/Scissor" size="4">
<field name="Scissor" size="16" start="0" type="uint"/>
<field name="Depth bias" size="16" start="16" type="uint"/>
</struct>
<struct name="Fragment shader" size="16">
<field name="Unknown 0" size="1" start="0" type="hex" default="0"/>
<field name="Uniform register count" size="3" start="1" type="uint" modifier="groups(64)"/>
<field name="Texture state register count" size="5" start="4" type="uint" modifier="groups(8)"/>
<field name="Sampler state register count" size="3" start="9" type="Sampler states"/>
<field name="Preshader register count" size="4" start="12" type="uint" modifier="groups(16)"/>
<field name="CF binding count" size="7" start="16" type="uint"/>
<field name="Unknown 1:0" size="2" start="1:0" type="hex"/>
<field name="Pipeline" size="26" start="1:6" type="address" modifier="shr(6)"/>
<field name="CF bindings" size="30" start="2:2" type="address" modifier="shr(2)"/>
<!-- Seems to be set to small values depending on textures? and pushed
uniforms? Needs investigation -->
<field name="Unknown 3:0" start="3:0" size="4" type="hex"/>
</struct>
<!-- PPP state ends -->
<!-- USC state starts -->
<enum name="USC Control">
<value name="Preshader" value="0x38"/>
<value name="Fragment properties" value="0x58"/>
<value name="No preshader" value="0x88"/>
<value name="Shader" value="0x0d"/>
<value name="Uniform" value="0x1d"/>
<value name="Uniform high" value="0x3d"/>
<value name="Shared" value="0x4d"/>
<value name="Registers" value="0x8d"/>
<value name="Sampler" value="0x9d"/>
<value name="Texture" value="0xdd"/>
</enum>
<struct name="USC Uniform" size="8">
<field name="Tag" size="8" start="0:0" type="USC Control" default="Uniform"/>
<field name="Start (halfs)" size="8" start="0:8" type="uint"/>
<field name="Size (halfs)" size="6" start="0:20" type="uint" modifier="groups(1)"/>
<field name="Buffer" size="38" start="0:26" type="address" modifier="shr(2)"/>
</struct>
<struct name="USC Uniform High" size="8">
<field name="Tag" size="8" start="0:0" type="USC Control" default="Uniform High"/>
<field name="Start (halfs)" size="8" start="0:8" type="uint"/>
<field name="Size (halfs)" size="6" start="0:20" type="uint" modifier="groups(1)"/>
<field name="Buffer" size="38" start="0:26" type="address" modifier="shr(2)"/>
</struct>
<struct name="USC Texture" size="8">
<field name="Tag" size="8" start="0:0" type="USC Control" default="Texture"/>
<field name="Start" size="8" start="0:8" type="uint"/>
<!-- Exact split is unknown. Count is at least 5 bits. Less than 8 bits. -->
<field name="Count" size="7" start="0:20" type="uint"/>
<field name="Buffer" size="36" start="0:27" type="address" modifier="shr(3)"/>
</struct>
<struct name="USC Sampler" size="8">
<field name="Tag" size="8" start="0:0" type="USC Control" default="Sampler"/>
<field name="Start" size="8" start="0:8" type="uint"/>
<field name="Count" size="7" start="0:20" type="uint"/>
<!-- Exact split is unknown. -->
<field name="Buffer" size="36" start="0:27" type="address" modifier="shr(3)"/>
</struct>
<enum name="Shared layout">
<value name="Vertex/compute" value="0x24"/>
<value name="32x32" value="0x2f"/>
<value name="32x16" value="0x3f"/>
<value name="16x16" value="0x36"/>
</enum>
<struct name="USC Shared" size="4">
<field name="Tag" size="8" start="0" type="USC Control" default="Shared"/>
<field name="Uses shared memory" size="1" start="8" type="bool"/>
<field name="Layout" size="6" start="10" type="Shared layout"/>
<field name="Sample count" size="2" start="16" type="uint" default="1" modifier="log2"/>
<field name="Sample stride in 8 bytes" size="4" start="20" type="uint"/>
<field name="Bytes per threadgroup" size="8" start="24" type="uint" modifier="groups(256)"/>
</struct>
<struct name="USC Shader" size="6">
<field name="Tag" size="8" start="0" type="USC Control" default="Shader"/>
<field name="Loads varyings" size="1" start="8" type="bool"/>
<!-- Seen set for pixel rate fragment shaders? -->
<field name="Unk 1" size="1" start="9" type="bool" default="0"/>
<field name="Unk 2" size="6" start="10" type="uint" default="3"/>
<field name="Code" size="32" start="16" type="address"/>
</struct>
<struct name="USC Registers" size="4">
<field name="Tag" size="8" start="0" type="USC Control" default="Registers"/>
<field name="Register count" size="5" start="8" type="uint" modifier="groups(8)"/>
<field name="Unk 1" size="1" start="13" type="bool" default="false"/>
<field name="Spill size" size="4" start="18" type="hex" default="0"/>
<field name="Unk 4" size="8" start="24" type="hex" default="0x1"/>
</struct>
<struct name="USC No Preshader" size="2">
<field name="Tag" size="8" start="0" type="USC Control" default="No preshader"/>
</struct>
<struct name="USC Preshader" size="8">
<field name="Tag" size="8" start="0" type="USC Control" default="Preshader"/>
<field name="Unk" size="24" start="8" type="hex" default="0xc08000"/>
<field name="Code" size="32" start="32" type="address"/>
</struct>
<struct name="USC Fragment Properties" size="4">
<field name="Tag" size="8" start="0" type="USC Control" default="Fragment properties"/>
<!-- Guess. Set if the shader does not write the sample mask (including by
discard_fragment) -->
<field name="Early-z testing" size="1" start="8" type="bool"/>
<field name="Unk 2" size="1" start="9" type="bool" default="true"/>
<field name="Unconditional discard 1" size="1" start="10" type="bool"/>
<field name="Unconditional discard 2" size="1" start="11" type="bool"/>
<field name="Unk 3" size="4" start="12" type="hex" default="0xf"/>
<field name="Unk 4" size="8" start="16" type="hex" default="0"/> <!-- TODO: determine relation, see docs/table.py -->
<field name="Unk 5" size="8" start="24" type="hex" default="0x01"/>
</struct>
<!-- USC commands end -->
<!-- VDM commands start. VDM commands are padded out to 8b alignment. -->
<enum name="VDM Block Type">
<value name="PPP State Update" value="0"/>
<value name="Barrier" value="1"/>
<value name="VDM State Update" value="2"/>
<value name="Index List" value="3"/>
<value name="Stream Link" value="4"/>
<value name="Tessellate" value="5"/>
<value name="Stream terminate" value="6"/>
</enum>
<struct name="PPP State" size="8">
<field name="Pointer (hi)" size="8" start="0" type="hex"/>
<field name="Size (words)" size="8" start="8" type="uint"/>
<field name="Block Type" size="3" start="29" type="VDM Block Type" default="PPP State Update"/>
<field name="Pointer (lo)" size="32" start="32" type="address"/>
</struct>
<struct name="VDM Barrier">
<field name="USC cache inval" size="1" start="3" type="bool" default="false"/>
<field name="Unk 4" size="1" start="4" type="bool" default="false"/>
<field name="Unk 5" size="1" start="5" type="bool" default="false"/>
<field name="Unk 6" size="1" start="6" type="bool" default="false"/>
<field name="Unk 8" size="1" start="8" type="bool" default="false"/>
<field name="Unk 11" size="1" start="11" type="bool" default="false"/>
<field name="Unk 20" size="1" start="20" type="bool" default="false"/>
<field name="Unk 24" size="1" start="24" type="bool" default="false"/>
<field name="Unk 26" size="1" start="26" type="bool" default="false"/>
<field name="Returns" size="1" start="27" type="bool" default="false"/>
<field name="Block Type" size="3" start="29" type="VDM Block Type" default="Barrier"/>
</struct>
<enum name="Index size">
<value name="U8" value="0"/>
<value name="U16" value="1"/>
<value name="U32" value="2"/>
</enum>
<struct name="VDM State" size="4">
<field name="Restart index present" size="1" start="0" type="bool"/>
<field name="Vertex shader word 0 present" size="1" start="1" type="bool"/>
<field name="Vertex shader word 1 present" size="1" start="2" type="bool"/>
<field name="Vertex outputs present" size="1" start="3" type="bool"/>
<field name="Tessellation present" size="1" start="4" type="bool"/>
<field name="Vertex unknown present" size="1" start="5" type="bool"/>
<field name="Tessellation scale present" size="1" start="7" type="bool"/>
<field name="Block Type" size="3" start="29" type="VDM Block Type" default="VDM State Update"/>
</struct>
<struct name="VDM State Restart Index" size="4">
<field name="Value" size="32" start="0" type="hex"/>
</struct>
<struct name="VDM State Vertex Shader Word 0" size="4">
<field name="Unknown 0" size="1" start="0" type="hex" default="0"/>
<field name="Uniform register count" size="3" start="1" type="uint" modifier="groups(64)"/>
<field name="Texture state register count" size="5" start="4" type="uint" modifier="groups(8)"/>
<field name="Sampler state register count" size="3" start="9" type="Sampler states"/>
<field name="Preshader register count" size="4" start="12" type="uint" modifier="groups(16)"/>
</struct>
<struct name="VDM State Vertex Shader Word 1" size="4">
<field name="Unknown 1:0" size="2" start="0" type="hex"/>
<field name="Pipeline" size="26" start="6" type="address" modifier="shr(6)"/>
</struct>
<struct name="VDM State Vertex Outputs" size="4">
<field name="Output count 1" size="8" start="0" type="uint" default="0"/>
<field name="Output count 2" size="8" start="8" type="uint" default="0"/>
</struct>
<enum name="VDM Vertex">
<value name="0" value="0"/>
<value name="1" value="1"/>
<value name="2" value="2"/>
</enum>
<enum name="Partition mode">
<value name="Pow 2" value="0"/>
<value name="Integer" value="1"/>
<value name="Fractional odd" value="2"/>
<value name="Fractional even" value="3"/>
</enum>
<enum name="Step function">
<value name="Constant" value="0"/>
<value name="Per patch" value="1"/>
<value name="Per instance" value="2"/>
<value name="Per patch and per instance" value="3"/>
</enum>
<enum name="Patch type">
<value name="Triangles" value="0"/>
<value name="Quads" value="1"/>
</enum>
<enum name="Factor type">
<value name="FP16" value="0"/>
<value name="FP32" value="1"/>
</enum>
<struct name="VDM State Tessellation" size="4">
<field name="Unknown" size="17" start="0" type="hex"/> <!-- 0 -->
<field name="Step function" size="2" start="17" type="Step function"/>
<!-- Not yet hardware tested, firm guess from stuffing values -->
<field name="Factor type" size="1" start="19" type="Factor type"/>
<!-- XXX: Possibly unknown 3 is part of the patch type, with points &
isolines also supported? would be a natural encoding. Needs testing to see
if implemeneted in hw. -->
<field name="Patch type" size="1" start="20" type="Patch type"/>
<field name="Unknown 3" size="2" start="21" type="hex"/> <!-- 1 -->
<!-- Subtract 1 for fractional odd -->
<field name="Max tess factor" size="6" start="23" type="uint" modifier="minus(1)"/>
<field name="Counterclockwise winding" size="1" start="29" type="bool"/>
<field name="Partition mode" size="2" start="30" type="Partition mode"/>
</struct>
<struct name="VDM State Tessellation Scale" size="4">
<!-- Always applied. Set to 1.0 to "disable" -->
<field name="Scale" size="16" start="0" type="half"/>
</struct>
<struct name="VDM State Vertex Unknown" size="4">
<field name="Flat shading control" start="0" size="2" type="VDM Vertex"/>
<field name="Unknown 4" size="1" start="4" type="bool"/>
<field name="Unknown 5" size="1" start="5" type="bool"/>
<field name="Generate primitive ID" size="1" start="6" type="bool"/>
</struct>
<!--- Command to issue a direct non-indexed draw -->
<struct name="Index List" size="4">
<field name="Index buffer hi" size="8" start="0" type="hex"/>
<field name="Primitive" size="8" start="8" type="Primitive"/>
<!-- Metal sets this bit for strips, probably wrong though -->
<field name="Restart enable" size="1" start="16" type="bool"/>
<field name="Index size" size="3" start="17" type="Index size"/>
<field name="Index buffer size present" size="1" start="20" type="bool"/>
<field name="Index buffer present" size="1" start="21" type="bool"/>
<!-- Order in the cmdstream is the same as bit order for these -->
<field name="Index count present" size="1" start="22" type="bool"/>
<field name="Instance count present" size="1" start="23" type="bool"/>
<field name="Start present" size="1" start="24" type="bool"/>
<!-- 2 words, 1st word is some kind of extra vertex offset? -->
<field name="Unk 1 present" size="1" start="25" type="bool"/>
<field name="Indirect buffer present" size="1" start="26" type="bool"/>
<!-- 1 word, unknown purpose -->
<field name="Unk 2 present" size="1" start="27" type="bool"/>
<field name="Block Type" size="3" start="29" type="VDM Block Type" default="Index List"/>
</struct>
<struct name="Index List: Buffer lo" size="4">
<!-- Index buffer lsb -->
<field name="Buffer lo" size="32" start="0" type="hex"/>
</struct>
<struct name="Index List: Count" size="4">
<!-- Vertex count for non-indexed, index count for index count -->
<field name="Count" size="32" start="0" type="uint"/>
</struct>
<struct name="Index List: Instances" size="4">
<field name="Count" size="32" start="0" type="uint"/> <!-- must be nonzero -->
</struct>
<struct name="Index List: Start" size="4">
<!-- Base vertex for indexed draws -->
<field name="Start" size="32" start="0" type="uint"/>
</struct>
<struct name="Index List: Buffer size" size="4">
<field name="Size" size="32" start="0" type="uint" modifier="shr(2)"/>
</struct>
<struct name="Index List: Indirect buffer" size="8">
<field name="Address hi" size="8" start="0" type="hex"/>
<field name="Address lo" size="32" start="32" type="hex"/>
</struct>
<!-- Conditional branching and function calls may be supported, see the
STREAM_LINK0 struct in mesa/src/imagination/csbgen/rogue_vdm.xml for a
probable definition -->
<struct name="VDM Stream Link" size="8">
<field name="Target hi" size="8" start="0" type="hex"/>
<field name="With return" size="1" start="28" type="bool"/>
<field name="Block Type" size="3" start="29" type="VDM Block Type" default="Stream Link"/>
<field name="Target lo" size="32" start="32" type="hex"/>
</struct>
<struct name="VDM Tessellate" size="4">
<field name="Factor buffer hi" size="8" start="0" type="hex"/>
<field name="Unknown 0" size="12" start="8" type="hex"/> <!-- 0xc -->
<!-- Set for both indirect and direct -->
<field name="Unknown 2" size="1" start="20" type="bool"/>
<!-- Present for both indirect and direct -->
<!-- XXX: Order is an (educated) guess -->
<field name="Factor buffer present" size="1" start="21" type="bool"/>
<!-- XXX: out of bits???? not set for indirect??? -->
<field name="Patch count present" size="1" start="22" type="bool"/>
<!-- These four are omitted for indirect draws -->
<!-- XXX: Order is an (educated) guess -->
<field name="Instance count present" size="1" start="22" type="bool"/>
<field name="Base patch present" size="1" start="23" type="bool"/>
<field name="Base instance present" size="1" start="25" type="bool"/>
<!-- XXX: Out of bits!!! -->
<field name="Instance stride present" size="1" start="25" type="bool"/>
<field name="Indirect present" size="1" start="26" type="bool"/>
<!-- Present for both indirect and direct -->
<field name="Unknown present" size="1" start="28" type="bool"/>
<field name="Unknown 1" size="1" start="28" type="hex"/> <!-- 1 -->
<field name="Block Type" size="3" start="29" type="VDM Block Type" default="Tessellate"/>
</struct>
<struct name="VDM Tessellate: Factor buffer" size="4">
<field name="Factor buffer lo" size="32" start="0" type="hex"/>
</struct>
<struct name="VDM Tessellate: Patch count" size="4">
<field name="Patch count" size="32" start="0" type="uint"/>
</struct>
<struct name="VDM Tessellate: Instance count" size="4">
<field name="Instance count" size="32" start="0" type="uint"/>
</struct>
<struct name="VDM Tessellate: Base patch" size="4">
<field name="Base patch" size="32" start="0" type="uint"/>
</struct>
<struct name="VDM Tessellate: Base instance" size="4">
<field name="Base instance" size="32" start="0" type="uint"/>
</struct>
<struct name="VDM Tessellate: Instance stride" size="4">
<!-- Divided by 4 for QUADS -->
<field name="Instance stride" size="32" start="0" type="uint"/>
</struct>
<struct name="VDM Tessellate: Indirect" size="12">
<!-- Address of the indirect buffer, format presumably matches Metal -->
<field name="Address hi" size="8" start="0:0" type="hex"/>
<field name="Address lo" size="32" start="1:0" type="hex"/>
<!-- # of bytes in the buffer, presumably for hw bounds checking -->
<field name="Size" size="32" start="2:0" type="uint"/>
</struct>
<struct name="VDM Tessellate: Unknown" size="4">
<field name="Unknown 7" size="32" start="0" type="hex"/> <!-- 3F -->
</struct>
<struct name="VDM Stream Terminate" size="32">
<field name="Block Type" size="3" start="29" type="VDM Block Type" default="Stream Terminate"/>
</struct>
<!-- VDM commands end -->
<!-- CDM commands start -->
<enum name="CDM Block Type">
<value name="Launch" value="0"/>
<value name="Stream Link" value="1"/>
<value name="Stream Terminate" value="2"/>
<value name="Barrier" value="3"/>
</enum>
<enum name="CDM Mode">
<!-- Global size + Local size -->
<value name="Direct" value="0"/>
<!-- Indirect buffer + Local size. Indirect buffer contains 3x 32-bit global
size. Used for indirect dispatch when the local size must be
fixed (e.g. due to local memory being used) -->
<value name="Indirect global" value="1"/>
<!-- Indirect buffer, containing 6x 32-bit size. Used for indirect dispatch
when the driver wants to optimize the local size with an auxiliary
compute kernel (requiring e.g. no local memory use) -->
<value name="Indirect local" value="2"/>
</enum>
<struct name="CDM Launch" size="8">
<field name="Uniform register count" size="3" start="1" type="uint" modifier="groups(64)"/>
<field name="Texture state register count" size="5" start="4" type="uint" modifier="groups(8)"/>
<field name="Sampler state register count" size="3" start="9" type="Sampler states"/>
<field name="Preshader register count" size="4" start="12" type="uint" modifier="groups(16)"/>
<field name="Mode" size="2" start="27" type="CDM Mode"/>
<field name="Block Type" size="3" start="29" type="CDM Block Type" default="Launch"/>
<field name="Pipeline" size="26" start="1:6" type="address" modifier="shr(6)"/>
</struct>
<struct name="CDM Unk G14X" size="8">
<field name="Unknown 30" size="1" start="1:30" type="bool" default="true"/>
</struct>
<struct name="CDM Indirect" size="8">
<field name="Address hi" size="8" start="0" type="hex"/>
<field name="Address lo" size="30" start="34" type="hex" modifier="shr(2)"/>
</struct>
<struct name="CDM Global size" size="12">
<field name="X" size="32" start="0:0" type="uint"/>
<field name="Y" size="32" start="1:0" type="uint"/>
<field name="Z" size="32" start="2:0" type="uint"/>
</struct>
<struct name="CDM Local size" size="12">
<field name="X" size="32" start="0:0" type="uint"/>
<field name="Y" size="32" start="1:0" type="uint"/>
<field name="Z" size="32" start="2:0" type="uint"/>
</struct>
<struct name="CDM Barrier" size="4">
<field name="Unk 0" size="1" start="0" type="bool" default="false"/>
<field name="Unk 1" size="1" start="1" type="bool" default="false"/>
<field name="Unk 2" size="1" start="2" type="bool" default="false"/>
<field name="USC cache inval" size="1" start="3" type="bool" default="false"/>
<field name="Unk 4" size="1" start="4" type="bool" default="false"/>
<field name="Unk 5" size="1" start="5" type="bool" default="false"/>
<field name="Unk 6" size="1" start="6" type="bool" default="false"/>
<field name="Unk 7" size="1" start="7" type="bool" default="false"/>
<field name="Unk 8" size="1" start="8" type="bool" default="false"/>
<field name="Unk 9" size="1" start="9" type="bool" default="false"/>
<field name="Unk 10" size="1" start="10" type="bool" default="false"/>
<field name="Unk 11" size="1" start="11" type="bool" default="false"/>
<field name="Unk 12" size="1" start="12" type="bool" default="false"/>
<field name="Unk 13" size="1" start="13" type="bool" default="false"/>
<field name="Unk 14" size="1" start="14" type="bool" default="false"/>
<field name="Unk 15" size="1" start="15" type="bool" default="false"/>
<field name="Unk 16" size="1" start="16" type="bool" default="false"/>
<field name="Unk 17" size="1" start="17" type="bool" default="false"/>
<field name="Unk 18" size="1" start="18" type="bool" default="false"/>
<field name="Unk 19" size="1" start="19" type="bool" default="false"/>
<field name="Unk 20" size="1" start="20" type="bool" default="false"/>
<field name="Unk 24" size="1" start="24" type="bool" default="false"/>
<field name="Unk 26" size="1" start="26" type="bool" default="false"/>
<field name="Returns" size="1" start="27" type="bool" default="false"/>
<field name="Block Type" size="3" start="29" type="CDM Block Type" default="Barrier"/>
</struct>
<struct name="CDM Stream Link" size="8">
<field name="Target hi" size="8" start="0" type="hex"/>
<field name="Block Type" size="3" start="29" type="CDM Block Type" default="Stream Link"/>
<field name="Target lo" size="32" start="32" type="hex"/>
</struct>
<struct name="CDM Stream Terminate" size="8">
<field name="Block Type" size="3" start="29" type="CDM Block Type" default="Stream Terminate"/>
</struct>
<!-- CDM commands end -->
<!--- The rest of this file is likely software defined by macOS kernel -->
<enum name="IOGPU Attachment Type">
<value name="Colour" value="0xE"/>
<value name="Depth" value="0x10"/>
<value name="Stencil" value="0x11"/>
<value name="Visibility" value="0x12"/>
</enum>
<struct name="IOGPU Attachment" size="24">
<field name="Unk 0" start="0:0" size="16" default="0x100" type="hex"/>
<field name="Address" start="0:16" size="48" type="address"/>
<field name="Type" start="2:16" size="16" type="IOGPU Attachment Type"/>
<field name="Size" start="3:9" size="32" type="uint"/>
<field name="Unk 3" start="4:16" size="4" type="hex" default="0xC"/>
<!-- Percent of total attachment space used for this attachment, expressed
in a decimal percentage [0, 100] <field name="Percent" start="5:16" -->
<field name="Percent" start="5:16" size="16" type="uint"/>
</struct>
<enum name="ZLS Format">
<value name="32F" value="0"/>
<value name="16" value="2"/>
</enum>
<struct name="ZLS Control" size="8">
<field name="Unknown 0" start="0" size="1" type="bool"/>
<field name="Unknown 1" start="1" size="1" type="bool"/>
<field name="Z Compress 1" start="2" size="1" type="bool"/>
<field name="Unknown 3" start="3" size="1" type="bool"/>
<field name="S Compress 1" start="4" size="1" type="bool"/>
<field name="Unknown 5" start="5" size="1" type="bool"/>
<field name="Z Compress 2" start="6" size="1" type="bool"/>
<field name="Unknown 7" start="7" size="1" type="bool"/>
<field name="S Compress 2" start="8" size="1" type="bool"/>
<field name="S Load Enable" start="14" size="1" type="bool"/>
<field name="Z Load Enable" start="15" size="1" type="bool"/>
<field name="S Store Enable" start="18" size="1" type="bool"/>
<field name="Z Store Enable" start="19" size="1" type="bool"/>
<field name="Z Format" start="25" size="2" type="ZLS Format"/>
<field name="Z Resolve" start="56" size="1" type="bool"/>
<field name="S Resolve" start="58" size="1" type="bool"/>
</struct>
<struct name="IOGPU Header" size="64">
<field name="Unk 0" start="0:0" size="32" default="0x10000" type="hex"/>
<field name="Total size" start="1:0" size="32" type="uint"/>
<!-- 0x7 in 11.x -->
<field name="Unk 2" start="2:0" size="32" default="0x4" type="hex"/>
<field name="Attachment length" start="9:0" size="32" type="uint"/>
<field name="Attachment offset" start="10:0" size="32" type="uint"/>
<field name="Unknown offset" start="11:0" size="32" type="uint"/>
<field name="Unk 4" start="12:0" size="32" default="0x30" type="hex"/>
<field name="Unk 5" start="13:0" size="32" default="0x01" type="hex"/>
<field name="Encoder" start="14:0" size="64" type="address"/>
</struct>
<struct name="Spill Buffer Histogram" size="60">
<field name="Bin 0" start="0:0" size="4" type="uint"/>
<field name="Bin 1" start="1:0" size="4" type="uint"/>
<field name="Bin 2" start="2:0" size="4" type="uint"/>
<field name="Bin 3" start="3:0" size="4" type="uint"/>
<field name="Bin 4" start="4:0" size="4" type="uint"/>
<field name="Bin 5" start="5:0" size="4" type="uint"/>
<field name="Bin 6" start="6:0" size="4" type="uint"/>
<field name="Bin 7" start="7:0" size="4" type="uint"/>
<field name="Bin 8" start="8:0" size="4" type="uint"/>
<field name="Bin 9" start="9:0" size="4" type="uint"/>
<field name="Bin 10" start="10:0" size="4" type="uint"/>
<field name="Bin 11" start="11:0" size="4" type="uint"/>
<field name="Bin 12" start="12:0" size="4" type="uint"/>
<field name="Bin 13" start="13:0" size="4" type="uint"/>
<field name="Bin 14" start="14:0" size="4" type="uint"/>
</struct>
<struct name="IOGPU Compute" size="384">
<field name="Deflake 1" start="20:0" size="64" type="address"/>
<field name="Terminate of encoder" start="22:0" size="64" type="address"/>
<field name="Deflake 2" start="26:0" size="64" type="address"/>
<field name="Deflake 3" start="28:0" size="64" type="address"/>
<field name="Deflake 4" start="30:0" size="64" type="address"/>
<field name="Deflake 5" start="32:0" size="64" type="address"/>
<field name="Unk 34" start="34:0" size="32" default="1" type="hex"/>
<field name="Unk address" start="36:0" size="64" type="address"/>
<field name="Unk 40" start="40:0" size="32" default="0x1c" type="hex"/>
<field name="Encoder ID" start="41:0" size="32" type="hex"/>
<field name="Unk 44" start="44:0" size="32" default="0xffffffff" type="hex"/>
<field name="Context switch program" start="48:0" size="32" type="address"/>
<!-- An enum that's purely macOS defined UAPI. Doesn't matter for us.
More info at https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21062#note_1754715 -->
<field name="Context switch block size" start="56:0" size="4" default="2" type="hex"/>
<field name="Spilling unk 1" start="57:3" size="1" type="bool"/>
<!-- Depends on grid size, as well as other factors. TODO: Decode. -->
<field name="Number of context switch buffers" start="58:0" size="32" default="1" type="uint"/>
<field name="Spill Buffer Histogram" start="60:0" size="480" type="Spill Buffer Histogram"/>
<!-- Lina's guess at the meaning -->
<field name="Enable context switching" start="75:16" size="1" default="true" type="bool"/>
<field name="Unk 94" start="94:0" size="32" default="0xffffffff" type="hex"/>
<field name="Unk 95" start="95:0" size="32" default="0xffffffff" type="hex"/>
</struct>
<struct name="IOGPU Graphics" size="1920">
<!-- if either deflake address is null, rendering gets flaky for high
geometry counts -->
<field name="Deflake 1" start="22:0" size="64" type="address"/>
<field name="Deflake 2" start="24:0" size="64" type="address"/>
<field name="Unk 54" start="38:0" size="32" default="0x6b0003" type="hex"/>
<field name="Unk 55" start="39:0" size="32" default="0x3a0012" type="hex"/>
<field name="Unk 56" start="40:0" size="32" default="0x1" type="hex"/>
<field name="Deflake 3" start="94:0" size="64" type="address"/>
<field name="Unk 112" start="96:0" size="32" default="0x1" type="hex"/>
<field name="Unk 114" start="98:0" size="32" default="0x1c" type="hex"/>
<field name="Memoryless render targets used" start="100:0" size="1" type="bool"/>
<field name="OpenGL depth clipping" start="100:24" size="1" type="bool"/>
<field name="Unk 118" start="102:0" size="32" default="0xffffffff" type="hex"/>
<field name="Unk 119" start="103:0" size="32" default="0xffffffff" type="hex"/>
<field name="Unk 120" start="104:0" size="32" default="0xffffffff" type="hex"/>
<field name="Clear pipeline bind" start="146:0" size="32" type="hex"/>
<field name="Clear pipeline unk" start="148:0" size="4" default="4" type="hex"/>
<field name="Clear pipeline" start="148:4" size="28" type="address" modifier="shr(4)"/>
<field name="Store pipeline bind" start="154:0" size="32" type="hex"/>
<field name="Store pipeline unk" start="156:0" size="4" default="4" type="hex"/>
<field name="Store pipeline" start="156:4" size="28" type="address" modifier="shr(4)"/>
<field name="Scissor array" start="158:0" size="64" type="address"/>
<field name="Depth bias array" start="160:0" size="64" type="address"/>
<field name="ZLS control" start="164:0" size="32" type="ZLS Control"/>
<field name="Depth width" start="170:0" size="15" type="uint" default="1" modifier="minus(1)"/>
<field name="Depth height" start="170:15" size="15" type="uint" default="1" modifier="minus(1)"/>
<field name="Depth buffer 1" start="172:7" size="33" type="address" modifier="shr(7)"/>
<!-- Normally 0, 0x38001 with layered -->
<field name="Depth unknown 1" start="176:0" size="32" type="hex"/>
<field name="Depth acceleration buffer 1" start="178:7" size="33" type="address" modifier="shr(7)"/>
<field name="Depth buffer 2" start="182:7" size="33" type="address" modifier="shr(7)"/>
<field name="Depth acceleration buffer 2" start="188:7" size="33" type="address" modifier="shr(7)"/>
<!-- Normally 0, 0x38001 with layered -->
<field name="Depth unknown 2" start="186:0" size="32" type="hex"/>
<field name="Stencil buffer 1" start="192:7" size="33" type="address" modifier="shr(7)"/>
<!-- Normally 0, 0x10001 with layered -->
<field name="Stencil unknown 1" start="196:0" size="32" type="hex"/>
<field name="Stencil acceleration buffer 1" start="198:7" size="33" type="address" modifier="shr(7)"/>
<field name="Stencil buffer 2" start="202:7" size="33" type="address" modifier="shr(7)"/>
<!-- Normally 0, 0x10001 with layered -->
<field name="Stencil unknown 2" start="206:0" size="32" type="hex"/>
<field name="Stencil acceleration buffer 2" start="208:7" size="33" type="address" modifier="shr(7)"/>
<!-- Proportional to tile width * tile height * sample count -->
<field name="Unk 212" start="212:0" size="32" default="0x4" type="hex"/>
<field name="Unk 214" start="214:0" size="16" default="0xc000" type="hex"/>
<field name="Z16 Unorm attachment 1" start="214:18" size="1" type="bool"/>
<field name="Width 1" start="216:0" size="32" type="uint"/>
<field name="Height 1" start="217:0" size="32" type="uint"/>
<field name="Pointer" start="218:0" size="64" type="address"/>
<!-- 0x40 with frag spilling -->
<field name="Spilling unk 1" start="226:0" size="32" type="hex"/>
<field name="Spill Buffer Histogram" start="238:0" size="480" type="Spill Buffer Histogram"/>
<!-- Encoded like the depth attachment -->
<field name="Depth clear value" start="276:0" size="32" type="hex"/>
<field name="Stencil clear value" start="277:0" size="8" type="uint"/>
<field name="Unk 277" start="277:8" size="8" type="hex" default="3"/>
<field name="Set when reloading Z or S 1" start="279:8" size="1" type="bool"/>
<field name="Set when frag shader spills" start="279:24" size="1" type="bool"/>
<field name="Set when reloading Z or S 2" start="280:24" size="1" type="bool"/>
<field name="Z16 Unorm attachment 2" start="281:8" size="1" type="bool"/>
<field name="Unk 282" start="282:0" size="32" type="hex" default="0xffffffff"/>
<field name="Unk 283" start="283:0" size="32" type="hex" default="0xffffffff"/>
<field name="Unk 284" start="284:0" size="32" type="hex" default="0xffffffff"/>
<field name="Visibility result buffer" start="286:0" size="64" type="address"/>
<field name="Partial reload pipeline bind" start="296:0" size="32" type="hex"/>
<field name="Partial reload pipeline unk" start="298:0" size="4" default="4" type="hex"/>
<field name="Partial reload pipeline" start="298:4" size="28" type="address" modifier="shr(4)"/>
<field name="Partial store pipeline bind" start="304:0" size="32" type="hex"/>
<field name="Partial store pipeline unk" start="306:0" size="4" default="4" type="hex"/>
<field name="Partial store pipeline" start="306:4" size="28" type="address" modifier="shr(4)"/>
<!-- New in 12.x -->
<field name="Depth buffer 3" start="340:0" size="64" type="address"/>
<field name="Depth acceleration buffer 3" start="342:0" size="64" type="address"/>
<field name="Stencil buffer 3" start="344:0" size="64" type="address"/>
<field name="Stencil acceleration buffer 3" start="346:0" size="64" type="address"/>
<!-- maybe only set when doing a depth clear? -->
<!-- 0x1000000 bit set with memoryless render targets? -->
<field name="Unk 352" start="352:0" size="32" default="0x1" type="hex"/>
<field name="Unk 360" start="360:0" size="32" default="0x1c" type="hex"/>
<field name="Encoder ID" start="362:0" size="32" type="hex"/>
<!-- top bit maybe only set with a depth clear? -->
<field name="Unk 365" start="365:0" size="64" default="0x1ffffffff" type="hex"/>
<field name="Unknown buffer" start="370:0" size="64" type="address"/>
<field name="Width 2" start="382:0" size="32" type="uint"/>
<field name="Height 2" start="383:0" size="32" type="uint"/>
<field name="Sample count" start="384:0" size="32" default="1" type="uint"/>
<!-- Divided by 16 and rounded -->
<field name="Sample 0 X" start="385:0" size="5" default="8" type="uint"/>
<field name="Sample 0 Y" start="386:0" size="5" default="8" type="uint"/>
<field name="Sample 1 X" start="387:0" size="5" default="0" type="uint"/>
<field name="Sample 1 Y" start="388:0" size="5" default="0" type="uint"/>
<field name="Sample 2 X" start="389:0" size="5" default="0" type="uint"/>
<field name="Sample 2 Y" start="390:0" size="5" default="0" type="uint"/>
<field name="Sample 3 X" start="391:0" size="5" default="0" type="uint"/>
<field name="Sample 3 Y" start="392:0" size="5" default="0" type="uint"/>
<!-- if tile size 32x32: max(tib allocation, 8) rounded to POT
if tile size 32x16: that, halved
-->
<field name="Unk 49:0" start="401:0" size="32" default="8" type="uint"/>
<field name="Tile width" start="402:0" size="32" default="32" type="uint"/>
<field name="Tile height" start="403:0" size="32" default="32" type="uint"/>
<!-- Number of framebuffer layers when rendering to a layered framebuffer (1
otherwise). This affects tiling calculations. It also affects how many
times the background program and end-of-tile programs are executed. The
layer index is available in sr2. -->
<field name="Framebuffer layers" start="404:0" size="32" default="1" type="uint"/>
<field name="Unk 56:0" start="408:0" size="32" default="0" type="uint"/>
<field name="Unk 70:0" start="410:0" size="32" default="1" type="uint"/>
</struct>
<struct name="IOGPU Attachment Count" size="16">
<field name="Count" start="3:0" size="32" type="uint"/>
</struct>
</genxml>