Changes

8,020 bytes added ,  09:16, 4 December 2015
Line 6,880: Line 6,880:     
== Geometry pipeline registers ==
 
== Geometry pipeline registers ==
 +
 +
=== GPUREG_ATTRIBBUFFERS_LOC ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 1-28
 +
| unsigned, Vertex arrays base address
 +
|}
 +
 +
=== GPUREG_ATTRIBBUFFERS_FORMAT_LOW ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-1
 +
| unsigned, Vertex attribute 0 type
 +
|-
 +
| 2-3
 +
| unsigned, Vertex attribute 0 size
 +
|-
 +
| 4-5
 +
| unsigned, Vertex attribute 1 type
 +
|-
 +
| 6-7
 +
| unsigned, Vertex attribute 1 size
 +
|-
 +
| 8-9
 +
| unsigned, Vertex attribute 2 type
 +
|-
 +
| 10-11
 +
| unsigned, Vertex attribute 2 size
 +
|-
 +
| 12-13
 +
| unsigned, Vertex attribute 3 type
 +
|-
 +
| 14-15
 +
| unsigned, Vertex attribute 3 size
 +
|-
 +
| 16-17
 +
| unsigned, Vertex attribute 4 type
 +
|-
 +
| 18-19
 +
| unsigned, Vertex attribute 4 size
 +
|-
 +
| 20-21
 +
| unsigned, Vertex attribute 5 type
 +
|-
 +
| 22-23
 +
| unsigned, Vertex attribute 5 size
 +
|-
 +
| 24-25
 +
| unsigned, Vertex attribute 6 type
 +
|-
 +
| 26-27
 +
| unsigned, Vertex attribute 6 size
 +
|-
 +
| 28-29
 +
| unsigned, Vertex attribute 7 type
 +
|-
 +
| 30-31
 +
| unsigned, Vertex attribute 7 size
 +
|}
 +
 +
Vertex attribute type values:
 +
 +
{| class="wikitable" border="1"
 +
! Value
 +
! Description
 +
|-
 +
| 0
 +
| Byte
 +
|-
 +
| 1
 +
| Unsigned byte
 +
|-
 +
| 2
 +
| Short
 +
|-
 +
| 3
 +
| Float
 +
|}
 +
 +
Vertex attribute size values:
 +
 +
{| class="wikitable" border="1"
 +
! Value
 +
! Description
 +
|-
 +
| 0
 +
| 8 bits
 +
|-
 +
| 1
 +
| 16 bits
 +
|-
 +
| 2
 +
| 24 bits
 +
|-
 +
| 3
 +
| 32 bits
 +
|}
 +
 +
=== GPUREG_ATTRIBBUFFERS_FORMAT_HIGH ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-1
 +
| unsigned, Vertex attribute 8 type
 +
|-
 +
| 2-3
 +
| unsigned, Vertex attribute 8 size
 +
|-
 +
| 4-5
 +
| unsigned, Vertex attribute 9 type
 +
|-
 +
| 6-7
 +
| unsigned, Vertex attribute 9 size
 +
|-
 +
| 8-9
 +
| unsigned, Vertex attribute 10 type
 +
|-
 +
| 10-11
 +
| unsigned, Vertex attribute 10 size
 +
|-
 +
| 12-13
 +
| unsigned, Vertex attribute 11 type
 +
|-
 +
| 14-15
 +
| unsigned, Vertex attribute 11 size
 +
|-
 +
| 16-27
 +
| unsigned, Fixed vertex attribute mask
 +
|-
 +
| 28-31
 +
| unsigned, Total vertex attribute count - 1
 +
|}
 +
 +
See GPUREG_ATTRIBBUFFERS_FORMAT_LOW for vertex attribute type and size values.
 +
 +
=== GPUREG_ATTRIBBUFFER''i''_OFFSET ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-27
 +
| unsigned, Offset from base vertex arrays address
 +
|}
 +
 +
=== GPUREG_ATTRIBBUFFER''i''_CONFIG1 ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-3
 +
| unsigned, Component 1
 +
|-
 +
| 4-7
 +
| unsigned, Component 2
 +
|-
 +
| 8-11
 +
| unsigned, Component 3
 +
|-
 +
| 12-15
 +
