• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<agxml>
2  <enum name="Channel">
3    <value name="R" value="0"/>
4    <value name="G" value="1"/>
5    <value name="B" value="2"/>
6    <value name="A" value="3"/>
7    <value name="1" value="4"/>
8    <value name="0" value="5"/>
9  </enum>
10
11  <enum name="ZS Func">
12    <value name="Never" value="0"/>
13    <value name="Less" value="1"/>
14    <value name="Equal" value="2"/>
15    <value name="Lequal" value="3"/>
16    <value name="Greater" value="4"/>
17    <value name="Not Equal" value="5"/>
18    <value name="Gequal" value="6"/>
19    <value name="Always" value="7"/>
20  </enum>
21
22  <enum name="Compare func">
23    <value name="Lequal" value="0"/>
24    <value name="Gequal" value="1"/>
25    <value name="Less" value="2"/>
26    <value name="Greater" value="3"/>
27    <value name="Equal" value="4"/>
28    <value name="Not Equal" value="5"/>
29    <value name="Always" value="6"/>
30    <value name="Never" value="7"/>
31  </enum>
32
33  <enum name="Stencil Op">
34    <value name="Keep" value="0"/>
35    <value name="Zero" value="1"/>
36    <value name="Replace" value="2"/>
37    <value name="Incr Sat" value="3"/>
38    <value name="Decr Sat" value="4"/>
39    <value name="Invert" value="5"/>
40    <value name="Incr Wrap" value="6"/>
41    <value name="Decr Wrap" value="7"/>
42  </enum>
43
44  <enum name="Visibility Mode">
45    <value name="None" value="0"/>
46    <value name="Counting" value="2"/>
47    <value name="Boolean" value="3"/>
48  </enum>
49
50  <enum name="Polygon Mode">
51    <value name="Fill" value="0"/>
52    <value name="Line" value="1"/>
53    <value name="Point" value="2"/>
54  </enum>
55
56  <enum name="Primitive">
57    <value name="Points" value="0"/>
58    <value name="Lines" value="1"/>
59    <value name="Line strip" value="3"/>
60    <value name="Line loop" value="5"/>
61    <value name="Triangles" value="6"/>
62    <value name="Triangle strip" value="9"/>
63    <value name="Triangle fan" value="10"/>
64    <value name="Quads" value="14"/> <!-- guess, confirm with piglit later XXX -->
65    <value name="Quad strip" value="15"/> <!-- guess, confirm with piglit later XXX -->
66  </enum>
67
68  <enum name="Layout">
69    <value name="Linear" value="0"/>
70    <!-- Morton order with 64x64 tiles -->
71    <value name="Tiled 64x64" value="2"/>
72  </enum>
73
74  <enum name="Channels">
75    <value name="R8" value="0x00"/>
76    <value name="R16" value="0x09"/>
77    <value name="R8G8" value="0x0A"/>
78    <value name="R5G6B5" value="0x0B"/>
79    <value name="R4G4B4A4" value="0x0C"/>
80    <value name="A1R5G5B5" value="0x0D"/>
81    <value name="R5G5B5A1" value="0x0E"/>
82    <value name="R32" value="0x21"/>
83    <value name="R16G16" value="0x23"/>
84    <value name="R11G11B10" value="0x25"/>
85    <value name="R10G10B10A2" value="0x26"/>
86    <value name="R9G9B9E5" value="0x27"/>
87    <value name="R8G8B8A8" value="0x28"/>
88    <value name="R32G32" value="0x31"/>
89    <value name="R16G16B16A16" value="0x32"/>
90    <value name="R32G32B32A32" value="0x38"/>
91    <value name="GBGR 422" value="0x40"/> <!-- Subsampled, swizzle BRG1 -->
92    <value name="BGRG 422" value="0x41"/> <!-- Subsampled, swizzle BRG1 -->
93
94    <!-- Compressed -->
95    <value name="PVRTC 2bpp" value="0x50"/>
96    <value name="PVRTC 4bpp" value="0x51"/>
97
98    <value name="ETC2 RGB8" value="0x58"/>
99    <value name="ETC2 RGBA8" value="0x59"/>
100    <value name="ETC2 RGB8A1" value="0x5A"/>
101    <value name="EAC R11" value="0x5B"/>
102    <value name="EAC RG11" value="0x5C"/>
103
104    <value name="ASTC 4x4 LDR" value="0x60"/>
105    <value name="ASTC 5x4 LDR" value="0x61"/>
106    <value name="ASTC 5x5 LDR" value="0x62"/>
107    <value name="ASTC 6x5 LDR" value="0x63"/>
108    <value name="ASTC 6x6 LDR" value="0x64"/>
109    <value name="ASTC 8x5 LDR" value="0x65"/>
110    <value name="ASTC 8x6 LDR" value="0x66"/>
111    <value name="ASTC 8x8 LDR" value="0x67"/>
112    <value name="ASTC 10x5 LDR" value="0x68"/>
113    <value name="ASTC 10x6 LDR" value="0x69"/>
114    <value name="ASTC 10x8 LDR" value="0x6A"/>
115    <value name="ASTC 10x10 LDR" value="0x6B"/>
116    <value name="ASTC 12x10 LDR" value="0x6C"/>
117    <value name="ASTC 12x12 LDR" value="0x6D"/>
118
119    <value name="BC1" value="0x74"/>
120    <value name="BC2" value="0x75"/>
121    <value name="BC3" value="0x76"/>
122    <value name="BC4" value="0x77"/>
123    <value name="BC5" value="0x78"/>
124    <value name="BC6H" value="0x79"/>
125    <value name="BC6H Ufloat" value="0x7A"/>
126    <value name="BC7" value="0x7B"/>
127  </enum>
128
129  <enum name="Texture Type">
130    <value name="Unorm" value="0"/>
131    <value name="Snorm" value="1"/>
132    <value name="Uint" value="2"/>
133    <value name="Sint" value="3"/>
134    <value name="Float" value="4"/>
135    <value name="XR" value="5"/>
136  </enum>
137
138  <struct name="Varying header" size="4">
139    <field name="Triangle slots" size="8" start="0:0" type="uint"/>
140    <field name="Point slots" size="8" start="0:8" type="uint"/>
141  </struct>
142
143  <enum name="Varying Type">
144    <value name="Flat (first)" value="0"/>
145    <value name="Flat (last)" value="2"/>
146    <value name="Fragcoord W" value="3"/>
147    <value name="Smooth" value="7"/>
148    <value name="Fragcoord Z" value="11"/>
149    <value name="Point coordinates" value="19"/>
150  </enum>
151
152  <struct name="Varying" size="4">
153    <field name="Components" size="2" start="0" type="uint" modifier="minus(1)"/>
154    <field name="Type" size="6" start="2" type="Varying Type" default="Smooth"/>
155    <field name="Triangle slot" size="8" start="8" type="uint"/>
156    <field name="Point slot" size="8" start="16" type="uint"/>
157  </struct>
158
159  <struct name="Format" size="2">
160    <field name="Channels" size="7" start="0" type="Channels"/>
161    <field name="Type" size="3" start="7" type="Texture Type"/>
162  </struct>
163
164  <struct name="Render Target" size="16">
165    <field name="Unknown" size="4" start="0" type="hex" default="0x2"/>
166    <field name="Layout" size="2" start="4" type="Layout"/>
167    <field name="Format" size="10" start="6" type="Pixel Format"/>
168    <field name="Swizzle R" size="2" start="16" type="Channel"/>
169    <field name="Swizzle G" size="2" start="18" type="Channel"/>
170    <field name="Swizzle B" size="2" start="20" type="Channel"/>
171    <field name="Swizzle A" size="2" start="22" type="Channel"/>
172    <field name="Width" size="14" start="24" type="uint" modifier="minus(1)"/>
173    <field name="Height" size="14" start="38" type="uint" modifier="minus(1)"/>
174    <field name="Unk 52" size="1" start="52" type="bool"/>
175    <field name="Rotate 90" size="1" start="53" type="bool" default="false"/>
176    <field name="Flip vertical" size="1" start="54" type="bool" default="false"/>
177    <!-- not 1c0, tried setting . setting 0x20/0x10/0x8 breaks render. not
178    0x4/0x2. 0x1 distorts in a funny way, renders upside-down with jitter
179    around the edges (like it's doing a 2x2 tiling or something).
180
181    When enabling mipmapping, Metal sets 0x8 and sets stride to 0x100009 -->
182    <field name="Unk 55" size="9" start="55" type="hex" default="0x00"/>
183    <field name="Buffer" size="36" start="64" type="address" modifier="shr(4)"/>
184    <!-- N.b. sRGB is not specified here -->
185    <field name="Level" size="4" start="100" type="uint"/>
186    <!-- Off by 4? -->
187    <field name="Stride" size="24" start="104" type="hex" prefix="AGX_RT_STRIDE">
188      <value name="Tiled" value="0x100000"/>
189      <value name="Tiled, mipmapped" value="0x100009"/>
190    </field>
191  </struct>
192
193  <enum name="Texture dimension">
194    <value name="2D" value="2"/>
195    <value name="2D Array" value="3"/>
196    <value name="3D" value="5"/>
197    <value name="Cube" value="6"/>
198  </enum>
199
200  <!-- Payloads follow, right-shifted by 4 because of course -->
201  <struct name="Texture" size="16">
202    <field name="Dimension" size="4" start="0" type="Texture dimension" default="2D"/>
203    <field name="Layout" size="2" start="4" type="Layout"/>
204    <field name="Format" size="10" start="6" type="Pixel Format"/>
205    <field name="Swizzle R" size="3" start="16" type="Channel" default="R"/>
206    <field name="Swizzle G" size="3" start="19" type="Channel" default="G"/>
207    <field name="Swizzle B" size="3" start="22" type="Channel" default="B"/>
208    <field name="Swizzle A" size="3" start="25" type="Channel" default="A"/>
209    <field name="Width" size="14" start="28" type="uint" modifier="minus(1)"/>
210    <field name="Height" size="14" start="42" type="uint" modifier="minus(1)"/>
211    <field name="Levels" size="6" start="60" type="uint" modifier="minus(1)"/>
212    <field name="Address" size="36" start="66" type="hex" modifier="shr(4)"/>
213    <!-- Unknown bit set by Metal when mipmapping. Might relate to a mechanism
214    to switch tile size (or disable tiling altogether?) at small mip levels to
215    reduce wasted memory due to padding. Causing test flakiness when set. -->
216    <field name="Unk mipmapped" size="1" start="102" type="bool"/>
217    <field name="Compression" size="2" start="106" type="hex"/> <!-- 0 for 64x64 tiling -->
218    <field name="sRGB" size="1" start="108" type="bool"/>
219    <field name="Unk 2" size="1" start="109" type="bool"/>
220    <field name="Stride" size="18" start="110" type="hex" modifier="shr(4)"/>
221    <!-- Note that 3D/arrays cannot be linear. -->
222    <field name="Depth" size="14" start="110" type="uint" modifier="minus(1)" default="1"/>
223  </struct>
224
225  <enum name="Wrap">
226    <value name="Clamp to edge" value="0"/>
227    <value name="Repeat" value="1"/>
228    <value name="Mirrored repeat" value="2"/>
229    <value name="Clamp to border" value="3"/>
230  </enum>
231
232  <enum name="Mip filter">
233    <value name="None" value="0"/>
234    <value name="Nearest" value="1"/>
235    <value name="Linear" value="2"/>
236  </enum>
237
238  <enum name="Border colour">
239    <value name="Transparent black" value="0"/>
240    <value name="Opaque black" value="1"/>
241    <value name="Opaque white" value="2"/>
242  </enum>
243
244  <struct name="Sampler" size="8">
245    <field name="Minimum LOD" size="10" start="0" type="lod" default="0.0"/>
246    <field name="Maximum LOD" size="10" start="10" type="lod" default="INFINITY"/>
247    <field name="Magnify linear" size="1" start="23" type="bool"/>
248    <field name="Minify linear" size="1" start="25" type="bool"/>
249    <field name="Mip filter" size="2" start="27" type="Mip filter"/>
250    <field name="Wrap S" size="3" start="29" type="Wrap"/>
251    <field name="Wrap T" size="3" start="32" type="Wrap"/>
252    <field name="Wrap R" size="3" start="35" type="Wrap"/>
253    <field name="Pixel coordinates" size="1" start="38" type="bool"/>
254    <field name="Compare func" size="3" start="39" type="Compare func"/>
255    <field name="Unk 3" size="1" start="42" type="hex" default="1"/>
256    <field name="Border colour" size="2" start="55" type="Border colour"/>
257  </struct>
258
259  <!--- Identified by tag? -->
260  <struct name="Viewport" size="40">
261    <field name="Tag" size="32" start="0:0" type="hex" default="0xc00"/>
262
263    <!-- Acts like a scissor at 32x32 tile boundaries, ignored unless clip tile is set -->
264    <field name="Max tile X" size="9" start="1:0" type="uint" modifier="minus(1)"/>
265    <field name="Min tile X" size="9" start="1:16" type="uint"/>
266    <field name="Clip tile" size="1" start="1:31" type="bool"/>
267    <field name="Max tile Y" size="9" start="2:0" type="uint" modifier="minus(1)"/>
268    <field name="Min tile Y" size="9" start="2:16" type="uint"/>
269
270    <!-- Used to convert clip space coordinates to NDC, does not clip -->
271    <field name="Translate X" size="32" start="4:0" type="float"/>
272    <field name="Scale X" size="32" start="5:0" type="float"/>
273    <field name="Translate Y" size="32" start="6:0" type="float"/>
274    <field name="Scale Y" size="32" start="7:0" type="float"/>
275
276    <!-- Specifies an affine transformation from clip coordinates to viewport
277    depth coordinates. For APIs with clip coordinates [0, 1], this cooresponds
278    to near z and (far z - near z) respectively. In general, given clip
279    coordinate z_in, the viewport depth is given as (z_in * scale_z) +
280    translate_z.  For example, the default [0, 1] depth buffer in OpenGL with
281    [-1, +1] clip coordinates is specified as scale = 1/2, bias = 1/2 -->
282    <field name="Translate Z" size="32" start="8:0" type="float"/>
283    <field name="Scale Z" size="32" start="9:0" type="float"/>
284  </struct>
285
286  <!--- Pointed to from the command buffer -->
287  <struct name="Scissor" size="16">
288    <field name="Max X" size="16" start="0:0" type="uint"/>
289    <field name="Min X" size="16" start="0:16" type="uint"/>
290    <field name="Max Y" size="16" start="1:0" type="uint"/>
291    <field name="Min Y" size="16" start="1:16" type="uint"/>
292    <field name="Min Z" size="32" start="2:0" type="float"/>
293    <field name="Max Z" size="32" start="3:0" type="float"/>
294  </struct>
295
296  <!-- Note: this structure is not padded. It really is 12 bytes -->
297  <struct name="Depth bias" size="12">
298    <field name="Depth bias" size="32" start="0:0" type="float"/>
299    <field name="Slope scale" size="32" start="1:0" type="float"/>
300    <field name="Clamp" size="32" start="2:0" type="float"/>
301  </struct>
302
303  <struct name="Rasterizer face" size="8">
304    <field name="Stencil reference" size="8" start="0:0" type="hex"/>
305    <!-- line width is 4:4 fixed point with off-by-one applied -->
306    <field name="Line width" size="8" start="0:8" type="hex"/>
307    <field name="Polygon mode" size="2" start="0:18" type="Polygon Mode"/>
308    <field name="Disable depth write" size="1" start="0:21" type="bool"/>
309    <field name="Unk - visibility test internal" size="2" start="0:22" type="hex"/>
310    <field name="Depth function" size="3" start="0:24" type="ZS Func"/>
311    <field name="Stencil write mask" size="8" start="1:0" type="hex"/>
312    <field name="Stencil read mask" size="8" start="1:8" type="hex"/>
313    <field name="Depth pass" size="3" start="1:16" type="Stencil Op"/>
314    <field name="Depth fail" size="3" start="1:19" type="Stencil Op"/>
315    <field name="Stencil fail" size="3" start="1:22" type="Stencil Op"/>
316    <field name="Stencil compare" size="3" start="1:25" type="ZS Func"/>
317  </struct>
318
319  <struct name="Rasterizer" size="28">
320    <field name="Tag" size="32" start="0:0" type="hex" default="0x10000b5"/>
321    <field name="Unk 1" size="1" start="1:9" type="hex" default="0x1"/>
322    <field name="Visibility mode" size="2" start="1:14" type="Visibility Mode"/>
323    <field name="Scissor enable" size="1" start="1:16" type="bool"/>
324    <field name="Depth bias enable" size="1" start="1:17" type="bool"/>
325    <field name="Unk ZS" size="1" start="1:18" type="hex" default="0x1"/>
326    <field name="Unk 2" size="2" start="1:19" type="hex" default="0x0"/>
327    <field name="Unk fill lines" size="1" start="1:26" type="hex" default="0x0"/> <!-- set when drawing LINES -->
328    <field name="Front" size="64" start="2:0" type="Rasterizer face"/>
329    <field name="Back" size="64" start="4:0" type="Rasterizer face"/>
330    <field name="Visibility buffer offset" size="18" start="6:14" type="uint"/>
331  </struct>
332
333  <struct name="Unknown face" size="4">
334    <field name="Unknown" size="8" start="0:20" type="hex" default="0x7e"/>
335    <field name="Lines" size="1" start="0:28" type="bool"/>
336    <field name="Points" size="1" start="0:30" type="bool"/>
337  </struct>
338
339  <struct name="Unknown 4a" size="20">
340    <field name="Tag" size="32" start="0:0" type="hex" default="0x200004a"/>
341    <field name="Unk 1" size="1" start="1:9" type="bool" default="true"/>
342    <field name="Lines or points" size="1" start="1:26" type="bool"/>
343    <field name="Reads tilebuffer" size="1" start="1:29" type="bool"/>
344    <field name="Sample mask from shader" size="1" start="1:30" type="bool"/>
345    <field name="Front" size="32" start="2:0" type="Unknown face"/>
346    <field name="Back" size="32" start="3:0" type="Unknown face"/>
347    <!-- maybe sample mask -->
348    <field name="Unk 4" size="32" start="4:0" type="hex" default="0x1ffff"/>
349  </struct>
350
351  <struct name="Cull" size="8">
352    <field name="Tag" size="32" start="0:0" type="hex" default="0x200000"/>
353    <field name="Cull front" size="1" start="1:0" type="bool"/>
354    <field name="Cull back" size="1" start="1:1" type="bool"/>
355    <field name="Unk GL 1" size="1" start="1:7" type="bool"/>
356    <field name="Unk GL 2" size="1" start="1:8" type="bool"/>
357    <field name="Depth clip" size="1" start="1:10" type="bool"/>
358    <field name="Depth clamp" size="1" start="1:11" type="bool"/>
359    <field name="Front face CCW" size="1" start="1:16" type="bool"/>
360  </struct>
361
362  <struct name="Interpolation" size="20">
363    <field name="Tag" size="32" start="0:0" type="hex" default="0x100C0000"/>
364    <field name="Varying count" size="32" start="1:0" type="uint"/>
365  </struct>
366
367  <struct name="Linkage" size="16">
368    <field name="Tag" size="32" start="0:0" type="hex" default="0xC020000"/>
369    <field name="Unk 1" size="32" start="1:0" type="hex" default="0x100"/>
370    <field name="Unk 2" size="32" start="2:0" type="hex" default="0x0"/>
371    <field name="Varying count" size="32" start="3:0" type="uint"/>
372  </struct>
373
374  <!-- Indexes into the scissor and depth bias arrays -->
375  <struct name="Set index" size="8">
376    <field name="Tag" size="32" start="0:0" type="hex" default="0x100"/>
377    <field name="Scissor" size="16" start="1:0" type="uint"/>
378    <field name="Depth bias" size="16" start="1:16" type="uint"/>
379  </struct>
380
381  <!--- Commands valid within a pipeline -->
382  <struct name="Bind uniform" size="8">
383    <field name="Tag" size="8" start="0:0" type="hex" default="0x1d"/>
384    <field name="Start (halfs)" size="8" start="0:8" type="uint"/>
385    <field name="Unk" size="4" start="0:16" type="hex" default="0x0"/>
386    <field name="Size (halfs)" size="4" start="0:20" type="uint"/>
387    <field name="Buffer" size="40" start="0:24" type="address"/>
388  </struct>
389
390  <struct name="Bind texture" size="8">
391    <field name="Tag" size="8" start="0:0" type="hex" default="0xdd"/>
392    <field name="Start" size="8" start="0:8" type="uint"/>
393    <field name="Count" size="4" start="0:20" type="uint"/>
394    <field name="Buffer" size="40" start="0:24" type="address"/>
395  </struct>
396
397  <struct name="Bind sampler" size="8">
398    <field name="Tag" size="8" start="0:0" type="hex" default="0x9d"/>
399    <field name="Start" size="8" start="0:8" type="uint"/>
400    <field name="Count" size="4" start="0:20" type="uint"/>
401    <field name="Buffer" size="40" start="0:24" type="address"/>
402  </struct>
403
404  <enum name="Preshader mode">
405    <value name="Preshader" value="3"/>
406    <value name="No preshader" value="8"/>
407  </enum>
408
409  <struct name="Set shader" size="24">
410    <field name="Tag" size="8" start="0:0" type="hex" default="0x4d"/>
411    <field name="Unk 1" size="24" start="0:8" type="hex" default="0x90"/>
412    <field name="Unk 2" size="8" start="1:0" type="hex" default="0x0d"/> <!-- TODO differs with stage -->
413    <field name="Unk 2b" size="8" start="1:8" type="uint" default="4"/>
414    <field name="Code" size="32" start="1:16" type="address"/>
415    <field name="Unk 3" size="8" start="2:16" type="hex" default="0x8d"/>
416    <field name="Register quadwords" size="5" start="2:24" type="uint"/> <!-- 0 for max -->
417    <field name="Unk 3b" size="3" start="2:29" type="hex" default="0x0"/>
418    <field name="Spill size" size="8" start="3:0" type="hex" default="0"/> <!-- TODO: determine relation, see docs/table.py -->
419    <field name="Unk 4" size="12" start="3:8" type="hex" default="0x801"/>
420    <field name="Preshader mode" size="4" start="3:20" type="Preshader mode" default="No preshader"/>
421    <field name="Unk 6" size="8" start="3:24" type="hex" default="0x0"/>
422    <field name="Preshader unk" size="16" start="4:0" type="hex" default="0x0"/>
423    <field name="Preshader code" size="32" start="4:16" type="address"/>
424    <field name="Unk 7" size="16" start="5:16" type="hex" default="0x0"/> <!-- blob is inconsistent -->
425  </struct>
426
427  <struct name="Fragment Parameters" size="4">
428    <field name="Unk 1" size="24" start="0" type="hex" default="0x580100"/>
429    <!-- Guess. Set if the shader does not write the sample mask (including by
430        discard_fragment) -->
431    <field name="Early-z testing" size="1" start="24" type="bool"/>
432    <field name="Unk 2" size="1" start="25" type="bool" default="true"/>
433    <field name="Unk 3" size="4" start="28" type="hex" default="0xf"/>
434  </struct>
435
436  <struct name="Set shader extended" size="32">
437    <field name="Tag" size="8" start="0:0" type="hex" default="0x4d"/>
438    <field name="Unk 1" size="24" start="0:8" type="hex" default="0x2010bd"/>
439    <field name="Unk 2" size="8" start="1:0" type="hex" default="0x0d"/>
440    <field name="Unk 2b" size="8" start="1:8" type="uint" default="5"/> <!-- 1 for other frag, 5 with discard? -->
441    <field name="Code" size="32" start="1:16" type="address"/>
442    <field name="Unk 3" size="8" start="2:16" type="hex" default="0x28d"/>
443    <field name="Register quadwords" size="5" start="2:24" type="uint"/> <!-- 0 for max -->
444    <field name="Unk 3b" size="3" start="2:29" type="hex" default="0x0"/>
445    <field name="Fragment parameters" size="32" start="3:0" type="Fragment Parameters"/>
446    <field name="Spill size" size="8" start="4:0" type="hex" default="0"/> <!-- TODO: determine relation, see docs/table.py -->
447    <field name="Unk 4" size="12" start="4:8" type="hex" default="0x801"/>
448    <field name="Preshader mode" size="4" start="4:20" type="Preshader mode" default="No preshader"/>
449    <field name="Unk 6" size="8" start="4:24" type="hex" default="0x0"/>
450    <field name="Preshader unk" size="16" start="5:0" type="hex" default="0x0"/>
451    <field name="Preshader code" size="32" start="5:16" type="address"/>
452    <field name="Unk 7" size="16" start="6:16" type="hex" default="0x0"/> <!-- blob is inconsistent -->
453    <field name="Unk 8" size="32" start="7:0" type="hex" default="0x0"/> <!-- may not exist -->
454  </struct>
455
456  <!--- Command to bind a vertex pipeline, followed by subcommands. Counts are
457	specified in 32-bit word units. Intepretation per-shader stage. -->
458  <struct name="Bind pipeline" size="24">
459    <field name="Tag" size="32" start="0:0" type="hex" default="0x4000002e">
460      <value name="AGX_BIND_PIPELINE_VERTEX" value="0x4000002e"/>
461      <value name="AGX_BIND_PIPELINE_FRAGMENT" value="0x800000"/>
462    </field>
463    <field name="Unk 1" size="4" start="1:0" type="hex" default="0x2"/>
464    <field name="Sampler count" start="1:4" size="5" type="uint"/>
465    <field name="Texture count" start="1:9" size="3" type="uint"/>
466    <field name="Unk 2" size="4" start="1:12" type="hex" default="0x1"/>
467    <field name="Input count" size="8" start="1:16" type="uint" default="0"/>
468    <field name="Padding 1" size="8" start="1:24" type="hex" default="0x0"/>
469    <field name="Pipeline" size="32" start="2:0" type="address"/>
470
471    <!-- Overlaps -->
472    <field name="FS Varyings" size="32" start="3:0" type="address"/>
473    <field name="VS Output count 1" size="8" start="3:0" type="uint" default="0"/>
474    <field name="VS Output count 2" size="8" start="3:8" type="uint" default="0"/>
475    <field name="Padding 2" size="16" start="3:16" type="hex" default="0x0"/>
476
477    <field name="Unk 3" size="32" start="5:0" type="address"/> <!-- C020000 -->
478  </struct>
479
480  <!-- Subcommands are packed inside sized records -->
481  <struct name="Record" size="8">
482    <field name="Pointer (hi)" size="8" start="0:0" type="hex"/>
483    <field name="Size (words)" size="8" start="0:8" type="uint"/>
484    <field name="Tag" size="16" start="0:16" type="hex" default="0x0000"/>
485    <field name="Pointer (lo)" size="32" start="0:32" type="address"/>
486  </struct>
487
488  <!--- Command to issue a direct non-indexed draw -->
489  <struct name="Draw" size="16">
490    <field name="Unk" size="8" start="0:0" type="hex" default="0x0"/>
491    <field name="Primitive" size="8" start="0:8" type="Primitive"/>
492    <field name="Unk 2" size="8" start="0:16" type="hex" default="0xc0"/>
493    <field name="Command" size="8" start="0:24" type="hex" default="0x61"/>
494    <field name="Vertex count" size="32" start="1:0" type="uint"/>
495    <field name="Instance count" size="32" start="2:0" type="uint"/> <!-- must be nonzero -->
496    <field name="Vertex start" size="32" start="3:0" type="uint"/>
497  </struct>
498
499  <enum name="Index size">
500    <value name="U8" value="0"/>
501    <value name="U16" value="1"/>
502    <value name="U32" value="2"/>
503  </enum>
504
505  <struct name="Indexed draw" size="32">
506    <field name="Unk 1" size="8" start="0:0" type="hex" default="0x1"/>
507    <field name="Command" size="24" start="0:8" type="hex" default="0x400000"/>
508    <field name="Restart index" size="32" start="1:0" type="hex"/>
509    <field name="Unk 2a" size="8" start="2:0" type="hex" default="0x15"/>
510    <field name="Primitive" size="8" start="2:8" type="Primitive"/>
511    <field name="Restart enable" size="1" start="2:16" type="bool"/> <!-- Metal sets this bit for strips -->
512    <field name="Index size" size="3" start="2:17" type="Index size"/>
513    <field name="Unk 2c" size="4" start="2:20" type="hex" default="0xF"/>
514    <field name="Unk 2d" size="8" start="2:24" type="hex" default="0x61"/>
515    <field name="Index buffer offset" size="32" start="3:0" type="hex"/>
516    <field name="Index count" size="32" start="4:0" type="uint"/>
517    <field name="Instance count" size="32" start="5:0" type="uint"/>
518    <field name="Base vertex" size="32" start="6:0" type="uint"/>
519    <field name="Index buffer size" size="32" start="7:0" type="uint" modifier="shr(2)"/>
520  </struct>
521
522  <!--- Command to launch a direct compute kernel -->
523  <struct name="Launch" size="36">
524    <field name="Command" size="32" start="0:0" type="hex" default="0x1002"/>
525    <field name="Pipeline" size="32" start="1:0" type="address"/>
526    <field name="Group count X" size="32" start="2:0" type="uint"/>
527    <field name="Group count Y" size="32" start="3:0" type="uint"/>
528    <field name="Group count Z" size="32" start="4:0" type="uint"/>
529    <field name="Local size X" size="32" start="5:0" type="uint"/>
530    <field name="Local size Y" size="32" start="6:0" type="uint"/>
531    <field name="Local size Z" size="32" start="7:0" type="uint"/>
532    <field name="Unk" size="32" start="8:0" type="hex" default="0x60000160"/>
533  </struct>
534
535  <!--- The rest of this file is likely software defined by macOS kernel -->
536  <enum name="IOGPU Attachment Type">
537    <value name="Colour" value="0xE"/>
538    <value name="Depth" value="0x10"/>
539    <value name="Stencil" value="0x11"/>
540    <value name="Visibility" value="0x12"/>
541  </enum>
542
543  <struct name="IOGPU Header" size="640">
544    <field name="Unk 0" start="0:0" size="32" default="0x10000" type="hex"/>
545    <field name="Total size" start="1:0" size="32" type="uint"/>
546    <!-- 0x7 in 11.x -->
547    <field name="Unk 2" start="2:0" size="32" default="0x4" type="hex"/>
548    <field name="Attachment length" start="9:0" size="32" type="uint"/>
549    <field name="Attachment offset" start="10:0" size="32" type="uint"/>
550    <field name="Unknown offset" start="11:0" size="32" type="uint"/>
551    <field name="Unk 4" start="12:0" size="32" default="0x30" type="hex"/>
552    <field name="Unk 5" start="13:0" size="32" default="0x01" type="hex"/>
553    <field name="Encoder" start="14:0" size="64" type="address"/>
554    <!-- if either deflake address is null, rendering gets flaky for high
555         geometry counts -->
556    <field name="Deflake 1" start="38:0" size="64" type="address"/>
557    <field name="Deflake 2" start="40:0" size="64" type="address"/>
558    <field name="Unk 54" start="54:0" size="32" default="0x6b0003" type="hex"/>
559    <field name="Unk 55" start="55:0" size="32" default="0x3a0012" type="hex"/>
560    <field name="Unk 56" start="56:0" size="32" default="0x1" type="hex"/>
561    <field name="Deflake 3" start="110:0" size="64" type="address"/>
562    <field name="Unk 112" start="112:0" size="32" default="0x1" type="hex"/>
563    <field name="Unk 114" start="114:0" size="32" default="0x1c" type="hex"/>
564    <field name="Unk 118" start="118:0" size="32" default="0xffffffff" type="hex"/>
565    <field name="Unk 119" start="119:0" size="32" default="0xffffffff" type="hex"/>
566    <field name="Unk 120" start="120:0" size="32" default="0xffffffff" type="hex"/>
567  </struct>
568
569  <struct name="IOGPU Attachment" size="24">
570    <field name="Unk 0" start="0:0" size="16" default="0x100" type="hex"/>
571    <field name="Address" start="0:16" size="48" type="address"/>
572    <field name="Type" start="2:16" size="16" type="IOGPU Attachment Type"/>
573    <field name="Size" start="3:9" size="32" type="uint"/>
574    <field name="Unk 3" start="4:16" size="4" type="hex" default="0xC"/>
575    <!-- Percent of total attachment space used for this attachment, expressed
576         in a decimal percentage [0, 100] <field name="Percent" start="5:16" -->
577    <field name="Percent" start="5:16" size="16" type="uint"/>
578  </struct>
579
580  <struct name="IOGPU Internal Pipelines" size="272">
581    <field name="Clear pipeline bind" start="2:0" size="32" type="hex"/>
582    <field name="Clear pipeline unk" start="4:0" size="4" default="4" type="hex"/>
583    <field name="Clear pipeline" start="4:4" size="28" type="address" modifier="shr(4)"/>
584    <field name="Store pipeline bind" start="10:0" size="32" type="hex"/>
585    <field name="Store pipeline unk" start="12:0" size="4" default="4" type="hex"/>
586    <field name="Store pipeline" start="12:4" size="28" type="address" modifier="shr(4)"/>
587    <field name="Scissor array" start="14:0" size="64" type="address"/>
588    <field name="Depth bias array" start="16:0" size="64" type="address"/>
589    <!-- 0xc0154 with depth clear and z32f and s8
590         0x40154 with z32f and s8
591         0x44 with z32f
592         0x4000044 with z16?
593    -->
594    <field name="Depth flags" start="20:0" size="32" type="hex"/>
595    <field name="Depth compression" start="20:6" size="1" type="bool"/>
596    <field name="Depth reload" start="20:15" size="1" type="bool"/>
597    <field name="Depth format 16 unorm" start="20:26" size="1" type="bool"/>
598    <field name="Depth width" start="26:0" size="15" type="uint" default="1" modifier="minus(1)"/>
599    <field name="Depth height" start="26:15" size="15" type="uint" default="1" modifier="minus(1)"/>
600    <field name="Depth buffer (if clearing)" start="28:0" size="64" type="address"/>
601    <field name="Depth acceleration buffer (if clearing)" start="34:0" size="64" type="address"/>
602    <!-- bytes unknown type 888F50 -->
603    <field name="Depth buffer" start="38:0" size="64" type="address"/>
604    <!-- 16384 bytes, initialized with 0x7F bytes -->
605    <field name="Depth acceleration buffer" start="44:0" size="64" type="address"/>
606    <field name="Stencil buffer" start="48:0" size="64" type="address"/>
607    <!--- 16384 bytes, initialized with 0x1F bytes -->
608    <field name="Stencil acceleration buffer" start="54:0" size="64" type="address"/>
609    <field name="Stencil buffer 2" start="58:0" size="64" type="address"/>
610    <field name="Stencil acceleration buffer 2" start="64:0" size="64" type="address"/>
611  </struct>
612
613  <struct name="IOGPU Aux Framebuffer" size="256">
614    <field name="Unk 0" start="0:0" size="32" default="0x4" type="hex"/>
615    <field name="Unk 1" start="2:0" size="16" default="0xc000" type="hex"/>
616    <field name="Z16 Unorm attachment" start="2:18" size="1" type="bool"/>
617    <field name="Width" start="4:0" size="32" type="uint"/>
618    <field name="Height" start="5:0" size="32" type="uint"/>
619    <field name="Pointer" start="6:0" size="64" type="address"/>
620  </struct>
621
622  <struct name="IOGPU Clear Z/S" size="256">
623    <!-- Encoded like the depth attachment -->
624    <field name="Depth clear value" start="0:0" size="32" type="hex"/>
625    <field name="Stencil clear value" start="1:0" size="8" type="uint"/>
626    <field name="Unk 1" start="1:8" size="8" type="hex" default="3"/>
627    <field name="Set when reloading Z 1" start="3:8" size="1" type="bool"/>
628    <field name="Set when reloading Z 2" start="4:24" size="1" type="bool"/>
629    <field name="Z16 Unorm attachment" start="5:8" size="1" type="bool"/>
630    <field name="Unk 3" start="6:0" size="32" type="hex" default="0xffffffff"/>
631    <field name="Unk 4" start="7:0" size="32" type="hex" default="0xffffffff"/>
632    <field name="Unk 5" start="8:0" size="32" type="hex" default="0xffffffff"/>
633    <field name="Visibility result buffer" start="10:0" size="64" type="address"/>
634    <field name="Partial reload pipeline bind" start="20:0" size="32" type="hex"/>
635    <field name="Partial reload pipeline unk" start="22:0" size="4" default="4" type="hex"/>
636    <field name="Partial reload pipeline" start="22:4" size="28" type="address" modifier="shr(4)"/>
637    <field name="Partial store pipeline bind" start="28:0" size="32" type="hex"/>
638    <field name="Partial store pipeline unk" start="30:0" size="4" default="4" type="hex"/>
639    <field name="Partial store pipeline" start="30:4" size="28" type="address" modifier="shr(4)"/>
640  </struct>
641
642  <struct name="IOGPU Misc" size="288">
643    <!-- New in 12.x -->
644    <field name="Depth buffer" start="0:0" size="64" type="address"/>
645    <field name="Depth acceleration buffer" start="2:0" size="64" type="address"/>
646    <field name="Stencil buffer" start="4:0" size="64" type="address"/>
647    <field name="Stencil acceleration buffer" start="6:0" size="64" type="address"/>
648    <!-- maybe only set when doing a depth clear? -->
649    <field name="Unk 8:0" start="12:0" size="32" default="0x1" type="hex"/>
650    <field name="Unk 16:0" start="20:0" size="32" default="0x1c" type="hex"/>
651    <field name="Encoder ID" start="22:0" size="32" type="hex"/>
652    <!-- top bit maybe only set with a depth clear? -->
653    <field name="Unk 21:0" start="25:0" size="64" default="0x1ffffffff" type="hex"/>
654    <field name="Unknown buffer" start="30:0" size="64" type="address"/>
655    <field name="Width" start="42:0" size="32" type="uint"/>
656    <field name="Height" start="43:0" size="32" type="uint"/>
657    <field name="Unk 32:0" start="44:0" size="32" default="1" type="uint"/>
658    <field name="Unk 33:0" start="45:0" size="32" default="8" type="uint"/>
659    <field name="Unk 34:0" start="46:0" size="32" default="8" type="uint"/>
660    <field name="Unk 49:0" start="61:0" size="32" default="8" type="uint"/>
661    <field name="Unk 50:0" start="62:0" size="32" default="32" type="uint"/>
662    <field name="Unk 51:0" start="63:0" size="32" default="32" type="uint"/>
663    <field name="Unk 52:0" start="64:0" size="32" default="1" type="uint"/>
664    <field name="Unk 56:0" start="68:0" size="32" default="0" type="uint"/>
665    <field name="Unk 70:0" start="70:0" size="32" default="1" type="uint"/>
666  </struct>
667
668  <struct name="IOGPU Attachment Count" size="16">
669    <field name="Count" start="3:0" size="32" type="uint"/>
670  </struct>
671
672</agxml>
673