This commit is contained in:
R2DLiu 2020-12-26 21:29:40 -05:00
commit 404f362bd5
13 changed files with 5290 additions and 45 deletions

View file

@ -1,4 +1,4 @@
{
{
"configurations": [
{
"name": "Release",
@ -85,7 +85,7 @@
]
},
{
"name": "x64-Release",
"name": "RelWDbgInfo",
"generator": "Ninja",
"configurationType": "RelWithDebInfo",
"buildRoot": "${projectDir}\\out\\build\\${name}",

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,885 @@
# GALJ01 - Super Smash Bros. Melee NTSC-J 1.02
[Core]
CPUThread = False
GPUDeterminismMode = fake-completion
PollingMethod = OnSIRead
FastDiscSpeed = True
[Gecko_Enabled]
$Required: General Codes
$Required: Slippi Playback
$Recommended: Normal Lag Reduction
[Gecko]
$Required: General Codes [Achilles, Dan Salvato, UnclePunch, tauKhan, Ptomerty, Cilan, Datel, Most]
0445BF28 FFFFFFFF #Unlock All Characters and Stages [Datel]
0445BF2C FFFFFFFF
0415D94C 4E800020 #Disable Special Messages [Most]
0415D984 4E800020 #Disable Trophy Messages [Achilles]
C22FCCE8 00000013 #External/Extended Nametag Box/Extended Nametag Box.asm
3C608003 6063556C
7C6803A6 887F0000
4E800021 5460063E
28000078 41820070
3C608045 6063D84F
1C0001A4 7C630214
38800000 8C030001
2C000000 41820018
38840001 2C000080
41A0FFEC 8C030001
4BFFFFE4 2C040005
41800034 3C604080
9061FFF0 C221FFF0
3E404330 CA028C58
9241FFEC 9081FFF0
C9E1FFEC EDEF8028
EDEF8824 807E0010
D1E3002C 807E0010
60000000 00000000
$Required: Slippi Playback [Fizzi, UnclePunch, Achilles, tauKhan]
*Used to play back a .slp file
*Will play replay configured in playback.txt
C216E9E4 00000010 #Playback/Core/CleanDynamicGeckos.asm
3BC30000 7C0802A6
90010004 9421FF50
BE810008 83CDB64C
83BE0010 807D0000
2C030000 41820044
389D0008 80BD0004
3D808000 618C31F4
7D8903A6 4E800421
807D0000 809D0004
3D808032 618C8F50
7D8903A6 4E800421
807D0004 7FBD1A14
3BBD0008 4BFFFFB8
BA810008 800100B4
382100B0 7C0803A6
60000000 00000000
C216D298 00000016 #Playback/Core/FetchGameFrame.asm
881F0008 2C000000
408200A0 7C0802A6
90010004 9421FF50
BE810008 806DB64C
83630000 38600076
987B0000 806DB654
907B0001 7F63DB78
38800005 38A00001
3D808000 618C55F0
7D8903A6 4E800421
7F63DB78 3880018F
38A00000 3D808000
618C55F0 7D8903A6
4E800421 887B0000
2C030000 40820024
3D808034 618CF314
7D8903A6 4E800421
3C60804C 38000000
98031F7B 4BFFFF90
BA810008 800100B4
382100B0 7C0803A6
881F0008 00000000
C206B0DC 00000046 #Playback/Core/RestoreGameFrame.asm
7C0802A6 90010004
9421FF50 BE810008
8BBF000C 7FA3EB78
3D808003 618C1724
7D8903A6 4E800421
7C7C1B78 832DB64C
83790000 7FE3FB78
3D808000 618C55F8
7D8903A6 4E800421
7C741B78 389B0007
88BF000C 1CA50062
7C842A14 1CB40031
7F442A14 3C80804D
807A0000 90645F90
807A0004 907F0620
807A0008 907F0624
807A000C 907F0638
807A0010 907F063C
807A0014 907F0650
807A0018 907F065C
8879056F 2C030000
41820024 807A001C
907F00B0 807A0020
907F00B4 807A0024
907F002C 807A0028
907F0010 3C608046
6063B108 3C80804C
60841F78 88840001
3884FFFF 2C040000
40A00008 38840005
1C840030 7C632214
889F0618 1C84000C
7E832214 887A002C
98740002 8879056F
2C030000 4182004C
807A002D 2C03FFFF
41820040 90610040
C0210040 C05F1830
EC211028 C0429500
FC011040 41820024
7FE3FB78 C0210040
C05F1830 EC211028
3D808006 618CCC7C
7D8903A6 4E800421
806DB654 2C03FF85
408200AC 7FE3FB78
38800000 C0228874
3D808007 618C592C
7D8903A6 4E800421
807F00B0 907F06F4
907F070C 807F00B4
907F06F8 907F0710
807F00B8 907F06FC
907F0714 C03F00B4
D03F2344 806DAE0C
907F0728 887F000C
889F221F 5484EFFE
38BF00B0 3D808003
618C2828 7D8903A6
4E800421 7FC3F378
3D808007 618C61C8
7D8903A6 4E800421
807F0890 C0230040
D023002C C0230044
D0230030 3D808002
618CF3AC 7D8903A6
4E800421 BA810008
800100B4 382100B0
7C0803A6 881F2219
60000000 00000000
C216E74C 0000009A #Playback/Core/RestoreGameInfo.asm
7C0802A6 90010004
9421FF50 BE810008
38600570 3D808037
618CF1E4 7D8903A6
4E800421 7C7C1B78
938DB64C 38800570
3D808000 618CC160
7D8903A6 4E800421
386001A5 3D808037
618CF1E4 7D8903A6
4E800421 7C7E1B78
93DC0000 38600040
3D808037 618CF1E4
7D8903A6 4E800421
907C0004 38600075
987E0000 387C001C
907E0001 38600553
907E0005 38600000
907E0009 7FC3F378
3880000D 38A00001
3D808000 618C55F0
7D8903A6 4E800421
7FC3F378 388001A5
38A00000 3D808000
618C55F0 7D8903A6
4E800421 887E0000
2C030001 41820018
3D808034 618CF314
7D8903A6 4E800421
4BFFFF8C 807E0001
3C80804D 90645F90
7FE3FB78 389E0005
38A00138 3D808000
618C31F4 7D8903A6
4E800421 387F0040
3880001C 3D808000
618CC160 7D8903A6
4E800421 3AE2F22C
3A82F230 3ABE013D
3AC00000 1C960008
7C64A82E 7C76B9AE
38840004 7C64A82E
7C76A1AE 3AD60001
2C160004 4180FFE0
3A800000 3ABF0060
1ED40024 7ED6AA14
88760001 2C030000
40820078 8876000A
2C030078 4182006C
7C771B78 3D808023
618C7A04 7D8903A6
4E800421 7EE3BB78
3D808015 618CCC9C
7D8903A6 4E800421
38630198 389E015D
1CB40010 7C842A14
88A40000 2C050000
40820010 38600078
9876000A 4800001C
38A00010 3D808000
618C31F4 7D8903A6
4E800421 48000004
3A940001 2C140004
4180FF70 887E019D
9862F234 887E019E
9862F238 887E019F
9862F23C 887E01A0
987C056F 807E01A1
3D808037 618CF1E4
7D8903A6 4E800421
7C7D1B78 93BC0008
3860008A 987D0000
7FA3EB78 38800001
38A00001 3D808000
618C55F0 7D8903A6
4E800421 7FA3EB78
809E01A1 38A00000
3D808000 618C55F0
7D8903A6 4E800421
38800004 909C000C
7FA3EB78 48000055
7C8802A6 3D808000
618C55FC 7D8903A6
4E800421 807C000C
3D808037 618CF1E4
7D8903A6 4E800421
907C0010 907C0014
7FA3EB78 48000041
7C8802A6 3D808000
618C55FC 7D8903A6
4E800421 4800013C
4E800021 2C050000
41820018 80CDB64C
8066000C 38630008
7C632A14 9066000C
4E800020 4E800021
2C050000 41820108
7C0802A6 90010004
9421FF50 BE810008
7C9E2378 7CBB2B78
80BE0000 54A501FE
64BD8000 834DB64C
833A0014 2C030004
41820014 2C030006
41820014 2C0300C2
41820014 3B9E0004
48000048 3B9E0008
48000040 389E0008
7C7D2050 546301BA
64634800 907A0018
3B9A0018 807E0004
1C630008 7C83F214
387D0004 7C641850
546301BA 64634800
3863FFFC 90640004
93B90000 93790004
38790008 7FA4EB78
7F65DB78 3D808000
618C31F4 7D8903A6
4E800421 3B390008
7F39DA14 933A0014
7FA3EB78 7F84E378
7F65DB78 3D808000
618C31F4 7D8903A6
4E800421 7FA3EB78
7F64DB78 3D808032
618C8F50 7D8903A6
4E800421 BA810008
800100B4 382100B0
7C0803A6 4E800020
38600000 809C0014
90640000 7FA3EB78
809E01A1 3D808032
618C8F50 7D8903A6
4E800421 38600004
38800007 38A00000
3D808039 618C01F0
7D8903A6 4E800421
48000021 7C8802A6
38A00000 3D808038
618CFD54 7D8903A6
4E800421 4800004C
4E800021 7C0802A6
90010004 9421FF50
BE810008 806DB64C
83A30000 887D0002
2C030000 41820010
807D0003 3C80804D
90645F90 BA810008
800100B4 382100B0
7C0803A6 4E800020
BA810008 800100B4
382100B0 7C0803A6
3C608017 00000000
C216D304 00000009 #Playback/Core/RestoreLRAStart.asm
806DB64C 80630000
88630000 2C030002
4082002C 3860FFFF
38800007 3D808016
618CCF4C 7D8903A6
4E800421 3D808016
618CD30C 7D8903A6
4E800420 7FE3FB78
60000000 00000000
C216B9C0 00000012 #Playback/Core/RestoreStockSteal.asm
80ADB64C 80A50004
38800089 98850000
808DB654 90850001
98650005 7CA32B78
38800006 38A00001
3D808000 618C55F0
7D8903A6 4E800421
806DB64C 80630004
38800001 38A00000
3D808000 618C55F0
7D8903A6 4E800421
806DB64C 80630004
88630000 2C030000
41820014 3D808016
618CBA1C 7D8903A6
4E800420 3D808016
618CBAC8 7D8903A6
4E800420 00000000
C21A501C 0000002A #Playback/Core/FastForward/FastForward.asm
3C808048 88649D30
2C03000E 40820040
88649D33 2C030001
40820034 38600001
3D80801A 618C45E8
7D8903A6 4E800421
2C030002 41820018
806DB64C 80630000
88630000 2C030003
41820024 38600001
38800002 3D808002
618C5064 7D8903A6
4E800421 7C1AD800
480000E0 806DB64C
80630000 88630001
2C030001 4182001C
38600000 38800000
3D808002 618C5064
7D8903A6 4E800421
4800000D 2C0300FF
480000A8 7C0802A6
90010004 9421FF50
BE810008 3D808003
618C0A50 7D8903A6
4E800421 3D808002
618CA4AC 7D8903A6
4E800421 3D808003
618C0A50 7D8903A6
4E800421 80630028
3D808036 618C8458
7D8903A6 4E800421
806DC18C 82830020
4800002C 82B4002C
8875221F 546006F7
40820018 7E83A378
3D808008 618C6A8C
7D8903A6 4E800421
82940008 2C140000
4082FFD4 BA810008
800100B4 382100B0
7C0803A6 4E800020
60000000 00000000
C2377544 00000002 #Playback/Core/FastForward/IncrementPadIndex.asm
40A2000C 38000001
981E0003 00000000
04376A88 881F0001 #Playback/Core/FastForward/PadAlwaysUseMasterIndex.asm
C21A45A0 00000007 #Playback/Core/Scene/Boot to Playback Scene.asm
48000019 7C6802A6
3C80803D 6084ADA8
90640004 4800001C
4E800021 38600003
3C808047 60849D30
98640003 4E800020
3800000E 00000000
C21A6348 00000070 #Playback/Core/Scene/SceneThink_Playback.asm
3C608047 60639D30
88630000 2C03000E
40820364 3860000D
3880000E 38A00000
3D808039 618C01F0
7D8903A6 4E800421
48000021 7C8802A6
38A00000 3D808038
618CFD54 7D8903A6
4E800421 48000318
4E800021 7C0802A6
90010004 9421FF50
BE810008 48000289
7FC802A6 38600000
3880FFFF 3D80803A
618C6754 7D8903A6
4E800421 7C7C1B78
38800001 989C0049
38800000 989C004A
C03E0008 D03C0008
C03E0010 D03C0024
D03C0028 C03E0000
C05E0004 7F83E378
4800025D 7C8802A6
4800026D 7CA802A6
3D80803A 618C6B98
7D8903A6 4E800421
7C641B78 7F83E378
C03E000C C05E000C
3D80803A 618C7548
7D8903A6 4E800421
C03E0014 C05E0018
7F83E378 4800023D
7C8802A6 3D80803A
618C6B98 7D8903A6
4E800421 7C641B78
7F83E378 C03E000C
C05E000C 3D80803A
618C7548 7D8903A6
4E800421 3C602ECC
606340FF 90610040
7F83E378 38800001
38A10040 3D80803A
618C74F0 7D8903A6
4E800421 38600020
3D808037 618CF1E4
7D8903A6 4E800421
7C7D1B78 3B600000
3D808033 618CC898
7D8903A6 4E800421
3D808033 618CF270
7D8903A6 4E800421
38600000 3D808037
618C5538 7D8903A6
4E800421 8062F240
2C030000 4082001C
38600000 7F84E378
3D80803A 618C84BC
7D8903A6 4E800421
38600000 3D808037
618C61C0 7D8903A6
4E800421 3D808034
618CF314 7D8903A6
4E800421 3B7B0001
2C1B00F0 41800008
3B600000 3860003C
7C7B1B96 48000119
7C8802A6 1C630004
7CC32214 7F83E378
38800000 480000E9
7CA802A6 4CC63182
3D80803A 618C70A0
7D8903A6 4E800421
38600088 987D0000
7FA3EB78 38800001
38A00001 3D808000
618C55F0 7D8903A6
4E800421 7FA3EB78
38800001 38A00000
3D808000 618C55F0
7D8903A6 4E800421
887D0000 2C030001
4082FEF0 7F83E378
3D80803A 618C5CC4
7D8903A6 4E800421
3D808002 618C4F6C
7D8903A6 4E800421
8062F240 2C030000
40820018 38600001
3D808002 618C4030
7D8903A6 4E800421
3D80801A 618C4B60
7D8903A6 4E800421
48000068 4E800021
C33E0000 00000000
00000000 3F800000
3F19999A 43B70000
43AF0000 432A0000
00000000 4E800021
57616974 696E6720
666F7220 67616D65
25730000 4E800021
00000000 2E000000
2E2E0000 2E2E2E00
4E800021 736C6970
70692E67 67000000
BA810008 800100B4
382100B0 7C0803A6
4E800020 3D80801A
618C6368 7D8903A6
4E800420 807F0000
60000000 00000000
041B16A8 801B09C0 #Playback/Core/Scene/Change Debug Result Screen MinorType to Debug Menu/ScenePrep_DebugResult = ScenePrep_DebugMenu.asm
043DDA9C 07000000 #Playback/Core/Scene/Change Debug Result Screen MinorType to Debug Menu/Swap MinorType.asm
C238D224 00000015 #Playback/Core/Sounds/AssignSoundInstanceId.asm
900DC0E8 3C608048
80639D30 5463443E
2C03010E 40820090
7C0802A6 90010004
9421FF50 BE810008
83EDB64C 3BDF001C
8B9E0000 3C608048
80639D60 809F056B
7C032000 41810028
3C608048 80639D60
809F056B 7C632050
38630001 8B9E0000
7F83E051 40800008
3B9C0007 1C7C00C2
38DE0001 7CC61A14
88660000 3863FFFF
1C630006 38A60001
7CA51A14 807D000C
90650002 BA810008
800100B4 382100B0
7C0803A6 00000000
C21A5014 00000032 #Playback/Core/Sounds/HandleFrameSoundLog.asm
41A20014 3D80801A
618C5024 7D8903A6
4E800420 3C608048
80639D30 5463443E
2C03010E 40820168
7C0802A6 90010004
9421FF50 BE810008
3D808034 618C7364
7D8903A6 4E800421
7C7D1B78 83EDB64C
3BDF001C 8B9E0000
3F008048 83189D60
3B18FFFF 82FF056B
7C18B800 4181009C
7C78B850 38630001
8B9E0000 7F83E051
40800008 3B9C0007
387E0001 1C9C00C2
7F432214 3B200000
48000060 38DA0000
38E00000 48000028
1C790006 7C651A14
A0630001 1C870006
7C862214 A0840001
7C032000 41820030
38E70001 88660000
2C070003 4180FFD4
1C790006 7C651A14
80630003 3D808002
618C36B8 7D8903A6
4E800421 3B390001
38BA0061 88650000
7C191800 4180FF98
387E0001 1C9C00C2
7F432214 387A0061
389A0000 38A00061
3D808000 618C31F4
7D8903A6 4E800421
387A0000 38800061
3D808000 618CC160
7D8903A6 4E800421
7C18B800 4081001C
931F056B 3B9C0001
2C1C0007 41800008
3B9CFFF9 9B9E0000
7FA3EB78 3D808034
618C738C 7D8903A6
4E800421 BA810008
800100B4 382100B0
7C0803A6 00000000
C2088224 0000001D #Playback/Core/Sounds/NoDestroyVoice.asm
3C608048 80639D30
5463443E 2C03010E
408200CC 7C0802A6
90010004 9421FF50
BE810008 83EDB64C
3BBF001C 57DE043E
8B9D0000 3C608048
80639D60 809F056B
7C032000 41810088
3C608048 80639D60
809F056B 7C632050
38630001 8B9D0000
7F83E051 40800008
3B9C0007 1C7C00C2
38DD0062 7CC61A14
39000000 48000020
1C680006 38A60001
7CA51A14 A0650000
7C1E1800 41820018
39080001 88660000
7C081800 4180FFDC
48000024 BA810008
800100B4 382100B0
7C0803A6 3D808008
618C8244 7D8903A6
4E800420 BA810008
800100B4 382100B0
7C0803A6 387F0000
60000000 00000000
C20882B0 0000001D #Playback/Core/Sounds/NoDestroyVoice2.asm
3C608048 80639D30
5463443E 2C03010E
408200CC 7C0802A6
90010004 9421FF50
BE810008 83EDB64C
3BBF001C 57DE043E
8B9D0000 3C608048
80639D60 809F056B
7C032000 41810088
3C608048 80639D60
809F056B 7C632050
38630001 8B9D0000
7F83E051 40800008
3B9C0007 1C7C00C2
38DD0062 7CC61A14
39000000 48000020
1C680006 38A60001
7CA51A14 A0650000
7C1E1800 41820018
39080001 88660000
7C081800 4180FFDC
48000024 BA810008
800100B4 382100B0
7C0803A6 3D808008
618C82D0 7D8903A6
4E800420 BA810008
800100B4 382100B0
7C0803A6 387F0000
60000000 00000000
C238D0B0 00000027 #Playback/Core/Sounds/PreventDuplicateSounds.asm
3C608048 80639D30
5463443E 2C03010E
40820120 7C0802A6
90010004 9421FF50
BE810008 83EDB64C
3BDF001C 3BA00000
3B400000 56FB043E
8B9E0000 3C608048
80639D60 809F056B
7C032000 41810070
3C608048 80639D60
809F056B 7C632050
38630001 8B9E0000
7F83E051 40800008
3B9C0007 1C7C00C2
38DE0062 7CC61A14
39000000 48000020
1C680006 38A60001
7CA51A14 A0650000
7C1B1800 41820018
39080001 88660000
7C081800 4180FFDC
4800000C 83450002
3BA00001 1C7C00C2
38DE0001 7CC61A14
88660000 2C030010
40800024 1C630006
38A60001 7CA51A14
B3650000 93450002
88660000 38630001
98660000 2C1D0000
41820028 7F43D378
BA810008 800100B4
382100B0 7C0803A6
3D808038 618CD2A0
7D8903A6 4E800420
BA810008 800100B4
382100B0 7C0803A6
2C1A0000 00000000
C20055F0 0000002C #Common/EXITransferBuffer.asm
7C0802A6 90010004
9421FF50 BE810008
7C7E1B78 7C9D2378
7CBF2B78 3D808034
618C7364 7D8903A6
4E800421 7C7C1B78
7FC3F378 7C9EEA14
2C1F0000 4182001C
7C0018AC 38630020
7C032000 4180FFF4
7C0004AC 4C00012C
38600001 38800000
3D808034 618C64C0
7D8903A6 4E800421
38600001 3D808034
618C6D80 7D8903A6
4E800421 38600001
38800000 38A00005
3D808034 618C6688
7D8903A6 4E800421
38600001 7FC4F378
7FA5EB78 7FE6FB78
38E00000 3D808034
618C5E60 7D8903A6
4E800421 38600001
3D808034 618C5F4C
7D8903A6 4E800421
38600001 3D808034
618C67B4 7D8903A6
4E800421 38600001
3D808034 618C6E74
7D8903A6 4E800421
38600001 3D808034
618C65CC 7D8903A6
4E800421 2C1F0000
4082001C 7C001BAC
38630020 7C032000
4180FFEC 7C0004AC
4C00012C 7F83E378
3D808034 618C738C
7D8903A6 4E800421
BA810008 800100B4
382100B0 7C0803A6
4E800020 00000000
C20055F8 0000000F #Common/GetIsFollower.asm
7C0802A6 90010004
9421FF50 BE810008
7C7E1B78 3BE00000
887E221F 5460EFFF
41820038 887E000C
3D808003 618C2330
7D8903A6 4E800421
3C80803B 6084CDE0
1C030003 7C640214
88030002 2C000000
40820008 3BE00001
7FE3FB78 BA810008
800100B4 382100B0
7C0803A6 4E800020
60000000 00000000
C216D294 00000006 #Common/IncrementFrameIndex.asm
987F0008 3C608048
80639D58 2C030000
40820010 3860FF85
906DB654 48000010
806DB654 38630001
906DB654 00000000
C21C154C 00000004 #Common/Initialize Stage Data/Init Stage Data.asm
38800204 3D808000
618CC160 7D8903A6
4E800421 281A0000
60000000 00000000
C2068EEC 00000006 #Common/Initialize Player Data/Init Player Data.asm
3BC30000 3C808045
60848FD0 80840020
3D808000 618CC160
7D8903A6 4E800421
7FC3F378 3C808046
60000000 00000000
C20055FC 00000022 #Common/Gecko/ProcessCodeList.asm
7C0802A6 90010004
9421FF50 BE810008
7C7D1B78 7C9E2378
3B800000 807D0000
5463463C 3B600008
3B200000 2C0300C0
41820044 2C0300C2
4182004C 2C030004
41820058 2C030006
41820058 2C030008
41820068 807D0000
5463213E 2C03000F
40820010 807D0004
2C030000 4182007C
4800004C 807D0004
1C630008 3B630008
4800003C 807D0004
1C630008 3B630008
3B200004 48000028
3B200004 48000020
807D0004 38630007
54630038 3B630008
833D0004 48000008
3B600010 3B9C0001
2C1E0000 4182001C
807D0000 5463463C
7FA4EB78 7F25CB78
7FC903A6 4E800421
7FBDDA14 4BFFFF38
3C608019 606310E8
7C63E850 BA810008
800100B4 382100B0
7C0803A6 4E800020
60000000 00000000
C209E090 00000011 #Common/FastForward/DynamicsFix.asm
807B0028 48000009
48000074 7C0802A6
90010004 9421FFE8
93E10014 7C7F1B78
807F0014 54600211
40820020 54600673
41820018 7FE3FB78
3D808037 618C3078
7D8903A6 4E800421
807F0010 2C030000
41820008 4BFFFFB9
807F0008 2C030000
41820008 4BFFFFA9
83E10014 8001001C
38210018 7C0803A6
4E800020 BB010028
60000000 00000000
$Recommended: Normal Lag Reduction [Hannes Mann]
043761EC 4800001C
04376238 48000018
$Optional: Game Music OFF [UnclePunch]
*Keep checked if you want music OFF. Uncheck "Game Music ON".
04023FFC 38800000
$Optional: Widescreen 16:9 [Dan Salvato, mirrorbender, Achilles1515, UnclePunch]
*Set Aspect Ratio to "Force 16:9" in Graphics for 16:9 monitors -----------------
*Requires all players to have enabled for netplay.
043BB05C 3EB00000 #External/Widescreen/Fix Screen Flash.asm
C236A4A8 00000006 #External/Widescreen/Overwrite CObj Values.asm
C03F0034 4800001D
7C6802A6 C0430000
C0630004 EC2100B2
EC211824 48000010
4E800021 43A00000
435B0000 00000000
044DDB58 3E4CCCCD #External/Widescreen/Adjust Offscreen Scissor/Adjust Bubble Zoom.asm
04086B24 60000000 #External/Widescreen/Adjust Offscreen Scissor/Draw High Poly Models.asm
04030C7C 38000064 #External/Widescreen/Adjust Offscreen Scissor/Left Camera Bound.asm
04030C88 3800021C #External/Widescreen/Adjust Offscreen Scissor/Right Camera Bound.asm
044DDB30 3F666666 #External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Adjust Corner Value 1.asm
044DDB34 BF666666 #External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Adjust Corner Value 2.asm
044DDB2C C3660000 #External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Extend Negative Vertical Bound.asm
044DDB28 43660000 #External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Extend Positive Vertical Bound.asm
044DDB4C 3D916873 #External/Widescreen/Adjust Offscreen Scissor/Fix Bubble Positions/Widen Bubble Region.asm
C22FCFC4 00000004 #External/Widescreen/Nametag Fixes/Adjust Nametag Background X Scale.asm
48000011 7C6802A6
C0030000 4800000C
4E800021 40DC7AE1
60000000 00000000
044DDB84 3E89FEFA #External/Widescreen/Nametag Fixes/Adjust Nametag Text X Scale.asm
$Optional: Disable Screen Shake [Achilles1515]
*Disables all screen shaking
04030E44 4E800020 #External/Disable Screen Shake/Disable Screen Shake.asm
$Optional: Hide HUD [UnclePunch]
*Hides the timer and player percent HUD elements
0416E9A4 60000000 #External/Hide Timer and Player HUD/Hide Timer HUD.asm
0416BA80 48000014 #External/Hide Timer and Player HUD/Hide Percents/Skip Percent Anim During Stock Steal.asm
0416E9B0 60000000 #External/Hide Timer and Player HUD/Hide Percents/Skip Player HUD Creation.asm
$Optional: Hide Waiting For Game [Nikki, UnclePunch]
*Hides the waiting for game text and slippi.gg text and disables the SFX played before a replay starts
*With this enabled, there will be no indication between matches that Melee is still running
044DEC20 00000001 #Playback/Hide Waiting For Game/Hide Waiting For Game.asm
$Optional: Enable Develop Mode [UnclePunch]
*Turns develop (debug) mode on. Allows access to frame advance, hit/hurtbox display, and alternate camera angles
0415FDBC 480000AC #External/Enable Develop Mode/Enable Develop Mode.asm
04089250 48000008 #External/Enable Develop Mode/Enable Stale Moves.asm
$Optional: Lagless FoD [Achilles, Myougi, Dan Salvato]
*Disables particles and reflection on FoD to improve performance
C21CBB90 00000005 #Lagless FoD
9421FFF8 3CC0804A
80C6ED78 3CA00002
60A5AE44 7CA53050
88C50000 60C60004
98C50000 00000000
041CC8AC FC000028
041CBE9C 60000000
041CBEF0 60000000
041CBF54 60000000
04390838 60000000
041CD250 60000000
041CCDCC 480000B4

View file

@ -18,7 +18,7 @@ namespace Common
#define BUILD_TYPE_STR ""
#endif
#define SLIPPI_REV_STR "2.2.3"
#define SLIPPI_REV_STR "2.3.0"
const std::string scm_slippi_semver_str = SLIPPI_REV_STR;

View file

@ -111,7 +111,7 @@ struct SConfig
bool bFPRF = false;
bool bAccurateNaNs = false;
int iTimingVariance = 40; // in milli secounds
int iTimingVariance = 12; // in milli secounds
bool bCPUThread = true;
bool bDSPThread = false;
bool bDSPHLE = true;

View file

@ -2022,6 +2022,8 @@ void CEXISlippi::handleLogInRequest()
bool logInRes = user->AttemptLogin();
if (!logInRes)
{
if (Host_RendererIsFullscreen())
Host_Fullscreen();
Host_LowerWindow();
user->OpenLogInPage();
user->ListenForLogIn();

View file

@ -649,10 +649,6 @@ void UpdateDevices()
}
}
// Hinting NetPlay that all controllers will be polled in
// succession, in order to optimize networking
NetPlay::SetSIPollBatching(true);
// Update inputs at the rate of SI
// Typically 120hz but is variable
g_controller_interface.UpdateInput();
@ -668,9 +664,6 @@ void UpdateDevices()
!!s_channel[3].device->GetData(s_channel[3].in_hi.hex, s_channel[3].in_lo.hex);
UpdateInterrupts();
// Polling finished
NetPlay::SetSIPollBatching(false);
}
SIDevices GetDeviceType(int channel)

View file

@ -830,6 +830,10 @@ static void EndField()
// Run when: When a frame is scanned (progressive/interlace)
void Update(u64 ticks)
{
// Try calling SI Poll every time update is called
Core::UpdateInputGate(!SConfig::GetInstance().m_BackgroundInput);
SerialInterface::UpdateDevices();
// Movie's frame counter should be updated before actually rendering the frame,
// in case frame counter display is enabled
@ -863,27 +867,6 @@ void Update(u64 ticks)
if (s_half_line_count == 0 || s_half_line_count == GetHalfLinesPerEvenField())
Core::Callback_NewField();
// If an SI poll is scheduled to happen on this half-line, do it!
if (s_half_line_of_next_si_poll == s_half_line_count)
{
Core::UpdateInputGate(!SConfig::GetInstance().m_BackgroundInput);
SerialInterface::UpdateDevices();
s_half_line_of_next_si_poll += 2 * SerialInterface::GetPollXLines();
}
// If this half-line is at the actual boundary of either field, schedule an SI poll to happen
// some number of half-lines in the future
if (s_half_line_count == 0)
{
s_half_line_of_next_si_poll = num_half_lines_for_si_poll; // first results start at vsync
}
if (s_half_line_count == GetHalfLinesPerEvenField())
{
s_half_line_of_next_si_poll = GetHalfLinesPerEvenField() + num_half_lines_for_si_poll;
}
// Move to the next half-line and potentially roll-over the count to zero. If we've reached
// the beginning of a new full-line, update the timer

View file

@ -276,7 +276,9 @@ static void BPWritten(const BPCmd& bp)
}
else
{
// Temp hack to get lag reduction code working
if (destAddr == 0x0) { destAddr = 0x4f0c00; }
// We should be able to get away with deactivating the current bbox tracking
// here. Not sure if there's a better spot to put this.
// the number of lines copied is determined by the y scale * source efb height
@ -298,19 +300,22 @@ static void BPWritten(const BPCmd& bp)
destAddr, srcRect.left, srcRect.top, srcRect.right, srcRect.bottom,
bpmem.copyTexSrcWH.x + 1, destStride, height, yScale);
bool is_depth_copy = bpmem.zcontrol.pixel_format == PEControl::Z24;
g_texture_cache->CopyRenderTargetToTexture(
destAddr, EFBCopyFormat::XFB, copy_width, height, destStride, is_depth_copy, srcRect,
false, false, yScale, s_gammaLUT[PE_copy.gamma], bpmem.triggerEFBCopy.clamp_top,
bpmem.triggerEFBCopy.clamp_bottom, bpmem.copyfilter.GetCoefficients());
//bool is_depth_copy = bpmem.zcontrol.pixel_format == PEControl::Z24;
//auto one = std::chrono::high_resolution_clock::now();
//g_texture_cache->CopyRenderTargetToTexture(
// destAddr, EFBCopyFormat::XFB, copy_width, height, destStride, is_depth_copy, srcRect,
// false, false, yScale, s_gammaLUT[PE_copy.gamma], bpmem.triggerEFBCopy.clamp_top,
// bpmem.triggerEFBCopy.clamp_bottom, bpmem.copyfilter.GetCoefficients());
//auto two = std::chrono::high_resolution_clock::now();
//WARN_LOG(SLIPPI, "timer: %d", (two - one).count());
// This stays in to signal end of a "frame"
g_renderer->RenderToXFB(destAddr, srcRect, destStride, height, s_gammaLUT[PE_copy.gamma]);
if (g_ActiveConfig.bImmediateXFB)
{
// below div two to convert from bytes to pixels - it expects width, not stride
g_renderer->Swap(destAddr, destStride / 2, destStride, height, CoreTiming::GetTicks());
g_renderer->Swap(destAddr, destStride / 2, destStride, height, CoreTiming::GetTicks(), s_gammaLUT[PE_copy.gamma], srcRect, bpmem.copyfilter.GetCoefficients(), yScale, bpmem.triggerEFBCopy.clamp_top, bpmem.triggerEFBCopy.clamp_bottom);
}
else
{

View file

@ -1219,6 +1219,147 @@ void Renderer::UpdateWidescreenHeuristic()
m_was_orthographically_anamorphic = ortho_looks_anamorphic;
}
void Renderer::Swap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height, u64 ticks, float gamma, const MathUtil::Rectangle<int>& srcRect, const CopyFilterCoefficients::Values& filter_coefficients, float y_scale, bool clamp_top, bool clamp_bottom)
{
if (SConfig::GetInstance().bWii)
m_is_game_widescreen = Config::Get(Config::SYSCONF_WIDESCREEN);
// suggested_aspect_mode overrides SYSCONF_WIDESCREEN
if (g_ActiveConfig.suggested_aspect_mode == AspectMode::Analog)
m_is_game_widescreen = false;
else if (g_ActiveConfig.suggested_aspect_mode == AspectMode::AnalogWide)
m_is_game_widescreen = true;
// If widescreen hack is disabled override game's AR if UI is set to 4:3 or 16:9.
if (!g_ActiveConfig.bWidescreenHack)
{
const auto aspect_mode = g_ActiveConfig.aspect_mode;
if (aspect_mode == AspectMode::Analog)
m_is_game_widescreen = false;
else if (aspect_mode == AspectMode::AnalogWide)
m_is_game_widescreen = true;
}
if (xfb_addr && fb_width && fb_stride && fb_height)
{
// Get the current XFB from texture cache
MathUtil::Rectangle<int> xfb_rect;
const auto* xfb_entry =
g_texture_cache->GetXFBTexture(xfb_addr, fb_width, fb_height, fb_stride, &xfb_rect, gamma, srcRect, filter_coefficients, y_scale, clamp_top, clamp_bottom);
if (xfb_entry &&
(!g_ActiveConfig.bSkipPresentingDuplicateXFBs || xfb_entry->id != m_last_xfb_id))
{
const bool is_duplicate_frame = xfb_entry->id == m_last_xfb_id;
m_last_xfb_id = xfb_entry->id;
// Since we use the common pipelines here and draw vertices if a batch is currently being
// built by the vertex loader, we end up trampling over its pointer, as we share the buffer
// with the loader, and it has not been unmapped yet. Force a pipeline flush to avoid this.
//g_vertex_manager->Flush();
// Render any UI elements to the draw list.
{
auto lock = GetImGuiLock();
#ifdef IS_PLAYBACK
if (SConfig::GetInstance().m_slippiEnableSeek && g_replayComm->getSettings().rollbackDisplayMethod == "off" && g_playbackStatus->inSlippiPlayback)
OSD::DrawSlippiPlaybackControls();
#endif
DrawDebugText();
OSD::DrawMessages();
ImGui::Render();
}
// Render the XFB to the screen.
BeginUtilityDrawing();
if (!IsHeadless())
{
BindBackbuffer({ {0.0f, 0.0f, 0.0f, 1.0f} });
if (!is_duplicate_frame)
UpdateWidescreenHeuristic();
UpdateDrawRectangle();
// Adjust the source rectangle instead of using an oversized viewport to render the XFB.
auto render_target_rc = GetTargetRectangle();
auto render_source_rc = xfb_rect;
AdjustRectanglesToFitBounds(&render_target_rc, &render_source_rc, m_backbuffer_width,
m_backbuffer_height);
RenderXFBToScreen(render_target_rc, xfb_entry->texture.get(), render_source_rc);
DrawImGui();
// Present to the window system.
{
std::lock_guard<std::mutex> guard(m_swap_mutex);
PresentBackbuffer();
}
// Update the window size based on the frame that was just rendered.
// Due to depending on guest state, we need to call this every frame.
SetWindowSize(xfb_rect.GetWidth(), xfb_rect.GetHeight());
}
if (!is_duplicate_frame)
{
m_fps_counter.Update();
if (IsFrameDumping())
DumpCurrentFrame(xfb_entry->texture.get(), xfb_rect, ticks);
// Begin new frame
m_frame_count++;
g_stats.ResetFrame();
}
g_shader_cache->RetrieveAsyncShaders();
g_vertex_manager->OnEndFrame();
BeginImGuiFrame();
// We invalidate the pipeline object at the start of the frame.
// This is for the rare case where only a single pipeline configuration is used,
// and hybrid ubershaders have compiled the specialized shader, but without any
// state changes the specialized shader will not take over.
g_vertex_manager->InvalidatePipelineObject();
// Flush any outstanding EFB copies to RAM, in case the game is running at an uncapped frame
// rate and not waiting for vblank. Otherwise, we'd end up with a huge list of pending copies.
g_texture_cache->FlushEFBCopies();
if (!is_duplicate_frame)
{
// Remove stale EFB/XFB copies.
g_texture_cache->Cleanup(m_frame_count);
Core::Callback_FramePresented();
}
// Handle any config changes, this gets propogated to the backend.
CheckForConfigChanges();
g_Config.iSaveTargetId = 0;
EndUtilityDrawing();
}
else
{
Flush();
}
// Update our last xfb values
m_last_xfb_addr = xfb_addr;
m_last_xfb_ticks = ticks;
m_last_xfb_width = fb_width;
m_last_xfb_stride = fb_stride;
m_last_xfb_height = fb_height;
}
else
{
Flush();
}
}
void Renderer::Swap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height, u64 ticks)
{
if (SConfig::GetInstance().bWii)

View file

@ -220,6 +220,7 @@ public:
// Finish up the current frame, print some stats
void Swap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height, u64 ticks);
void Swap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height, u64 ticks, float gamma, const MathUtil::Rectangle<int>& srcRect, const CopyFilterCoefficients::Values& filter_coefficients, float y_scale, bool clamp_top, bool clamp_bottom);
void UpdateWidescreenHeuristic();