| unsigned, Component 4
 +
|-
 +
| 16-19
 +
| unsigned, Component 5
 +
|-
 +
| 20-23
 +
| unsigned, Component 6
 +
|-
 +
| 24-27
 +
| unsigned, Component 7
 +
|-
 +
| 28-31
 +
| unsigned, Component 8
 +
|}
 +
 +
Component values:
 +
 +
{| class="wikitable" border="1"
 +
! Value
 +
! Description
 +
|-
 +
| 0
 +
| Vertex attribute 0
 +
|-
 +
| 1
 +
| Vertex attribute 1
 +
|-
 +
| 2
 +
| Vertex attribute 2
 +
|-
 +
| 3
 +
| Vertex attribute 3
 +
|-
 +
| 4
 +
| Vertex attribute 4
 +
|-
 +
| 5
 +
| Vertex attribute 5
 +
|-
 +
| 6
 +
| Vertex attribute 6
 +
|-
 +
| 7
 +
| Vertex attribute 7
 +
|-
 +
| 8
 +
| Vertex attribute 8
 +
|-
 +
| 9
 +
| Vertex attribute 9
 +
|-
 +
| 10
 +
| Vertex attribute 10
 +
|-
 +
| 11
 +
| Vertex attribute 11
 +
|-
 +
| 12
 +
| 4-byte padding
 +
|-
 +
| 13
 +
| 8-byte padding
 +
|-
 +
| 14
 +
| 12-byte padding
 +
|-
 +
| 15
 +
| 16-byte padding
 +
|}
 +
 +
=== GPUREG_ATTRIBBUFFER''i''_CONFIG2 ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-3
 +
| unsigned, Component 9
 +
|-
 +
| 4-7
 +
| unsigned, Component 10
 +
|-
 +
| 8-11
 +
| unsigned, Component 11
 +
|-
 +
| 12-15
 +
| unsigned, Component 12
 +
|-
 +
| 16-23
 +
| unsigned, Bytes per vertex
 +
|-
 +
| 28-31
 +
| unsigned, Total number of components
 +
|}
 +
 +
See GPUREG_ATTRIBBUFFER''i''_CONFIG1 for component values.
 +
 +
=== GPUREG_INDEXBUFFER_CONFIG ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-27
 +
| unsigned, Offset from base vertex arrays address
 +
|-
 +
| 31
 +
| Index type (0 = unsigned byte, 1 = unsigned short or drawing arrays)
 +
|}
 +
 +
=== GPUREG_NUMVERTICES ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-31
 +
| unsigned, Number of vertices to render
 +
|}
    
=== GPUREG_GEOSTAGE_CONFIG ===
 
=== GPUREG_GEOSTAGE_CONFIG ===
Line 6,887: Line 7,175:  
! Description
 
! Description
 
|-
 
|-
| 0-7
+
| 0-1
| unsigned, Geometry stage mode. (0=Vertex shader only, 2=Vertex shader + geometry shader)
+
| unsigned, Geometry shader in use (0 = not in use, 2 = in use)
 
|-
 
|-
 
| 8
 
| 8
| Unknown. Seems to skip every other triangle when used with indexed rendering and without geoshaders. Has no effect with non-indexed rendering without geoshaders. '''If this is 0, you don't need to use GPU_UNKPRIM with DrawElements.'''
+
| unsigned, Drawing triangle elements (0 = not, 1 = drawing triangle elements)
 
|-
 
|-
| 9-15
+
| 9
| No effect.
+
| 0x0
 
|-
 
|-
 
| 16-23
 
| 16-23
| Unknown.
+
| 0x0
 
|-
 
|-
| 24-31
+
| 31
| Unknown. Often set to 0.
+
| unsigned, Use reserved geometry shader subdivision (0 = don't use, 1 = use)
 
|}
 
|}
    
This register configures the geometry stage of the GPU pipeline.
 
This register configures the geometry stage of the GPU pipeline.
 +
 +
=== GPUREG_VERTEX_OFFSET ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-31
 +
| unsigned, Starting vertex offset
 +
|}
 +
 +
=== GPUREG_POST_VERTEX_CACHE_NUM ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-7
 +
| unsigned, Number of entries in the post-vertex cache (usually 0x4 or 0x84)
 +
