GPU/GL Arrays

From 3dbrew
< GPU
Revision as of 15:17, 31 July 2015 by Neobrain (talk | contribs) (Add a note on DMP's variable-size primitives.)
Jump to navigation Jump to search

This page describes the GPU commands used for OpenGL arrays.

Command Sets

glDrawElements()
Command Index CommandID Parameter Description
0 0x0229 u32, val<<8. Unknown, val is 0 or 1.
1-2 0x0253 Same as command 0x0229. Unknown
3 0x025E u32, val<<8. This sets the GL rendering mode.
4 0x025E Value 0 ?
5 0x025F Value 1 ?
6 0x0253 Value 0 ?
7 0x0227 u32 This specifies the indices data-type, and the indices array address.
8 0x0228 u32 This specifies the number of elements in the array to use for rendering.
9 0x0245 Value 0 ?
10 0x022F Value 1 ?
11 0x0245 Value 1 ?
12 0x0231 Value 1 ?
13 0x0111 Value 1 ?
14 0x0229 Value 0 ?
15 0x0253 Value 0 ?
16 0x025E Value 0 ?
17 0x02BA Value 0x7FFF0000 ?
Command 0x0200
Command Index CommandID Parameter Description
0 0x0200 This sets the addresses for the GL arrays.
1 0x02BB ?
2 0x0232 Unknown, this command is used multiple times for specifying each parameter-buffer entry.

GL mode values for command 0x025E

Value Description
0 GL_TRIANGLES
1 GL_TRIANGLE_STRIP
2 GL_TRIANGLE_FAN
3 Unknown. An unconfirmed theory is that this is used for variable-size primitives, for which the index buffer format is altered slightly (each sequence of indices constituting a primitive is prepended a number indicating the primitive size).
4 Unknown, this seems to have the same effect as value 0.

Parameter value format for command 0x0227

Bit Description
30-0 Indices array address, relative to base set with command 0x0200.
31 0 = indices data-type GL_UNSIGNED_BYTE, 1 = GL_UNSIGNED_SHORT.

Parameter structure for command 0x0200

Index Word Description
0x0 Base physical address >> 3, normally located in VRAM. The address must be aligned to a 16-byte boundary.
0x1 Every 4 bits is used for specifying the array data-type and size for each entry.
0x2 Value is: (0xF0000000 + (val<<28)) | ((attrib_mask & 0xFFF)<<16), where val is the total 4-bit value entries for the command 0x801F02BB parameter buffer.(Normally val is 8); attrib_mask is usually (0xFFF<<totalentries)
0x3-0x26 12 entries, each entry is 3 words.

These parameters and the entries' parameters are set by gl*Pointer().

Entry structure

Index Word Description
0 Physical address, relative to the base address.
1 Entry attribute permutation (lower 8 bytes)
2 Value is: ((numattrib)<<28 | (stride<<16) | ((attrib_permuation>>32)&0xFFFF). (stride in bytes)

A given entry corresponds to a buffer, but a single buffer may contain attributes of multiple different interlaced attributes, hence the attribute permutation parameter which lists the various attributes that can be found in the buffer, and in which order. If stride doesn't exactly match the format, the GPU may hang. When the entry is unused, the entry data is all-zero.

Array data-type/size values
Value GL type
0x0 + ((size-1)*4) GL_BYTE
0x1 + ((size-1)*4) GL_UNSIGNED_BYTE
0x2 + ((size-1)*4) GL_UNSIGNED_SHORT/GL_SHORT
0x3 + ((size-1)*4) GL_FLOAT

Size is 1-4. Using GL_FLOAT with a texture coordinates array causes the GPU to hang?

Parameter structure for command 0x02BB

Index Word Description
0-1 u64, every 4-bits is a value from some array.

Parameter structure for command 0x0232

Index Word Description
0 Entry index + total command 0x0200 parameter-buffer entries.
1 Unknown, usually value 0x3F000000 / 0.5f.(u32 read/writes are used for this field, not float read/writes however)
2 Unknown, usually value 0.
3 Unknown, usually value 0.

Each parameter buffer for command 0x0232 is an entry loaded from an array. 4 float24 values ?