cemu_graphic_packs/Mods/BreathOfTheWild_FPS++/Fence Method/patches.txt
Crementif adb112620c [BotW] Fix fence methods
Accidentally budged up performance fence which would be active when it wasn't selected...

Also added comments, so the code should be slightly easier to understand.
2019-04-07 17:40:27 +02:00

81 lines
3.6 KiB
Plaintext

[BotwFenceV208]
moduleMatches = 0x6267BFD0
# Code Cave
codeCaveSize = 0x50
# Fence Method Value
_fenceMethod = 0x0000000
0x0000000 = .int $fenceMethod
# Performance Fence method
_conditionalPerformanceFence = 0x0000004
0x0000004 = lis r11, _fenceMethod@ha
0x0000008 = lwz r11, _fenceMethod@l(r11) ; Load the fence method value
0x000000C = cmpwi r11, 1 ; Compare the skip fence method with the fence method that's set, store comparison to the conditional register
0x0000010 = bne .+0x0C ; If the conditional register isn't equel to the performance fence method, skip the next two instructions
0x0000014 = li r0, 1 # Performance fence always set the fence skip value to 1
0x0000018 = blr ; Return to the instruction that jumped to this part to the code cave
0x000001C = lwz r0, 0x388(r31) ; Instruction that gets executed if performance fence isn't used, this is the original instruction.
0x0000020 = blr ; Return to the instruction that jumped to this part to the code cave
# Accurate and Skip Fence methods
_conditionalAccurateAndSkipFence = 0x0000024
0x0000024 = lis r5, _fenceMethod@ha
0x0000028 = lwz r11, _fenceMethod@l(r5) ; Load the fence method value
0x000002C = cmpwi r11, 2 ; Compare the accurate fence method with the fence method that's set, store comparison to the conditional register
0x0000030 = li r5, 6 ; Original instruction that got replaced with the jump
0x0000034 = add r6, r12, r0 ; Instruction that got replaced with the fence skip check
0x0000038 = bne .+0x10 ; If the conditional register isn't equel to accurate fence, skip the next three instructions (the ones that are the accurate fence) to the next comparison instruction.
0x000003C = cmpwi r6, 500 # Accurate fence basically checks if it's the first 500 frames of the game, in which case it does a full fence.
0x0000040 = blt .+0x08
0x0000044 = subi r6, r6, 1
0x0000048 = cmpwi r11, 3 ; Compare the skip fence method with the fence method that's set, in preparation of the fence skip since it stores the result in the conditional register.
0x000004C = blr ; Return to the instruction that jumped to this part to the code cave
0x31FAAE8 = bla _conditionalPerformanceFence ; Jumps to the conditional performance part of the code cave that creates the performance fence skip if that preset has been chosen.
0x31FAAF8 = bla _conditionalAccurateAndSkipFence ; Jumps to the conditional accurate part of the code cave that creates the accurate fence skip if that preset has been chosen.
0x31FAAFC = beq .+0x08 ; This part is the crucial part of the fence skip method. It skips the GX2SetGPUFence call in which case there's no fence skip, if the conditional register that has previously been set by the accurate code cave was true.
[BotwFenceV176V192]
moduleMatches = 0xFD091F9F, 0xD472D8A5
# Code Cave
codeCaveSize = 0x50
# Fence Method Value
_fenceMethod = 0x0000000
0x0000000 = .int $fenceMethod
# Performance Fence method
_conditionalPerformanceFence = 0x0000004
0x0000004 = lis r11, _fenceMethod@ha
0x0000008 = lwz r11, _fenceMethod@l(r11)
0x000000C = cmpwi r11, 1
0x0000010 = bne .+0x0C
0x0000014 = li r0, 1
0x0000018 = blr
0x000001C = lwz r0, 0x388(r31)
0x0000020 = blr
# Accurate and Skip Fence methods
_conditionalAccurateAndSkipFence = 0x0000024
0x0000024 = lis r5, _fenceMethod@ha
0x0000028 = lwz r11, _fenceMethod@l(r5)
0x000002C = cmpwi r11, 2
0x0000030 = li r5, 6
0x0000034 = add r6, r12, r0
0x0000038 = bne .+0x10
0x000003C = cmpwi r6, 500
0x0000040 = blt .+0x08
0x0000044 = subi r6, r6, 1
0x0000048 = cmpwi r11, 3
0x000004C = blr
0x31F9FEC = bla _conditionalPerformanceFence
0x31F9FFC = bla _conditionalAccurateAndSkipFence
0x31FA000 = beq .+0x08