View file

@ -1713,7 +1713,7 @@ static void GetDisplayRectForXFBEntry(TextureCacheBase::TCacheEntry* entry, u32
TextureCacheBase::TCacheEntry*
TextureCacheBase::GetXFBTexture(u32 address, u32 width, u32 height, u32 stride,
MathUtil::Rectangle<int>* display_rect)
MathUtil::Rectangle<int>* display_rect)
{
const u8* src_data = Memory::GetPointer(address);
if (!src_data)
@ -1742,9 +1742,9 @@ TextureCacheBase::GetXFBTexture(u32 address, u32 width, u32 height, u32 stride,
// Create a new VRAM texture, and fill it with the data from guest RAM.
entry = AllocateCacheEntry(TextureConfig(width, height, 1, 1, 1, AbstractTextureFormat::RGBA8,
AbstractTextureFlag_RenderTarget));
AbstractTextureFlag_RenderTarget));
entry->SetGeneralParameters(address, total_size,
TextureAndTLUTFormat(TextureFormat::XFB, TLUTFormat::IA8), true);
TextureAndTLUTFormat(TextureFormat::XFB, TLUTFormat::IA8), true);
entry->SetDimensions(width, height, 1);
entry->SetHashes(hash, hash);
entry->SetXfbCopy(stride);
@ -1753,8 +1753,8 @@ TextureCacheBase::GetXFBTexture(u32 address, u32 width, u32 height, u32 stride,
entry->may_have_overlapping_textures = false;
entry->frameCount = FRAMECOUNT_INVALID;
if (!g_ActiveConfig.UseGPUTextureDecoding() ||
!DecodeTextureOnGPU(entry, 0, src_data, total_size, entry->format.texfmt, width, height,
width, height, stride, texMem, entry->format.tlutfmt))
!DecodeTextureOnGPU(entry, 0, src_data, total_size, entry->format.texfmt, width, height,
width, height, stride, texMem, entry->format.tlutfmt))
{
const u32 decoded_size = width * height * sizeof(u32);
CheckTempSize(decoded_size);
@ -1776,7 +1776,216 @@ TextureCacheBase::GetXFBTexture(u32 address, u32 width, u32 height, u32 stride,
// While this isn't really an xfb copy, we can treat it as such for dumping purposes
static int xfb_count = 0;
entry->texture->Save(
fmt::format("{}xfb_loaded_{}.png", File::GetUserPath(D_DUMPTEXTURES_IDX), xfb_count++), 0);
fmt::format("{}xfb_loaded_{}.png", File::GetUserPath(D_DUMPTEXTURES_IDX), xfb_count++), 0);
}
GetDisplayRectForXFBEntry(entry, width, height, display_rect);
return entry;
}
TextureCacheBase::TCacheEntry*
TextureCacheBase::GetXFBTexture(u32 address, u32 width, u32 height, u32 stride,
MathUtil::Rectangle<int>* display_rect, float gamma, const MathUtil::Rectangle<int>& src_rect, const CopyFilterCoefficients::Values& copy_filter_coefficients, float y_scale, bool clamp_top, bool clamp_bottom)
{
auto filter_coefficients = GetVRAMCopyFilterCoefficients(copy_filter_coefficients);
const u8* src_data = Memory::GetPointer(address);
if (!src_data)
{
ERROR_LOG(VIDEO, "Trying to load XFB texture from invalid address 0x%8x", address);
return nullptr;
}
u32 scaled_tex_w = g_renderer->EFBToScaledX(width);
u32 scaled_tex_h = g_renderer->EFBToScaledY(height);
// Compute total texture size. XFB textures aren't tiled, so this is simple.
const u32 total_size = height * stride;
const u64 hash = Common::GetHash64(src_data, total_size, 0);
TCacheEntry* entry = nullptr;
const TextureConfig config(scaled_tex_w, scaled_tex_h, 1, g_framebuffer_manager->GetEFBLayers(),
1, AbstractTextureFormat::RGBA8, AbstractTextureFlag_RenderTarget);
entry = AllocateCacheEntry(config);
auto baseFormat = TexDecoder_GetEFBCopyBaseFormat(EFBCopyFormat::XFB);
u32 blockH = TexDecoder_GetBlockHeightInTexels(baseFormat);
const u32 blockW = TexDecoder_GetBlockWidthInTexels(baseFormat);
// Round up source height to multiple of block size
u32 actualHeight = Common::AlignUp(height, blockH);
const u32 actualWidth = Common::AlignUp(width, blockW);
u32 num_blocks_y = actualHeight / blockH;
const u32 num_blocks_x = actualWidth / blockW;
// RGBA takes two cache lines per block; all others take one
const u32 bytes_per_block = baseFormat == TextureFormat::RGBA8 ? 64 : 32;
const u32 bytes_per_row = num_blocks_x * bytes_per_block;
const u32 covered_range = num_blocks_y * stride;
if (entry)
{
entry->SetGeneralParameters(address, 0, TexDecoder_GetEFBCopyBaseFormat(EFBCopyFormat::XFB), true);
entry->SetDimensions(width, height, 1);
entry->frameCount = FRAMECOUNT_INVALID;
entry->should_force_safe_hashing = true;
entry->SetXfbCopy(stride);
entry->may_have_overlapping_textures = false;
entry->is_custom_tex = false;
///////////////////////
// Flush EFB pokes first, as they're expected to be included.
g_framebuffer_manager->FlushEFBPokes();
// Get the pipeline which we will be using. If the compilation failed, this will be null.
const AbstractPipeline* copy_pipeline =
g_shader_cache->GetEFBCopyToVRAMPipeline(TextureConversionShaderGen::GetShaderUid(
EFBCopyFormat::XFB, false, false, false,
NeedsCopyFilterInShader(filter_coefficients)));
if (!copy_pipeline)
{
WARN_LOG(VIDEO, "Skipping EFB copy to VRAM due to missing pipeline.");
return entry;
}
const auto scaled_src_rect = g_renderer->ConvertEFBRectangle(src_rect);
const auto framebuffer_rect = g_renderer->ConvertFramebufferRectangle(
scaled_src_rect, g_framebuffer_manager->GetEFBFramebuffer());
AbstractTexture* src_texture = g_framebuffer_manager->ResolveEFBColorTexture(framebuffer_rect);
src_texture->FinishedRendering();
g_renderer->BeginUtilityDrawing();
const bool linear_filter = g_renderer->GetEFBScale() != 1 || y_scale > 1.0f;
// Fill uniform buffer.
struct Uniforms
{
float src_left, src_top, src_width, src_height;
float filter_coefficients[3];
float gamma_rcp;
float clamp_top;
float clamp_bottom;
float pixel_height;
u32 padding;
};
Uniforms uniforms;
const float rcp_efb_width = 1.0f / static_cast<float>(g_framebuffer_manager->GetEFBWidth());
const float rcp_efb_height = 1.0f / static_cast<float>(g_framebuffer_manager->GetEFBHeight());
uniforms.src_left = framebuffer_rect.left * rcp_efb_width;
uniforms.src_top = framebuffer_rect.top * rcp_efb_height;
uniforms.src_width = framebuffer_rect.GetWidth() * rcp_efb_width;
uniforms.src_height = framebuffer_rect.GetHeight() * rcp_efb_height;
uniforms.filter_coefficients[0] = filter_coefficients.upper;
uniforms.filter_coefficients[1] = filter_coefficients.middle;
uniforms.filter_coefficients[2] = filter_coefficients.lower;
uniforms.gamma_rcp = 1.0f / gamma;
uniforms.clamp_top = clamp_top ? framebuffer_rect.top * rcp_efb_height : 0.0f;
uniforms.clamp_bottom = clamp_bottom ? framebuffer_rect.bottom * rcp_efb_height : 1.0f;
uniforms.pixel_height = g_ActiveConfig.bCopyEFBScaled ? rcp_efb_height : 1.0f / EFB_HEIGHT;
uniforms.padding = 0;
g_vertex_manager->UploadUtilityUniforms(&uniforms, sizeof(uniforms));
// Use the copy pipeline to render the VRAM copy.
g_renderer->SetAndDiscardFramebuffer(entry->framebuffer.get());
g_renderer->SetViewportAndScissor(entry->framebuffer->GetRect());
g_renderer->SetPipeline(copy_pipeline);
g_renderer->SetTexture(0, src_texture);
g_renderer->SetSamplerState(0, linear_filter ? RenderState::GetLinearSamplerState() :
RenderState::GetPointSamplerState());
g_renderer->Draw(0, 3);
g_renderer->EndUtilityDrawing();
entry->texture->FinishedRendering();
////////////////////////////////////////////////////////////////////////////
if (g_ActiveConfig.bDumpXFBTarget)
{
static int xfb_count = 0;
entry->texture->Save(
fmt::format("{}xfb_copy_{}.png", File::GetUserPath(D_DUMPTEXTURES_IDX), xfb_count++),
0);
}
u8* dst = Memory::GetPointer(address);
UninitializeXFBMemory(dst, stride, bytes_per_row, num_blocks_y);
// Invalidate all textures, if they are either fully overwritten by our efb copy, or if they
// have a different stride than our efb copy. Partly overwritten textures with the same stride
// as our efb copy are marked to check them for partial texture updates.
// TODO: The logic to detect overlapping strided efb copies is not 100% accurate.
bool strided_efb_copy = stride != bytes_per_row;
auto iter = FindOverlappingTextures(address, covered_range);
while (iter.first != iter.second)
{
TCacheEntry* overlapping_entry = iter.first->second;
if (overlapping_entry->addr == address && overlapping_entry->is_xfb_copy)
{
for (auto& reference : overlapping_entry->references)
{
reference->reference_changed = true;
}
}
if (overlapping_entry->OverlapsMemoryRange(address, covered_range))
{
u32 overlap_range = std::min(overlapping_entry->addr + overlapping_entry->size_in_bytes,
address + covered_range) -
std::max(overlapping_entry->addr, address);
if (overlapping_entry->memory_stride != stride ||
(!strided_efb_copy && overlapping_entry->size_in_bytes == overlap_range) ||
(strided_efb_copy && overlapping_entry->size_in_bytes == overlap_range &&
overlapping_entry->addr == address))
{
// Pending EFB copies which are completely covered by this new copy can simply be tossed,
// instead of having to flush them later on, since this copy will write over everything.
iter.first = InvalidateTexture(iter.first, true);
continue;
}
// We don't want to change the may_have_overlapping_textures flag on XFB container entries
// because otherwise they can't be re-used/updated, leaking textures for several frames.
if (!overlapping_entry->is_xfb_container)
overlapping_entry->may_have_overlapping_textures = true;
// Do not load textures by hash, if they were at least partly overwritten by an efb copy.
// In this case, comparing the hash is not enough to check, if two textures are identical.
if (overlapping_entry->textures_by_hash_iter != textures_by_hash.end())
{
textures_by_hash.erase(overlapping_entry->textures_by_hash_iter);
overlapping_entry->textures_by_hash_iter = textures_by_hash.end();
}
}
++iter.first;
}
if (OpcodeDecoder::g_record_fifo_data)
{
// Mark the memory behind this efb copy as dynamicly generated for the Fifo log
for (u32 i = 0; i < num_blocks_y; i++)
{
FifoRecorder::GetInstance().UseMemory(address, bytes_per_row, MemoryUpdate::TEXTURE_MAP,
true);
address += stride;
}
}
// Even if the copy is deferred, still compute the hash. This way if the copy is used as a texture
// in a subsequent draw before it is flushed, it will have the same hash.
if (entry)
{
const u64 entry_hash = entry->CalculateHash();
entry->SetHashes(entry_hash, entry_hash);
textures_by_address.emplace(address, entry);
}
}
if (entry && entry->is_xfb_container)
{
StitchXFBCopy(entry);
entry->texture->FinishedRendering();
}
GetDisplayRectForXFBEntry(entry, width, height, display_rect);

View file

@ -223,6 +223,8 @@ public:
u32 tmem_address_odd = 0);
TCacheEntry* GetXFBTexture(u32 address, u32 width, u32 height, u32 stride,
MathUtil::Rectangle<int>* display_rect);
TCacheEntry* GetXFBTexture(u32 address, u32 width, u32 height, u32 stride,
MathUtil::Rectangle<int>* display_rect, float gamma, const MathUtil::Rectangle<int>& src_rect, const CopyFilterCoefficients::Values& copy_filter_coefficients, float y_scale, bool clamp_top, bool clamp_bottom);
virtual void BindTextures();
void CopyRenderTargetToTexture(u32 dstAddr, EFBCopyFormat dstFormat, u32 width, u32 height,