GPU/GL Arrays

From 3dbrew
< GPU
Revision as of 16:35, 17 March 2014 by Smea (talk | contribs)
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 0x00020229 u32, val<<8. Unknown, val is 0 or 1.
1-2 0x00020253 Same as CmdID 0x00020229. Unknown
3 0x0002025E u32, val<<8. This sets the GL rendering mode.
4 0x0004025E Value 0 ?
5 0x000F025F Value 1 ?
6 0x00010253 Value 0 ?
7 0x000F0227 u32 This specifies the indices data-type, and the indices array address.
8 0x000F0228 u32 This specifies the number of elements in the array to use for rendering.
9 0x00010245 Value 0 ?
10 0x000F022F Value 1 ?
11 0x00010245 Value 1 ?
12 0x000F0231 Value 1 ?
13 0x000F0111 Value 1 ?
14 0x00020229 Value 0 ?
15 0x00020253 Value 0 ?
16 0x0002025E Value 0 ?
17 0x000C02BA Value 0x7FFF0000 ?
CmdID 0x826F0200
Command Index CommandID Parameter Description
0 0x826F0200 This sets the addresses for the GL arrays.
1 0x801F02BB ?
2 0x803F0232 Unknown, this command is used multiple times for specifying each parameter-buffer entry.

GL mode values for CmdID 0x0002025E

Value Description
0 GL_TRIANGLES
1 GL_TRIANGLE_STRIP
2 GL_TRIANGLE_FAN
3 GL_TRIANGLES
4 Unknown, this seems to have the same effect as value 0.

Parameter value format for CmdID 0x000F0227

Bit Description
30-0 Indices array address, relative to VRAM physical address 0x18000000. Thus, when this relative address is 0x08XXXXXX, the array is located in FCRAM.
31 0 = indices data-type GL_UNSIGNED_BYTE, 1 = GL_UNSIGNED_SHORT.

Parameter structure for CmdID 0x826F0200

Index Word Description
0x0 Base physical address >> 3, normally located in VRAM.
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 CmdID 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. 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 CmdID 0x801F02BB

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

Parameter structure for CmdID 0x803F0232

Index Word Description
0 Entry index + total CmdID 0x826F0200 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 CmdID 0x803F0232 is an entry loaded from an array.