[BotW] Add central fence method pack, change ordering

Should be clear now which packs are required. Also, gone with the multiple fence skip packs. Instead, there's now a confusing mess for devs to sort out.
This commit is contained in:
Crementif 2019-04-07 14:34:38 +02:00
parent 9440409e25
commit 590daf5304
14 changed files with 137 additions and 108 deletions

View File

@ -1,30 +0,0 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = Dynamic (FPS++)
path = "The Legend of Zelda: Breath of the Wild/Mods/FPS++/2.2Testing"
description = Important: Don't enable Static FPS while having FPS++ also enabled! This pack won't work without Cemuhook, make sure to install that! This pack only works when you've properly updated your game (we always recommend the latest updates). Keep in mind that going above 30fps will bring game bugs, so you might want to use the "30FPS" preset.
version = 3
[Preset]
name = 32 Frames Averaged
$amount_of_FPS_averaged = 32
[Preset]
name = 16 Frames Averaged
$amount_of_FPS_averaged = 16
[Preset]
name = 8 Frames Averaged
$amount_of_FPS_averaged = 8
[Preset]
name = 6 Frames Averaged
$amount_of_FPS_averaged = 6
[Preset]
name = 4 Frames Averaged
$amount_of_FPS_averaged = 4
[Preset]
name = 3 Frames Averaged
$amount_of_FPS_averaged = 3

View File

@ -1,6 +1,6 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = CPU Occlusion Query
path = "The Legend of Zelda: Breath of the Wild/Mods/FPS++/CPU Occlusion Query"
description = Changes occlusion querys from gpu type to cpu type. Fixes nvidia npc "ai stutter" when full sync at gx2drawdone is disabled. Does not fix camera rune or random crashes. Use lwzx workaround for random crash fix if you disable drawdone.
path = "The Legend of Zelda: Breath of the Wild/Mods/FPS++/NPC Stutter Fix (CPU Occlusion Query)"
description = Changes occlusion queries from GPU to CPU type. This is a workaround for the NPC or creatures stuttering at a distance when full sync at GX2DrawDone is disabled. If you disable that option for extra FPS, you will need to enable the LWZX workaround to fix (most) crashes if you disable this.
version = 3

View File

@ -1,4 +1,4 @@
Since this work isn't wholy mine anymore I feel it needs a readme.
Thanks to the contributors Crementif and EpigramX and as always Rajkosto for the input early on and for making it possible to begin with. Also thanks to the Cemu dev team for creating such a fun emulator. They recently added a debugger to aid in projects like this and I can't wait to try it out.
Since this work isn't wholy mine anymore I feel it needs a readme.
Thanks to the contributors Crementif and EpigramX and as always Rajkosto for the input early on and for making it possible to begin with. Also thanks to the Cemu dev team for creating such a fun emulator. They recently added a debugger to aid in projects like this and I can't wait to try it out.
Credits for the Arrow fix go to EpigramX and the initial porting of it to fps++ by Crementif. It's always nice to see people contribute to make something better. I fully welcome others messing around with this and have added comments to all the original code in hope that it is easier to understand. But I suck at comments as much as I suck at code. If you have questions about patching feel free to ask me on discord. I would like to avoid situations where a whole bunch of lines are copy pasted into fps++, where 90% of them don't do anything,claiming it fixes things it doesnt. And fragmenting the user base with regards to which fps++ they should use.
Credits for the Arrow fix go to EpigramX and the initial porting of it to fps++ by Crementif. It's always nice to see people contribute to make something better. I fully welcome others messing around with this and have added comments to all the original code in hope that it is easier to understand. But I suck at comments as much as I suck at code. If you have questions about patching feel free to ask me on discord. I would like to avoid situations where a whole bunch of lines are copy pasted into fps++, where 90% of them don't do anything,claiming it fixes things it doesnt. And fragmenting the user base with regards to which fps++ they should use.

View File

@ -0,0 +1,30 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = Dynamic Gamespeed
path = "The Legend of Zelda: Breath of the Wild/Mods/FPS++/Dynamic Gamespeed (Required)"
description = DON'T USE STATIC FPS WITH FPS++! Don't forget to set the FPS limit if you want to exceed 30 FPS. Lowering the amount of averaged frames, how more reactive the gamespeed becomes to your FPS.
version = 3
[Preset]
name = 32 Frames Averaged
$amount_of_FPS_averaged = 32
[Preset]
name = 16 Frames Averaged
$amount_of_FPS_averaged = 16
[Preset]
name = 8 Frames Averaged
$amount_of_FPS_averaged = 8
[Preset]
name = 6 Frames Averaged
$amount_of_FPS_averaged = 6
[Preset]
name = 4 Frames Averaged
$amount_of_FPS_averaged = 4
[Preset]
name = 3 Frames Averaged
$amount_of_FPS_averaged = 3

