panfrost: Add XML for Valhall data structures
authorAlyssa Rosenzweig <alyssa@collabora.com>
Mon, 15 Nov 2021 23:53:57 +0000 (18:53 -0500)
committerMarge Bot <emma+marge@anholt.net>
Mon, 6 Dec 2021 20:46:09 +0000 (20:46 +0000)
Fork the latest canonical XML (Bifrost v7) and adapt to the data
structures found in the earliest Valhall GPU I could get my hands on
(Valhall v9). This should minimize the churn needed for the port by
keeping the Valhall model close to the Bifrost we already supported.

It is not known what happened to v8. It appears to have been yeeted from
existence.

Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14063>

src/panfrost/lib/genxml/v9.xml [new file with mode: 0644]

diff --git a/src/panfrost/lib/genxml/v9.xml b/src/panfrost/lib/genxml/v9.xml
new file mode 100644 (file)
index 0000000..bf307a0
--- /dev/null
@@ -0,0 +1,1285 @@
+<panxml arch="9">
+  <enum name="Instancing">
+    <value name="Per-instance" value="1"/>
+    <value name="POT Divisor" value="2"/>
+    <value name="NPOT Divisor" value="3"/>
+    <value name="Per-vertex" value="17"/>
+  </enum>
+
+  <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="0" value="4"/>
+    <value name="1" value="5"/>
+  </enum>
+
+  <enum name="Depth Source">
+    <!-- TODO: check if min/max supported -->
+    <value name="None" value="0"/>
+    <value name="Fixed function" value="2"/>
+    <value name="Shader" value="3"/>
+  </enum>
+
+  <enum name="Job Type">
+    <value name="Not started" value="0"/>
+    <value name="Null" value="1"/>
+    <value name="Write value" value="2"/>
+    <value name="Cache flush" value="3"/>
+    <value name="Compute" value="4"/>
+    <!--- Traditional vertex jobs removed in Valhall, use compute job -->
+    <value name="Geometry" value="6"/>
+    <value name="Tiler" value="7"/>
+    <value name="Fused" value="8"/>
+    <value name="Fragment" value="9"/>
+    <value name="Indexed vertex" value="10"/>
+    <value name="IDVS helper" value="11"/> 
+  </enum>
+
+  <enum name="Shader stage">
+    <value name="Compute" value="1"/>
+    <value name="Fragment" value="2"/>
+    <value name="Vertex" value="3"/>
+  </enum>
+
+  <enum name="Descriptor Type">
+    <value name="Sampler" value="1"/>
+    <value name="Texture" value="2"/>
+    <value name="Attribute" value="5"/>
+    <value name="Depth/stencil" value="7"/>
+    <value name="Shader" value="8"/>
+    <value name="Buffer" value="9"/>
+    <value name="Surface" value="10"/>
+  </enum>
+
+  <enum name="Draw Mode">
+    <value name="None" value="0"/>
+    <value name="Points" value="1"/>
+    <value name="Lines" value="2"/>
+    <value name="Line strip" value="4"/>
+    <value name="Line loop" value="6"/>
+    <value name="Triangles" value="8"/>
+    <value name="Triangle strip" value="10"/>
+    <value name="Triangle fan" value="12"/>
+    <value name="Polygon" value="13"/>
+    <value name="Quads" value="14"/>
+  </enum>
+
+  <enum name="Exception Access">
+    <value name="None" value="0"/>
+    <value name="Execute" value="2"/>
+    <value name="Read" value="1"/>
+    <value name="Write" value="3"/>
+  </enum>
+
+  <enum name="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="Format">
+    <value name="ETC2 RGB8" value="1"/>
+    <value name="ETC2 R11 UNORM" value="2"/>
+    <value name="ETC2 RGBA8" value="3"/>
+    <value name="ETC2 RG11 UNORM" value="4"/>
+    <value name="R4A4 UNORM" value="5"/>
+    <value name="A4R4 UNORM" value="6"/>
+    <value name="BC1 UNORM" value="7"/>
+    <value name="BC2 UNORM" value="8"/>
+    <value name="BC3 UNORM" value="9"/>
+    <value name="BC4 UNORM" value="10"/>
+    <value name="BC4 SNORM" value="11"/>
+    <value name="BC5 UNORM" value="12"/>
+    <value name="BC5 SNORM" value="13"/>
+    <value name="BC6H UF16" value="14"/>
+    <value name="BC6H SF16" value="15"/>
+    <value name="BC7 UNORM" value="16"/>
+    <value name="ETC2 R11 SNORM" value="17"/>
+    <value name="ETC2 RG11 SNORM" value="18"/>
+    <value name="ETC2 RGB8A1" value="19"/>
+    <value name="ASTC 3D LDR" value="20"/>
+    <value name="ASTC 3D HDR" value="21"/>
+    <value name="ASTC 2D LDR" value="22"/>
+    <value name="ASTC 2D HDR" value="23"/>
+    <value name="R8A8 UNORM" value="24"/>
+    <value name="A8R8 UNORM" value="25"/>
+    <value name="A8 UNORM" value="26"/>
+    <!--- 27 reserved -->
+    <value name="RAW10" value="28"/>
+    <value name="RAW12" value="29"/>
+    <value name="R8G8B8G8" value="30"/>
+    <value name="G8R8G8B8" value="31"/>
+    <value name="YUV8" value="32"/>
+    <value name="YUVA8" value="33"/>
+    <value name="YUYV8" value="34"/>
+    <value name="VYUY8" value="35"/>
+    <value name="Y8 UV8 422" value="36"/>
+    <value name="Y8 U8 V8 422" value="37"/>
+    <value name="Y8 UV8 420" value="38"/>
+    <value name="Y8 U8 V8 420" value="39"/>
+    <value name="YUV10 A2" value="40"/>
+    <value name="A2 YUV10" value="41"/>
+    <value name="YUYAAYVYAA" value="42"/>
+    <!--- 43 reserved -->
+    <value name="YUYV10" value="44"/>
+    <value name="VYUY10" value="45"/>
+    <value name="Y10 UV10 422" value="46"/>
+    <value name="Y10 UV10 420" value="47"/>
+    <value name="YUV16" value="48"/>
+    <value name="YUVA16" value="49"/>
+    <value name="YUYV16" value="50"/>
+    <value name="VYUY16" value="51"/>
+    <value name="Y10X6 U10X6V10X6 422" value="52"/>
+    <value name="Y16 UV16 422" value="53"/>
+    <value name="Y10X6 U10X6V10X6 420" value="54"/>
+    <value name="Y16 UV16 420" value="55"/>
+    <value name="Y8 UV8 BL 422" value="56"/>
+    <value name="Y8 UV8 BL 420" value="57"/>
+    <value name="CUSTOM YUV 2" value="58"/>
+    <value name="CUSTOM YUV 3" value="59"/>
+    <value name="CUSTOM YUV 4" value="60"/>
+    <value name="CUSTOM YUV 5" value="61"/>
+    <value name="ASTC 2D NARROW" value="62"/>
+    <value name="ASTC 3D NARROW" value="63"/>
+    <value name="RGB565" value="64"/>
+    <value name="RGB5 A1 UNORM" value="65"/>
+    <value name="A1 BGR5 UNORM" value="66"/>
+    <value name="RGB10 A2 UNORM" value="67"/>
+    <value name="A2 BGR10 UNORM" value="68"/>
+    <value name="RGB10 A2 SNORM" value="69"/>
+    <value name="A2 BGR10 SNORM" value="70"/>
+    <value name="RGB10 A2UI" value="71"/>
+    <value name="A2 BGR10UI" value="72"/>
+    <value name="RGB10 A2I" value="73"/>
+    <value name="A2 BGR10I" value="74"/>
+    <value name="Z16 UNORM" value="75"/>
+    <value name="Z32" value="76"/>
+    <value name="Z24X8 UNORM" value="77"/>
+    <value name="X8Z24" value="78"/>
+    <value name="X32 S8X24" value="79"/>
+    <value name="X24S8 X32" value="80"/>
+    <value name="R32 FIXED" value="81"/>
+    <value name="RG32 FIXED" value="82"/>
+    <value name="RGB32 FIXED" value="83"/>
+    <value name="RGBA32 FIXED" value="84"/>
+    <value name="X24S8" value="85"/>
+    <value name="S8X24" value="86"/>
+    <value name="Z32 X32" value="87"/>
+    <value name="X32 Z32" value="88"/>
+    <value name="R11F G11F B10F" value="89"/>
+    <value name="B10F G11F R11F" value="90"/>
+    <value name="R9F G9F B9F E5F" value="91"/>
+    <value name="E5F B9F G9F R9F" value="92"/>
+    <value name="S8" value="93"/>
+    <!--- RGBA32F + snap to 2^-8, used for vertex writes -->
+    <value name="Snap 4" value="94"/>
+    <value name="Constant" value="95"/>
+    <!--- 96-98 reserved -->
+    <value name="R8 SNORM" value="99"/>
+    <value name="R16 SNORM" value="100"/>
+    <value name="R32 SNORM" value="101"/>
+    <!--- 102-105 reserved -->
+    <value name="RG4 SNORM" value="106"/>
+    <value name="RG8 SNORM" value="107"/>
+    <value name="RG16 SNORM" value="108"/>
+    <value name="RG32 SNORM" value="109"/>
+    <!-- 110-114 reserved -->
+    <value name="RGB8 SNORM" value="115"/>
+    <value name="RGB16 SNORM" value="116"/>
+    <value name="RGB32 SNORM" value="117"/>
+    <!-- 118-120 reserved -->
+    <value name="RGBA2 SNORM" value="121"/>
+    <value name="RGBA4 SNORM" value="122"/>
+    <value name="RGBA8 SNORM" value="123"/>
+    <value name="RGBA16 SNORM" value="124"/>
+    <value name="RGBA32 SNORM" value="125"/>
+    <!-- 126-130 reserved -->
+    <value name="R8UI" value="131"/>
+    <value name="R16UI" value="132"/>
+    <value name="R32UI" value="133"/>
+    <!-- 134-137 reserved -->
+    <value name="RG4UI" value="138"/>
+    <value name="RG8UI" value="139"/>
+    <value name="RG16UI" value="140"/>
+    <value name="RG32UI" value="141"/>
+    <!-- 142-146 reserved -->
+    <value name="RGB8UI" value="147"/>
+    <value name="RGB16UI" value="148"/>
+    <value name="RGB32UI" value="149"/>
+    <!-- 150-152 reserved -->
+    <value name="RGBA2UI" value="153"/>
+    <value name="RGBA4UI" value="154"/>
+    <value name="RGBA8UI" value="155"/>
+    <value name="RGBA16UI" value="156"/>
+    <value name="RGBA32UI" value="157"/>
+    <!-- 158-162 reserved -->
+    <value name="R8 UNORM" value="163"/>
+    <value name="R16 UNORM" value="164"/>
+    <value name="R32 UNORM" value="165"/>
+    <!-- 166 reserved -->
+    <value name="R32F" value="167"/>
+    <!-- 168-169 reserved -->
+    <value name="RG4 UNORM" value="170"/>
+    <value name="RG8 UNORM" value="171"/>
+    <value name="RG16 UNORM" value="172"/>
+    <value name="RG32 UNORM" value="173"/>
+    <!-- 174 reserved -->
+    <value name="RG32F" value="175"/>
+    <!-- 176-178 reserved -->
+    <value name="RGB8 UNORM" value="179"/>
+    <value name="RGB16 UNORM" value="180"/>
+    <value name="RGB32 UNORM" value="181"/>
+    <!-- 182 reserved -->
+    <value name="RGB32F" value="183"/>
+    <!-- 184 reserved -->
+    <value name="RGBA2 UNORM" value="185"/>
+    <value name="RGBA4 UNORM" value="186"/>
+    <value name="RGBA8 UNORM" value="187"/>
+    <value name="RGBA16 UNORM" value="188"/>
+    <value name="RGBA32 UNORM" value="189"/>
+    <!-- 190 reserved -->
+    <value name="RGBA32F" value="191"/>
+    <!-- 192-194 reserved -->
+    <value name="R8I" value="195"/>
+    <value name="R16I" value="196"/>
+    <value name="R32I" value="197"/>
+    <!-- 198 reserved -->
+    <value name="R16F" value="199"/>
+    <!-- 200-201 reserved -->
+    <value name="RG4I" value="202"/>
+    <value name="RG8I" value="203"/>
+    <value name="RG16I" value="204"/>
+    <value name="RG32I" value="205"/>
+    <!-- 206 reserved -->
+    <value name="RG16F" value="207"/>
+    <!-- 208-210 reserved -->
+    <value name="RGB8I" value="211"/>
+    <value name="RGB16I" value="212"/>
+    <value name="RGB32I" value="213"/>
+    <!-- 214 reserved -->
+    <value name="RGB16F" value="215"/>
+    <!-- 216 reserved -->
+    <value name="RGBA2I" value="217"/>
+    <value name="RGBA4I" value="218"/>
+    <value name="RGBA8I" value="219"/>
+    <value name="RGBA16I" value="220"/>
+    <value name="RGBA32I" value="221"/>
+    <!-- 222 reserved -->
+    <value name="RGBA16F" value="223"/>
+    <value name="RGB5 A1 AU" value="224"/>
+    <value name="RGB5 A1 PU" value="225"/>
+    <value name="R5G6B5 AU" value="226"/>
+    <value name="R5G6B5 PU" value="227"/>
+    <!-- 228-229 reserved -->
+    <value name="Snap4 V" value="230"/>
+    <value name="R32F RTZ" value="231"/>
+    <value name="RGBA4 AU" value="232"/>
+    <value name="RGBA4 PU" value="233"/>
+    <!-- 234-236 reserved -->
+    <value name="RGBA8 TB" value="237"/>
+    <value name="RGB10 A2 TB" value="238"/>
+    <value name="RG32F RTZ" value="239"/>
+    <value name="Tess Vertex Pack" value="240"/>
+    <value name="RGB8 A2 AU" value="241"/>
+    <value name="RGB8 A2 PU" value="242"/>
+    <!-- 243-246 reserved -->
+    <value name="RGB32F RTZ" value="247"/>
+    <!-- 248-254 reserved -->
+    <value name="RGBA32F RTZ" value="255"/>
+  </enum>
+
+  <enum name="RGB Component Order">
+    <value name="RGBA" value="0"/>
+    <value name="GRBA" value="2"/>
+    <value name="BGRA" value="4"/>
+    <value name="ARGB" value="8"/>
+    <value name="AGRB" value="10"/>
+    <value name="ABGR" value="12"/>
+    <value name="RGB1" value="16"/>
+    <value name="GRB1" value="18"/>
+    <value name="BGR1" value="20"/>
+    <value name="1RGB" value="24"/>
+    <value name="1GRB" value="26"/>
+    <value name="1BGR" value="28"/>
+    <value name="RRRR" value="226"/>
+    <value name="RRR1" value="227"/>
+    <value name="RRRA" value="228"/>
+    <value name="000A" value="229"/>
+    <value name="0001" value="230"/>
+    <value name="0000" value="231"/>
+    <value name="Snap4 v9" value="232"/>
+    <value name="Snap4 v10" value="233"/>
+    <value name="Snap4 v11" value="234"/>
+    <value name="Snap4 v12" value="235"/>
+    <value name="Snap4 v13" value="236"/>
+    <value name="Snap4 v14" value="237"/>
+    <value name="Snap4 v15" value="238"/>
+    <value name="Snap4 v16" value="239"/>
+    <!-- Internal only, do not use -->
+    <value name="R000" value="240"/>
+    <value name="RBGA" value="242"/>
+  </enum>
+
+  <enum name="YUV Swizzle">
+    <value name="YUVA" value="0"/>
+    <value name="YVUA" value="1"/>
+    <value name="UYVA" value="2"/>
+    <value name="UVYA" value="3"/>
+    <value name="VUYA" value="4"/>
+    <value name="VYUA" value="5"/>
+    <value name="Y00A" value="6"/>
+    <value name="YXXA" value="7"/>
+  </enum>
+
+  <enum name="YUV Conversion Mode">
+    <value name="No Conversion" value="0"/>
+    <value name="BT 601" value="3"/>
+    <value name="BT 709" value="4"/>
+    <value name="BT 2020" value="6"/>
+  </enum>
+
+  <enum name="YUV Cr Siting">
+    <value name="Co-Sited" value="0"/>
+    <value name="Center Y" value="1"/>
+    <value name="Center X" value="2"/>
+    <value name="Center" value="3"/>
+    <value name="One Quarter" value="4"/>
+    <value name="Three Quarters" value="5"/>
+    <value name="Replicated" value="7"/>
+  </enum>
+
+  <enum name="ASTC 2D Dimension">
+    <value name="4" value="0"/>
+    <value name="5" value="1"/>
+    <value name="6" value="2"/>
+    <value name="8" value="4"/>
+    <value name="10" value="6"/>
+    <value name="12" value="7"/>
+  </enum>
+
+  <enum name="ASTC 3D Dimension">
+    <value name="4" value="0"/>
+    <value name="5" value="1"/>
+    <value name="6" value="2"/>
+    <value name="3" value="3"/>
+  </enum>
+
+  <enum name="Pixel Kill">
+    <value name="Force Early" value="0"/>
+    <value name="Strong Early" value="1"/>
+    <value name="Weak Early" value="2"/>
+    <value name="Force Late" value="3"/>
+  </enum>
+
+  <enum name="Block Format">
+    <value name="No Write" value="0"/>
+    <!--- 16x16 block u-interleaved -->
+    <value name="Tiled U-Interleaved" value="1"/>
+    <value name="Linear" value="2"/>
+    <value name="AFBC" value="12"/>
+    <value name="AFBC Tiled" value="13"/>
+  </enum>
+
+  <enum name="Mipmap Mode">
+    <value name="Nearest" value="0"/>
+    <value name="None" value="1"/>
+    <value name="Trilinear" value="3"/>
+  </enum>
+
+  <enum name="LOD Algorithm">
+    <value name="Isotropic" value="0"/>
+      <!--- 1, 2 reserved -->
+    <value name="Anisotropic" value="3"/>
+  </enum>
+
+  <enum name="MSAA">
+    <value name="Single" value="0"/>
+    <!-- N samples, 1 surface, resolved -->
+    <value name="Average" value="1"/>
+    <!-- N samples, 1 surface, unresolved -->
+    <value name="Multiple" value="2"/>
+    <!-- N samples, N surfaces -->
+    <value name="Layered" value="3"/>
+  </enum>
+
+  <enum name="Index Type">
+    <value name="None" value="0"/>
+    <value name="UINT8" value="1"/>
+    <value name="UINT16" value="2"/>
+    <value name="UINT32" value="3"/>
+  </enum>
+
+  <enum name="Occlusion Mode">
+    <value name="Disabled" value="0"/>
+    <value name="Predicate" value="1"/>
+    <value name="Counter" value="3"/>
+  </enum>
+
+  <enum name="Stencil Op">
+    <value name="Keep" value="0"/>
+    <value name="Replace" value="1"/>
+    <value name="Zero" value="2"/>
+    <value name="Invert" value="3"/>
+    <value name="Incr Wrap" value="4"/>
+    <value name="Decr Wrap" value="5"/>
+    <value name="Incr Sat" value="6"/>
+    <value name="Decr Sat" value="7"/>
+  </enum>
+
+  <enum name="Texture Dimension">
+    <value name="Cube" value="0"/>
+    <value name="1D" value="1"/>
+    <value name="2D" value="2"/>
+    <value name="3D" value="3"/>
+  </enum>
+
+  <enum name="Texture Layout">
+    <value name="Linear" value="0"/>
+    <!-- TODO: confirm others -->
+    <!--- 16x16 block u-interleaved -->
+    <value name="Tiled" value="1"/>
+    <value name="AFBC" value="12"/>
+  </enum>
+
+  <enum name="AFBC Surface Flag">
+    <value name="YTR" value="1"/>
+    <value name="Split Block" value="2"/>
+    <value name="Wide Block" value="4"/>
+    <value name="Tiled Header" value="8"/>
+    <value name="Prefetch" value="16"/>
+    <value name="Check Payload Range" value="32"/>
+  </enum>
+
+  <enum name="Wrap Mode">
+    <value name="Repeat" value="8"/>
+    <value name="Clamp to Edge" value="9"/>
+    <value name="Clamp to Border" value="11"/>
+    <value name="Mirrored Repeat" value="12"/>
+    <value name="Mirrored Clamp to Edge" value="13"/>
+    <value name="Mirrored Clamp to Border" value="15"/>
+  </enum>
+
+  <struct name="Attribute" size="8" align="32">
+    <field name="Type" size="4" start="0:0" type="Descriptor Type" default="Attribute"/>
+    <field name="Instancing" size="6" start="0:4" type="Instancing"/>
+    <!-- <field name="Offset enable" size="1" start="9" type="bool" default="true"/> -->
+    <field name="Format" size="22" start="0:10" type="Pixel Format"/>
+    <field name="Table" size="4" start="1:0" type="uint"/>
+    <!-- no instancing, modulo: 0x0
+         instancing, divisor : 0x4
+    -->
+    <field name="Unk 2" size="24" start="1:4" type="hex"/>
+    <field name="Divisor R" size="5" start="1:24" type="uint"/>
+    <field name="Divisor E" size="1" start="1:29" type="bool"/>
+    <field name="Offset" size="32" start="2:0" type="int"/>
+    <field name="Buffer index" size="32" start="3:0" type="uint"/> 
+    <field name="Stride" size="32" start="4:0" type="uint"/>
+    <field name="Divisor D" size="32" start="5:0" type="uint"/>
+    <field name="Unk 6" size="64" start="6:0" type="hex"/>
+  </struct>
+
+  <struct name="Buffer" size="8" align="32">
+    <field name="Type" size="4" start="0:0" type="Descriptor Type" default="Buffer"/>
+    <field name="Unk 1" size="28" start="0:4" type="hex"/>
+    <field name="Size" size="32" start="1:0" type="uint"/>
+    <field name="Address" size="64" start="2:0" type="address"/>
+  </struct>
+
+  <enum name="Blend Operand A">
+    <value name="Zero" value="1"/>
+    <value name="Src" value="2"/>
+    <value name="Dest" value="3"/>
+  </enum>
+
+  <enum name="Blend Operand B">
+    <value name="Src Minus Dest" value="0"/>
+    <value name="Src Plus Dest" value="1"/>
+    <value name="Src" value="2"/>
+    <value name="Dest" value="3"/>
+  </enum>
+
+  <enum name="Blend Operand C">
+    <value name="Zero" value="1"/>
+    <value name="Src" value="2"/>
+    <value name="Dest" value="3"/>
+    <value name="Src x 2" value="4"/>
+    <value name="Src Alpha" value="5"/>
+    <value name="Dest Alpha" value="6"/>
+    <value name="Constant" value="7"/>
+  </enum>
+
+  <struct name="Blend Function" no-direct-packing="true">
+    <!-- Blend equation: A + (B * C) -->
+    <field name="A" size="2" start="0" type="Blend Operand A"/>
+    <field name="Negate A" size="1" start="3" type="bool"/>
+    <field name="B" size="2" start="4" type="Blend Operand B"/>
+    <field name="Negate B" size="1" start="7" type="bool"/>
+    <field name="C" size="3" start="8" type="Blend Operand C"/>
+    <field name="Invert C" size="1" start="11" type="bool"/>
+  </struct>
+
+  <struct name="Blend Equation" size="1">
+    <field name="RGB" size="12" start="0:0" type="Blend Function"/>
+    <field name="Alpha" size="12" start="0:12" type="Blend Function"/>
+    <field name="Color Mask" size="4" start="0:28" type="uint"/>
+  </struct>
+
+  <enum name="Register File Format">
+    <value name="F16" value="0"/>
+    <value name="F32" value="1"/>
+    <value name="I32" value="2"/>
+    <value name="U32" value="3"/>
+    <value name="I16" value="4"/>
+    <value name="U16" value="5"/>
+  </enum>
+
+  <enum name="Blend Mode">
+    <value name="Shader" value="0"/>
+    <value name="Opaque" value="1"/>
+    <value name="Fixed-Function" value="2"/>
+    <value name="Off" value="3"/>
+  </enum>
+
+  <struct name="Blend Shader" size="2">
+    <field name="Return Value" size="29" start="0:3" type="uint" modifier="shr(3)"/>
+    <field name="PC" size="28" start="1:4" type="uint" modifier="shr(4)"/>
+  </struct>
+
+  <struct name="Internal Conversion" size="1">
+    <field name="Memory Format" size="22" start="0" type="Pixel Format"/>
+    <field name="Raw" size="1" start="22" type="bool"/>
+    <field name="Register Format" size="3" start="24" type="Register File Format"/>
+  </struct>
+
+  <struct name="Blend Fixed-Function" size="2">
+    <field name="Num Comps" size="2" start="0:3" type="uint" modifier="minus(1)" default="1"/>
+    <field name="RT" size="4" start="0:16" type="uint">
+       <value name="MALI_BIFROST_BLEND_MAX_RT" value="8"/>
+    </field>
+    <field name="Conversion" size="32" start="1:0" type="Internal Conversion"/>
+  </struct>
+
+  <struct name="Internal Blend">
+    <field name="Mode" size="2" start="0:0" type="Blend Mode"/>
+    <field name="Shader" size="64" start="0:0" type="Blend Shader"/>
+    <field name="Fixed-Function" size="64" start="0:0" type="Blend Fixed-Function"/>
+  </struct>
+
+  <struct name="Blend" size="4" align="16">
+    <field name="Load Destination" size="1" start="0:0" type="bool" default="false"/>
+    <field name="Alpha To One" size="1" start="0:8" type="bool"/>
+    <field name="Enable" size="1" start="0:9" type="bool" default="true"/>
+    <field name="sRGB" size="1" start="0:10" type="bool" default="false"/>
+    <field name="Round to FB precision" size="1" start="0:11" type="bool" default="false"/>
+    <field name="Constant" size="16" start="0:16" type="uint"/>
+    <field name="Equation" size="32" start="1:0" type="Blend Equation"/>
+    <field name="Internal" size="64" start="2:0" type="Internal Blend"/>
+  </struct>
+
+  <enum name="Point Size Array Format">
+    <value name="None" value="0"/>
+    <value name="FP16" value="2"/>
+    <value name="FP32" value="3"/>
+  </enum>
+
+  <enum name="Primitive Restart">
+    <value name="None" value="0"/>
+    <value name="Implicit" value="2"/>
+    <value name="Explicit" value="3"/>
+  </enum>
+
+  <struct name="Primitive">
+    <field name="Draw mode" size="8" start="0:0" type="Draw Mode" default="None"/>
+    <field name="Index type" size="3" start="0:8" type="Index Type" default="None"/>
+    <field name="Point size array format" size="2" start="0:11" type="Point Size Array Format"/>
+    <field name="Primitive Index Enable" size="1" start="0:13" type="bool"/>
+    <field name="Primitive Index Writeback" size="1" start="0:14" type="bool"/>
+    <field name="First provoking vertex" size="1" start="0:15" type="bool" default="true"/>
+    <field name="Low Depth Cull" size="1" start="0:16" type="bool" default="true"/>
+    <field name="High Depth Cull" size="1" start="0:17" type="bool" default="true"/>
+    <field name="Secondary Shader" size="1" start="0:18" type="bool"/>
+    <field name="Primitive restart" size="2" start="0:19" type="Primitive Restart"/>
+    <field name="Job Task Split" size="6" start="0:26" type="uint"/>
+    <field name="Base vertex offset" size="32" start="1:0" type="uint"/>
+    <field name="Primitive Restart Index" size="32" start="2:0" type="uint"/>
+    <field name="Index count" size="32" start="3:0" type="uint"/>
+  </struct>
+
+  <struct name="Sampler" size="8" align="32">
+    <field name="Type" size="4" start="0:0" type="Descriptor Type" default="Sampler"/>
+    <field name="Wrap Mode R" size="4" start="0:8" type="Wrap Mode" default="Clamp to Edge"/>
+    <field name="Wrap Mode T" size="4" start="0:12" type="Wrap Mode" default="Clamp to Edge"/>
+    <field name="Wrap Mode S" size="4" start="0:16" type="Wrap Mode" default="Clamp to Edge"/>
+    <field name="Round to nearest even" size="1" start="0:21" type="bool" default="false"/>
+    <!--- Disable sRGB-to-linear conversion (assume linear) -->
+    <field name="sRGB override" size="1" start="0:22" type="bool" default="false"/>
+    <field name="Seamless Cube Map" size="1" start="0:23" type="bool" default="true"/>
+    <field name="Clamp integer coordinates" size="1" start="0:24" type="bool"/>
+    <field name="Normalized Coordinates" size="1" start="0:25" type="bool" default="true"/>
+    <field name="Clamp integer array indices" size="1" start="0:26" type="bool" default="true"/>
+    <field name="Minify nearest" size="1" start="0:27" type="bool" default="false"/>
+    <field name="Magnify nearest" size="1" start="0:28" type="bool" default="false"/>
+    <!--- Set for 0.5, clear for 0.0 -->
+    <field name="Magnify cutoff" size="1" start="0:29" type="bool" default="false"/>
+    <field name="Mipmap Mode" size="2" start="0:30" type="Mipmap Mode" default="Nearest"/>
+    <field name="Minimum LOD" size="13" start="1:0" type="uint" default="0"/>
+    <field name="Compare Function" size="3" start="1:13" type="Func" default="Never"/>
+    <field name="Maximum LOD" size="13" start="1:16" type="uint" default="0"/>
+    <field name="LOD bias" size="16" start="2:0" type="int" default="0"/>
+    <field name="Maximum anisotropy" size="5" start="2:16" type="uint" default="1" modifier="minus(1)"/>
+    <field name="LOD algorithm" size="2" start="2:24" type="LOD Algorithm" default="Isotropic"/>
+    <field name="Border Color R" size="32" start="4:0" type="uint/float" default="0.0"/>
+    <field name="Border Color G" size="32" start="5:0" type="uint/float" default="0.0"/>
+    <field name="Border Color B" size="32" start="6:0" type="uint/float" default="0.0"/>
+    <field name="Border Color A" size="32" start="7:0" type="uint/float" default="0.0"/>
+  </struct>
+
+  <!-- Size unknown. Need to check what happens with mipmapping, cubemapping, 3D... -->
+  <struct name="Surface with Stride" size="32" align="32">
+    <field name="Type" size="4" start="0:0" type="Descriptor Type" default="Surface"/>
+    <field name="Unk 1" size="28" start="0:4" type="hex" default="0x0200021"/> <!-- XXX: maybe counts -->
+    <field name="Surface stride" size="32" start="1:0" type="int"/>
+    <field name="Pointer" size="64" start="2:0" type="address"/>
+    <field name="Row stride" size="32" start="4:0" type="int"/>
+  </struct>
+
+  <struct name="Texture" size="8" align="32">
+    <field name="Type" size="4" start="0:0" type="Descriptor Type" default="Texture"/>
+    <field name="Dimension" size="2" start="0:4" type="Texture Dimension"/>
+    <field name="Sample corner position" size="1" start="0:8" type="bool" default="false"/>
+    <field name="Normalize coordinates" size="1" start="0:9" type="bool" default="false"/>
+    <field name="Format" size="22" start="0:10" type="Pixel Format"/>
+    <field name="Width" size="16" start="1:0" type="uint" modifier="minus(1)"/>
+    <field name="Height" size="16" start="1:16" type="uint" modifier="minus(1)"/>
+    <field name="Swizzle" size="12" start="2:0" type="uint"/>
+    <field name="Texel ordering" size="4" start="2:12" type="Texture Layout"/>
+    <field name="Levels" size="5" start="2:16" type="uint" default="1" modifier="minus(1)"/>
+    <field name="Minimum level" size="5" start="2:24" type="uint"/>
+    <field name="Minimum LOD" size="13" start="3:0" type="uint" default="0"/>
+    <field name="Sample count" size="3" start="3:13" type="uint" default="1" modifier="log2"/>
+    <field name="Maximum LOD" size="13" start="3:16" type="uint" default="0"/>
+    <field name="Surfaces" size="64" start="4:0" type="address"/>
+    <field name="Array size" size="16" start="6:0" type="uint" modifier="minus(1)" default="1"/>
+    <field name="Depth" size="16" start="7:0" type="uint" modifier="minus(1)" default="1"/>
+  </struct>
+
+  <enum name="Shader Register Allocation">
+    <value name="64 Per Thread" value="0"/>
+    <value name="32 Per Thread" value="2"/>
+  </enum>
+
+  <struct name="Compute Preload" size="1" no-direct-packing="true">
+    <field name="PC" size="1" start="6" type="bool"/> <!-- TODO: test -->
+    <field name="Local Invocation XY" size="1" start="7" type="bool"/>
+    <field name="Local Invocation Z" size="1" start="8" type="bool"/>
+    <field name="Work group X" size="1" start="9" type="bool"/>
+    <field name="Work group Y" size="1" start="10" type="bool"/>
+    <field name="Work group Z" size="1" start="11" type="bool"/>
+    <field name="Global Invocation X" size="1" start="12" type="bool"/>
+    <field name="Global Invocation Y" size="1" start="13" type="bool"/>
+    <field name="Global Invocation Z" size="1" start="14" type="bool"/>
+  </struct>
+
+  <enum name="Warp Limit">
+    <value name="None" value="0"/>
+    <value name="2" value="1"/>
+    <value name="4" value="2"/>
+    <value name="8" value="3"/>
+  </enum>
+
+  <struct name="Vertex Preload" size="1" no-direct-packing="true">
+    <field name="Warp limit" size="2" start="0" type="Warp Limit"/> <!-- TODO: test -->
+    <field name="PC" size="1" start="6" type="bool"/> <!-- TODO: test -->
+    <field name="Linear ID" size="1" start="11" type="bool"/>
+    <field name="Vertex ID" size="1" start="12" type="bool"/>
+    <field name="Instance ID" size="1" start="13" type="bool"/>
+  </struct>
+
+  <struct name="Fragment Preload" size="1" no-direct-packing="true">
+    <field name="PC" size="1" start="6" type="bool"/> <!-- TODO: test -->
+    <field name="Coverage mask type" size="1" start="7" type="bool"/> <!-- TODO: test -->
+    <field name="Primitive ID" size="1" start="9" type="bool"/> <!-- TODO: test -->
+    <field name="Primitive flags" size="1" start="10" type="bool"/>
+    <field name="Fragment position" size="1" start="11" type="bool"/>
+    <field name="Coverage" size="1" start="12" type="bool"/>
+    <field name="Sample mask/ID" size="1" start="13" type="bool"/>
+  </struct>
+
+  <struct name="Preload" size="1">
+    <field name="Compute" size="32" start="0" type="Compute Preload"/>
+    <field name="Vertex" size="32" start="0" type="Vertex Preload"/>
+    <field name="Fragment" size="32" start="0" type="Fragment Preload"/>
+  </struct>
+
+  <struct name="Shader Program" align="32">
+    <field name="Type" size="4" start="0:0" type="Descriptor Type" default="Shader"/>
+    <field name="Stage" size="4" start="0:4" type="Shader stage"/>
+    <field name="Primary shader" size="8" start="0:8" type="uint"/>
+    <!-- XXX DDK sets/clears these together, so I might have them backward -->
+    <field name="Suppress Inf" size="1" start="0:16" type="bool"/>
+    <field name="Suppress NaN" size="1" start="0:19" type="bool"/>
+    <field name="Shader contains barrier" size="1" start="0:28" type="bool"/>
+    <field name="Register allocation" size="2" start="0:30" type="Shader Register Allocation"/>
+    <field name="Preload" size="16" start="1:0" type="Preload"/>
+    <field name="Binary" size="64" start="2:0" type="address"/>
+  </struct>
+
+  <struct name="Scissor">
+    <field name="Scissor Minimum X" size="16" start="0:0" type="uint"/>
+    <field name="Scissor Minimum Y" size="16" start="0:16" type="uint"/>
+    <field name="Scissor Maximum X" size="16" start="1:0" type="uint"/>
+    <field name="Scissor Maximum Y" size="16" start="1:16" type="uint"/>
+  </struct>
+
+  <struct name="Local Storage" size="8" align="64">
+    <field name="TLS Size" size="5" start="0:0" type="uint"/>
+    <field name="TLS Initial Stack Pointer Offset" size="27" start="0:5" type="uint"/>
+    <field name="WLS Instances" size="5" start="1:0" type="uint" modifier="log2" prefix="MALI_LOCAL_STORAGE" default="MALI_LOCAL_STORAGE_NO_WORKGROUP_MEM">
+      <value name="No Workgroup Mem" value="0x80000000"/>
+    </field>
+    <field name="WLS Size Base" size="2" start="1:5" type="uint"/>
+    <field name="WLS Size Scale" size="5" start="1:8" type="uint"/>
+    <!-- Encoded as (0x10000000 << 32) | (real_base >> 8) due to TLS hashing -->
+    <field name="TLS Base Pointer" size="64" start="2:0" type="address"/>
+    <field name="WLS Base Pointer" size="64" start="4:0" type="address"/>
+  </struct>
+
+  <enum name="Color Buffer Internal Format">
+    <value name="Raw Value" value="0"/>
+    <value name="R8G8B8A8" value="1"/>
+    <value name="R10G10B10A2" value="2"/>
+    <value name="R8G8B8A2" value="3"/>
+    <value name="R4G4B4A4" value="4"/>
+    <value name="R5G6B5A0" value="5"/>
+    <value name="R5G5B5A1" value="6"/>
+    <value name="RAW8" value="32"/>
+    <value name="RAW16" value="33"/>
+    <value name="RAW32" value="34"/>
+    <value name="RAW64" value="35"/>
+    <value name="RAW128" value="36"/>
+  </enum>
+
+  <enum name="Color Format">
+    <value name="RAW8" value="0"/>
+    <value name="RAW16" value="1"/>
+    <value name="RAW24" value="2"/>
+    <value name="RAW32" value="3"/>
+    <value name="RAW48" value="4"/>
+    <value name="RAW64" value="5"/>
+    <value name="RAW96" value="6"/>
+    <value name="RAW128" value="7"/>
+    <value name="RAW192" value="8"/>
+    <value name="RAW256" value="9"/>
+    <value name="RAW384" value="10"/>
+    <value name="RAW512" value="11"/>
+    <value name="RAW768" value="12"/>
+    <value name="RAW1024" value="13"/>
+    <value name="RAW1536" value="14"/>
+    <value name="RAW2048" value="15"/>
+    <value name="R8" value="16"/>
+    <value name="R8G8" value="17"/>
+    <value name="R8G8B8" value="18"/>
+    <value name="R8G8B8A8" value="19"/>
+    <value name="R4G4B4A4" value="20"/>
+    <value name="R5G6B5" value="21"/>
+    <value name="R8G8B8_FROM_R8G8B8A2" value="22"/>
+    <value name="R10G10B10A2" value="24"/>
+    <value name="A2B10G10R10" value="25"/>
+    <value name="R5G5B5A1" value="28"/>
+    <value name="A1B5G5R5" value="29"/>
+    <value name="NATIVE" value="31"/>
+  </enum>
+
+  <enum name="Downsampling Accumulation Mode">
+    <value name="Unsigned normalized integer" value="0"/>
+    <value name="Signed normalized integer" value="1"/>
+  </enum>
+
+  <enum name="Sample Layout">
+    <value name="Ordered 4x Grid" value="0"/>
+    <value name="Rotated 4x Grid" value="1"/>
+    <value name="D3D 8x Grid" value="2"/>
+    <value name="D3D 16x Grid" value="3"/>
+  </enum>
+
+  <enum name="ZS Format">
+    <value name="D16" value="1"/>
+    <value name="D24" value="2"/>
+    <value name="D24X8" value="4"/>
+    <value name="D24S8" value="5"/>
+    <value name="X8D24" value="6"/>
+    <value name="S8D24" value="7"/>
+    <value name="D32_X8X24" value="13"/>
+    <value name="D32" value="14"/>
+    <value name="D32_S8X24" value="15"/>
+  </enum>
+
+  <enum name="ZS Preload Format">
+    <value name="D32_S8X24" value="4"/>
+  </enum>
+
+  <enum name="S Format">
+    <value name="S8" value="1"/>
+    <value name="S8X8" value="2"/>
+    <value name="S8X24" value="3"/>
+    <value name="X24S8" value="4"/>
+    <value name="X8S8" value="5"/>
+    <value name="X32_S8X24" value="6"/>
+  </enum>
+
+  <enum name="Tie-Break Rule">
+    <value name="0_IN_180_OUT" value="0"/>
+    <value name="0_OUT_180_IN" value="1"/>
+    <value name="MINUS_180_IN_0_OUT" value="2"/>
+    <value name="MINUS_180_OUT_0_IN" value="3"/>
+    <value name="90_IN_270_OUT" value="4"/>
+    <value name="90_OUT_270_IN" value="5"/>
+    <value name="MINUS_90_IN_90_OUT" value="6"/>
+    <value name="MINUS_90_OUT_90_IN" value="7"/>
+  </enum>
+
+  <struct name="RT Buffer">
+    <field name="Base" size="64" start="0:0" type="address"/>
+    <field name="Row Stride" size="32" start="2:0" type="uint"/>
+    <field name="Surface Stride" size="32" start="3:0" type="uint"/>
+  </struct>
+
+  <enum name="Sample Pattern">
+    <value name="Single-sampled" value="0"/>
+    <value name="Ordered 4x Grid" value="1"/>
+    <value name="Rotated 4x Grid" value="2"/>
+    <value name="D3D 8x Grid" value="3"/>
+    <value name="D3D 16x Grid" value="4"/>
+  </enum>
+
+  <enum name="Z Internal Format">
+    <value name="D16" value="0"/>
+    <value name="D24" value="1"/>
+    <value name="D32" value="2"/>
+  </enum>
+
+  <enum name="FBD Tag">
+    <value name="IS_MFBD" value="1"/>
+    <value name="HAS_ZS_RT" value="2"/>
+    <value name="MASK" value="63"/>
+  </enum>
+
+  <enum name="Pre Post Frame Shader Mode">
+    <value name="Never" value="0"/>
+    <value name="Always" value="1"/>
+    <value name="Intersect" value="2"/>
+    <value name="Early ZS always" value="3"/>
+  </enum>
+
+  <struct name="Framebuffer Parameters">
+    <field name="Pre Frame 0" size="3" start="0:0" type="Pre Post Frame Shader Mode"/>
+    <field name="Pre Frame 1" size="3" start="0:3" type="Pre Post Frame Shader Mode"/>
+    <field name="Post Frame" size="3" start="0:6" type="Pre Post Frame Shader Mode"/>
+    <field name="Unk 2" size="1" start="2:16" type="bool" default="true"/>
+    <field name="Sample Locations" size="64" start="4:0" type="address"/>
+    <field name="Frame Shader DCDs" size="64" start="6:0" type="address"/>
+    <field name="Width" size="16" start="8:0" type="uint" modifier="minus(1)"/>
+    <field name="Height" size="16" start="8:16" type="uint" modifier="minus(1)"/>
+    <field name="Bound Min X" size="16" start="9:0" type="uint"/>
+    <field name="Bound Min Y" size="16" start="9:16" type="uint"/>
+    <field name="Bound Max X" size="16" start="10:0" type="uint"/>
+    <field name="Bound Max Y" size="16" start="10:16" type="uint"/>
+    <field name="Sample Count" size="3" start="11:0" type="uint" default="1" modifier="log2"/>
+    <field name="Sample Pattern" size="3" start="11:3" type="Sample Pattern"/>
+    <field name="Tie-Break Rule" size="3" start="11:6" type="Tie-Break Rule"/>
+    <field name="Effective Tile Size" size="4" start="11:9" type="uint" modifier="log2"/>
+    <field name="Unknown 11:13" size="3" start="11:13" type="uint" default="4"/>
+    <field name="Unknown 11:16" size="3" start="11:16" type="uint" default="3"/>
+    <field name="Render Target Count" size="4" start="11:19" type="uint" modifier="minus(1)"/>
+    <field name="Color Buffer Allocation" size="8" start="11:24" type="uint" modifier="shr(10)"/>
+    <field name="S Clear" size="8" start="12:0" type="uint"/>
+    <field name="S Write Enable" size="1" start="12:8" type="bool"/>
+    <field name="S Preload Enable" size="1" start="12:9" type="bool"/>
+    <field name="S Unload Enable" size="1" start="12:10" type="bool"/>
+    <field name="Z Internal Format" size="2" start="12:16" type="Z Internal Format"/>
+    <field name="Z Write Enable" size="1" start="12:18" type="bool"/>
+    <field name="Z Preload Enable" size="1" start="12:19" type="bool"/>
+    <field name="Z Unload Enable" size="1" start="12:20" type="bool"/>
+    <field name="Has ZS CRC Extension" size="1" start="12:21" type="bool"/>
+    <field name="Empty Tile Read Enable" size="1" start="12:28" type="bool"/>
+    <field name="Empty Tile Write Enable" size="1" start="12:29" type="bool"/>
+    <field name="CRC Read Enable" size="1" start="12:30" type="bool"/>
+    <field name="CRC Write Enable" size="1" start="12:31" type="bool"/>
+    <field name="Z Clear" size="32" start="13:0" type="float"/>
+    <field name="Tiler" size="64" start="14:0" type="address"/>
+  </struct>
+
+  <struct name="ZS CRC Extension" align="64" size="16">
+    <field name="Word 0" size="32" start="0:0" type="hex"/>
+    <field name="CRC Row Stride" size="32" start="1:0" type="uint"/>
+    <field name="CRC Clear Color" size="64" start="2:0" type="hex"/>
+    <field name="CRC Base" size="64" start="4:0" type="address"/>
+    <field name="Word 6" size="64" start="6:0" type="hex"/>
+    <field name="Word 8" size="64" start="8:0" type="hex"/>
+    <field name="Word 10" size="64" start="10:0" type="hex"/>
+    <field name="Word 12" size="64" start="12:0" type="hex"/>
+    <field name="Word 14" size="64" start="14:0" type="hex"/>
+
+    <!-- TODO: everything below this, Arm shuffled this descriptor -->
+    <!--
+    <field name="ZS Write Format" size="4" start="3:0" type="ZS Format"/>
+    <field name="ZS Block Format" size="4" start="3:4" type="Block Format"/>
+    <field name="ZS MSAA" size="2" start="3:8" default="Single" type="MSAA"/>
+    <field name="ZS Clean Pixel Write Enable" size="1" start="3:10" type="bool"/>
+    <field name="CRC Render Target" size="4" start="3:11" type="uint"/>
+    <field name="S Write Format" size="4" start="3:16" type="S Format"/>
+    <field name="S Block Format" size="4" start="3:20" type="Block Format"/>
+    <field name="S MSAA" size="2" start="3:24" default="Single" type="MSAA"/>
+    <field name="ZS Writeback Base" size="64" start="4:0" type="address"/>
+    <field name="ZS Writeback Row Stride" size="32" start="6:0" type="uint"/>
+    <field name="ZS Writeback Surface Stride" size="32" start="7:0" type="uint"/>
+    <field name="S Writeback Base" size="64" start="8:0" type="address"/>
+    <field name="S Writeback Row Stride" size="32" start="10:0" type="uint"/>
+    <field name="S Writeback Surface Stride" size="32" start="11:0" type="uint"/>
+    <field name="ZS AFBC Header" size="64" start="4:0" type="address"/>
+    <field name="ZS AFBC Row Stride" size="13" start="6:0" type="uint"/>
+    <field name="ZS AFBC Body" size="64" start="8:0" type="address"/>
+    -->
+  </struct>
+
+  <enum name="YUV Conv K6">
+    <value name="0" value="0"/>
+    <value name="16" value="1"/>
+  </enum>
+
+  <enum name="YUV Conv K7 Clamp">
+    <value name="MINUS_128_TO_127" value="0"/>
+    <value name="MINUS_112_TO_111" value="1"/>
+    <value name="0_TO_255" value="2"/>
+    <value name="16_TO_239" value="3"/>
+  </enum>
+
+  <enum name="YUV Conv K8">
+    <value name="220" value="0"/>
+    <value name="256" value="1"/>
+  </enum>
+
+  <struct name="Render Target YUV Overlay" size="16">
+    <field name="Swizzle" size="3" start="2:16" type="YUV Swizzle"/>
+    <field name="Full Range" size="1" start="2:20" type="bool"/>
+    <field name="Conversion Mode" size="4" start="2:21" type="YUV Conversion Mode"/>
+    <field name="Cr Siting" size="3" start="2:25" type="YUV Cr Siting"/>
+    <field name="Unsigned Cr Range" size="1" start="2:28" type="bool"/>
+    <field name="Plane 0 Base" size="64" start="4:0" type="address"/>
+    <field name="Plane 1 Base" size="64" start="6:0" type="address"/>
+    <field name="Plane 2 Base" size="64" start="8:0" type="address"/>
+    <field name="Plane 0 Stride" size="32" start="10:0" type="uint"/>
+    <field name="Plane 1 2 Stride" size="32" start="11:0" type="uint"/>
+  </struct>
+
+  <struct name="Render Target AFBC Overlay" size="16">
+    <field name="Header" size="64" start="4:0" type="address"/>
+    <field name="Row Stride" size="13" start="6:0" type="uint"/>
+    <field name="Chunk Size" size="12" start="7:0" type="uint"/>
+    <field name="AFBC Split Block Enable" size="1" start="7:18" type="bool"/>
+    <field name="AFBC Wide Block Enable" size="1" start="7:19" type="bool"/>
+
+    <!-- Flag in v7 to effectively disable AFBC as a race condition workaround
+    when in-place rendering is used with the AFBC block size differing
+    from the effective tile size (XXX: does v6 need a different workaround?) -->
+    <field name="Reverse Issue Order" size="1" start="7:20" type="bool"/>
+    <field name="YUV Transform Enable" size="1" start="7:17" type="bool"/>
+    <field name="Body" size="64" start="8:0" type="address"/>
+    <field name="Body Size" size="32" start="10:0" type="uint"/>
+  </struct>
+
+  <struct name="RT Clear">
+    <field name="Color 0" size="32" start="0:0" type="uint"/>
+    <field name="Color 1" size="32" start="1:0" type="uint"/>
+    <field name="Color 2" size="32" start="2:0" type="uint"/>
+    <field name="Color 3" size="32" start="3:0" type="uint"/>
+  </struct>
+
+  <struct name="Render Target" align="64">
+    <field name="YUV" size="512" start="0:0" type="Render Target YUV Overlay"/>
+    <field name="AFBC" size="512" start="0:0" type="Render Target AFBC Overlay"/>
+    <field name="Internal Buffer Offset" size="12" start="0:4" type="uint" modifier="shr(4)"/>
+    <field name="YUV Enable" size="1" start="0:24" type="bool"/>
+    <field name="Dithered Clear" size="1" start="0:25" type="bool"/>
+    <field name="Internal Format" size="6" start="0:26" type="Color Buffer Internal Format"/>
+    <field name="Write Enable" size="1" start="1:0" type="bool"/>
+    <field name="Writeback Format" size="5" start="1:3" type="Color Format"/>
+    <field name="Writeback Block Format" size="4" start="1:8" type="Block Format"/>
+    <field name="Writeback MSAA" size="2" start="1:12" type="MSAA"/>
+    <field name="sRGB" size="1" start="1:14" type="bool"/>
+    <field name="Dithering Enable" size="1" start="1:15" type="bool"/>
+    <field name="Swizzle" size="12" start="1:16" type="uint"/>
+    <field name="Clean Pixel Write Enable" size="1" start="1:31" type="bool"/>
+    <field name="RGB" size="128" start="8:0" type="RT Buffer"/>
+    <field name="Clear" size="128" start="12:0" type="RT Clear"/>
+  </struct>
+
+  <struct name="Tiler Heap" align="64">
+    <field name="Unknown" size="32" start="0:0" type="hex" default="0x329"/>
+    <field name="Size" size="32" start="1:0" type="uint" modifier="align(4096)"/>
+    <field name="Base" size="64" start="2:0" type="address"/>
+    <field name="Bottom" size="64" start="4:0" type="address"/>
+    <field name="Top" size="64" start="6:0" type="address"/>
+  </struct>
+
+  <struct name="Tiler Weights" size="8">
+    <field name="Weight0" size="16" start="0:16" type="uint"/>
+    <field name="Weight1" size="16" start="1:16" type="uint"/>
+    <field name="Weight2" size="16" start="2:16" type="uint"/>
+    <field name="Weight3" size="16" start="3:16" type="uint"/>
+    <field name="Weight4" size="16" start="4:16" type="uint"/>
+    <field name="Weight5" size="16" start="5:16" type="uint"/>
+    <field name="Weight6" size="16" start="6:16" type="uint"/>
+    <field name="Weight7" size="16" start="7:16" type="uint"/>
+  </struct>
+
+  <struct name="Tiler State" size="16">
+    <field name="Word0" size="32" start="0:0" type="uint"/>
+    <field name="Word1" size="32" start="1:0" type="uint"/>
+    <field name="Word2" size="32" start="2:0" type="uint"/>
+    <field name="Word3" size="32" start="3:0" type="uint"/>
+    <field name="Word4" size="32" start="4:0" type="uint"/>
+    <field name="Word5" size="32" start="5:0" type="uint"/>
+    <field name="Word6" size="32" start="6:0" type="uint"/>
+    <field name="Word7" size="32" start="7:0" type="uint"/>
+    <field name="Word8" size="32" start="8:0" type="uint"/>
+    <field name="Word9" size="32" start="9:0" type="uint"/>
+    <field name="Word10" size="32" start="10:0" type="uint"/>
+    <field name="Word11" size="32" start="11:0" type="uint"/>
+    <field name="Word12" size="32" start="12:0" type="uint"/>
+    <field name="Word13" size="32" start="13:0" type="uint"/>
+    <field name="Word14" size="32" start="14:0" type="uint"/>
+    <field name="Word15" size="32" start="15:0" type="uint"/>
+  </struct>
+
+  <struct name="Tiler Context" size="48" align="64">
+    <field name="Polygon List" size="64" start="0:0" type="address"/>
+    <field name="Hierarchy Mask" size="13" start="2:0" type="uint"/>
+    <field name="Sample Pattern" size="3" start="2:13" type="Sample Pattern"/>
+    <field name="Update Cost Table" size="1" start="2:16" type="bool"/>
+    <field name="FB Width" size="16" start="3:0" type="uint" modifier="minus(1)"/>
+    <field name="FB Height" size="16" start="3:16" type="uint" modifier="minus(1)"/>
+    <field name="Heap" size="64" start="6:0" type="address"/>
+    <field name="Weights" size="256" start="8:0" type="Tiler Weights"/>
+    <field name="State" size="512" start="32:0" type="Tiler State"/>
+  </struct>
+
+  <struct name="Framebuffer Padding" size="16">
+  </struct>
+
+  <aggregate name="Framebuffer" align="64">
+    <section name="Parameters" offset="0" type="Framebuffer Parameters"/>
+    <section name="Padding" offset="64" type="Framebuffer Padding"/>
+  </aggregate>
+
+  <struct name="Job Header" align="64">
+    <field name="Exception Status" size="32" start="0:0" type="uint"/>
+    <field name="First Incomplete Task" size="32" start="1:0" type="uint"/>
+    <field name="Fault Pointer" size="64" start="2:0" type="address"/>
+    <!--- All jobs are 64-bit -->
+    <field name="Type" size="7" start="4:1" type="Job Type"/>
+    <field name="Barrier" size="1" start="4:8" type="bool"/>
+    <field name="Invalidate Cache" size="1" start="4:9" type="bool"/>
+    <field name="Suppress Prefetch" size="1" start="4:11" type="bool"/>
+    <field name="Relax Dependency 1" size="1" start="4:14" type="bool"/>
+    <field name="Relax Dependency 2" size="1" start="4:15" type="bool"/>
+    <field name="Index" size="16" start="4:16" type="uint"/>
+    <field name="Dependency 1" size="16" start="5:0" type="uint"/>
+    <field name="Dependency 2" size="16" start="5:16" type="uint"/>
+    <field name="Next" size="64" start="6:0" type="address"/>
+  </struct>
+
+  <struct name="Fragment Job Payload" size="8">
+    <field name="Bound Min X" size="12" start="0:0" type="uint"/>
+    <field name="Bound Min Y" size="12" start="0:16" type="uint"/>
+    <field name="Bound Max X" size="12" start="1:0" type="uint"/>
+    <field name="Bound Max Y" size="12" start="1:16" type="uint"/>
+    <field name="Has Tile Enable Map" size="1" start="1:31" type="bool"/>
+    <field name="Framebuffer" size="64" start="2:0" type="address"/>
+    <field name="Tile Enable Map" size="64" start="4:0" type="address"/>
+    <field name="Tile Enable Map Row Stride" size="8" start="6:0" type="uint"/>
+  </struct>
+
+  <aggregate name="Fragment Job" align="64">
+    <section name="Header" offset="0" type="Job Header"/>
+    <section name="Payload" offset="32" type="Fragment Job Payload"/>
+  </aggregate>
+
+  <enum name="Write Value Type">
+    <value name="Cycle Counter" value="1"/>
+    <value name="System Timestamp" value="2"/>
+    <value name="Zero" value="3"/>
+    <value name="Immediate 8" value="4"/>
+    <value name="Immediate 16" value="5"/>
+    <value name="Immediate 32" value="6"/>
+    <value name="Immediate 64" value="7"/>
+  </enum>
+
+  <struct name="Write Value Job Payload">
+    <field name="Address" size="64" start="0:0" type="address"/>
+    <field name="Type" size="32" start="2:0" type="Write Value Type"/>
+    <field name="Immediate Value" size="64" start="4:0" type="uint"/>
+  </struct>
+
+  <struct name="Cache Flush Job Payload" size="2">
+    <field name="Clean Shader Core LS" size="1" start="0:0" type="bool"/>
+    <field name="Invalidate Shader Core LS" size="1" start="0:1" type="bool"/>
+    <field name="Invalidate Shader Core Other" size="1" start="0:2" type="bool"/>
+    <field name="Job Manager Clean" size="1" start="0:16" type="bool"/>
+    <field name="Job Manager Invalidate" size="1" start="0:17" type="bool"/>
+    <field name="Tiler Clean" size="1" start="0:24" type="bool"/>
+    <field name="Tiler Invalidate" size="1" start="0:25" type="bool"/>
+    <field name="L2 Clean" size="1" start="1:0" type="bool"/>
+    <field name="L2 Invalidate" size="1" start="1:1" type="bool"/>
+  </struct>
+
+  <aggregate name="Write Value Job" align="64">
+    <section name="Header" offset="0" type="Job Header"/>
+    <section name="Payload" offset="32" type="Write Value Job Payload"/>
+  </aggregate>
+
+  <aggregate name="Cache Flush Job" align="64">
+    <section name="Header" offset="0" type="Job Header"/>
+    <section name="Payload" offset="32" type="Cache Flush Job Payload"/>
+  </aggregate>
+
+  <struct name="Shader" size="16">
+    <field name="FAU count" start="1:0" size="32" type="uint"/>
+    <field name="Resources" start="8:0" size="64" type="address"/>
+    <field name="Shader" start="10:0" size="64" type="address"/>
+    <field name="Thread storage" start="12:0" size="64" type="address"/>
+    <field name="FAU" start="14:0" size="64" type="address"/>
+    <!-- TODO: Missing/unknown from Bifrost v7 for compute alone
+      UBOs
+      Attribute buffers
+    -->
+  </struct>
+
+  <struct name="Compute Payload" size="24">
+    <field name="Workgroup size X" start="0:0" size="10" type="uint" modifier="minus(1)"/>
+    <field name="Workgroup size Y" start="0:10" size="10" type="uint" modifier="minus(1)"/>
+    <field name="Workgroup size Z" start="0:20" size="10" type="uint" modifier="minus(1)"/>
+    <field name="Unk 0" start="0:30" size="2" type="uint"/>
+    <field name="Unk 1" start="1:0" size="32" type="hex"/> <!-- 0x8001 -->
+    <field name="Workgroup count X" start="2:0" size="32" type="uint"/>
+    <field name="Workgroup count Y" start="3:0" size="32" type="uint"/>
+    <field name="Workgroup count Z" start="4:0" size="32" type="uint"/>
+    <!-- TODO: Missing/unknown from Bifrost v7:
+      Thread group split
+      Job Task Split
+    -->
+    <field name="Compute" start="8:0" size="512" type="Shader"/>
+  </struct>
+
+  <!-- Compute job also covers vertex and geometry operations -->
+  <aggregate name="Compute Job" align="64">
+    <section name="Header" offset="0" type="Job Header"/>
+    <section name="Payload" offset="32" type="Compute Payload"/>
+  </aggregate>
+
+  <struct name="Resource" size="4" align="16">
+    <field name="Address" start="0:0" size="56" type="address"/>
+    <field name="Unk" start="1:24" size="1" type="bool" default="true"/>
+    <field name="Size" start="2:0" size="64" type="uint"/> <!-- bytes -->
+  </struct>
+
+  <struct name="Depth/stencil" size="8" align="32">
+    <field name="Type" size="4" start="0:0" type="Descriptor Type" default="Depth/stencil"/>
+    <field name="Front compare function" size="3" start="0:4" type="Func"/>
+    <field name="Front stencil fail" size="3" start="0:7" type="Stencil Op"/>
+    <field name="Front depth fail" size="3" start="0:10" type="Stencil Op"/>
+    <field name="Front depth pass" size="3" start="0:13" type="Stencil Op"/>
+    <field name="Back compare function" size="3" start="0:16" type="Func"/>
+    <field name="Back stencil fail" size="3" start="0:19" type="Stencil Op"/>
+    <field name="Back depth fail" size="3" start="0:22" type="Stencil Op"/>
+    <field name="Back depth pass" size="3" start="0:25" type="Stencil Op"/>
+    <field name="Stencil test enable" size="1" start="0:31" type="bool"/>
+    <field name="Front write mask" size="8" start="1:0" type="hex"/>
+    <field name="Back write mask" size="8" start="1:8" type="hex"/>
+    <field name="Front value mask" size="8" start="1:16" type="hex"/>
+    <field name="Back value mask" size="8" start="1:24" type="hex"/>
+    <field name="Front reference value" size="8" start="2:0" type="hex"/>
+    <field name="Back reference value" size="8" start="2:8" type="hex"/>
+    <field name="Unk 1" size="1" start="4:22" type="bool" default="true"/>
+    <field name="Unk 2" size="1" start="4:23" type="bool" default="true"/>
+    <field name="Depth source" size="2" start="4:25" type="Depth Source" default="Fixed function"/>
+    <field name="Depth write enable" size="1" start="4:27" type="bool"/>
+    <field name="Depth bias enable" size="1" start="4:28" type="bool"/>
+    <field name="Depth function" size="3" start="4:29" type="Func"/>
+    <field name="Stencil from shader" size="1" start="4:30" type="bool"/>
+    <field name="Depth units" size="32" start="5:0" type="float"/>
+    <field name="Depth factor" size="32" start="6:0" type="float"/>
+    <field name="Depth bias clamp" size="32" start="7:0" type="float"/>
+  </struct>
+
+  <struct name="Draw" size="64">
+    <field name="Allow forward pixel to kill" size="1" start="0:0" type="bool"/>
+    <field name="Allow forward pixel to be killed" size="1" start="0:1" type="bool"/>
+    <field name="Pixel kill operation" size="2" start="0:2" type="Pixel Kill"/>
+    <field name="ZS update operation" size="2" start="0:4" type="Pixel Kill"/>
+    <field name="Depth write mask" size="1" start="0:6" type="bool"/> <!-- TODO -->
+    <field name="Alpha Zero NOP" start="0:7" size="1" type="bool"/>
+    <field name="Alpha One Store" size="1" start="0:8" type="bool"/>
+    <field name="Unknown - preframe" size="1" start="0:9" type="bool"/> <!-- maybe clean pixel -->
+    <field name="Evaluate per-sample" size="1" start="0:11" type="bool"/>
+    <field name="Clear colour/depth, no MSAA" size="1" start="0:13" type="bool"/> <!-- TODO -->
+    <field name="Occlusion query" size="2" start="0:14" type="Occlusion Mode" default="Disabled"/>
+    <field name="Front face CCW" size="1" start="0:16" type="bool"/>
+    <field name="Cull front face" size="1" start="0:17" type="bool"/>
+    <field name="Cull back face" size="1" start="0:18" type="bool"/>
+    <field name="Multisample enable" size="1" start="0:19" type="bool"/>
+    <field name="Shader modifies coverage" size="1" start="0:20" type="bool"/>
+    <field name="Sample mask" size="16" start="1:0" type="uint"/>
+    <field name="Unk 25" start="1:16" size="16" type="hex" default="0x1"/>
+    <field name="Internal tiler pointer" start="2:0" size="64" type="address" default="0x1"/>
+    <field name="Unk 28" start="4:0" size="32" type="hex"/>
+    <field name="Minimum Z" start="6:0" size="32" type="float"/>
+    <field name="Maximum Z" start="7:0" size="32" type="float"/>
+    <field name="Depth/stencil" start="10:0" size="64" type="address"/>
+    <field name="Blend unk" start="12:0" size="4" type="uint" default="2"/>
+    <field name="Blend" start="12:4" size="60" type="address" modifier="shr(4)"/>
+    <field name="Occlusion" size="64" start="14:0" type="address"/>
+
+    <field name="Fragment" start="16:0" size="512" type="Shader"/>
+    <field name="Position" start="32:0" size="512" type="Shader"/>
+    <field name="Varying" start="48:0" size="512" type="Shader"/>
+  </struct>
+
+  <struct name="IDVS Counts" size="4">
+    <field name="Instance count" start="0:0" size="32" type="uint"/>
+    <field name="Vertex output (bytes)" start="1:0" size="16" type="uint"/>
+    <field name="Fragment input (bytes)" start="1:16" size="16" type="uint"/>
+    <field name="Tiler" size="64" start="2:0" type="address"/>
+  </struct>
+
+  <struct name="Tiler Pointer" size="2">
+    <field name="Address" size="64" start="0:0" type="address"/>
+  </struct>
+
+  <struct name="Primitive Size" size="2">
+    <field name="Constant" size="32" start="0:0" type="float"/>
+    <field name="Size Array" size="64" start="0:0" type="uint"/>
+  </struct>
+
+  <struct name="Indices" size="2">
+    <field name="Address" size="64" start="0:0" type="address"/>
+  </struct>
+
+  <aggregate name="IDVS Helper Job" size="384" align="64">
+    <section name="Header" offset="0" type="Job Header"/>
+    <section name="Primitive" offset="32" type="Primitive"/>
+    <section name="Counts" offset="48" type="IDVS Counts"/>
+    <section name="Tiler" offset="56" type="Tiler Pointer"/>
+    <section name="Scissor" offset="104" type="Scissor"/>
+    <section name="Primitive Size" offset="112" type="Primitive Size"/>
+    <section name="Indices" offset="120" type="Indices"/>
+    <section name="Draw" offset="128" type="Draw"/>
+  </aggregate>
+</panxml>