GPU/GL Arrays

< GPU
Revision as of 20:34, 25 March 2013 by Yellows8 (talk | contribs)

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 ?
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)) | (((0xFF<<totalentries) & 0xFF)<<16), where val is the total 4-bit value entries for the CmdID 0x801F02BB parameter buffer.(Normally val is 8)
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 index
2 Value is: 0x10000000 | (arraytype<<16).

When the entry is unused, the entry data is all-zero.

Entry array types
Type Description
0x2 ?
0x3 Normals array
0x4 Texture coordinates array
0xC Vertex array
0x10 Color array
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.