View File

@ -0,0 +1,81 @@
[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)
0x000000C = cmpwi r11, 1
0x0000010 = beq .+0x0C
0x0000014 = li r0, 1
0x0000018 = blr
0x000001C = lwz r0, 0x388(r31)
0x0000020 = blr
# Accuracy and Skip Fence methods
_conditionalAccuracyAndSkipFence = 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
0x31FAAE8 = bla _conditionalPerformanceFence
0x31FAAF8 = bla _conditionalAccuracyAndSkipFence
0x31FAAFC = beq .+0x08
[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 = beq .+0x0C
0x0000014 = li r0, 1
0x0000018 = blr
0x000001C = lwz r0, 0x388(r31)
0x0000020 = blr
# Accuracy and Skip Fence methods
_conditionalAccuracyAndSkipFence = 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 _conditionalAccuracyAndSkipFence
0x31FA000 = beq .+0x08

View File

@ -0,0 +1,18 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = Fence Method
path = "The Legend of Zelda: Breath of the Wild/Mods/FPS++/Fence Method (Required)"
description = Performance fence gives better performance with some CPU's and some (lower) resolutions. Accurate fence likely solves all of the milk water. Fence skip will likely cause milk water.
version = 3
[Preset]
name = Performance Fence
$fenceMethod:int = 1
[Preset]
name = Accurate Fence
$fenceMethod:int = 2
[Preset]
name = Fence Skip
$fenceMethod:int = 3

View File

@ -1,30 +0,0 @@
[BotwFPSV208]
moduleMatches = 0x6267BFD0
#cave
codeCaveSize = 0x14
_fenceNeg1 = 0x00000000
0x00000000 = add r6, r12, r0 #orig instruction we are replacing
0x00000004 = cmpwi r6, 500 #check if less than 500 (full sync on those first frames to prevent milk water)
0x00000008 = blt .+0x08 #skip subtract if less than
0x0000000C = subi r6, r6, 1 #do the subtract
0x00000010 = blr #return
#code changes
0x031FAAFC = bla _fenceNeg1 ;Best fence (make sure GPU is never more than 1 frame ahead)
[BotwFPSv176V192]
moduleMatches = 0xFD091F9F, 0xD472D8A5
#cave
codeCaveSize = 0x14
_fenceNeg1 = 0x00000000
0x00000000 = add r6, r12, r0 #orig instruction we are replacing
0x00000004 = cmpwi r6, 500 #check if less than 500 (full sync on those first frames to prevent milk water)
0x00000008 = blt .+0x08 #skip subtract if less than
0x0000000C = subi r6, r6, 1 #do the subtract
0x00000010 = blr
#code changes
0x031FA000 = bla _fenceNeg1

View File

@ -1,6 +0,0 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = Best Fence
path = "The Legend of Zelda: Breath of the Wild/Mods/FPS++/Best Fence"
description = Subtract 1 from fence value. Original default option that is least likely to cause milk water. No difference from best on high end systems. Incompatible with other fence options.
version = 3

View File

@ -1,11 +0,0 @@
[BotwFPSV208]
moduleMatches = 0x6267BFD0
#code changes
0x031FAAE8 = li r0, 1 ;Better fence (make sure GPU is never more than 1 second? ahead)
[BotwFPSv176V192]
moduleMatches = 0xFD091F9F, 0xD472D8A5
#code changes
0x031F9FEC = li r0, 1

View File

@ -1,6 +0,0 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = Better Fence
path = "The Legend of Zelda: Breath of the Wild/Mods/FPS++/Better Fence"
description = Ensure fence value is always 1. Better for lower end hardware. If you feel like you are getting framerate capped try this.
version = 3

View File

@ -1,11 +0,0 @@
[BotwFPSV208]
moduleMatches = 0x6267BFD0
#code changes
0x031FAB00 = nop ; skip fence (no waiting on GPU)
[BotwFPSv176V192]
moduleMatches = 0xFD091F9F, 0xD472D8A5
#code changes
0x031FA004 = nop

View File

@ -1,6 +0,0 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = Skip Fence
path = "The Legend of Zelda: Breath of the Wild/Mods/FPS++/Skip Fence"
description = Don't call gx2setgpufence. Most likely to cause milk water. Incompatible with other fence options.
version = 3

View File

@ -1,8 +1,8 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = Vsync Control
path = "The Legend of Zelda: Breath of the Wild/Mods/FPS++/Vsync Control"
description = Select the fps you want to be your limit with FPS++
name = Set FPS Limit
path = "The Legend of Zelda: Breath of the Wild/Mods/FPS++/Set FPS Limit (Required)"
description = Sets a cap on the FPS. If you want no gameplay bugs, use 30FPS. These bugs range from crashing after cutscenes, certain boss fights will fly away to the horizon and some physics are more intense.
version = 3
[Preset]