|}
 +
 +
=== GPUREG_DRAWARRAYS ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-31
 +
| unsigned, Trigger (0 = idle, non-zero = draw arrays)
 +
|}
 +
 +
=== GPUREG_DRAWELEMENTS ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-31
 +
| unsigned, Trigger (0 = idle, non-zero = draw elements)
 +
|}
 +
 +
=== GPUREG_VTX_FUNC ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-31
 +
| unsigned, Trigger (0 = idle, non-zero = clear post-vertex cache)
 +
|}
    
=== GPUREG_FIXEDATTRIB_INDEX ===
 
=== GPUREG_FIXEDATTRIB_INDEX ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-3
 +
| unsigned, Fixed attribute index (0-11, 0xF = immediate-mode submission)
 +
|}
    
See [[GPU/Fixed Vertex Attributes]] and [[GPU/Immediate-Mode Vertex Submission]] for usage info.
 
See [[GPU/Fixed Vertex Attributes]] and [[GPU/Immediate-Mode Vertex Submission]] for usage info.
 +
 +
=== GPUREG_FIXEDATTRIB_DATA0 ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-23
 +
| float1.7.16, Vertex attribute element 1
 +
|-
 +
| 24-31
 +
| float1.7.16, Vertex attribute element 2 (lower 8 bits)
 +
|}
 +
 +
Accepts the first part of the four 24-bit floating-point values that make up a vertex attribute. Stored in the fixed attribute currently specified with GPUREG_FIXEDATTRIB_INDEX. If immediate-mode vertex submission is enabled (by writing 0xF to the index register) then vertex data is input here directly.
 +
 +
=== GPUREG_FIXEDATTRIB_DATA1 ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-23
 +
| float1.7.16, Vertex attribute element 2 (upper 16 bits)
 +
|-
 +
| 24-31
 +
| float1.7.16, Vertex attribute element 3 (lower 16 bits)
 +
|}
 +
 +
 +
Accepts the second part of the four 24-bit floating-point values that make up a vertex attribute. Stored in the fixed attribute currently specified with GPUREG_FIXEDATTRIB_INDEX. If immediate-mode vertex submission is enabled (by writing 0xF to the index register) then vertex data is input here directly.
 +
 +
=== GPUREG_FIXEDATTRIB_DATA2 ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-23
 +
| float1.7.16, Vertex attribute element 3 (upper 8 bits)
 +
|-
 +
| 24-31
 +
| float1.7.16, Vertex attribute element 4
 +
|}
 +
 +
Accepts the third part of the four 24-bit floating-point values that make up a vertex attribute. Stored in the fixed attribute currently specified with GPUREG_FIXEDATTRIB_INDEX. If immediate-mode vertex submission is enabled (by writing 0xF to the index register) then vertex data is input here directly.
 +
 +
=== GPUREG_CMDBUF_SIZE0 ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-20
 +
| unsigned, Size of command buffer 0 >> 3
 +
|}
 +
 +
=== GPUREG_CMDBUF_SIZE1 ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-20
 +
| unsigned, Size of command buffer 1 >> 3
 +
|}
 +
 +
=== GPUREG_CMDBUF_ADDR0 ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-28
 +
| unsigned, Physical address of command buffer 0 >> 3
 +
|}
 +
 +
=== GPUREG_CMDBUF_ADDR1 ===
 +
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-28
 +
| unsigned, Physical address of command buffer 1 >> 3
 +
|}
 +
 +
=== GPUREG_CMDBUF_JUMP0 ===
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 6,914: Line 7,348:  
|-
 
|-
 
| 0-31
 
| 0-31
| Sets the active fixed attribute index. This is the fixed attribute which will be set when writing to [[#GPUREG_FIXEDATTRIB_DATA|GPUREG_FIXEDATTRIB_DATA]]. Valid values are 0-11. If the special value 0xF is written here, this sets up immediate-mode vertex submission instead, and writes to the data register will input vertex data directly into the pipeline.
+
| unsigned, Trigger (0 = idle, non-zero = execute command buffer 0)
 
|}
 
|}
   −
=== GPUREG_FIXEDATTRIB_DATA ===
+
=== GPUREG_CMDBUF_JUMP1 ===
   −
