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