freedreno: Update A6XX_PC_MODE_CNTL definition and values

This register seems to be fairly critical on A7XX for vertex processing
performance, and was set to an unoptimal value for the A730/A735/A740
which has now been updated to a value that maximizes performance and
aligns with the proprietary driver.

Fixes #15411

Signed-off-by: Dhruv Mark Collins <mark@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41451>
This commit is contained in:
Dhruv Mark Collins 2026-05-09 14:33:17 +00:00 committed by Marge Bot
parent 360650d189
commit 23f94c692c
7 changed files with 47 additions and 29 deletions

View file

@ -873,7 +873,7 @@ a730_raw_magic_regs = [
[A6XXRegs.REG_A7XX_UCHE_UNKNOWN_0E11, 0x00000040],
[A6XXRegs.REG_A7XX_SP_HLSQ_DBG_ECO_CNTL, 0x00008000],
[A6XXRegs.REG_A6XX_SP_DBG_ECO_CNTL, 0x10000000],
[A6XXRegs.REG_A6XX_PC_MODE_CNTL, 0x0000003f], # 0x00001f1f in some tests
[A6XXRegs.REG_A6XX_PC_MODE_CNTL, 0x1f1f],
[A6XXRegs.REG_A6XX_PC_DBG_ECO_CNTL, 0x20080000],
[A6XXRegs.REG_A7XX_PC_UNKNOWN_9E24, 0x21fc7f00],
[A6XXRegs.REG_A7XX_VFD_DBG_ECO_CNTL, 0x00000000],
@ -922,9 +922,7 @@ a740_raw_magic_regs = [
[A6XXRegs.REG_A7XX_UCHE_UNKNOWN_0E11, 0x00000000],
[A6XXRegs.REG_A7XX_SP_HLSQ_DBG_ECO_CNTL, 0x00000000],
[A6XXRegs.REG_A6XX_SP_DBG_ECO_CNTL, 0x10000000],
# Blob uses 0x1f or 0x1f1f, however these values cause vertices
# corruption in some tests.
[A6XXRegs.REG_A6XX_PC_MODE_CNTL, 0x0000003f],
[A6XXRegs.REG_A6XX_PC_MODE_CNTL, 0x1f1f],
[A6XXRegs.REG_A6XX_PC_DBG_ECO_CNTL, 0x00100000],
[A6XXRegs.REG_A7XX_PC_UNKNOWN_9E24, 0x21585600],
[A6XXRegs.REG_A7XX_VFD_DBG_ECO_CNTL, 0x00008000],
@ -1028,7 +1026,7 @@ add_gpus([
[A6XXRegs.REG_A7XX_UCHE_UNKNOWN_0E11, 0x00000000],
[A6XXRegs.REG_A7XX_SP_HLSQ_DBG_ECO_CNTL, 0x00000000],
[A6XXRegs.REG_A6XX_SP_DBG_ECO_CNTL, 0x10000000],
[A6XXRegs.REG_A6XX_PC_MODE_CNTL, 0x1f],
[A6XXRegs.REG_A6XX_PC_MODE_CNTL, 0x1f1f],
[A6XXRegs.REG_A6XX_PC_DBG_ECO_CNTL, 0x00100000],
[A6XXRegs.REG_A7XX_PC_UNKNOWN_9E24, 0x01585600],
[A6XXRegs.REG_A7XX_VFD_DBG_ECO_CNTL, 0x00008000],
@ -1111,9 +1109,7 @@ add_gpus([
[A6XXRegs.REG_A7XX_UCHE_UNKNOWN_0E11, 0x00000080],
[A6XXRegs.REG_A7XX_SP_HLSQ_DBG_ECO_CNTL, 0x00000000],
[A6XXRegs.REG_A6XX_SP_DBG_ECO_CNTL, 0x10000000],
# Blob uses 0x1f or 0x1f1f, however these values cause vertices
# corruption in some tests.
[A6XXRegs.REG_A6XX_PC_MODE_CNTL, 0x0000003f],
[A6XXRegs.REG_A6XX_PC_MODE_CNTL, 0x1f1f],
[A6XXRegs.REG_A6XX_PC_DBG_ECO_CNTL, 0x00100000],
[A6XXRegs.REG_A7XX_PC_UNKNOWN_9E24, 0x21585600],
[A6XXRegs.REG_A7XX_VFD_DBG_ECO_CNTL, 0x00008000],

View file

@ -3286,7 +3286,29 @@ by a particular renderpass/blit.
<reg32 offset="0x9803" name="PC_RESTART_INDEX" low="0" high="31" type="uint" variants="A6XX-A7XX" usage="draw"/>
<reg32 offset="0x9b15" name="PC_RESTART_INDEX" low="0" high="31" type="uint" variants="A8XX-" usage="draw"/>
<reg32 offset="0x9804" name="PC_MODE_CNTL" low="0" high="7" variants="A6XX-A7XX" usage="draw"/>
<reg32 offset="0x9804" name="PC_MODE_CNTL" low="0" high="7" variants="A6XX-A7XX" usage="draw">
<!--
The higher this is set, the faster primitive processing performance
ends up being. It is likely the amount of entries to process/fetch.
-->
<bitfield name="COUNT1" low="0" high="4" type="uint"/>
<!--
Setting this slows down primitive processing substantially, but it
was noted to fix some vertex corruption issues in the past. Likely
serves as a workaround to serialize the primitive pipeline?
-->
<bitfield name="UNK5" pos="5" type="boolean"/>
<!-- Never set by the blob, removed in A7XX. Unclear impact. -->
<bitfield name="UNK6" pos="6" type="boolean" variants="A6XX"/>
<!-- Never set by the blob. Unclear impact. -->
<bitfield name="UNK7" pos="7" type="boolean"/>
<!--
Same as COUNT1 but one bit larger, this replaces COUNT1 mid-A7XX but
the proprietary driver tends to set it to the same or larger value
(by using the extra bit) as COUNT1.
-->
<bitfield name="COUNT2" low="8" high="13" type="uint" variants="A7XX-"/>
</reg32>
<reg32 offset="0x9b00" name="PC_MODE_CNTL" low="0" high="14" variants="A8XX" usage="draw"/>
<reg32 offset="0x9805" name="PC_POWER_CNTL" low="0" high="2" variants="A6XX" usage="draw"/>

View file

@ -6154,7 +6154,7 @@ WARNING: 64b discontinuity (no _LO dword for 890d)
00000000 PC_HS_PARAM_1: { SIZE = 0 }
00000000 PC_DS_PARAM: { SPACING = TESS_EQUAL | OUTPUT = TESS_POINTS }
ffffffff PC_RESTART_INDEX: 4294967295
0000001f PC_MODE_CNTL: 0x1f
0000001f PC_MODE_CNTL: { COUNT1 = 31 }
00000001 PC_POWER_CNTL: 0x1
00000000 PC_PS_CNTL: { 0 }
00000002 PC_CNTL: { PROVOKING_VTX_LAST }
@ -6382,7 +6382,7 @@ WARNING: 64b discontinuity (no _LO dword for 890d)
00000000 PC_HS_PARAM_1: { SIZE = 0 }
00000000 PC_DS_PARAM: { SPACING = TESS_EQUAL | OUTPUT = TESS_POINTS }
ffffffff PC_RESTART_INDEX: 4294967295
0000001f PC_MODE_CNTL: 0x1f
0000001f PC_MODE_CNTL: { COUNT1 = 31 }
00000001 PC_POWER_CNTL: 0x1
00000000 PC_PS_CNTL: { 0 }
00000002 PC_CNTL: { PROVOKING_VTX_LAST }

View file

@ -6761,7 +6761,7 @@ WARNING: 64b discontinuity (no _LO dword for 890d)
00000000 PC_HS_PARAM_1: { SIZE = 0 }
00000000 PC_DS_PARAM: { SPACING = TESS_EQUAL | OUTPUT = TESS_POINTS }
ffffffff PC_RESTART_INDEX: 4294967295
0000001f PC_MODE_CNTL: 0x1f
0000001f PC_MODE_CNTL: { COUNT1 = 31 }
00000001 PC_POWER_CNTL: 0x1
00000000 PC_PS_CNTL: { 0 }
00000000 PC_CNTL: { 0 }
@ -6989,7 +6989,7 @@ WARNING: 64b discontinuity (no _LO dword for 890d)
00000000 PC_HS_PARAM_1: { SIZE = 0 }
00000000 PC_DS_PARAM: { SPACING = TESS_EQUAL | OUTPUT = TESS_POINTS }
ffffffff PC_RESTART_INDEX: 4294967295
0000001f PC_MODE_CNTL: 0x1f
0000001f PC_MODE_CNTL: { COUNT1 = 31 }
00000001 PC_POWER_CNTL: 0x1
00000000 PC_PS_CNTL: { 0 }
00000000 PC_CNTL: { 0 }
@ -8019,7 +8019,7 @@ got cmdszdw=38
!+? 00000001 VPC_SO_OVERRIDE: { DISABLE }
+? 00000000 VPC_DBG_ECO_CNTL: 0
+? 00000000 VPC_LB_MODE_CNTL: FALSE
!+? 0000001f PC_MODE_CNTL: 0x1f
!+? 0000001f PC_MODE_CNTL: { COUNT1 = 31 }
+? 00000000 PC_CONTEXT_SWITCH_GFX_PREEMPTION_MODE: 0
+? 00000000 VFD_RENDER_MODE: { RENDER_MODE = RENDERING_PASS }
!+? 00000001 VFD_MODE_CNTL: { VERTEX }
@ -8328,7 +8328,7 @@ got cmdszdw=38
+? 00000001 VPC_SO_OVERRIDE: { DISABLE }
+? 00000000 VPC_DBG_ECO_CNTL: 0
+? 00000000 VPC_LB_MODE_CNTL: FALSE
+? 0000001f PC_MODE_CNTL: 0x1f
+? 0000001f PC_MODE_CNTL: { COUNT1 = 31 }
+? 00000000 PC_CONTEXT_SWITCH_GFX_PREEMPTION_MODE: 0
+? 00000000 VFD_RENDER_MODE: { RENDER_MODE = RENDERING_PASS }
+? 00000001 VFD_MODE_CNTL: { VERTEX }
@ -8849,7 +8849,7 @@ got cmdszdw=38
!+ ff00ff00 VPC_PS_CNTL: { NUMNONPOSVAR = 0 | PRIMIDLOC = 255 | VIEWIDLOC = 255 }
+ 00000000 VPC_SO_CNTL: { BUF0_STREAM = 0 | BUF1_STREAM = 0 | BUF2_STREAM = 0 | BUF3_STREAM = 0 | STREAM_ENABLE = 0 }
00000001 VPC_SO_OVERRIDE: { DISABLE }
0000001f PC_MODE_CNTL: 0x1f
0000001f PC_MODE_CNTL: { COUNT1 = 31 }
+ 00000000 PC_PS_CNTL: { 0 }
+ 00000000 VPC_RAST_STREAM_CNTL: { STREAM = 0 }
!+ 00000003 PC_DGEN_RAST_CNTL: { MODE = POLYMODE6_TRIANGLES }
@ -9558,7 +9558,7 @@ got cmdszdw=38
+ ff00ff00 VPC_PS_CNTL: { NUMNONPOSVAR = 0 | PRIMIDLOC = 255 | VIEWIDLOC = 255 }
+ 00000000 VPC_SO_CNTL: { BUF0_STREAM = 0 | BUF1_STREAM = 0 | BUF2_STREAM = 0 | BUF3_STREAM = 0 | STREAM_ENABLE = 0 }
00000001 VPC_SO_OVERRIDE: { DISABLE }
0000001f PC_MODE_CNTL: 0x1f
0000001f PC_MODE_CNTL: { COUNT1 = 31 }
+ 00000000 PC_PS_CNTL: { 0 }
+ 00000000 VPC_RAST_STREAM_CNTL: { STREAM = 0 }
+ 00000003 PC_DGEN_RAST_CNTL: { MODE = POLYMODE6_TRIANGLES }
@ -10282,7 +10282,7 @@ got cmdszdw=38
+ ff00ff00 VPC_PS_CNTL: { NUMNONPOSVAR = 0 | PRIMIDLOC = 255 | VIEWIDLOC = 255 }
+ 00000000 VPC_SO_CNTL: { BUF0_STREAM = 0 | BUF1_STREAM = 0 | BUF2_STREAM = 0 | BUF3_STREAM = 0 | STREAM_ENABLE = 0 }
00000001 VPC_SO_OVERRIDE: { DISABLE }
0000001f PC_MODE_CNTL: 0x1f
0000001f PC_MODE_CNTL: { COUNT1 = 31 }
+ 00000000 PC_PS_CNTL: { 0 }
+ 00000000 VPC_RAST_STREAM_CNTL: { STREAM = 0 }
+ 00000003 PC_DGEN_RAST_CNTL: { MODE = POLYMODE6_TRIANGLES }
@ -10913,7 +10913,7 @@ ESTIMATED CRASH LOCATION!
+ ff00ff00 VPC_PS_CNTL: { NUMNONPOSVAR = 0 | PRIMIDLOC = 255 | VIEWIDLOC = 255 }
+ 00000000 VPC_SO_CNTL: { BUF0_STREAM = 0 | BUF1_STREAM = 0 | BUF2_STREAM = 0 | BUF3_STREAM = 0 | STREAM_ENABLE = 0 }
00000001 VPC_SO_OVERRIDE: { DISABLE }
0000001f PC_MODE_CNTL: 0x1f
0000001f PC_MODE_CNTL: { COUNT1 = 31 }
+ 00000000 PC_PS_CNTL: { 0 }
+ 00000000 VPC_RAST_STREAM_CNTL: { STREAM = 0 }
+ 00000003 PC_DGEN_RAST_CNTL: { MODE = POLYMODE6_TRIANGLES }
@ -11179,7 +11179,7 @@ ESTIMATED CRASH LOCATION!
+? 00000001 VPC_SO_OVERRIDE: { DISABLE }
+? 00000000 VPC_DBG_ECO_CNTL: 0
+? 00000000 VPC_LB_MODE_CNTL: FALSE
+? 0000001f PC_MODE_CNTL: 0x1f
+? 0000001f PC_MODE_CNTL: { COUNT1 = 31 }
+? 00000000 PC_CONTEXT_SWITCH_GFX_PREEMPTION_MODE: 0
+? 00000000 VFD_RENDER_MODE: { RENDER_MODE = RENDERING_PASS }
+? 00000001 VFD_MODE_CNTL: { VERTEX }

View file

@ -84,7 +84,7 @@ cmdstream[0]: 265 dwords
RB_MODE_CNTL: 0x1
00000000010580cc: 0000: 48881101 00000010
write PC_MODE_CNTL (9804)
PC_MODE_CNTL: 0x1f
PC_MODE_CNTL: { COUNT1 = 31 }
00000000010580d4: 0000: 48980401 0000001f
write RB_SRGB_CNTL (880f)
RB_SRGB_CNTL: { 0 }
@ -186,7 +186,7 @@ cmdstream[0]: 265 dwords
VFD_STEREO_RENDERING_CNTL: { VIEWS = 0 }
00000000010581dc: 0000: 40a00801 00000000
write PC_MODE_CNTL (9804)
PC_MODE_CNTL: 0x1f
PC_MODE_CNTL: { COUNT1 = 31 }
00000000010581e4: 0000: 48980401 0000001f
opcode: CP_SET_DRAW_STATE (43) (4 dwords)
{ COUNT = 0 | DISABLE_ALL_GROUPS | GROUP_ID = 0 }
@ -317,7 +317,7 @@ cmdstream[0]: 265 dwords
!+? 00000001 VPC_SO_OVERRIDE: { DISABLE }
+? 00000000 VPC_DBG_ECO_CNTL: 0
+? 00000000 VPC_LB_MODE_CNTL: FALSE
!+? 0000001f PC_MODE_CNTL: 0x1f
!+? 0000001f PC_MODE_CNTL: { COUNT1 = 31 }
+? 00000000 VPC_RAST_STREAM_CNTL: { STREAM = 0 }
+? 00000000 PC_PRIMITIVE_CNTL_6: { STRIDE_IN_VPC = 0 }
+? 00000000 PC_STEREO_RENDERING_CNTL: { VIEWS = 0 }
@ -1359,7 +1359,7 @@ cmdstream[0]: 265 dwords
+ 00000000 VPC_SO_CNTL: { BUF0_STREAM = 0 | BUF1_STREAM = 0 | BUF2_STREAM = 0 | BUF3_STREAM = 0 | STREAM_ENABLE = 0 }
00000000 VPC_SO_OVERRIDE: { 0 }
!+ ffffffff PC_RESTART_INDEX: 4294967295
0000001f PC_MODE_CNTL: 0x1f
0000001f PC_MODE_CNTL: { COUNT1 = 31 }
+ 00000000 PC_PS_CNTL: { 0 }
00000000 VPC_RAST_STREAM_CNTL: { STREAM = 0 }
!+ 00000003 PC_DGEN_RAST_CNTL: { MODE = POLYMODE6_TRIANGLES }

View file

@ -953,7 +953,7 @@
+ 00ffffff VPC_VS_SIV_CNTL_V2: { LAYERLOC = 255 | VIEWLOC = 255 | SHADINGRATELOC = 255 }
+ 00000000 VPC_RAST_STREAM_CNTL_V2: { STREAM = 0 }
+ 00000000 PC_RESTART_INDEX: 0
00003f1f PC_MODE_CNTL: 0x1f | 0x3f00
00003f1f PC_MODE_CNTL: { COUNT1 = 31 | COUNT2 = 0 }
+ 00000000 PC_PS_CNTL: { 0 }
00000000 PC_DGEN_SO_CNTL: { STREAM_ENABLE = 0 }
+ 00000003 PC_DGEN_RAST_CNTL: { MODE = POLYMODE6_TRIANGLES }

View file

@ -75,7 +75,7 @@ cmdstream[0]: 1023 dwords
RB_MODE_CNTL: 0x1
0000000001d910b4: 0000: 48881101 00000010
write PC_MODE_CNTL (9804)
PC_MODE_CNTL: 0x1f
PC_MODE_CNTL: { COUNT1 = 31 }
0000000001d910bc: 0000: 48980401 0000001f
write RB_SRGB_CNTL (880f)
RB_SRGB_CNTL: { 0 }
@ -216,7 +216,7 @@ cmdstream[0]: 1023 dwords
VFD_STEREO_RENDERING_CNTL: { VIEWS = 0 }
0000000001d91228: 0000: 40a00801 00000000
write PC_MODE_CNTL (9804)
PC_MODE_CNTL: 0x1f
PC_MODE_CNTL: { COUNT1 = 31 }
0000000001d91230: 0000: 48980401 0000001f
opcode: CP_SET_DRAW_STATE (43) (4 dwords)
{ COUNT = 0 | DISABLE_ALL_GROUPS | GROUP_ID = 0 }
@ -1021,7 +1021,7 @@ cmdstream[0]: 1023 dwords
+? 00000000 VPC_DBG_ECO_CNTL: 0
+? 00000000 VPC_LB_MODE_CNTL: FALSE
!+ ffffffff PC_RESTART_INDEX: 4294967295
!+ 0000001f PC_MODE_CNTL: 0x1f
!+ 0000001f PC_MODE_CNTL: { COUNT1 = 31 }
!+ 00000001 PC_POWER_CNTL: 0x1
+ 00000000 PC_PS_CNTL: { 0 }
+ 00000000 VPC_RAST_STREAM_CNTL: { STREAM = 0 }
@ -5210,7 +5210,7 @@ cmdstream[0]: 1023 dwords
00000000 VPC_SO_CNTL: { BUF0_STREAM = 0 | BUF1_STREAM = 0 | BUF2_STREAM = 0 | BUF3_STREAM = 0 | STREAM_ENABLE = 0 }
00000001 VPC_SO_OVERRIDE: { DISABLE }
+ ffffffff PC_RESTART_INDEX: 4294967295
0000001f PC_MODE_CNTL: 0x1f
0000001f PC_MODE_CNTL: { COUNT1 = 31 }
00000001 PC_POWER_CNTL: 0x1
00000000 PC_PS_CNTL: { 0 }
00000000 VPC_RAST_STREAM_CNTL: { STREAM = 0 }