Accepts a packed 4-tuple of float24 values (in the same format used for [[#GPUREG_VSH_FLOATUNIFORM_DATA|specifying shader uniforms]]). This is stored as the fixed attribute value for the attribute currently specified in the index register. Attributes are always specified as a 4-tuple of floats, regardless of the format configured in [[#GPUREG_ATTRIBBUFFERS_FORMAT_HIGH|GPUREG_ATTRIBBUFFERS_FORMAT_HIGH]].
+
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-31
 +
| unsigned, Trigger (0 = idle, non-zero = execute command buffer 1)
 +
|}
   −
If immediate-mode vertex submission is enabled (by writing 0xF to the index register) then vertex data is input here directly. The index register does not need to be re-set after each write.
+
=== GPUREG_VSH_NUM_ATTR ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-3
 +
| unsigned, Number of vertex shader input attributes - 1
 +
|}
 +
 
 +
=== GPUREG_VSH_COM_MODE ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0
 +
| unsigned, Geometry shader configuration enabled (0 = disabled, 1 = enabled)
 +
|-
 +
| 8-31
 +
| 0x0
 +
|}
 +
 
 +
=== GPUREG_START_DRAW_FUNC0 ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0
 +
| unsigned, Mode (0 = drawing, 1 = configuration)
 +
|-
 +
| 1-31
 +
| 0x0
 +
|}
 +
 
 +
When the mode value is set to 1, rendering is not performed properly. When set to 0, changes to the vertex shader configuration registers are not applied correctly.
 +
 
 +
=== GPUREG_VSH_OUTMAP_TOTAL1 ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-3
 +
| unsigned, Number of vertex shader output map registers - 1
 +
|}
 +
 
 +
=== GPUREG_VSH_OUTMAP_TOTAL2 ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-3
 +
| unsigned, Number of vertex shader output map registers - 1
 +
|}
 +
 
 +
=== GPUREG_GSH_MISC0 ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-31
 +
| unsigned, Misc data (0x00000001 = Reserved geometry shader subdivision in use, 0x01004302 = Particle system in use, 0 otherwise)
 +
|}
 +
 
 +
=== GPUREG_GEOSTAGE_CONFIG2 ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0
 +
| unsigned, Draw command active (0 = not active, 1 = active)
 +
|-
 +
| 8
 +
| unsigned, Drawing triangle elements (0 = not, 1 = drawing triangle elements)
 +
|-
 +
| 9
 +
| 0x0
 +
|-
 +
| 16-31
 +
| 0x0
 +
|}
 +
 
 +
This register is set to 1 before draw arrays/elements calls and cleared immediately after. While set to 1, some register writes out side of the 0x200-0x254 and
 +
0x280-0x2DF ranges may be processed incorrectly.
 +
 
 +
=== GPUREG_GSH_MISC1 ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-4
 +
| unsigned, Reserved geometry shader subdivision type (2 = Loop, 3 = Catmull-Clark)
 +
|}
 +
 
 +
=== GPUREG_PRIMITIVE_CONFIG ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-3
 +
| unsigned,  Number of vertex shader output map registers - 1
 +
|-
 +
| 8-9
 +
| unsigned, Primitive mode
 +
|-
 +
| 16
 +
| 0x0
 +
|}
 +
 
 +
Primitive mode value:
 +
 
 +
{| class="wikitable" border="1"
 +
! Value
 +
! Description
 +
|-
 +
| 0
 +
| Triangles
 +
|-
 +
| 1
 +
| Triangle strip
 +
|-
 +
| 2
 +
| Triangle fan
 +
|-
 +
| 3
 +
| Geometry primitive
 +
|}
    
=== GPUREG_RESTART_PRIMITIVE ===
 
=== GPUREG_RESTART_PRIMITIVE ===
Line 6,929: Line 7,502:  
! Description
 
! Description
 
|-
 
|-
| 0-7
+
| 0
| Writing 0x01 to this field ends the current triangle strip or fan. This is necessary before using these kinds of primitives with [[GPU:Immediate-Mode Vertex Submission|immediate-mode]], but most games seem to write to it before every draw call.
+
| unsigned, Trigger (0 = idle, 1 = reset primitive)
 +
|-
 +
| 1-31
 +
| 0x0
 
|}
 
|}
  
1,434

edits