Merge branch 'master' into wii-network
This commit is contained in:
commit
5548e77438
|
@ -4,7 +4,6 @@
|
||||||
# Values set here will override the main dolphin settings.
|
# Values set here will override the main dolphin settings.
|
||||||
EnableFPRF = True
|
EnableFPRF = True
|
||||||
TLBHack = 1
|
TLBHack = 1
|
||||||
SyncGPU = 1
|
|
||||||
|
|
||||||
[EmuState]
|
[EmuState]
|
||||||
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
# Values set here will override the main dolphin settings.
|
# Values set here will override the main dolphin settings.
|
||||||
EnableFPRF = True
|
EnableFPRF = True
|
||||||
TLBHack = 1
|
TLBHack = 1
|
||||||
SyncGPU = 1
|
|
||||||
|
|
||||||
[EmuState]
|
[EmuState]
|
||||||
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
# Values set here will override the main dolphin settings.
|
# Values set here will override the main dolphin settings.
|
||||||
EnableFPRF = True
|
EnableFPRF = True
|
||||||
TLBHack = 1
|
TLBHack = 1
|
||||||
SyncGPU = 1
|
|
||||||
|
|
||||||
[EmuState]
|
[EmuState]
|
||||||
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
# GK2D52 - Spider-Man 2
|
||||||
|
[Core]
|
||||||
|
MMU = 1
|
||||||
|
[EmuState]
|
||||||
|
EmulationStateId = 4
|
||||||
|
EmulationIssues = Slow because it needs mmu to run.
|
||||||
|
[OnFrame]
|
||||||
|
[ActionReplay]
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Video_Hacks]
|
||||||
|
EFBToTextureEnable = False
|
||||||
|
EFBCopyEnable = True
|
|
@ -0,0 +1,18 @@
|
||||||
|
# GK2E52 - Spider-Man 2
|
||||||
|
[Core]
|
||||||
|
MMU = 1
|
||||||
|
[EmuState]
|
||||||
|
EmulationStateId = 4
|
||||||
|
EmulationIssues = Slow because it needs mmu to run.
|
||||||
|
[OnFrame]
|
||||||
|
[ActionReplay]
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Video_Hacks]
|
||||||
|
EFBToTextureEnable = False
|
||||||
|
EFBCopyEnable = True
|
|
@ -0,0 +1,18 @@
|
||||||
|
# GK2F52 - Spider-Man 2
|
||||||
|
[Core]
|
||||||
|
MMU = 1
|
||||||
|
[EmuState]
|
||||||
|
EmulationStateId = 4
|
||||||
|
EmulationIssues = Slow because it needs mmu to run.
|
||||||
|
[OnFrame]
|
||||||
|
[ActionReplay]
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Video_Hacks]
|
||||||
|
EFBToTextureEnable = False
|
||||||
|
EFBCopyEnable = True
|
|
@ -0,0 +1,18 @@
|
||||||
|
# GK2I52 - Spider-Man 2
|
||||||
|
[Core]
|
||||||
|
MMU = 1
|
||||||
|
[EmuState]
|
||||||
|
EmulationStateId = 4
|
||||||
|
EmulationIssues = Slow because it needs mmu to run.
|
||||||
|
[OnFrame]
|
||||||
|
[ActionReplay]
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Video_Hacks]
|
||||||
|
EFBToTextureEnable = False
|
||||||
|
EFBCopyEnable = True
|
|
@ -0,0 +1,18 @@
|
||||||
|
# GK2P52 - Spider-Man 2
|
||||||
|
[Core]
|
||||||
|
MMU = 1
|
||||||
|
[EmuState]
|
||||||
|
EmulationStateId = 4
|
||||||
|
EmulationIssues = Slow because it needs mmu to run.
|
||||||
|
[OnFrame]
|
||||||
|
[ActionReplay]
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Video_Hacks]
|
||||||
|
EFBToTextureEnable = False
|
||||||
|
EFBCopyEnable = True
|
|
@ -0,0 +1,31 @@
|
||||||
|
# GOYP69 - GoldenEye Rogue Agent
|
||||||
|
|
||||||
|
[Core]
|
||||||
|
# Values set here will override the main dolphin settings.
|
||||||
|
TLBHack = 1
|
||||||
|
|
||||||
|
[EmuState]
|
||||||
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
|
EmulationIssues = Videos are messed up, skip them.
|
||||||
|
EmulationStateId = 4
|
||||||
|
|
||||||
|
[OnLoad]
|
||||||
|
# Add memory patches to be loaded once on boot here.
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
# Add memory patches to be applied every frame here.
|
||||||
|
|
||||||
|
[ActionReplay]
|
||||||
|
# Add action replay cheats here.
|
||||||
|
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
|
||||||
|
[Video_Settings]
|
||||||
|
SafeTextureCacheColorSamples = 512
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
# GOYS69 - GoldenEye Rogue Agent
|
||||||
|
|
||||||
|
[Core]
|
||||||
|
# Values set here will override the main dolphin settings.
|
||||||
|
TLBHack = 1
|
||||||
|
|
||||||
|
[EmuState]
|
||||||
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
|
EmulationIssues = Videos are messed up, skip them.
|
||||||
|
EmulationStateId = 4
|
||||||
|
|
||||||
|
[OnLoad]
|
||||||
|
# Add memory patches to be loaded once on boot here.
|
||||||
|
|
||||||
|
[OnFrame]
|
||||||
|
# Add memory patches to be applied every frame here.
|
||||||
|
|
||||||
|
[ActionReplay]
|
||||||
|
# Add action replay cheats here.
|
||||||
|
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
|
||||||
|
[Video_Settings]
|
||||||
|
SafeTextureCacheColorSamples = 512
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
# GQCD52 - Call of Duty 2: Big Red One
|
||||||
|
[Core]
|
||||||
|
# Values set here will override the main dolphin settings.
|
||||||
|
MMU = 1
|
||||||
|
[EmuState]
|
||||||
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
|
EmulationIssues = Slow because it needs mmu to run.
|
||||||
|
EmulationStateId = 4
|
||||||
|
[OnLoad]
|
||||||
|
# Add memory patches to be loaded once on boot here.
|
||||||
|
[OnFrame]
|
||||||
|
[ActionReplay]
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Gecko]
|
|
@ -1,20 +1,20 @@
|
||||||
# GQCE52 - Call of Duty 2: Big Red One
|
# GQCE52 - Call of Duty 2: Big Red One
|
||||||
|
|
||||||
[Core]
|
[Core]
|
||||||
# Values set here will override the main dolphin settings.
|
# Values set here will override the main dolphin settings.
|
||||||
TLBHack = 1
|
MMU = 1
|
||||||
|
|
||||||
[EmuState]
|
[EmuState]
|
||||||
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
EmulationIssues = Black screen
|
EmulationIssues = Slow because it needs mmu to run.
|
||||||
EmulationStateId = 4
|
EmulationStateId = 4
|
||||||
|
|
||||||
[OnLoad]
|
[OnLoad]
|
||||||
# Add memory patches to be loaded once on boot here.
|
# Add memory patches to be loaded once on boot here.
|
||||||
|
|
||||||
[OnFrame]
|
[OnFrame]
|
||||||
# Add memory patches to be applied every frame here.
|
|
||||||
|
|
||||||
[ActionReplay]
|
[ActionReplay]
|
||||||
# Add action replay cheats here.
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Gecko]
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
# GQCF52 - Call of Duty 2: Big Red One
|
||||||
|
[Core]
|
||||||
|
# Values set here will override the main dolphin settings.
|
||||||
|
MMU = 1
|
||||||
|
[EmuState]
|
||||||
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
|
EmulationIssues = Slow because it needs mmu to run.
|
||||||
|
EmulationStateId = 4
|
||||||
|
[OnLoad]
|
||||||
|
# Add memory patches to be loaded once on boot here.
|
||||||
|
[OnFrame]
|
||||||
|
[ActionReplay]
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Gecko]
|
|
@ -0,0 +1,20 @@
|
||||||
|
# GQCI52 - Call of Duty 2: Big Red One
|
||||||
|
[Core]
|
||||||
|
# Values set here will override the main dolphin settings.
|
||||||
|
MMU = 1
|
||||||
|
[EmuState]
|
||||||
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
|
EmulationIssues = Slow because it needs mmu to run.
|
||||||
|
EmulationStateId = 4
|
||||||
|
[OnLoad]
|
||||||
|
# Add memory patches to be loaded once on boot here.
|
||||||
|
[OnFrame]
|
||||||
|
[ActionReplay]
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Geck
|
|
@ -0,0 +1,20 @@
|
||||||
|
# GQCP52 - Call of Duty 2: Big Red One
|
||||||
|
[Core]
|
||||||
|
# Values set here will override the main dolphin settings.
|
||||||
|
MMU = 1
|
||||||
|
[EmuState]
|
||||||
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
|
EmulationIssues = Slow because it needs mmu to run.
|
||||||
|
EmulationStateId = 4
|
||||||
|
[OnLoad]
|
||||||
|
# Add memory patches to be loaded once on boot here.
|
||||||
|
[OnFrame]
|
||||||
|
[ActionReplay]
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Gecko]
|
|
@ -1,18 +1,20 @@
|
||||||
# GQCS52 - Call of Duty 2: Big Red One
|
# GQCS52 - Call of Duty 2: Big Red One
|
||||||
|
|
||||||
[Core]
|
[Core]
|
||||||
# Values set here will override the main dolphin settings.
|
# Values set here will override the main dolphin settings.
|
||||||
|
MMU = 1
|
||||||
[EmuState]
|
[EmuState]
|
||||||
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
|
EmulationIssues = Slow because it needs mmu to run.
|
||||||
EmulationStateId = 4
|
EmulationStateId = 4
|
||||||
|
|
||||||
[OnLoad]
|
[OnLoad]
|
||||||
# Add memory patches to be loaded once on boot here.
|
# Add memory patches to be loaded once on boot here.
|
||||||
|
|
||||||
[OnFrame]
|
[OnFrame]
|
||||||
# Add memory patches to be applied every frame here.
|
|
||||||
|
|
||||||
[ActionReplay]
|
[ActionReplay]
|
||||||
# Add action replay cheats here.
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Gecko]
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
# GR8D69 - Medal of Honor Rising Sun
|
||||||
|
[Core]
|
||||||
|
# Values set here will override the main dolphin settings.
|
||||||
|
TLBHack = 1
|
||||||
|
[EmuState]
|
||||||
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
|
EmulationStateId = 3
|
||||||
|
EmulationIssues = Videos are messed up, skip them.
|
||||||
|
[OnLoad]
|
||||||
|
# Add memory patches to be loaded once on boot here.
|
||||||
|
[OnFrame]
|
||||||
|
[ActionReplay]
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Gecko]
|
|
@ -1,18 +1,20 @@
|
||||||
# GR8E69 - Medal of Honor Rising Sun
|
# GR8E69 - Medal of Honor Rising Sun
|
||||||
|
|
||||||
[Core]
|
[Core]
|
||||||
# Values set here will override the main dolphin settings.
|
# Values set here will override the main dolphin settings.
|
||||||
|
TLBHack = 1
|
||||||
[EmuState]
|
[EmuState]
|
||||||
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
EmulationStateId = 3
|
EmulationStateId = 3
|
||||||
|
EmulationIssues = Videos are messed up, skip them.
|
||||||
[OnLoad]
|
[OnLoad]
|
||||||
# Add memory patches to be loaded once on boot here.
|
# Add memory patches to be loaded once on boot here.
|
||||||
|
|
||||||
[OnFrame]
|
[OnFrame]
|
||||||
# Add memory patches to be applied every frame here.
|
|
||||||
|
|
||||||
[ActionReplay]
|
[ActionReplay]
|
||||||
# Add action replay cheats here.
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Gecko]
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
# GR8F69 - Medal of Honor Rising Sun
|
||||||
|
[Core]
|
||||||
|
# Values set here will override the main dolphin settings.
|
||||||
|
TLBHack = 1
|
||||||
|
[EmuState]
|
||||||
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
|
EmulationStateId = 3
|
||||||
|
EmulationIssues = Videos are messed up, skip them.
|
||||||
|
[OnLoad]
|
||||||
|
# Add memory patches to be loaded once on boot here.
|
||||||
|
[OnFrame]
|
||||||
|
[ActionReplay]
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Gecko]
|
|
@ -0,0 +1,20 @@
|
||||||
|
# GR8J69 - Medal of Honor Rising Sun
|
||||||
|
[Core]
|
||||||
|
# Values set here will override the main dolphin settings.
|
||||||
|
TLBHack = 1
|
||||||
|
[EmuState]
|
||||||
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
|
EmulationStateId = 3
|
||||||
|
EmulationIssues = Videos are messed up, skip them.
|
||||||
|
[OnLoad]
|
||||||
|
# Add memory patches to be loaded once on boot here.
|
||||||
|
[OnFrame]
|
||||||
|
[ActionReplay]
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Gecko]
|
|
@ -0,0 +1,20 @@
|
||||||
|
# GR8P69 - Medal of Honor Rising Sun
|
||||||
|
[Core]
|
||||||
|
# Values set here will override the main dolphin settings.
|
||||||
|
TLBHack = 1
|
||||||
|
[EmuState]
|
||||||
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
|
EmulationStateId = 3
|
||||||
|
EmulationIssues = Videos are messed up, skip them.
|
||||||
|
[OnLoad]
|
||||||
|
# Add memory patches to be loaded once on boot here.
|
||||||
|
[OnFrame]
|
||||||
|
[ActionReplay]
|
||||||
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Gecko]
|
|
@ -1,20 +1,21 @@
|
||||||
# GWJE52 - Tony Hawk's American Wasteland
|
# GWJE52 - Tony Hawk's American Wasteland
|
||||||
|
|
||||||
[Core]
|
[Core]
|
||||||
# Values set here will override the main dolphin settings.
|
# Values set here will override the main dolphin settings.
|
||||||
TLBHack=1
|
MMU = 1
|
||||||
|
|
||||||
[EmuState]
|
[EmuState]
|
||||||
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
# The Emulation State. 1 is worst, 5 is best, 0 is not set.
|
||||||
EmulationStateId = 3
|
EmulationStateId = 3
|
||||||
Issues="Error to compile...DC error?"
|
Issues="Error to compile...DC error?"
|
||||||
|
EmulationIssues = Slow because it needs mmu to run.
|
||||||
[OnLoad]
|
[OnLoad]
|
||||||
# Add memory patches to be loaded once on boot here.
|
# Add memory patches to be loaded once on boot here.
|
||||||
|
|
||||||
[OnFrame]
|
[OnFrame]
|
||||||
# Add memory patches to be applied every frame here.
|
|
||||||
|
|
||||||
[ActionReplay]
|
[ActionReplay]
|
||||||
# Add action replay cheats here.
|
[Video]
|
||||||
|
ProjectionHack = 0
|
||||||
|
PH_SZNear = 0
|
||||||
|
PH_SZFar = 0
|
||||||
|
PH_ExtraParam = 0
|
||||||
|
PH_ZNear =
|
||||||
|
PH_ZFar =
|
||||||
|
[Gecko]
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||||
|
<item
|
||||||
|
android:id="@+id/clearGameList"
|
||||||
|
android:title="@string/clear_game_list"
|
||||||
|
android:showAsAction="ifRoom|withText" />
|
||||||
|
</menu>
|
|
@ -17,9 +17,10 @@
|
||||||
<string name="parent_directory">親ディレクトリ</string>
|
<string name="parent_directory">親ディレクトリ</string>
|
||||||
<string name="folder">フォルダ</string>
|
<string name="folder">フォルダ</string>
|
||||||
<string name="file_size">ファイルサイズ: </string>
|
<string name="file_size">ファイルサイズ: </string>
|
||||||
<string name="cant_use_compressed_filetypes">圧縮ファイル形式はサポートされていません</string>
|
|
||||||
|
|
||||||
<!-- Game List Activity -->
|
<!-- Game List Activity -->
|
||||||
|
<string name="clear_game_list">クリア</string>
|
||||||
|
<string name="clear_game_list_confirm">ゲームリストからすべての項目を削除しますか?</string>
|
||||||
<string name="game_list">ゲームリスト</string>
|
<string name="game_list">ゲームリスト</string>
|
||||||
<string name="browse_folder">フォルダの参照</string>
|
<string name="browse_folder">フォルダの参照</string>
|
||||||
<string name="settings">設定</string>
|
<string name="settings">設定</string>
|
||||||
|
@ -61,7 +62,7 @@
|
||||||
<string name="cpu_settings">CPU設定</string>
|
<string name="cpu_settings">CPU設定</string>
|
||||||
<string name="emu_core_to_use">使用するエミュレーションコア</string>
|
<string name="emu_core_to_use">使用するエミュレーションコア</string>
|
||||||
<string name="dual_core">デュアルコア</string>
|
<string name="dual_core">デュアルコア</string>
|
||||||
<string name="on_off">有効/無効</string>
|
<string name="dual_core_descrip">処理のための2つのCPUコアを使用して。速度が向上します。</string>
|
||||||
<string name="video_settings">ビデオ設定</string>
|
<string name="video_settings">ビデオ設定</string>
|
||||||
<string name="software_renderer">Software Renderer</string>
|
<string name="software_renderer">Software Renderer</string>
|
||||||
<string name="opengl_es3">OpenGL ES 3</string>
|
<string name="opengl_es3">OpenGL ES 3</string>
|
||||||
|
|
|
@ -17,9 +17,10 @@
|
||||||
<string name="parent_directory">Parent Directory</string>
|
<string name="parent_directory">Parent Directory</string>
|
||||||
<string name="folder">Folder</string>
|
<string name="folder">Folder</string>
|
||||||
<string name="file_size">File Size: </string>
|
<string name="file_size">File Size: </string>
|
||||||
<string name="cant_use_compressed_filetypes">Can not use compressed file types</string>
|
|
||||||
|
|
||||||
<!-- Game List Activity -->
|
<!-- Game List Activity -->
|
||||||
|
<string name="clear_game_list">Clear game list</string>
|
||||||
|
<string name="clear_game_list_confirm">Do you want to clear the game list?</string>
|
||||||
<string name="game_list">Game List</string>
|
<string name="game_list">Game List</string>
|
||||||
<string name="browse_folder">Browse Folder</string>
|
<string name="browse_folder">Browse Folder</string>
|
||||||
<string name="settings">Settings</string>
|
<string name="settings">Settings</string>
|
||||||
|
@ -58,11 +59,11 @@
|
||||||
<string name="jitil_recompiler">JITIL Recompiler</string>
|
<string name="jitil_recompiler">JITIL Recompiler</string>
|
||||||
<string name="jit_arm_recompiler">JIT ARM Recompiler</string>
|
<string name="jit_arm_recompiler">JIT ARM Recompiler</string>
|
||||||
<string name="cpu_core">CPU Core</string>
|
<string name="cpu_core">CPU Core</string>
|
||||||
<string name="cpu_settings">CPU Settings</string>
|
<string name="cpu_settings">CPU</string>
|
||||||
<string name="emu_core_to_use">Emulation core to use</string>
|
<string name="emu_core_to_use">Emulation core to use</string>
|
||||||
<string name="dual_core">Dual Core</string>
|
<string name="dual_core">Dual Core</string>
|
||||||
<string name="on_off">On/Off</string>
|
<string name="dual_core_descrip">Split workload to two CPU cores instead of one. Increases speed.</string>
|
||||||
<string name="video_settings">Video Settings</string>
|
<string name="video_settings">Video</string>
|
||||||
<string name="software_renderer">Software Renderer</string>
|
<string name="software_renderer">Software Renderer</string>
|
||||||
<string name="opengl_es3">OpenGL ES 3</string>
|
<string name="opengl_es3">OpenGL ES 3</string>
|
||||||
<string name="video_backend">Video Backend</string>
|
<string name="video_backend">Video Backend</string>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<!-- CPU Settings -->
|
<!-- CPU Settings -->
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:key="dualCorePref"
|
android:key="dualCorePref"
|
||||||
android:summary="@string/on_off"
|
android:summary="@string/dual_core_descrip"
|
||||||
android:title="@string/dual_core" />
|
android:title="@string/dual_core" />
|
||||||
|
|
||||||
<ListPreference
|
<ListPreference
|
||||||
|
|
|
@ -36,8 +36,8 @@ public final class AboutFragment extends Fragment
|
||||||
String no = getString(R.string.no);
|
String no = getString(R.string.no);
|
||||||
|
|
||||||
List<FolderBrowserItem> Input = new ArrayList<FolderBrowserItem>();
|
List<FolderBrowserItem> Input = new ArrayList<FolderBrowserItem>();
|
||||||
Input.add(new FolderBrowserItem(getString(R.string.build_revision), NativeLibrary.GetVersionString(), "", true));
|
Input.add(new FolderBrowserItem(getString(R.string.build_revision), NativeLibrary.GetVersionString(), ""));
|
||||||
Input.add(new FolderBrowserItem(getString(R.string.supports_gles3), VideoSettingsFragment.SupportsGLES3() ? yes : no, "", true));
|
Input.add(new FolderBrowserItem(getString(R.string.supports_gles3), VideoSettingsFragment.SupportsGLES3() ? yes : no, ""));
|
||||||
|
|
||||||
adapter = new FolderBrowserAdapter(m_activity, R.layout.about_layout, Input);
|
adapter = new FolderBrowserAdapter(m_activity, R.layout.about_layout, Input);
|
||||||
mMainList.setAdapter(adapter);
|
mMainList.setAdapter(adapter);
|
||||||
|
|
|
@ -128,6 +128,8 @@ public final class DolphinEmulator<MainActivity> extends Activity
|
||||||
CopyAsset("setting-usa.txt", WiiDir + File.separator + "setting-usa.txt");
|
CopyAsset("setting-usa.txt", WiiDir + File.separator + "setting-usa.txt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load the configuration keys set in the Dolphin ini and gfx ini files
|
||||||
|
// into the application's shared preferences.
|
||||||
UserPreferences.LoadDolphinConfigToPrefs(this);
|
UserPreferences.LoadDolphinConfigToPrefs(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -148,7 +150,6 @@ public final class DolphinEmulator<MainActivity> extends Activity
|
||||||
String FileName = data.getStringExtra("Select");
|
String FileName = data.getStringExtra("Select");
|
||||||
GLview = new NativeGLSurfaceView(this);
|
GLview = new NativeGLSurfaceView(this);
|
||||||
this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||||
String backend = NativeLibrary.GetConfig("Dolphin.ini", "Core", "GFXBackend", "Software Renderer");
|
|
||||||
NativeLibrary.SetDimensions((int)screenWidth, (int)screenHeight);
|
NativeLibrary.SetDimensions((int)screenWidth, (int)screenHeight);
|
||||||
NativeLibrary.SetFilename(FileName);
|
NativeLibrary.SetFilename(FileName);
|
||||||
setContentView(GLview);
|
setContentView(GLview);
|
||||||
|
|
|
@ -18,17 +18,83 @@ public final class NativeLibrary
|
||||||
public static native void onTouchEvent(int Action, float X, float Y);
|
public static native void onTouchEvent(int Action, float X, float Y);
|
||||||
public static native void onGamePadEvent(String Device, int Button, int Action);
|
public static native void onGamePadEvent(String Device, int Button, int Action);
|
||||||
public static native void onGamePadMoveEvent(String Device, int Axis, float Value);
|
public static native void onGamePadMoveEvent(String Device, int Axis, float Value);
|
||||||
public static native String GetConfig(String configFile, String Key, String Value, String Default);
|
|
||||||
public static native void SetConfig(String configFile, String Key, String Value, String Default);
|
/**
|
||||||
|
* Gets a value from a key in the given ini-based config file.
|
||||||
|
*
|
||||||
|
* @param configFile The ini-based config file to get the value from.
|
||||||
|
* @param Section The section key that the actual key is in.
|
||||||
|
* @param Key The key to get the value from.
|
||||||
|
* @param Default The value to return in the event the given key doesn't exist.
|
||||||
|
*
|
||||||
|
* @return the value stored at the key, or a default value if it doesn't exist.
|
||||||
|
*/
|
||||||
|
public static native String GetConfig(String configFile, String Section, String Key, String Default);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a value to a key in the given ini config file.
|
||||||
|
*
|
||||||
|
* @param configFile The ini-based config file to add the value to.
|
||||||
|
* @param Section The section key for the ini key
|
||||||
|
* @param Key The actual ini key to set.
|
||||||
|
* @param Value The string to set the ini key to.
|
||||||
|
*/
|
||||||
|
public static native void SetConfig(String configFile, String Section, String Key, String Value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the filename to be run during emulation.
|
||||||
|
*
|
||||||
|
* @param filename The filename to be run during emulation.
|
||||||
|
*/
|
||||||
public static native void SetFilename(String filename);
|
public static native void SetFilename(String filename);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the dimensions of the rendering window.
|
||||||
|
*
|
||||||
|
* @param width The new width of the rendering window (in pixels).
|
||||||
|
* @param height The new height of the rendering window (in pixels).
|
||||||
|
*/
|
||||||
public static native void SetDimensions(int width, int height);
|
public static native void SetDimensions(int width, int height);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the embedded banner within the given ISO/ROM.
|
||||||
|
*
|
||||||
|
* @param filename the file path to the ISO/ROM.
|
||||||
|
*
|
||||||
|
* @return an integer array containing the color data for the banner.
|
||||||
|
*/
|
||||||
public static native int[] GetBanner(String filename);
|
public static native int[] GetBanner(String filename);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the embedded title of the given ISO/ROM.
|
||||||
|
*
|
||||||
|
* @param filename The file path to the ISO/ROM.
|
||||||
|
*
|
||||||
|
* @return the embedded title of the ISO/ROM.
|
||||||
|
*/
|
||||||
public static native String GetTitle(String filename);
|
public static native String GetTitle(String filename);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the Dolphin version string.
|
||||||
|
*
|
||||||
|
* @return the Dolphin version string.
|
||||||
|
*/
|
||||||
public static native String GetVersionString();
|
public static native String GetVersionString();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begins emulation.
|
||||||
|
*
|
||||||
|
* @param surf The surface to render to.
|
||||||
|
*/
|
||||||
public static native void Run(Surface surf);
|
public static native void Run(Surface surf);
|
||||||
|
|
||||||
|
/** Unpauses emulation from a paused state. */
|
||||||
public static native void UnPauseEmulation();
|
public static native void UnPauseEmulation();
|
||||||
|
|
||||||
|
/** Pauses emulation. */
|
||||||
public static native void PauseEmulation();
|
public static native void PauseEmulation();
|
||||||
|
|
||||||
|
/** Stops emulation. */
|
||||||
public static native void StopEmulation();
|
public static native void StopEmulation();
|
||||||
|
|
||||||
static
|
static
|
||||||
|
|
|
@ -10,7 +10,6 @@ import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
@ -50,7 +49,6 @@ public final class FolderBrowser extends Fragment
|
||||||
|
|
||||||
// Supported extensions to filter by
|
// Supported extensions to filter by
|
||||||
Set<String> validExts = new HashSet<String>(Arrays.asList(".gcm", ".iso", ".wbfs", ".gcz", ".dol", ".elf", ".dff"));
|
Set<String> validExts = new HashSet<String>(Arrays.asList(".gcm", ".iso", ".wbfs", ".gcz", ".dol", ".elf", ".dff"));
|
||||||
Set<String> invalidExts = new HashSet<String>(Arrays.asList(".zip", ".rar", ".7z"));
|
|
||||||
|
|
||||||
// Search for any directories or files within the current dir.
|
// Search for any directories or files within the current dir.
|
||||||
for(File entry : dirs)
|
for(File entry : dirs)
|
||||||
|
@ -65,17 +63,13 @@ public final class FolderBrowser extends Fragment
|
||||||
{
|
{
|
||||||
if(entry.isDirectory())
|
if(entry.isDirectory())
|
||||||
{
|
{
|
||||||
dir.add(new FolderBrowserItem(entryName, entry.getAbsolutePath(), true));
|
dir.add(new FolderBrowserItem(entryName, entry.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
else if (entry.isFile() && hasExtension)
|
else if (entry.isFile() && hasExtension)
|
||||||
{
|
{
|
||||||
if (validExts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.'))))
|
if (validExts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.'))))
|
||||||
{
|
{
|
||||||
fls.add(new FolderBrowserItem(entryName, getString(R.string.file_size)+entry.length(), entry.getAbsolutePath(), true));
|
fls.add(new FolderBrowserItem(entryName, getString(R.string.file_size)+entry.length(), entry.getAbsolutePath()));
|
||||||
}
|
|
||||||
else if (invalidExts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.'))))
|
|
||||||
{
|
|
||||||
fls.add(new FolderBrowserItem(entryName, getString(R.string.file_size)+entry.length(), entry.getAbsolutePath(), false));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -92,7 +86,7 @@ public final class FolderBrowser extends Fragment
|
||||||
|
|
||||||
// Check for a parent directory to the one we're currently in.
|
// Check for a parent directory to the one we're currently in.
|
||||||
if (!currDir.getPath().equalsIgnoreCase("/"))
|
if (!currDir.getPath().equalsIgnoreCase("/"))
|
||||||
dir.add(0, new FolderBrowserItem("..", getString(R.string.parent_directory), currDir.getParent(), true));
|
dir.add(0, new FolderBrowserItem("..", getString(R.string.parent_directory), currDir.getParent()));
|
||||||
|
|
||||||
adapter = new FolderBrowserAdapter(m_activity, R.layout.folderbrowser, dir);
|
adapter = new FolderBrowserAdapter(m_activity, R.layout.folderbrowser, dir);
|
||||||
mDrawerList = (ListView) rootView.findViewById(R.id.gamelist);
|
mDrawerList = (ListView) rootView.findViewById(R.id.gamelist);
|
||||||
|
@ -124,10 +118,7 @@ public final class FolderBrowser extends Fragment
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (item.isValid())
|
|
||||||
FolderSelected();
|
FolderSelected();
|
||||||
else
|
|
||||||
Toast.makeText(m_activity, getString(R.string.cant_use_compressed_filetypes), Toast.LENGTH_LONG).show();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -137,18 +128,9 @@ public final class FolderBrowser extends Fragment
|
||||||
{
|
{
|
||||||
super.onAttach(activity);
|
super.onAttach(activity);
|
||||||
|
|
||||||
// This makes sure that the container activity has implemented
|
// Cache the activity instance.
|
||||||
// the callback interface. If not, it throws an exception
|
|
||||||
try
|
|
||||||
{
|
|
||||||
m_activity = activity;
|
m_activity = activity;
|
||||||
}
|
}
|
||||||
catch (ClassCastException e)
|
|
||||||
{
|
|
||||||
throw new ClassCastException(activity.toString()
|
|
||||||
+ " must implement OnGameListZeroListener");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void FolderSelected()
|
private void FolderSelected()
|
||||||
|
|
|
@ -58,11 +58,6 @@ public final class FolderBrowserAdapter extends ArrayAdapter<FolderBrowserItem>
|
||||||
if(mainText != null)
|
if(mainText != null)
|
||||||
{
|
{
|
||||||
mainText.setText(item.getName());
|
mainText.setText(item.getName());
|
||||||
|
|
||||||
if (!item.isValid())
|
|
||||||
{
|
|
||||||
mainText.setTextColor(0xFFFF0000);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(subtitleText != null)
|
if(subtitleText != null)
|
||||||
|
|
|
@ -10,7 +10,6 @@ public final class FolderBrowserItem implements Comparable<FolderBrowserItem>
|
||||||
private final String name;
|
private final String name;
|
||||||
private final String subtitle;
|
private final String subtitle;
|
||||||
private final String path;
|
private final String path;
|
||||||
private final boolean isValid;
|
|
||||||
private final File underlyingFile;
|
private final File underlyingFile;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -19,14 +18,12 @@ public final class FolderBrowserItem implements Comparable<FolderBrowserItem>
|
||||||
* @param name The name of the file/folder represented by this item.
|
* @param name The name of the file/folder represented by this item.
|
||||||
* @param subtitle The subtitle of this FolderBrowserItem to display.
|
* @param subtitle The subtitle of this FolderBrowserItem to display.
|
||||||
* @param path The path of the file/folder represented by this item.
|
* @param path The path of the file/folder represented by this item.
|
||||||
* @param isValid Whether or not this item represents a file type that can be handled.
|
|
||||||
*/
|
*/
|
||||||
public FolderBrowserItem(String name, String subtitle, String path, boolean isValid)
|
public FolderBrowserItem(String name, String subtitle, String path)
|
||||||
{
|
{
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.subtitle = subtitle;
|
this.subtitle = subtitle;
|
||||||
this.path = path;
|
this.path = path;
|
||||||
this.isValid = isValid;
|
|
||||||
this.underlyingFile = new File(path);
|
this.underlyingFile = new File(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,14 +32,12 @@ public final class FolderBrowserItem implements Comparable<FolderBrowserItem>
|
||||||
*
|
*
|
||||||
* @param name The name of the file/folder represented by this item.
|
* @param name The name of the file/folder represented by this item.
|
||||||
* @param path The path of the file/folder represented by this item.
|
* @param path The path of the file/folder represented by this item.
|
||||||
* @param isValid Whether or not this item represents a file type that can be handled.
|
|
||||||
*/
|
*/
|
||||||
public FolderBrowserItem(String name, String path, boolean isValid)
|
public FolderBrowserItem(String name, String path)
|
||||||
{
|
{
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.subtitle = "";
|
this.subtitle = "";
|
||||||
this.path = path;
|
this.path = path;
|
||||||
this.isValid = isValid;
|
|
||||||
this.underlyingFile = new File(path);
|
this.underlyingFile = new File(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,20 +71,6 @@ public final class FolderBrowserItem implements Comparable<FolderBrowserItem>
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets whether or not the file represented
|
|
||||||
* by this FolderBrowserItem is supported
|
|
||||||
* and can be handled correctly.
|
|
||||||
*
|
|
||||||
* @return whether or not the file represented
|
|
||||||
* by this FolderBrowserItem is supported
|
|
||||||
* and can be handled correctly.
|
|
||||||
*/
|
|
||||||
public boolean isValid()
|
|
||||||
{
|
|
||||||
return isValid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the {@link File} representation of the underlying file/folder
|
* Gets the {@link File} representation of the underlying file/folder
|
||||||
* represented by this FolderBrowserItem.
|
* represented by this FolderBrowserItem.
|
||||||
|
|
|
@ -7,8 +7,10 @@
|
||||||
package org.dolphinemu.dolphinemu.gamelist;
|
package org.dolphinemu.dolphinemu.gamelist;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.app.AlertDialog;
|
||||||
import android.app.Fragment;
|
import android.app.Fragment;
|
||||||
import android.app.FragmentManager;
|
import android.app.FragmentManager;
|
||||||
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
@ -16,6 +18,7 @@ import android.support.v4.app.ActionBarDrawerToggle;
|
||||||
import android.support.v4.widget.DrawerLayout;
|
import android.support.v4.widget.DrawerLayout;
|
||||||
import android.view.*;
|
import android.view.*;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -249,6 +252,20 @@ public final class GameListActivity extends Activity
|
||||||
return super.onPrepareOptionsMenu(menu);
|
return super.onPrepareOptionsMenu(menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCreateOptionsMenu(Menu menu)
|
||||||
|
{
|
||||||
|
// Only show this in the game list.
|
||||||
|
if (this.mCurFragmentNum == 0)
|
||||||
|
{
|
||||||
|
MenuInflater inflater = getMenuInflater();
|
||||||
|
inflater.inflate(R.menu.gamelist_menu, menu);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item)
|
public boolean onOptionsItemSelected(MenuItem item)
|
||||||
{
|
{
|
||||||
|
@ -259,6 +276,38 @@ public final class GameListActivity extends Activity
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If clear game list is pressed.
|
||||||
|
if (item.getItemId() == R.id.clearGameList)
|
||||||
|
{
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||||
|
builder.setTitle(R.string.clear_game_list);
|
||||||
|
builder.setMessage(getString(R.string.clear_game_list_confirm));
|
||||||
|
builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener(){
|
||||||
|
public void onClick(DialogInterface dialog, int which)
|
||||||
|
{
|
||||||
|
String directories = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPathes", "0");
|
||||||
|
int intDirs = Integer.parseInt(directories);
|
||||||
|
|
||||||
|
for (int i = 0; i < intDirs; i++)
|
||||||
|
{
|
||||||
|
NativeLibrary.SetConfig("Dolphin.ini", "General", "GCMPath" + i, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayAdapter<GameListItem> adapter = ((GameListFragment)GameListActivity.this.mCurFragment).getAdapter();
|
||||||
|
adapter.clear();
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which)
|
||||||
|
{
|
||||||
|
// Do nothing. This just make "No" appear.
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.show();
|
||||||
|
}
|
||||||
|
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,16 @@ public final class GameListFragment extends Fragment
|
||||||
void onZeroFiles();
|
void onZeroFiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the adapter for this fragment.
|
||||||
|
*
|
||||||
|
* @return the adapter for this fragment.
|
||||||
|
*/
|
||||||
|
public GameListAdapter getAdapter()
|
||||||
|
{
|
||||||
|
return mGameAdapter;
|
||||||
|
}
|
||||||
|
|
||||||
private void Fill()
|
private void Fill()
|
||||||
{
|
{
|
||||||
List<GameListItem> fls = new ArrayList<GameListItem>();
|
List<GameListItem> fls = new ArrayList<GameListItem>();
|
||||||
|
@ -77,7 +87,7 @@ public final class GameListFragment extends Fragment
|
||||||
if (!entry.isDirectory())
|
if (!entry.isDirectory())
|
||||||
{
|
{
|
||||||
if (exts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.'))))
|
if (exts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.'))))
|
||||||
fls.add(new GameListItem(mMe.getApplicationContext(), entryName, getString(R.string.file_size)+entry.length(),entry.getAbsolutePath(), true));
|
fls.add(new GameListItem(mMe.getApplicationContext(), entryName, getString(R.string.file_size)+entry.length(),entry.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -95,11 +105,12 @@ public final class GameListFragment extends Fragment
|
||||||
// so there should be no worries about accidentally removing a valid game.
|
// so there should be no worries about accidentally removing a valid game.
|
||||||
for (int i = 0; i < fls.size(); i++)
|
for (int i = 0; i < fls.size(); i++)
|
||||||
{
|
{
|
||||||
int indexNext = i+1;
|
for (int j = i+1; j < fls.size(); j++)
|
||||||
|
|
||||||
if (indexNext < fls.size() && fls.get(indexNext).getPath().contains(fls.get(i).getPath()))
|
|
||||||
{
|
{
|
||||||
fls.remove(indexNext);
|
if (fls.get(j).getPath().equals(fls.get(i).getPath()))
|
||||||
|
{
|
||||||
|
fls.remove(j);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@ public final class GameListItem implements Comparable<GameListItem>
|
||||||
private String name;
|
private String name;
|
||||||
private final String data;
|
private final String data;
|
||||||
private final String path;
|
private final String path;
|
||||||
private final boolean isValid;
|
|
||||||
private Bitmap image;
|
private Bitmap image;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -37,12 +36,11 @@ public final class GameListItem implements Comparable<GameListItem>
|
||||||
* @param path The file path for the game represented by this GameListItem.
|
* @param path The file path for the game represented by this GameListItem.
|
||||||
* @param isValid Whether or not the emulator can handle this file.
|
* @param isValid Whether or not the emulator can handle this file.
|
||||||
*/
|
*/
|
||||||
public GameListItem(Context ctx, String name, String data, String path, boolean isValid)
|
public GameListItem(Context ctx, String name, String data, String path)
|
||||||
{
|
{
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.data = data;
|
this.data = data;
|
||||||
this.path = path;
|
this.path = path;
|
||||||
this.isValid = isValid;
|
|
||||||
|
|
||||||
File file = new File(path);
|
File file = new File(path);
|
||||||
if (!file.isDirectory() && !path.equals(""))
|
if (!file.isDirectory() && !path.equals(""))
|
||||||
|
@ -115,16 +113,6 @@ public final class GameListItem implements Comparable<GameListItem>
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets whether or not the emulator can handle this GameListItem.
|
|
||||||
*
|
|
||||||
* @return true, if this GameListItem can be handled by the emulator; false, otherwise.
|
|
||||||
*/
|
|
||||||
public boolean isValid()
|
|
||||||
{
|
|
||||||
return isValid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int compareTo(GameListItem o)
|
public int compareTo(GameListItem o)
|
||||||
{
|
{
|
||||||
if (this.name != null)
|
if (this.name != null)
|
||||||
|
|
|
@ -402,7 +402,7 @@ void SConfig::LoadSettings()
|
||||||
ini.Get("Core", "EnableCheats", &m_LocalCoreStartupParameter.bEnableCheats, false);
|
ini.Get("Core", "EnableCheats", &m_LocalCoreStartupParameter.bEnableCheats, false);
|
||||||
ini.Get("Core", "SelectedLanguage", &m_LocalCoreStartupParameter.SelectedLanguage, 0);
|
ini.Get("Core", "SelectedLanguage", &m_LocalCoreStartupParameter.SelectedLanguage, 0);
|
||||||
ini.Get("Core", "DPL2Decoder", &m_LocalCoreStartupParameter.bDPL2Decoder, false);
|
ini.Get("Core", "DPL2Decoder", &m_LocalCoreStartupParameter.bDPL2Decoder, false);
|
||||||
ini.Get("Core", "Latency", &m_LocalCoreStartupParameter.iLatency, 14);
|
ini.Get("Core", "Latency", &m_LocalCoreStartupParameter.iLatency, 2);
|
||||||
ini.Get("Core", "MemcardA", &m_strMemoryCardA);
|
ini.Get("Core", "MemcardA", &m_strMemoryCardA);
|
||||||
ini.Get("Core", "MemcardB", &m_strMemoryCardB);
|
ini.Get("Core", "MemcardB", &m_strMemoryCardB);
|
||||||
ini.Get("Core", "SlotA", (int*)&m_EXIDevice[0], EXIDEVICE_MEMORYCARD);
|
ini.Get("Core", "SlotA", (int*)&m_EXIDevice[0], EXIDEVICE_MEMORYCARD);
|
||||||
|
|
|
@ -388,7 +388,7 @@ void EmuThread()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
OSD::AddMessage(("Dolphin " + g_video_backend->GetName() + " Video Backend.").c_str(), 5000);
|
OSD::AddMessage("Dolphin " + g_video_backend->GetName() + " Video Backend.", 5000);
|
||||||
|
|
||||||
if (!DSP::GetDSPEmulator()->Initialize(g_pWindowHandle,
|
if (!DSP::GetDSPEmulator()->Initialize(g_pWindowHandle,
|
||||||
_CoreParameter.bWii, _CoreParameter.bDSPThread))
|
_CoreParameter.bWii, _CoreParameter.bDSPThread))
|
||||||
|
|
|
@ -23,22 +23,6 @@ NetSettings g_NetPlaySettings;
|
||||||
|
|
||||||
#define RPT_SIZE_HACK (1 << 16)
|
#define RPT_SIZE_HACK (1 << 16)
|
||||||
|
|
||||||
NetPlayClient::Player::Player()
|
|
||||||
{
|
|
||||||
memset(pad_map, -1, sizeof(pad_map));
|
|
||||||
}
|
|
||||||
|
|
||||||
// called from ---GUI--- thread
|
|
||||||
std::string NetPlayClient::Player::ToString() const
|
|
||||||
{
|
|
||||||
std::ostringstream ss;
|
|
||||||
ss << name << '[' << (char)(pid+'0') << "] : " << revision << " |";
|
|
||||||
for (unsigned int i=0; i<4; ++i)
|
|
||||||
ss << (pad_map[i]>=0 ? (char)(pad_map[i]+'1') : '-');
|
|
||||||
ss << " | " << ping << "ms";
|
|
||||||
return ss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
NetPad::NetPad()
|
NetPad::NetPad()
|
||||||
{
|
{
|
||||||
nHi = 0x00808080;
|
nHi = 0x00808080;
|
||||||
|
@ -200,16 +184,8 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)
|
||||||
|
|
||||||
case NP_MSG_PAD_MAPPING :
|
case NP_MSG_PAD_MAPPING :
|
||||||
{
|
{
|
||||||
PlayerId pid;
|
for (PadMapping i = 0; i < 4; i++)
|
||||||
packet >> pid;
|
packet >> m_pad_map[i];
|
||||||
|
|
||||||
{
|
|
||||||
std::lock_guard<std::recursive_mutex> lkp(m_crit.players);
|
|
||||||
Player& player = m_players[pid];
|
|
||||||
|
|
||||||
for (unsigned int i=0; i<4; ++i)
|
|
||||||
packet >> player.pad_map[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
m_dialog->Update();
|
m_dialog->Update();
|
||||||
}
|
}
|
||||||
|
@ -223,7 +199,7 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)
|
||||||
|
|
||||||
// trusting server for good map value (>=0 && <4)
|
// trusting server for good map value (>=0 && <4)
|
||||||
// add to pad buffer
|
// add to pad buffer
|
||||||
m_pad_buffer[(unsigned)map].Push(np);
|
m_pad_buffer[map].Push(np);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -361,13 +337,36 @@ void NetPlayClient::GetPlayerList(std::string& list, std::vector<int>& pid_list)
|
||||||
e = m_players.end();
|
e = m_players.end();
|
||||||
for ( ; i!=e; ++i)
|
for ( ; i!=e; ++i)
|
||||||
{
|
{
|
||||||
ss << i->second.ToString() << '\n';
|
const Player *player = &(i->second);
|
||||||
pid_list.push_back(i->second.pid);
|
ss << player->name << "[" << (int)player->pid << "] : " << player->revision << " | ";
|
||||||
|
for (unsigned int j = 0; j < 4; j++)
|
||||||
|
{
|
||||||
|
if (m_pad_map[j] == player->pid)
|
||||||
|
ss << j + 1;
|
||||||
|
else
|
||||||
|
ss << '-';
|
||||||
|
}
|
||||||
|
ss << " | " << player->ping << "ms\n";
|
||||||
|
pid_list.push_back(player->pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
list = ss.str();
|
list = ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// called from ---GUI--- thread
|
||||||
|
void NetPlayClient::GetPlayers(std::vector<const Player *> &player_list)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::recursive_mutex> lkp(m_crit.players);
|
||||||
|
std::map<PlayerId, Player>::const_iterator
|
||||||
|
i = m_players.begin(),
|
||||||
|
e = m_players.end();
|
||||||
|
for ( ; i!=e; ++i)
|
||||||
|
{
|
||||||
|
const Player *player = &(i->second);
|
||||||
|
player_list.push_back(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// called from ---GUI--- thread
|
// called from ---GUI--- thread
|
||||||
void NetPlayClient::SendChatMessage(const std::string& msg)
|
void NetPlayClient::SendChatMessage(const std::string& msg)
|
||||||
|
@ -381,12 +380,12 @@ void NetPlayClient::SendChatMessage(const std::string& msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// called from ---CPU--- thread
|
// called from ---CPU--- thread
|
||||||
void NetPlayClient::SendPadState(const PadMapping local_nb, const NetPad& np)
|
void NetPlayClient::SendPadState(const PadMapping in_game_pad, const NetPad& np)
|
||||||
{
|
{
|
||||||
// send to server
|
// send to server
|
||||||
sf::Packet spac;
|
sf::Packet spac;
|
||||||
spac << (MessageId)NP_MSG_PAD_DATA;
|
spac << (MessageId)NP_MSG_PAD_DATA;
|
||||||
spac << local_nb; // local pad num
|
spac << in_game_pad;
|
||||||
spac << np.nHi << np.nLo;
|
spac << np.nHi << np.nLo;
|
||||||
|
|
||||||
std::lock_guard<std::recursive_mutex> lks(m_crit.send);
|
std::lock_guard<std::recursive_mutex> lks(m_crit.send);
|
||||||
|
@ -457,13 +456,35 @@ void NetPlayClient::ClearBuffers()
|
||||||
// called from ---CPU--- thread
|
// called from ---CPU--- thread
|
||||||
bool NetPlayClient::GetNetPads(const u8 pad_nb, const SPADStatus* const pad_status, NetPad* const netvalues)
|
bool NetPlayClient::GetNetPads(const u8 pad_nb, const SPADStatus* const pad_status, NetPad* const netvalues)
|
||||||
{
|
{
|
||||||
{
|
// The interface for this is extremely silly.
|
||||||
std::lock_guard<std::recursive_mutex> lkp(m_crit.players);
|
//
|
||||||
|
// Imagine a physical device that links three Gamecubes together
|
||||||
|
// and emulates NetPlay that way. Which Gamecube controls which
|
||||||
|
// in-game controllers can be configured on the device (m_pad_map)
|
||||||
|
// but which sockets on each individual Gamecube should be used
|
||||||
|
// to control which players? The solution that Dolphin uses is
|
||||||
|
// that we hardcode the knowledge that they go in order, so if
|
||||||
|
// you have a 3P game with three gamecubes, then every single
|
||||||
|
// controller should be plugged into slot 1.
|
||||||
|
//
|
||||||
|
// If you have a 4P game, then one of the Gamecubes will have
|
||||||
|
// a controller plugged into slot 1, and another in slot 2.
|
||||||
|
//
|
||||||
|
// The slot number is the "local" pad number, and what player
|
||||||
|
// it actually means is the "in-game" pad number.
|
||||||
|
//
|
||||||
|
// The interface here gives us the status of local pads, and
|
||||||
|
// expects to get back "in-game" pad numbers back in response.
|
||||||
|
// e.g. it asks "here's the input that slot 1 has, and by the
|
||||||
|
// way, what's the state of P1?"
|
||||||
|
//
|
||||||
|
// We should add this split between "in-game" pads and "local"
|
||||||
|
// pads higher up.
|
||||||
|
|
||||||
// in game mapping for this local pad
|
int in_game_num = GetPadNum(pad_nb);
|
||||||
unsigned int in_game_num = m_local_player->pad_map[pad_nb];
|
|
||||||
|
|
||||||
// does this local pad map in game?
|
// If this in-game pad is one of ours, then update from the
|
||||||
|
// information given.
|
||||||
if (in_game_num < 4)
|
if (in_game_num < 4)
|
||||||
{
|
{
|
||||||
NetPad np(pad_status);
|
NetPad np(pad_status);
|
||||||
|
@ -476,89 +497,36 @@ bool NetPlayClient::GetNetPads(const u8 pad_nb, const SPADStatus* const pad_stat
|
||||||
m_pad_buffer[in_game_num].Push(np);
|
m_pad_buffer[in_game_num].Push(np);
|
||||||
|
|
||||||
// send
|
// send
|
||||||
SendPadState(pad_nb, np);
|
SendPadState(in_game_num, np);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // unlock players
|
// Now, we need to swap out the local value with the values
|
||||||
|
// retrieved from NetPlay. This could be the value we pushed
|
||||||
//Common::Timer bufftimer;
|
// above if we're configured as P1 and the code is trying
|
||||||
//bufftimer.Start();
|
// to retrieve data for slot 1.
|
||||||
|
|
||||||
// get padstate from buffer and send to game
|
|
||||||
while (!m_pad_buffer[pad_nb].Pop(*netvalues))
|
while (!m_pad_buffer[pad_nb].Pop(*netvalues))
|
||||||
{
|
{
|
||||||
// wait for receiving thread to push some data
|
if (!m_is_running)
|
||||||
Common::SleepCurrentThread(1);
|
|
||||||
|
|
||||||
if (false == m_is_running)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// TODO: check the time of bufftimer here,
|
// TODO: use a condition instead of sleeping
|
||||||
// if it gets pretty high, ask the user if they want to disconnect
|
Common::SleepCurrentThread(1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//u64 hangtime = bufftimer.GetTimeElapsed();
|
|
||||||
//if (hangtime > 10)
|
|
||||||
//{
|
|
||||||
// std::ostringstream ss;
|
|
||||||
// ss << "Pad " << (int)pad_nb << ": Had to wait " << hangtime << "ms for pad data. (increase pad Buffer maybe)";
|
|
||||||
// Core::DisplayMessage(ss.str(), 1000);
|
|
||||||
//}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// called from ---CPU--- thread
|
// called from ---CPU--- thread
|
||||||
void NetPlayClient::WiimoteInput(int _number, u16 _channelID, const void* _pData, u32 _Size)
|
void NetPlayClient::WiimoteInput(int _number, u16 _channelID, const void* _pData, u32 _Size)
|
||||||
{
|
{
|
||||||
//// in game mapping for this local wiimote
|
// XXX
|
||||||
unsigned int in_game_num = m_local_player->pad_map[_number]; // just using gc pad_map for now
|
|
||||||
|
|
||||||
// does this local pad map in game?
|
|
||||||
if (in_game_num < 4)
|
|
||||||
{
|
|
||||||
m_wiimote_input[_number].resize(m_wiimote_input[_number].size() + 1);
|
|
||||||
m_wiimote_input[_number].back().assign((char*)_pData, (char*)_pData + _Size);
|
|
||||||
m_wiimote_input[_number].back().channel = _channelID;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// called from ---CPU--- thread
|
// called from ---CPU--- thread
|
||||||
void NetPlayClient::WiimoteUpdate(int _number)
|
void NetPlayClient::WiimoteUpdate(int _number)
|
||||||
{
|
{
|
||||||
{
|
// XXX
|
||||||
std::lock_guard<std::recursive_mutex> lkp(m_crit.players);
|
|
||||||
|
|
||||||
// in game mapping for this local wiimote
|
|
||||||
unsigned int in_game_num = m_local_player->pad_map[_number]; // just using gc pad_map for now
|
|
||||||
|
|
||||||
// does this local pad map in game?
|
|
||||||
if (in_game_num < 4)
|
|
||||||
{
|
|
||||||
m_wiimote_buffer[in_game_num].Push(m_wiimote_input[_number]);
|
|
||||||
|
|
||||||
// TODO: send it
|
|
||||||
|
|
||||||
m_wiimote_input[_number].clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // unlock players
|
|
||||||
|
|
||||||
if (0 == m_wiimote_buffer[_number].Size())
|
|
||||||
{
|
|
||||||
//PanicAlert("PANIC");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NetWiimote nw;
|
|
||||||
m_wiimote_buffer[_number].Pop(nw);
|
|
||||||
|
|
||||||
NetWiimote::const_iterator
|
|
||||||
i = nw.begin(), e = nw.end();
|
|
||||||
for ( ; i!=e; ++i)
|
|
||||||
Core::Callback_WiimoteInterruptChannel(_number, i->channel, &(*i)[0], (u32)i->size() + RPT_SIZE_HACK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// called from ---GUI--- thread and ---NETPLAY--- thread (client side)
|
// called from ---GUI--- thread and ---NETPLAY--- thread (client side)
|
||||||
|
@ -586,13 +554,21 @@ bool NetPlayClient::StopGame()
|
||||||
// called from ---CPU--- thread
|
// called from ---CPU--- thread
|
||||||
u8 NetPlayClient::GetPadNum(u8 numPAD)
|
u8 NetPlayClient::GetPadNum(u8 numPAD)
|
||||||
{
|
{
|
||||||
// TODO: i don't like that this loop is running everytime there is rumble
|
// Figure out which in-game pad maps to which local pad.
|
||||||
unsigned int i = 0;
|
// The logic we have here is that the local slots always
|
||||||
for (; i<4; ++i)
|
// go in order.
|
||||||
if (numPAD == m_local_player->pad_map[i])
|
int local_pad_count = -1;
|
||||||
break;
|
int ingame_pad = 0;
|
||||||
|
for (; ingame_pad < 4; ingame_pad++)
|
||||||
|
{
|
||||||
|
if (m_pad_map[ingame_pad] == m_local_player->pid)
|
||||||
|
local_pad_count++;
|
||||||
|
|
||||||
return i;
|
if (local_pad_count == numPAD)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ingame_pad;
|
||||||
}
|
}
|
||||||
|
|
||||||
// stuff hacked into dolphin
|
// stuff hacked into dolphin
|
||||||
|
@ -658,21 +634,12 @@ u8 CSIDevice_DanceMat::NetPlay_GetPadNum(u8 numPAD)
|
||||||
//void CWII_IPC_HLE_Device_usb_oh1_57e_305::NetPlay_WiimoteUpdate(int _number)
|
//void CWII_IPC_HLE_Device_usb_oh1_57e_305::NetPlay_WiimoteUpdate(int _number)
|
||||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::NetPlay_WiimoteUpdate(int)
|
void CWII_IPC_HLE_Device_usb_oh1_57e_305::NetPlay_WiimoteUpdate(int)
|
||||||
{
|
{
|
||||||
//CritLocker crit(crit_netplay_client);
|
|
||||||
|
|
||||||
//if (netplay_client)
|
|
||||||
// netplay_client->WiimoteUpdate(_number);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// called from ---CPU--- thread
|
// called from ---CPU--- thread
|
||||||
//
|
//
|
||||||
int CWII_IPC_HLE_WiiMote::NetPlay_GetWiimoteNum(int _number)
|
int CWII_IPC_HLE_WiiMote::NetPlay_GetWiimoteNum(int _number)
|
||||||
{
|
{
|
||||||
//CritLocker crit(crit_netplay_client);
|
|
||||||
|
|
||||||
//if (netplay_client)
|
|
||||||
// return netplay_client->GetPadNum(_number); // just using gcpad mapping for now
|
|
||||||
//else
|
|
||||||
return _number;
|
return _number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -684,19 +651,7 @@ bool CWII_IPC_HLE_WiiMote::NetPlay_WiimoteInput(int, u16, const void*, u32&)
|
||||||
std::lock_guard<std::mutex> lk(crit_netplay_client);
|
std::lock_guard<std::mutex> lk(crit_netplay_client);
|
||||||
|
|
||||||
if (netplay_client)
|
if (netplay_client)
|
||||||
//{
|
|
||||||
// if (_Size >= RPT_SIZE_HACK)
|
|
||||||
// {
|
|
||||||
// _Size -= RPT_SIZE_HACK;
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// netplay_client->WiimoteInput(_number, _channelID, _pData, _Size);
|
|
||||||
// // don't use this packet
|
|
||||||
return true;
|
return true;
|
||||||
// }
|
|
||||||
//}
|
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,15 @@ public:
|
||||||
|
|
||||||
extern NetSettings g_NetPlaySettings;
|
extern NetSettings g_NetPlaySettings;
|
||||||
|
|
||||||
|
class Player
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PlayerId pid;
|
||||||
|
std::string name;
|
||||||
|
std::string revision;
|
||||||
|
u32 ping;
|
||||||
|
};
|
||||||
|
|
||||||
class NetPlayClient
|
class NetPlayClient
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -59,6 +68,7 @@ public:
|
||||||
~NetPlayClient();
|
~NetPlayClient();
|
||||||
|
|
||||||
void GetPlayerList(std::string& list, std::vector<int>& pid_list);
|
void GetPlayerList(std::string& list, std::vector<int>& pid_list);
|
||||||
|
void GetPlayers(std::vector<const Player *>& player_list);
|
||||||
|
|
||||||
bool is_connected;
|
bool is_connected;
|
||||||
|
|
||||||
|
@ -84,19 +94,6 @@ protected:
|
||||||
std::recursive_mutex players, send;
|
std::recursive_mutex players, send;
|
||||||
} m_crit;
|
} m_crit;
|
||||||
|
|
||||||
class Player
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Player();
|
|
||||||
std::string ToString() const;
|
|
||||||
|
|
||||||
PlayerId pid;
|
|
||||||
std::string name;
|
|
||||||
PadMapping pad_map[4];
|
|
||||||
std::string revision;
|
|
||||||
u32 ping;
|
|
||||||
};
|
|
||||||
|
|
||||||
Common::FifoQueue<NetPad> m_pad_buffer[4];
|
Common::FifoQueue<NetPad> m_pad_buffer[4];
|
||||||
Common::FifoQueue<NetWiimote> m_wiimote_buffer[4];
|
Common::FifoQueue<NetWiimote> m_wiimote_buffer[4];
|
||||||
|
|
||||||
|
@ -117,8 +114,10 @@ protected:
|
||||||
|
|
||||||
u32 m_current_game;
|
u32 m_current_game;
|
||||||
|
|
||||||
|
PadMapping m_pad_map[4];
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void SendPadState(const PadMapping local_nb, const NetPad& np);
|
void SendPadState(const PadMapping in_game_pad, const NetPad& np);
|
||||||
unsigned int OnData(sf::Packet& packet);
|
unsigned int OnData(sf::Packet& packet);
|
||||||
|
|
||||||
PlayerId m_pid;
|
PlayerId m_pid;
|
||||||
|
|
|
@ -24,7 +24,7 @@ struct Rpt : public std::vector<u8>
|
||||||
|
|
||||||
typedef std::vector<Rpt> NetWiimote;
|
typedef std::vector<Rpt> NetWiimote;
|
||||||
|
|
||||||
#define NETPLAY_VERSION "Dolphin NetPlay 2013-08-18"
|
#define NETPLAY_VERSION "Dolphin NetPlay 2013-08-23"
|
||||||
|
|
||||||
// messages
|
// messages
|
||||||
enum
|
enum
|
||||||
|
|
|
@ -4,11 +4,6 @@
|
||||||
|
|
||||||
#include "NetPlayServer.h"
|
#include "NetPlayServer.h"
|
||||||
|
|
||||||
NetPlayServer::Client::Client()
|
|
||||||
{
|
|
||||||
memset(pad_map, -1, sizeof(pad_map));
|
|
||||||
}
|
|
||||||
|
|
||||||
NetPlayServer::~NetPlayServer()
|
NetPlayServer::~NetPlayServer()
|
||||||
{
|
{
|
||||||
if (is_connected)
|
if (is_connected)
|
||||||
|
@ -29,6 +24,7 @@ NetPlayServer::~NetPlayServer()
|
||||||
// called from ---GUI--- thread
|
// called from ---GUI--- thread
|
||||||
NetPlayServer::NetPlayServer(const u16 port) : is_connected(false), m_is_running(false)
|
NetPlayServer::NetPlayServer(const u16 port) : is_connected(false), m_is_running(false)
|
||||||
{
|
{
|
||||||
|
memset(m_pad_map, -1, sizeof(m_pad_map));
|
||||||
if (m_socket.Listen(port))
|
if (m_socket.Listen(port))
|
||||||
{
|
{
|
||||||
is_connected = true;
|
is_connected = true;
|
||||||
|
@ -155,45 +151,16 @@ unsigned int NetPlayServer::OnConnect(sf::SocketTCP& socket)
|
||||||
rpac >> player.name;
|
rpac >> player.name;
|
||||||
|
|
||||||
// give new client first available id
|
// give new client first available id
|
||||||
player.pid = 0;
|
player.pid = m_players.size() + 1;
|
||||||
std::map<sf::SocketTCP, Client>::const_iterator
|
|
||||||
i,
|
|
||||||
e = m_players.end();
|
|
||||||
for (PlayerId p = 1; 0 == player.pid; ++p)
|
|
||||||
{
|
|
||||||
for (i = m_players.begin(); ; ++i)
|
|
||||||
{
|
|
||||||
if (e == i)
|
|
||||||
{
|
|
||||||
player.pid = p;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (p == i->second.pid)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: this is crappy
|
|
||||||
// try to automatically assign new user a pad
|
// try to automatically assign new user a pad
|
||||||
|
for (unsigned int m = 0; m < 4; ++m)
|
||||||
{
|
{
|
||||||
bool is_mapped[4] = {false,false,false,false};
|
if (m_pad_map[m] == -1)
|
||||||
|
|
||||||
for ( unsigned int m = 0; m<4; ++m)
|
|
||||||
{
|
{
|
||||||
for (i = m_players.begin(); i!=e; ++i)
|
m_pad_map[m] = player.pid;
|
||||||
{
|
|
||||||
if (i->second.pad_map[m] >= 0)
|
|
||||||
is_mapped[(unsigned)i->second.pad_map[m]] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( unsigned int m = 0; m<4; ++m)
|
|
||||||
if (false == is_mapped[m])
|
|
||||||
{
|
|
||||||
player.pad_map[0] = m;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -221,6 +188,9 @@ unsigned int NetPlayServer::OnConnect(sf::SocketTCP& socket)
|
||||||
}
|
}
|
||||||
|
|
||||||
// sync values with new client
|
// sync values with new client
|
||||||
|
std::map<sf::SocketTCP, Client>::const_iterator
|
||||||
|
i,
|
||||||
|
e = m_players.end();
|
||||||
for (i = m_players.begin(); i!=e; ++i)
|
for (i = m_players.begin(); i!=e; ++i)
|
||||||
{
|
{
|
||||||
spac.Clear();
|
spac.Clear();
|
||||||
|
@ -279,83 +249,28 @@ unsigned int NetPlayServer::OnDisconnect(sf::SocketTCP& socket)
|
||||||
}
|
}
|
||||||
|
|
||||||
// called from ---GUI--- thread
|
// called from ---GUI--- thread
|
||||||
bool NetPlayServer::GetPadMapping(const int pid, int map[])
|
void NetPlayServer::GetPadMapping(PadMapping map[4])
|
||||||
{
|
{
|
||||||
std::lock_guard<std::recursive_mutex> lkp(m_crit.players);
|
for (int i = 0; i < 4; i++)
|
||||||
std::map<sf::SocketTCP, Client>::const_iterator
|
map[i] = m_pad_map[i];
|
||||||
i = m_players.begin(),
|
|
||||||
e = m_players.end();
|
|
||||||
for (; i!=e; ++i)
|
|
||||||
if (pid == i->second.pid)
|
|
||||||
break;
|
|
||||||
|
|
||||||
// player not found
|
|
||||||
if (i == e)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// get pad mapping
|
|
||||||
for (unsigned int m = 0; m<4; ++m)
|
|
||||||
map[m] = i->second.pad_map[m];
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// called from ---GUI--- thread
|
// called from ---GUI--- thread
|
||||||
bool NetPlayServer::SetPadMapping(const int pid, const int map[])
|
void NetPlayServer::SetPadMapping(const PadMapping map[4])
|
||||||
{
|
{
|
||||||
std::lock_guard<std::recursive_mutex> lkg(m_crit.game);
|
for (int i = 0; i < 4; i++)
|
||||||
if (m_is_running)
|
m_pad_map[i] = map[i];
|
||||||
return false;
|
UpdatePadMapping();
|
||||||
|
|
||||||
std::lock_guard<std::recursive_mutex> lkp(m_crit.players);
|
|
||||||
std::map<sf::SocketTCP, Client>::iterator
|
|
||||||
i = m_players.begin(),
|
|
||||||
e = m_players.end();
|
|
||||||
for (; i!=e; ++i)
|
|
||||||
if (pid == i->second.pid)
|
|
||||||
break;
|
|
||||||
|
|
||||||
// player not found
|
|
||||||
if (i == e)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
Client& player = i->second;
|
|
||||||
|
|
||||||
// set pad mapping
|
|
||||||
for (unsigned int m = 0; m<4; ++m)
|
|
||||||
{
|
|
||||||
player.pad_map[m] = (PadMapping)map[m];
|
|
||||||
|
|
||||||
// remove duplicate mappings
|
|
||||||
for (i = m_players.begin(); i!=e; ++i)
|
|
||||||
for (unsigned int p = 0; p<4; ++p)
|
|
||||||
if (p != m || i->second.pid != pid)
|
|
||||||
if (player.pad_map[m] == i->second.pad_map[p])
|
|
||||||
i->second.pad_map[p] = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::lock_guard<std::recursive_mutex> lks(m_crit.send);
|
|
||||||
UpdatePadMapping(); // sync pad mappings with everyone
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// called from ---NETPLAY--- thread
|
// called from ---GUI--- thread and ---NETPLAY--- thread
|
||||||
void NetPlayServer::UpdatePadMapping()
|
void NetPlayServer::UpdatePadMapping()
|
||||||
{
|
{
|
||||||
std::map<sf::SocketTCP, Client>::const_iterator
|
|
||||||
i = m_players.begin(),
|
|
||||||
e = m_players.end();
|
|
||||||
for (; i!=e; ++i)
|
|
||||||
{
|
|
||||||
sf::Packet spac;
|
sf::Packet spac;
|
||||||
spac << (MessageId)NP_MSG_PAD_MAPPING;
|
spac << (MessageId)NP_MSG_PAD_MAPPING;
|
||||||
spac << i->second.pid;
|
for (int i = 0; i < 4; i++)
|
||||||
for (unsigned int pm = 0; pm<4; ++pm)
|
spac << m_pad_map[i];
|
||||||
spac << i->second.pad_map[pm];
|
|
||||||
SendToClients(spac);
|
SendToClients(spac);
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// called from ---GUI--- thread and ---NETPLAY--- thread
|
// called from ---GUI--- thread and ---NETPLAY--- thread
|
||||||
|
@ -415,23 +330,15 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, sf::SocketTCP& socket)
|
||||||
int hi, lo;
|
int hi, lo;
|
||||||
packet >> map >> hi >> lo;
|
packet >> map >> hi >> lo;
|
||||||
|
|
||||||
// check if client's pad indeed maps in game
|
// If the data is not from the correct player,
|
||||||
if (map >= 0 && map < 4)
|
// then disconnect them.
|
||||||
map = player.pad_map[(unsigned)map];
|
if (m_pad_map[map] != player.pid)
|
||||||
else
|
|
||||||
map = -1;
|
|
||||||
|
|
||||||
// if not, they are hacking, so disconnect them
|
|
||||||
// this could happen right after a pad map change, but that isn't implemented yet
|
|
||||||
if (map < 0)
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
// Relay to clients
|
||||||
// relay to clients
|
|
||||||
sf::Packet spac;
|
sf::Packet spac;
|
||||||
spac << (MessageId)NP_MSG_PAD_DATA;
|
spac << (MessageId)NP_MSG_PAD_DATA;
|
||||||
spac << map; // in game mapping
|
spac << map << hi << lo;
|
||||||
spac << hi << lo;
|
|
||||||
|
|
||||||
std::lock_guard<std::recursive_mutex> lks(m_crit.send);
|
std::lock_guard<std::recursive_mutex> lks(m_crit.send);
|
||||||
SendToClients(spac, player.pid);
|
SendToClients(spac, player.pid);
|
||||||
|
|
|
@ -35,8 +35,8 @@ public:
|
||||||
bool StartGame(const std::string &path);
|
bool StartGame(const std::string &path);
|
||||||
bool StopGame();
|
bool StopGame();
|
||||||
|
|
||||||
bool GetPadMapping(const int pid, int map[]);
|
void GetPadMapping(PadMapping map[]);
|
||||||
bool SetPadMapping(const int pid, const int map[]);
|
void SetPadMapping(const PadMapping map[]);
|
||||||
|
|
||||||
void AdjustPadBufferSize(unsigned int size);
|
void AdjustPadBufferSize(unsigned int size);
|
||||||
|
|
||||||
|
@ -50,11 +50,8 @@ private:
|
||||||
class Client
|
class Client
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Client();
|
|
||||||
|
|
||||||
PlayerId pid;
|
PlayerId pid;
|
||||||
std::string name;
|
std::string name;
|
||||||
PadMapping pad_map[4];
|
|
||||||
std::string revision;
|
std::string revision;
|
||||||
|
|
||||||
sf::SocketTCP socket;
|
sf::SocketTCP socket;
|
||||||
|
@ -77,6 +74,7 @@ private:
|
||||||
bool m_update_pings;
|
bool m_update_pings;
|
||||||
u32 m_current_game;
|
u32 m_current_game;
|
||||||
unsigned int m_target_buffer_size;
|
unsigned int m_target_buffer_size;
|
||||||
|
PadMapping m_pad_map[4];
|
||||||
|
|
||||||
std::map<sf::SocketTCP, Client> m_players;
|
std::map<sf::SocketTCP, Client> m_players;
|
||||||
|
|
||||||
|
|
|
@ -513,10 +513,8 @@ void CConfigMain::InitializeGUITooltips()
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
DPL2Decoder->SetToolTip(_("Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on OSX."));
|
DPL2Decoder->SetToolTip(_("Enables Dolby Pro Logic II emulation using 5.1 surround. Not available on OSX."));
|
||||||
#elif defined(__linux__)
|
#else
|
||||||
DPL2Decoder->SetToolTip(_("Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only."));
|
DPL2Decoder->SetToolTip(_("Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only."));
|
||||||
#elif defined(_WIN32)
|
|
||||||
DPL2Decoder->SetToolTip(_("Enables Dolby Pro Logic II emulation using 5.1 surround. OpenAL backend only. May need to rename soft_oal.dll to OpenAL32.dll to make it work."));
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Latency->SetToolTip(_("Sets the latency (in ms). Higher values may reduce audio crackling. OpenAL backend only."));
|
Latency->SetToolTip(_("Sets the latency (in ms). Higher values may reduce audio crackling. OpenAL backend only."));
|
||||||
|
|
|
@ -132,25 +132,6 @@ void Host_SysMessage(const char *fmt, ...)
|
||||||
|
|
||||||
void Host_SetWiiMoteConnectionState(int _State) {}
|
void Host_SetWiiMoteConnectionState(int _State) {}
|
||||||
|
|
||||||
void OSDCallbacks(u32 UserData)
|
|
||||||
{
|
|
||||||
switch(UserData)
|
|
||||||
{
|
|
||||||
case 0: // Init
|
|
||||||
ButtonManager::Init();
|
|
||||||
break;
|
|
||||||
case 1: // Draw
|
|
||||||
ButtonManager::DrawButtons();
|
|
||||||
break;
|
|
||||||
case 2: // Shutdown
|
|
||||||
ButtonManager::Shutdown();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
WARN_LOG(COMMON, "Error, wrong OSD type");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DVD_BANNER_WIDTH 96
|
#define DVD_BANNER_WIDTH 96
|
||||||
#define DVD_BANNER_HEIGHT 32
|
#define DVD_BANNER_HEIGHT 32
|
||||||
std::vector<std::string> m_volume_names;
|
std::vector<std::string> m_volume_names;
|
||||||
|
@ -321,8 +302,8 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv *
|
||||||
{
|
{
|
||||||
surf = ANativeWindow_fromSurface(env, _surf);
|
surf = ANativeWindow_fromSurface(env, _surf);
|
||||||
// Install our callbacks
|
// Install our callbacks
|
||||||
OSD::AddCallback(OSD::OSD_INIT, OSDCallbacks, 0);
|
OSD::AddCallback(OSD::OSD_INIT, ButtonManager::Init);
|
||||||
OSD::AddCallback(OSD::OSD_SHUTDOWN, OSDCallbacks, 2);
|
OSD::AddCallback(OSD::OSD_SHUTDOWN, ButtonManager::Shutdown);
|
||||||
|
|
||||||
LogManager::Init();
|
LogManager::Init();
|
||||||
SConfig::Init();
|
SConfig::Init();
|
||||||
|
@ -337,7 +318,7 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv *
|
||||||
ini.Get("Android", "ScreenControls", &onscreencontrols, true);
|
ini.Get("Android", "ScreenControls", &onscreencontrols, true);
|
||||||
|
|
||||||
if (onscreencontrols)
|
if (onscreencontrols)
|
||||||
OSD::AddCallback(OSD::OSD_ONFRAME, OSDCallbacks, 1);
|
OSD::AddCallback(OSD::OSD_ONFRAME, ButtonManager::DrawButtons);
|
||||||
|
|
||||||
// No use running the loop when booting fails
|
// No use running the loop when booting fails
|
||||||
if ( BootManager::BootCore( g_filename.c_str() ) )
|
if ( BootManager::BootCore( g_filename.c_str() ) )
|
||||||
|
|
|
@ -559,23 +559,13 @@ void NetPlayDiag::OnChangeGame(wxCommandEvent&)
|
||||||
|
|
||||||
void NetPlayDiag::OnConfigPads(wxCommandEvent&)
|
void NetPlayDiag::OnConfigPads(wxCommandEvent&)
|
||||||
{
|
{
|
||||||
int mapping[4];
|
PadMapping mapping[4];
|
||||||
|
std::vector<const Player *> player_list;
|
||||||
// get selected player id
|
netplay_server->GetPadMapping(mapping);
|
||||||
int pid = m_player_lbox->GetSelection();
|
netplay_client->GetPlayers(player_list);
|
||||||
if (pid < 0)
|
PadMapDiag pmd(this, mapping, player_list);
|
||||||
return;
|
|
||||||
pid = m_playerids.at(pid);
|
|
||||||
|
|
||||||
if (false == netplay_server->GetPadMapping(pid, mapping))
|
|
||||||
return;
|
|
||||||
|
|
||||||
PadMapDiag pmd(this, mapping);
|
|
||||||
pmd.ShowModal();
|
pmd.ShowModal();
|
||||||
|
netplay_server->SetPadMapping(mapping);
|
||||||
if (false == netplay_server->SetPadMapping(pid, mapping))
|
|
||||||
PanicAlertT("Could not set pads. The player left or the game is currently running!\n"
|
|
||||||
"(setting pads while the game is running is not yet supported)");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ChangeGameDiag::ChangeGameDiag(wxWindow* const parent, const CGameListCtrl* const game_list, wxString& game_name)
|
ChangeGameDiag::ChangeGameDiag(wxWindow* const parent, const CGameListCtrl* const game_list, wxString& game_name)
|
||||||
|
@ -605,45 +595,40 @@ void ChangeGameDiag::OnPick(wxCommandEvent& event)
|
||||||
EndModal(wxID_OK);
|
EndModal(wxID_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
PadMapDiag::PadMapDiag(wxWindow* const parent, int map[])
|
PadMapDiag::PadMapDiag(wxWindow* const parent, PadMapping map[], std::vector<const Player *>& player_list)
|
||||||
: wxDialog(parent, wxID_ANY, _("Configure Pads"), wxDefaultPosition, wxDefaultSize)
|
: wxDialog(parent, wxID_ANY, _("Configure Pads"), wxDefaultPosition, wxDefaultSize)
|
||||||
, m_mapping(map)
|
, m_mapping(map)
|
||||||
|
, m_player_list(player_list)
|
||||||
{
|
{
|
||||||
wxBoxSizer* const h_szr = new wxBoxSizer(wxHORIZONTAL);
|
wxBoxSizer* const h_szr = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
h_szr->AddSpacer(10);
|
||||||
|
|
||||||
h_szr->AddSpacer(20);
|
wxArrayString player_names;
|
||||||
|
player_names.Add(_("None"));
|
||||||
// labels
|
for (unsigned int i = 0; i < m_player_list.size(); i++)
|
||||||
wxBoxSizer* const label_szr = new wxBoxSizer(wxVERTICAL);
|
player_names.Add(m_player_list[i]->name);
|
||||||
label_szr->Add(new wxStaticText(this, wxID_ANY, _("Local")), 0, wxALIGN_TOP);
|
|
||||||
label_szr->AddStretchSpacer(1);
|
|
||||||
label_szr->Add(new wxStaticText(this, wxID_ANY, _("In-Game")), 0, wxALIGN_BOTTOM);
|
|
||||||
|
|
||||||
h_szr->Add(label_szr, 1, wxTOP | wxEXPAND, 20);
|
|
||||||
|
|
||||||
// set up choices
|
|
||||||
wxString pad_names[5];
|
|
||||||
pad_names[0] = _("None");
|
|
||||||
for (unsigned int i=1; i<5; ++i)
|
|
||||||
pad_names[i] = wxString(_("Pad ")) + (wxChar)(wxT('0')+i);
|
|
||||||
|
|
||||||
for (unsigned int i=0; i<4; ++i)
|
for (unsigned int i=0; i<4; ++i)
|
||||||
{
|
{
|
||||||
wxChoice* const pad_cbox = m_map_cbox[i]
|
|
||||||
= new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 5, pad_names);
|
|
||||||
pad_cbox->Select(m_mapping[i] + 1);
|
|
||||||
|
|
||||||
pad_cbox->Bind(wxEVT_COMMAND_CHOICE_SELECTED, &PadMapDiag::OnAdjust, this);
|
|
||||||
|
|
||||||
wxBoxSizer* const v_szr = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer* const v_szr = new wxBoxSizer(wxVERTICAL);
|
||||||
v_szr->Add(new wxStaticText(this,wxID_ANY, pad_names[i + 1]), 1, wxALIGN_CENTER_HORIZONTAL);
|
v_szr->Add(new wxStaticText(this, wxID_ANY, (wxString(_("Pad ")) + (wxChar)(wxT('0')+i))),
|
||||||
v_szr->Add(pad_cbox, 1);
|
1, wxALIGN_CENTER_HORIZONTAL);
|
||||||
|
|
||||||
|
m_map_cbox[i] = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, player_names);
|
||||||
|
m_map_cbox[i]->Bind(wxEVT_COMMAND_CHOICE_SELECTED, &PadMapDiag::OnAdjust, this);
|
||||||
|
if (m_mapping[i] == -1)
|
||||||
|
m_map_cbox[i]->Select(0);
|
||||||
|
else
|
||||||
|
for (unsigned int j = 0; j < m_player_list.size(); j++)
|
||||||
|
if (m_mapping[i] == m_player_list[j]->pid)
|
||||||
|
m_map_cbox[i]->Select(j + 1);
|
||||||
|
|
||||||
|
v_szr->Add(m_map_cbox[i], 1);
|
||||||
|
|
||||||
h_szr->Add(v_szr, 1, wxTOP | wxEXPAND, 20);
|
h_szr->Add(v_szr, 1, wxTOP | wxEXPAND, 20);
|
||||||
|
h_szr->AddSpacer(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
h_szr->AddSpacer(20);
|
|
||||||
|
|
||||||
wxBoxSizer* const main_szr = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer* const main_szr = new wxBoxSizer(wxVERTICAL);
|
||||||
main_szr->Add(h_szr);
|
main_szr->Add(h_szr);
|
||||||
main_szr->AddSpacer(5);
|
main_szr->AddSpacer(5);
|
||||||
|
@ -656,8 +641,14 @@ PadMapDiag::PadMapDiag(wxWindow* const parent, int map[])
|
||||||
void PadMapDiag::OnAdjust(wxCommandEvent& event)
|
void PadMapDiag::OnAdjust(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
(void)event;
|
(void)event;
|
||||||
for (unsigned int i=0; i<4; ++i)
|
for (unsigned int i = 0; i < 4; i++)
|
||||||
m_mapping[i] = m_map_cbox[i]->GetSelection() - 1;
|
{
|
||||||
|
int player_idx = m_map_cbox[i]->GetSelection();
|
||||||
|
if (player_idx > 0)
|
||||||
|
m_mapping[i] = m_player_list[player_idx - 1]->pid;
|
||||||
|
else
|
||||||
|
m_mapping[i] = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetPlay::StopGame()
|
void NetPlay::StopGame()
|
||||||
|
|
|
@ -124,13 +124,14 @@ private:
|
||||||
class PadMapDiag : public wxDialog
|
class PadMapDiag : public wxDialog
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PadMapDiag(wxWindow* const parent, int map[]);
|
PadMapDiag(wxWindow* const parent, PadMapping map[], std::vector<const Player *>& player_list);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void OnAdjust(wxCommandEvent& event);
|
void OnAdjust(wxCommandEvent& event);
|
||||||
|
|
||||||
wxChoice* m_map_cbox[4];
|
wxChoice* m_map_cbox[4];
|
||||||
int* const m_mapping;
|
PadMapping* const m_mapping;
|
||||||
|
std::vector<const Player *>& m_player_list;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace NetPlay
|
namespace NetPlay
|
||||||
|
|
|
@ -11,8 +11,9 @@ namespace DriverDetails
|
||||||
{
|
{
|
||||||
struct BugInfo
|
struct BugInfo
|
||||||
{
|
{
|
||||||
|
Vendor m_vendor; // which vendor has the error
|
||||||
|
Driver m_driver; // which driver has the error
|
||||||
Bug m_bug; // Which bug it is
|
Bug m_bug; // Which bug it is
|
||||||
u32 m_devfamily; // Which device(family) has the error
|
|
||||||
double m_versionstart; // When it started
|
double m_versionstart; // When it started
|
||||||
double m_versionend; // When it ended
|
double m_versionend; // When it ended
|
||||||
bool m_hasbug; // Does it have it?
|
bool m_hasbug; // Does it have it?
|
||||||
|
@ -21,40 +22,27 @@ namespace DriverDetails
|
||||||
// Local members
|
// Local members
|
||||||
Vendor m_vendor = VENDOR_UNKNOWN;
|
Vendor m_vendor = VENDOR_UNKNOWN;
|
||||||
Driver m_driver = DRIVER_UNKNOWN;
|
Driver m_driver = DRIVER_UNKNOWN;
|
||||||
u32 m_devfamily = 0;
|
|
||||||
double m_version = 0.0;
|
double m_version = 0.0;
|
||||||
|
|
||||||
// This is a list of all known bugs for each vendor
|
// This is a list of all known bugs for each vendor
|
||||||
// We use this to check if the device and driver has a issue
|
// We use this to check if the device and driver has a issue
|
||||||
BugInfo m_qualcommbugs[] = {
|
BugInfo m_known_bugs[] = {
|
||||||
{BUG_NODYNUBOACCESS, 300, 14.0, -1.0},
|
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_NODYNUBOACCESS, 14.0, -1.0, true},
|
||||||
{BUG_BROKENCENTROID, 300, 14.0, -1.0},
|
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENCENTROID, 14.0, -1.0, true},
|
||||||
{BUG_BROKENINFOLOG, 300, -1.0, -1.0},
|
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENINFOLOG, -1.0, -1.0, true},
|
||||||
|
{VENDOR_MESA, DRIVER_NOUVEAU, BUG_BROKENUBO, 900, 916, true},
|
||||||
|
{VENDOR_MESA, DRIVER_R600, BUG_BROKENUBO, 900, 913, true},
|
||||||
|
{VENDOR_MESA, DRIVER_I965, BUG_BROKENUBO, 900, 920, true},
|
||||||
};
|
};
|
||||||
|
|
||||||
std::map<std::pair<Vendor, Bug>, BugInfo> m_bugs;
|
std::map<Bug, BugInfo> m_bugs;
|
||||||
|
|
||||||
// Private function
|
void Init(Vendor vendor, Driver driver, const double version)
|
||||||
void InitBugMap()
|
|
||||||
{
|
|
||||||
switch(m_driver)
|
|
||||||
{
|
|
||||||
case DRIVER_QUALCOMM:
|
|
||||||
for (unsigned int a = 0; a < (sizeof(m_qualcommbugs) / sizeof(BugInfo)); ++a)
|
|
||||||
m_bugs[std::make_pair(m_vendor, m_qualcommbugs[a].m_bug)] = m_qualcommbugs[a];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Init(Vendor vendor, Driver driver, const u32 devfamily, const double version)
|
|
||||||
{
|
{
|
||||||
m_vendor = vendor;
|
m_vendor = vendor;
|
||||||
m_driver = driver;
|
m_driver = driver;
|
||||||
m_devfamily = devfamily;
|
|
||||||
m_version = version;
|
m_version = version;
|
||||||
InitBugMap();
|
|
||||||
if (driver == DRIVER_UNKNOWN)
|
if (driver == DRIVER_UNKNOWN)
|
||||||
switch(vendor)
|
switch(vendor)
|
||||||
{
|
{
|
||||||
|
@ -68,12 +56,6 @@ namespace DriverDetails
|
||||||
case VENDOR_INTEL:
|
case VENDOR_INTEL:
|
||||||
m_driver = DRIVER_INTEL;
|
m_driver = DRIVER_INTEL;
|
||||||
break;
|
break;
|
||||||
case VENDOR_ARM:
|
|
||||||
m_driver = DRIVER_ARM;
|
|
||||||
break;
|
|
||||||
case VENDOR_QUALCOMM:
|
|
||||||
m_driver = DRIVER_QUALCOMM;
|
|
||||||
break;
|
|
||||||
case VENDOR_IMGTEC:
|
case VENDOR_IMGTEC:
|
||||||
m_driver = DRIVER_IMGTEC;
|
m_driver = DRIVER_IMGTEC;
|
||||||
break;
|
break;
|
||||||
|
@ -84,15 +66,21 @@ namespace DriverDetails
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto it = m_bugs.begin(); it != m_bugs.end(); ++it)
|
for(unsigned int a = 0; a < (sizeof(m_known_bugs) / sizeof(BugInfo)); ++a)
|
||||||
if (it->second.m_devfamily == m_devfamily)
|
{
|
||||||
if (it->second.m_versionend == -1.0 || (it->second.m_versionstart <= m_version && it->second.m_versionend > m_version))
|
if(
|
||||||
it->second.m_hasbug = true;
|
( m_known_bugs[a].m_vendor == m_vendor || m_known_bugs[a].m_vendor == VENDOR_ALL ) &&
|
||||||
|
( m_known_bugs[a].m_driver == m_driver || m_known_bugs[a].m_driver == DRIVER_ALL ) &&
|
||||||
|
( m_known_bugs[a].m_versionstart <= m_version || m_known_bugs[a].m_versionstart == -1 ) &&
|
||||||
|
( m_known_bugs[a].m_versionend > m_version || m_known_bugs[a].m_versionend == -1 )
|
||||||
|
)
|
||||||
|
m_bugs.insert(std::make_pair(m_known_bugs[a].m_bug, m_known_bugs[a]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HasBug(Bug bug)
|
bool HasBug(Bug bug)
|
||||||
{
|
{
|
||||||
auto it = m_bugs.find(std::make_pair(m_vendor, bug));
|
auto it = m_bugs.find(bug);
|
||||||
if (it == m_bugs.end())
|
if (it == m_bugs.end())
|
||||||
return false;
|
return false;
|
||||||
return it->second.m_hasbug;
|
return it->second.m_hasbug;
|
||||||
|
|
|
@ -10,7 +10,8 @@ namespace DriverDetails
|
||||||
// Tegra and Nvidia are separated out due to such substantial differences
|
// Tegra and Nvidia are separated out due to such substantial differences
|
||||||
enum Vendor
|
enum Vendor
|
||||||
{
|
{
|
||||||
VENDOR_NVIDIA = 0,
|
VENDOR_ALL = 0,
|
||||||
|
VENDOR_NVIDIA,
|
||||||
VENDOR_ATI,
|
VENDOR_ATI,
|
||||||
VENDOR_INTEL,
|
VENDOR_INTEL,
|
||||||
VENDOR_ARM,
|
VENDOR_ARM,
|
||||||
|
@ -18,20 +19,25 @@ namespace DriverDetails
|
||||||
VENDOR_IMGTEC,
|
VENDOR_IMGTEC,
|
||||||
VENDOR_TEGRA,
|
VENDOR_TEGRA,
|
||||||
VENDOR_VIVANTE,
|
VENDOR_VIVANTE,
|
||||||
|
VENDOR_MESA,
|
||||||
VENDOR_UNKNOWN
|
VENDOR_UNKNOWN
|
||||||
};
|
};
|
||||||
|
|
||||||
// Enum of known drivers
|
// Enum of known drivers
|
||||||
enum Driver
|
enum Driver
|
||||||
{
|
{
|
||||||
DRIVER_NVIDIA = 0, // Official Nvidia, including mobile GPU
|
DRIVER_ALL = 0,
|
||||||
|
DRIVER_NVIDIA, // Official Nvidia, including mobile GPU
|
||||||
DRIVER_NOUVEAU, // OSS nouveau
|
DRIVER_NOUVEAU, // OSS nouveau
|
||||||
DRIVER_ATI, // Official ATI
|
DRIVER_ATI, // Official ATI
|
||||||
DRIVER_RADEONHD, // OSS Radeon
|
DRIVER_R600, // OSS Radeon
|
||||||
DRIVER_INTEL, // Official Intel
|
DRIVER_INTEL, // Official Intel
|
||||||
DRIVER_ARM, // Official Mali driver
|
DRIVER_I965, // OSS Intel
|
||||||
|
DRIVER_ARM_4XX, // Official Mali driver
|
||||||
|
DRIVER_ARM_T6XX, // Official Mali driver
|
||||||
DRIVER_LIMA, // OSS Mali driver
|
DRIVER_LIMA, // OSS Mali driver
|
||||||
DRIVER_QUALCOMM, // Official Adreno driver
|
DRIVER_QUALCOMM_3XX, // Official Adreno driver 3xx
|
||||||
|
DRIVER_QUALCOMM_2XX, // Official Adreno driver 2xx
|
||||||
DRIVER_FREEDRENO, // OSS Adreno driver
|
DRIVER_FREEDRENO, // OSS Adreno driver
|
||||||
DRIVER_IMGTEC, // OSS PowerVR driver
|
DRIVER_IMGTEC, // OSS PowerVR driver
|
||||||
DRIVER_VIVANTE, // Official vivante driver
|
DRIVER_VIVANTE, // Official vivante driver
|
||||||
|
@ -69,10 +75,18 @@ namespace DriverDetails
|
||||||
// Adreno devices /always/ return 0 when querying GL_INFO_LOG_LENGTH
|
// Adreno devices /always/ return 0 when querying GL_INFO_LOG_LENGTH
|
||||||
// They also max out at 1024 bytes(1023 characters + null terminator) for the log
|
// They also max out at 1024 bytes(1023 characters + null terminator) for the log
|
||||||
BUG_BROKENINFOLOG,
|
BUG_BROKENINFOLOG,
|
||||||
|
// Bug: UBO buffer offset broken
|
||||||
|
// Affected devices: all mesa drivers
|
||||||
|
// Started Version: 9.0 (mesa doesn't support ubo before)
|
||||||
|
// Ended Version: up to 9.2
|
||||||
|
// The offset of glBindBufferRange was ignored on all Mesa Gallium3D drivers until 9.1.3
|
||||||
|
// Nouveau stored the offset as u16 which isn't enough for all cases with range until 9.1.6
|
||||||
|
// I965 has broken data fetches from uniform buffers which results in a dithering until 9.2.0
|
||||||
|
BUG_BROKENUBO,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Initializes our internal vendor, device family, and driver version
|
// Initializes our internal vendor, device family, and driver version
|
||||||
void Init(Vendor vendor, Driver driver, const u32 devfamily, const double version);
|
void Init(Vendor vendor, Driver driver, const double version);
|
||||||
|
|
||||||
// Once Vendor and driver version is set, this will return if it has the applicable bug passed to it.
|
// Once Vendor and driver version is set, this will return if it has the applicable bug passed to it.
|
||||||
bool HasBug(Bug bug);
|
bool HasBug(Bug bug);
|
||||||
|
|
|
@ -11,51 +11,27 @@
|
||||||
#include "RenderBase.h"
|
#include "RenderBase.h"
|
||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
|
|
||||||
#include <vector>
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace OSD
|
namespace OSD
|
||||||
{
|
{
|
||||||
|
|
||||||
struct MESSAGE
|
struct Message
|
||||||
{
|
{
|
||||||
MESSAGE() {}
|
Message() {}
|
||||||
MESSAGE(const char* p, u32 dw)
|
Message(const std::string& s, u32 ts) : str(s), timestamp(ts) {}
|
||||||
{
|
|
||||||
strncpy(str, p, 255);
|
std::string str;
|
||||||
str[255] = '\0';
|
u32 timestamp;
|
||||||
dwTimeStamp = dw;
|
|
||||||
}
|
|
||||||
char str[256];
|
|
||||||
u32 dwTimeStamp;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class OSDCALLBACK
|
static std::multimap<CallbackType, Callback> s_callbacks;
|
||||||
|
static std::list<Message> s_msgList;
|
||||||
|
|
||||||
|
void AddMessage(const std::string& str, u32 ms)
|
||||||
{
|
{
|
||||||
private:
|
s_msgList.push_back(Message(str, Common::Timer::GetTimeMs() + ms));
|
||||||
CallbackPtr m_functionptr;
|
|
||||||
CallbackType m_type;
|
|
||||||
u32 m_data;
|
|
||||||
public:
|
|
||||||
OSDCALLBACK(CallbackType OnType, CallbackPtr FuncPtr, u32 UserData)
|
|
||||||
{
|
|
||||||
m_type = OnType;
|
|
||||||
m_functionptr = FuncPtr;
|
|
||||||
m_data = UserData;
|
|
||||||
}
|
|
||||||
void Call()
|
|
||||||
{
|
|
||||||
m_functionptr(m_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
CallbackType Type() { return m_type; }
|
|
||||||
};
|
|
||||||
|
|
||||||
std::vector<OSDCALLBACK> m_callbacks;
|
|
||||||
static std::list<MESSAGE> s_listMsgs;
|
|
||||||
|
|
||||||
void AddMessage(const char* pstr, u32 ms)
|
|
||||||
{
|
|
||||||
s_listMsgs.push_back(MESSAGE(pstr, Common::Timer::GetTimeMs() + ms));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawMessages()
|
void DrawMessages()
|
||||||
|
@ -63,14 +39,12 @@ void DrawMessages()
|
||||||
if(!SConfig::GetInstance().m_LocalCoreStartupParameter.bOnScreenDisplayMessages)
|
if(!SConfig::GetInstance().m_LocalCoreStartupParameter.bOnScreenDisplayMessages)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (s_listMsgs.size() > 0)
|
|
||||||
{
|
|
||||||
int left = 25, top = 15;
|
int left = 25, top = 15;
|
||||||
std::list<MESSAGE>::iterator it = s_listMsgs.begin();
|
auto it = s_msgList.begin();
|
||||||
while (it != s_listMsgs.end())
|
while (it != s_msgList.end())
|
||||||
{
|
{
|
||||||
int time_left = (int)(it->dwTimeStamp - Common::Timer::GetTimeMs());
|
int time_left = (int)(it->timestamp - Common::Timer::GetTimeMs());
|
||||||
int alpha = 255;
|
u32 alpha = 255;
|
||||||
|
|
||||||
if (time_left < 1024)
|
if (time_left < 1024)
|
||||||
{
|
{
|
||||||
|
@ -81,40 +55,34 @@ void DrawMessages()
|
||||||
|
|
||||||
alpha <<= 24;
|
alpha <<= 24;
|
||||||
|
|
||||||
g_renderer->RenderText(it->str, left+1, top+1, 0x000000|alpha);
|
g_renderer->RenderText(it->str.c_str(), left + 1, top + 1, 0x000000 | alpha);
|
||||||
g_renderer->RenderText(it->str, left, top, 0xffff30|alpha);
|
g_renderer->RenderText(it->str.c_str(), left, top, 0xffff30 | alpha);
|
||||||
top += 15;
|
top += 15;
|
||||||
|
|
||||||
if (time_left <= 0)
|
if (time_left <= 0)
|
||||||
it = s_listMsgs.erase(it);
|
it = s_msgList.erase(it);
|
||||||
else
|
else
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClearMessages()
|
void ClearMessages()
|
||||||
{
|
{
|
||||||
std::list<MESSAGE>::iterator it = s_listMsgs.begin();
|
s_msgList.clear();
|
||||||
|
|
||||||
while (it != s_listMsgs.end())
|
|
||||||
{
|
|
||||||
it = s_listMsgs.erase(it);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// On-Screen Display Callbacks
|
// On-Screen Display Callbacks
|
||||||
void AddCallback(CallbackType OnType, CallbackPtr FuncPtr, u32 UserData)
|
void AddCallback(CallbackType type, Callback cb)
|
||||||
{
|
{
|
||||||
m_callbacks.push_back(OSDCALLBACK(OnType, FuncPtr, UserData));
|
s_callbacks.insert(std::pair<CallbackType, Callback>(type, cb));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DoCallbacks(CallbackType OnType)
|
void DoCallbacks(CallbackType type)
|
||||||
{
|
{
|
||||||
for (auto it = m_callbacks.begin(); it != m_callbacks.end(); ++it)
|
auto it_bounds = s_callbacks.equal_range(type);
|
||||||
|
for (auto it = it_bounds.first; it != it_bounds.second; ++it)
|
||||||
{
|
{
|
||||||
if (it->Type() == OnType)
|
it->second();
|
||||||
it->Call();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,13 @@
|
||||||
#ifndef _OSD_H_
|
#ifndef _OSD_H_
|
||||||
#define _OSD_H_
|
#define _OSD_H_
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace OSD
|
namespace OSD
|
||||||
{
|
{
|
||||||
|
|
||||||
// On-screen message display
|
// On-screen message display
|
||||||
void AddMessage(const char* str, u32 ms = 2000);
|
void AddMessage(const std::string& str, u32 ms = 2000);
|
||||||
void DrawMessages(); // draw the current messages on the screen. Only call once per frame.
|
void DrawMessages(); // draw the current messages on the screen. Only call once per frame.
|
||||||
void ClearMessages();
|
void ClearMessages();
|
||||||
|
|
||||||
|
@ -20,12 +22,10 @@ enum CallbackType
|
||||||
OSD_ONFRAME,
|
OSD_ONFRAME,
|
||||||
OSD_SHUTDOWN
|
OSD_SHUTDOWN
|
||||||
};
|
};
|
||||||
typedef void(*CallbackPtr)(u32);
|
typedef std::function<void()> Callback;
|
||||||
|
|
||||||
void AddCallback(CallbackType OnType, CallbackPtr FuncPtr, u32 UserData);
|
void AddCallback(CallbackType type, Callback cb);
|
||||||
|
void DoCallbacks(CallbackType type);
|
||||||
void DoCallbacks(CallbackType OnType);
|
} // namespace OSD
|
||||||
} // namespace
|
|
||||||
|
|
||||||
#endif // _OSD_H_
|
#endif // _OSD_H_
|
||||||
|
|
||||||
|
|
|
@ -97,6 +97,7 @@ void VideoConfig::Load(const char *ini_file)
|
||||||
iniFile.Get("Hacks", "EFBScaledCopy", &bCopyEFBScaled, true);
|
iniFile.Get("Hacks", "EFBScaledCopy", &bCopyEFBScaled, true);
|
||||||
iniFile.Get("Hacks", "EFBCopyCacheEnable", &bEFBCopyCacheEnable, false);
|
iniFile.Get("Hacks", "EFBCopyCacheEnable", &bEFBCopyCacheEnable, false);
|
||||||
iniFile.Get("Hacks", "EFBEmulateFormatChanges", &bEFBEmulateFormatChanges, false);
|
iniFile.Get("Hacks", "EFBEmulateFormatChanges", &bEFBEmulateFormatChanges, false);
|
||||||
|
iniFile.Get("Hacks", "ForceDualSourceBlend", &bForceDualSourceBlend, false);
|
||||||
|
|
||||||
iniFile.Get("Hardware", "Adapter", &iAdapter, 0);
|
iniFile.Get("Hardware", "Adapter", &iAdapter, 0);
|
||||||
|
|
||||||
|
@ -265,6 +266,7 @@ void VideoConfig::Save(const char *ini_file)
|
||||||
iniFile.Set("Hacks", "EFBScaledCopy", bCopyEFBScaled);
|
iniFile.Set("Hacks", "EFBScaledCopy", bCopyEFBScaled);
|
||||||
iniFile.Set("Hacks", "EFBCopyCacheEnable", bEFBCopyCacheEnable);
|
iniFile.Set("Hacks", "EFBCopyCacheEnable", bEFBCopyCacheEnable);
|
||||||
iniFile.Set("Hacks", "EFBEmulateFormatChanges", bEFBEmulateFormatChanges);
|
iniFile.Set("Hacks", "EFBEmulateFormatChanges", bEFBEmulateFormatChanges);
|
||||||
|
iniFile.Set("Hacks", "ForceDualSourceBlend", bForceDualSourceBlend);
|
||||||
|
|
||||||
iniFile.Set("Hardware", "Adapter", iAdapter);
|
iniFile.Set("Hardware", "Adapter", iAdapter);
|
||||||
|
|
||||||
|
|
|
@ -124,7 +124,8 @@ struct VideoConfig
|
||||||
bool bEnablePixelLighting;
|
bool bEnablePixelLighting;
|
||||||
bool bHackedBufferUpload;
|
bool bHackedBufferUpload;
|
||||||
bool bFastDepthCalc;
|
bool bFastDepthCalc;
|
||||||
|
//for dx9-backend
|
||||||
|
bool bForceDualSourceBlend;
|
||||||
int iLog; // CONF_ bits
|
int iLog; // CONF_ bits
|
||||||
int iSaveTargetId; // TODO: Should be dropped
|
int iSaveTargetId; // TODO: Should be dropped
|
||||||
|
|
||||||
|
|
|
@ -745,6 +745,15 @@ bool Renderer::SaveScreenshot(const std::string &filename, const TargetRectangle
|
||||||
|
|
||||||
// ready to be saved
|
// ready to be saved
|
||||||
HRESULT hr = PD3DX11SaveTextureToFileA(D3D::context, s_screenshot_texture, D3DX11_IFF_PNG, filename.c_str());
|
HRESULT hr = PD3DX11SaveTextureToFileA(D3D::context, s_screenshot_texture, D3DX11_IFF_PNG, filename.c_str());
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
OSD::AddMessage(StringFromFormat("Saved %i x %i %s", D3D::GetBackBufferWidth(),
|
||||||
|
D3D::GetBackBufferHeight(), filename.c_str()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OSD::AddMessage(StringFromFormat("Error saving %s", filename.c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
return SUCCEEDED(hr);
|
return SUCCEEDED(hr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,8 @@ void PerfQuery::DestroyDeviceObjects()
|
||||||
|
|
||||||
void PerfQuery::EnableQuery(PerfQueryGroup type)
|
void PerfQuery::EnableQuery(PerfQueryGroup type)
|
||||||
{
|
{
|
||||||
|
if (!ShouldEmulate())
|
||||||
|
return;
|
||||||
// Is this sane?
|
// Is this sane?
|
||||||
if (m_query_count > ARRAYSIZE(m_query_buffer) / 2)
|
if (m_query_count > ARRAYSIZE(m_query_buffer) / 2)
|
||||||
WeakFlush();
|
WeakFlush();
|
||||||
|
@ -58,6 +60,8 @@ void PerfQuery::EnableQuery(PerfQueryGroup type)
|
||||||
|
|
||||||
void PerfQuery::DisableQuery(PerfQueryGroup type)
|
void PerfQuery::DisableQuery(PerfQueryGroup type)
|
||||||
{
|
{
|
||||||
|
if (!ShouldEmulate())
|
||||||
|
return;
|
||||||
// stop query
|
// stop query
|
||||||
if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP)
|
if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP)
|
||||||
{
|
{
|
||||||
|
@ -74,6 +78,8 @@ void PerfQuery::ResetQuery()
|
||||||
|
|
||||||
u32 PerfQuery::GetQueryResult(PerfQueryType type)
|
u32 PerfQuery::GetQueryResult(PerfQueryType type)
|
||||||
{
|
{
|
||||||
|
if (!ShouldEmulate())
|
||||||
|
return 0;
|
||||||
u32 result = 0;
|
u32 result = 0;
|
||||||
|
|
||||||
if (type == PQ_ZCOMP_INPUT_ZCOMPLOC || type == PQ_ZCOMP_OUTPUT_ZCOMPLOC)
|
if (type == PQ_ZCOMP_INPUT_ZCOMPLOC || type == PQ_ZCOMP_OUTPUT_ZCOMPLOC)
|
||||||
|
@ -98,6 +104,8 @@ u32 PerfQuery::GetQueryResult(PerfQueryType type)
|
||||||
|
|
||||||
void PerfQuery::FlushOne()
|
void PerfQuery::FlushOne()
|
||||||
{
|
{
|
||||||
|
if (!ShouldEmulate())
|
||||||
|
return;
|
||||||
auto& entry = m_query_buffer[m_query_read_pos];
|
auto& entry = m_query_buffer[m_query_read_pos];
|
||||||
|
|
||||||
DWORD result = 0;
|
DWORD result = 0;
|
||||||
|
@ -118,12 +126,16 @@ void PerfQuery::FlushOne()
|
||||||
// TODO: could selectively flush things, but I don't think that will do much
|
// TODO: could selectively flush things, but I don't think that will do much
|
||||||
void PerfQuery::FlushResults()
|
void PerfQuery::FlushResults()
|
||||||
{
|
{
|
||||||
|
if (!ShouldEmulate())
|
||||||
|
return;
|
||||||
while (!IsFlushed())
|
while (!IsFlushed())
|
||||||
FlushOne();
|
FlushOne();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PerfQuery::WeakFlush()
|
void PerfQuery::WeakFlush()
|
||||||
{
|
{
|
||||||
|
if (!ShouldEmulate())
|
||||||
|
return;
|
||||||
while (!IsFlushed())
|
while (!IsFlushed())
|
||||||
{
|
{
|
||||||
auto& entry = m_query_buffer[m_query_read_pos];
|
auto& entry = m_query_buffer[m_query_read_pos];
|
||||||
|
@ -148,6 +160,8 @@ void PerfQuery::WeakFlush()
|
||||||
|
|
||||||
bool PerfQuery::IsFlushed() const
|
bool PerfQuery::IsFlushed() const
|
||||||
{
|
{
|
||||||
|
if (!ShouldEmulate())
|
||||||
|
return true;
|
||||||
return 0 == m_query_count;
|
return 0 == m_query_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -177,12 +177,14 @@ static LPDIRECT3DPIXELSHADER9 CreateCopyShader(int copyMatrixType, int depthConv
|
||||||
"in float uv1 : TEXCOORD1){\n"
|
"in float uv1 : TEXCOORD1){\n"
|
||||||
"float4 texcol = tex2D(samp0,uv0.xy);\n");
|
"float4 texcol = tex2D(samp0,uv0.xy);\n");
|
||||||
break;
|
break;
|
||||||
case 1: // 1 Samples SSAA
|
case 1: // 4 Samples in 4x SSAA buffer
|
||||||
WRITE(p, "in float2 uv0 : TEXCOORD0,\n"
|
WRITE(p, "in float4 uv0 : TEXCOORD0,\n"
|
||||||
"in float uv1 : TEXCOORD1){\n"
|
"in float uv1 : TEXCOORD1,\n"
|
||||||
"float4 texcol = tex2D(samp0,uv0.xy);\n");
|
"in float4 uv2 : TEXCOORD2,\n"
|
||||||
|
"in float4 uv3 : TEXCOORD3){\n"
|
||||||
|
"float4 texcol = (tex2D(samp0,uv2.xy) + tex2D(samp0,uv2.wz) + tex2D(samp0,uv3.xy) + tex2D(samp0,uv3.wz))*0.25f;\n");
|
||||||
break;
|
break;
|
||||||
case 2: // 4 Samples SSAA
|
case 2: // 4 Samples in 9x SSAA buffer
|
||||||
WRITE(p, "in float4 uv0 : TEXCOORD0,\n"
|
WRITE(p, "in float4 uv0 : TEXCOORD0,\n"
|
||||||
"in float uv1 : TEXCOORD1,\n"
|
"in float uv1 : TEXCOORD1,\n"
|
||||||
"in float4 uv2 : TEXCOORD2,\n"
|
"in float4 uv2 : TEXCOORD2,\n"
|
||||||
|
|
|
@ -742,6 +742,7 @@ bool Renderer::SaveScreenshot(const std::string &filename, const TargetRectangle
|
||||||
PanicAlert("Error saving screen.");
|
PanicAlert("Error saving screen.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
OSD::AddMessage(StringFromFormat("Saved %i x %i %s", dst_rect.GetWidth(), dst_rect.GetHeight(), filename.c_str()));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1080,6 +1081,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons
|
||||||
D3D::dev->SetRenderTarget(0, FramebufferManager::GetEFBColorRTSurface());
|
D3D::dev->SetRenderTarget(0, FramebufferManager::GetEFBColorRTSurface());
|
||||||
D3D::dev->SetDepthStencilSurface(FramebufferManager::GetEFBDepthRTSurface());
|
D3D::dev->SetDepthStencilSurface(FramebufferManager::GetEFBDepthRTSurface());
|
||||||
D3D::dev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
|
D3D::dev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
|
||||||
|
SetLineWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (XFBWrited)
|
if (XFBWrited)
|
||||||
|
@ -1140,8 +1142,8 @@ void Renderer::RestoreState()
|
||||||
D3D::RefreshRenderState(D3DRS_ZFUNC);
|
D3D::RefreshRenderState(D3DRS_ZFUNC);
|
||||||
}
|
}
|
||||||
// TODO: Enable this code. Caused glitches for me however (neobrain)
|
// TODO: Enable this code. Caused glitches for me however (neobrain)
|
||||||
// for (unsigned int i = 0; i < 8; ++i)
|
// for (unsigned int i = 0; i < 8; ++i)
|
||||||
// D3D::dev->SetTexture(i, NULL);
|
// D3D::dev->SetTexture(i, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ALWAYS call RestoreAPIState for each ResetAPIState call you're doing
|
// ALWAYS call RestoreAPIState for each ResetAPIState call you're doing
|
||||||
|
@ -1315,9 +1317,8 @@ void Renderer::SetLineWidth()
|
||||||
{
|
{
|
||||||
// We can't change line width in D3D unless we use ID3DXLine
|
// We can't change line width in D3D unless we use ID3DXLine
|
||||||
float fratio = xfregs.viewport.wd != 0 ? Renderer::EFBToScaledXf(1.f) : 1.0f;
|
float fratio = xfregs.viewport.wd != 0 ? Renderer::EFBToScaledXf(1.f) : 1.0f;
|
||||||
float psize = bpmem.lineptwidth.linesize * fratio / 6.0f;
|
float psize = bpmem.lineptwidth.pointsize * fratio / 6.0f;
|
||||||
//little hack to compensate scaling problems in dx9 must be taken out when scaling is fixed.
|
psize = psize > 0 ? psize : 1.0;
|
||||||
psize *= 2.0f;
|
|
||||||
if (psize > m_fMaxPointSize)
|
if (psize > m_fMaxPointSize)
|
||||||
{
|
{
|
||||||
psize = m_fMaxPointSize;
|
psize = m_fMaxPointSize;
|
||||||
|
|
|
@ -37,7 +37,7 @@ inline void DumpBadShaders()
|
||||||
{
|
{
|
||||||
#if defined(_DEBUG) || defined(DEBUGFAST)
|
#if defined(_DEBUG) || defined(DEBUGFAST)
|
||||||
// TODO: Reimplement!
|
// TODO: Reimplement!
|
||||||
/* std::string error_shaders;
|
/* std::string error_shaders;
|
||||||
error_shaders.append(VertexShaderCache::GetCurrentShaderCode());
|
error_shaders.append(VertexShaderCache::GetCurrentShaderCode());
|
||||||
error_shaders.append(PixelShaderCache::GetCurrentShaderCode());
|
error_shaders.append(PixelShaderCache::GetCurrentShaderCode());
|
||||||
char filename[512] = "bad_shader_combo_0.txt";
|
char filename[512] = "bad_shader_combo_0.txt";
|
||||||
|
@ -144,8 +144,9 @@ void VertexManager::PrepareDrawBuffers(u32 stride)
|
||||||
int datasize = IndexGenerator::GetNumVerts() * stride;
|
int datasize = IndexGenerator::GetNumVerts() * stride;
|
||||||
int TdataSize = IndexGenerator::GetTriangleindexLen();
|
int TdataSize = IndexGenerator::GetTriangleindexLen();
|
||||||
int LDataSize = IndexGenerator::GetLineindexLen();
|
int LDataSize = IndexGenerator::GetLineindexLen();
|
||||||
int PDataSize = IndexGenerator::GetPointindexLen();
|
|
||||||
int IndexDataSize = TdataSize + LDataSize;
|
int IndexDataSize = TdataSize + LDataSize;
|
||||||
|
if(IndexDataSize)
|
||||||
|
{
|
||||||
DWORD LockMode = D3DLOCK_NOOVERWRITE;
|
DWORD LockMode = D3DLOCK_NOOVERWRITE;
|
||||||
m_vertex_buffer_cursor--;
|
m_vertex_buffer_cursor--;
|
||||||
m_vertex_buffer_cursor = m_vertex_buffer_cursor - (m_vertex_buffer_cursor % stride) + stride;
|
m_vertex_buffer_cursor = m_vertex_buffer_cursor - (m_vertex_buffer_cursor % stride) + stride;
|
||||||
|
@ -187,10 +188,11 @@ void VertexManager::PrepareDrawBuffers(u32 stride)
|
||||||
pIndices += LDataSize;
|
pIndices += LDataSize;
|
||||||
}
|
}
|
||||||
m_index_buffers[m_current_index_buffer]->Unlock();
|
m_index_buffers[m_current_index_buffer]->Unlock();
|
||||||
|
}
|
||||||
if(m_current_stride != stride || m_vertex_buffer_cursor == 0)
|
if(m_current_stride != stride || m_vertex_buffer_cursor == 0)
|
||||||
{
|
{
|
||||||
m_current_stride = stride;
|
m_current_stride = stride;
|
||||||
D3D::SetStreamSource( 0, m_vertex_buffers[m_current_vertex_buffer], 0, stride);
|
D3D::SetStreamSource( 0, m_vertex_buffers[m_current_vertex_buffer], 0, m_current_stride);
|
||||||
}
|
}
|
||||||
if (m_index_buffer_cursor == 0)
|
if (m_index_buffer_cursor == 0)
|
||||||
{
|
{
|
||||||
|
@ -241,20 +243,26 @@ void VertexManager::DrawVertexBuffer(int stride)
|
||||||
}
|
}
|
||||||
if (points > 0)
|
if (points > 0)
|
||||||
{
|
{
|
||||||
//DrawIndexedPrimitive does not support point list so we have to draw the points one by one
|
//DrawIndexedPrimitive does not support point list so we have to draw them using DrawPrimitive
|
||||||
for (int i = 0; i < points; i++)
|
u16* PointIndexBuffer = GetPointIndexBuffer();
|
||||||
|
int i = 0;
|
||||||
|
do
|
||||||
{
|
{
|
||||||
|
int count = i + 1;
|
||||||
|
while (count < points && PointIndexBuffer[count - 1] + 1 == PointIndexBuffer[count])
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
}
|
||||||
if (FAILED(D3D::dev->DrawPrimitive(
|
if (FAILED(D3D::dev->DrawPrimitive(
|
||||||
D3DPT_POINTLIST,
|
D3DPT_POINTLIST,
|
||||||
basevertex + GetPointIndexBuffer()[i],
|
basevertex + PointIndexBuffer[i],
|
||||||
1)))
|
count - i)))
|
||||||
{
|
{
|
||||||
DumpBadShaders();
|
DumpBadShaders();
|
||||||
}
|
}
|
||||||
INCSTAT(stats.thisFrame.numDrawCalls);
|
INCSTAT(stats.thisFrame.numDrawCalls);
|
||||||
}
|
i = count;
|
||||||
|
} while (i < points);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,15 +92,19 @@ void VertexShaderCache::Init()
|
||||||
sprintf(vProg, "struct VSOUTPUT\n"
|
sprintf(vProg, "struct VSOUTPUT\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"float4 vPosition : POSITION;\n"
|
"float4 vPosition : POSITION;\n"
|
||||||
"float2 vTexCoord : TEXCOORD0;\n"
|
"float4 vTexCoord : TEXCOORD0;\n"
|
||||||
"float vTexCoord1 : TEXCOORD1;\n"
|
"float vTexCoord1 : TEXCOORD1;\n"
|
||||||
|
"float4 vTexCoord2 : TEXCOORD2;\n"
|
||||||
|
"float4 vTexCoord3 : TEXCOORD3;\n"
|
||||||
"};\n"
|
"};\n"
|
||||||
"VSOUTPUT main(float4 inPosition : POSITION,float2 inTEX0 : TEXCOORD0,float2 inInvTexSize : TEXCOORD1,float inTEX2 : TEXCOORD2)\n"
|
"VSOUTPUT main(float4 inPosition : POSITION,float2 inTEX0 : TEXCOORD0,float2 inTEX1 : TEXCOORD1,float inTEX2 : TEXCOORD2)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"VSOUTPUT OUT;"
|
"VSOUTPUT OUT;"
|
||||||
"OUT.vPosition = inPosition;\n"
|
"OUT.vPosition = inPosition;\n"
|
||||||
"OUT.vTexCoord = inTEX0;\n"
|
"OUT.vTexCoord = inTEX0.xyyx;\n"
|
||||||
"OUT.vTexCoord1 = inTEX2;\n"
|
"OUT.vTexCoord1 = inTEX2.x;\n"
|
||||||
|
"OUT.vTexCoord2 = inTEX0.xyyx + (float4(-0.495f,-0.495f, 0.495f,-0.495f) * inTEX1.xyyx);\n"
|
||||||
|
"OUT.vTexCoord3 = inTEX0.xyyx + (float4( 0.495f, 0.495f,-0.495f, 0.495f) * inTEX1.xyyx);\n"
|
||||||
"return OUT;\n"
|
"return OUT;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
SimpleVertexShader[1] = D3D::CompileAndCreateVertexShader(vProg, (int)strlen(vProg));
|
SimpleVertexShader[1] = D3D::CompileAndCreateVertexShader(vProg, (int)strlen(vProg));
|
||||||
|
@ -119,8 +123,8 @@ void VertexShaderCache::Init()
|
||||||
"OUT.vPosition = inPosition;\n"
|
"OUT.vPosition = inPosition;\n"
|
||||||
"OUT.vTexCoord = inTEX0.xyyx;\n"
|
"OUT.vTexCoord = inTEX0.xyyx;\n"
|
||||||
"OUT.vTexCoord1 = inTEX2.x;\n"
|
"OUT.vTexCoord1 = inTEX2.x;\n"
|
||||||
"OUT.vTexCoord2 = inTEX0.xyyx + (float4(-1.0f,-0.5f, 1.0f,-0.5f) * inTEX1.xyyx);\n"
|
"OUT.vTexCoord2 = inTEX0.xyyx + (float4(-0.9f,-0.45f, 0.9f,-0.45f) * inTEX1.xyyx);\n"
|
||||||
"OUT.vTexCoord3 = inTEX0.xyyx + (float4( 1.0f, 0.5f,-1.0f, 0.5f) * inTEX1.xyyx);\n"
|
"OUT.vTexCoord3 = inTEX0.xyyx + (float4( 0.9f, 0.45f,-0.9f, 0.45f) * inTEX1.xyyx);\n"
|
||||||
"return OUT;\n"
|
"return OUT;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
SimpleVertexShader[2] = D3D::CompileAndCreateVertexShader(vProg, (int)strlen(vProg));
|
SimpleVertexShader[2] = D3D::CompileAndCreateVertexShader(vProg, (int)strlen(vProg));
|
||||||
|
@ -251,10 +255,16 @@ bool VertexShaderCache::InsertByteCode(const VertexShaderUid &uid, const u8 *byt
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float VSConstantbuffer[4*C_VENVCONST_END];
|
||||||
|
|
||||||
void Renderer::SetVSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4)
|
void Renderer::SetVSConstant4f(unsigned int const_number, float f1, float f2, float f3, float f4)
|
||||||
{
|
{
|
||||||
const float f[4] = { f1, f2, f3, f4 };
|
float* VSConstantbuffer_pointer = &VSConstantbuffer[const_number];
|
||||||
DX9::D3D::dev->SetVertexShaderConstantF(const_number, f, 1);
|
VSConstantbuffer_pointer[0] = f1;
|
||||||
|
VSConstantbuffer_pointer[1] = f2;
|
||||||
|
VSConstantbuffer_pointer[2] = f3;
|
||||||
|
VSConstantbuffer_pointer[3] = f4;
|
||||||
|
DX9::D3D::dev->SetVertexShaderConstantF(const_number, VSConstantbuffer_pointer, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::SetVSConstant4fv(unsigned int const_number, const float *f)
|
void Renderer::SetVSConstant4fv(unsigned int const_number, const float *f)
|
||||||
|
@ -264,15 +274,15 @@ void Renderer::SetVSConstant4fv(unsigned int const_number, const float *f)
|
||||||
|
|
||||||
void Renderer::SetMultiVSConstant3fv(unsigned int const_number, unsigned int count, const float *f)
|
void Renderer::SetMultiVSConstant3fv(unsigned int const_number, unsigned int count, const float *f)
|
||||||
{
|
{
|
||||||
float buf[4*C_VENVCONST_END];
|
float* VSConstantbuffer_pointer = &VSConstantbuffer[const_number];
|
||||||
for (unsigned int i = 0; i < count; i++)
|
for (unsigned int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
buf[4*i ] = *f++;
|
*VSConstantbuffer_pointer++ = *f++;
|
||||||
buf[4*i+1] = *f++;
|
*VSConstantbuffer_pointer++ = *f++;
|
||||||
buf[4*i+2] = *f++;
|
*VSConstantbuffer_pointer++ = *f++;
|
||||||
buf[4*i+3] = 0.f;
|
*VSConstantbuffer_pointer++ = 0.f;
|
||||||
}
|
}
|
||||||
DX9::D3D::dev->SetVertexShaderConstantF(const_number, buf, count);
|
DX9::D3D::dev->SetVertexShaderConstantF(const_number, &VSConstantbuffer[const_number], count);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::SetMultiVSConstant4fv(unsigned int const_number, unsigned int count, const float *f)
|
void Renderer::SetMultiVSConstant4fv(unsigned int const_number, unsigned int count, const float *f)
|
||||||
|
|
|
@ -90,10 +90,24 @@ void InitBackendInfo()
|
||||||
g_Config.backend_info.bUseRGBATextures = false;
|
g_Config.backend_info.bUseRGBATextures = false;
|
||||||
g_Config.backend_info.bUseMinimalMipCount = true;
|
g_Config.backend_info.bUseMinimalMipCount = true;
|
||||||
g_Config.backend_info.bSupports3DVision = true;
|
g_Config.backend_info.bSupports3DVision = true;
|
||||||
g_Config.backend_info.bSupportsPrimitiveRestart = false; // TODO: figure out if it does
|
g_Config.backend_info.bSupportsPrimitiveRestart = false; // D3D9 does not support primitive restart
|
||||||
g_Config.backend_info.bSupportsSeparateAlphaFunction = device_caps.PrimitiveMiscCaps & D3DPMISCCAPS_SEPARATEALPHABLEND;
|
g_Config.backend_info.bSupportsSeparateAlphaFunction = device_caps.PrimitiveMiscCaps & D3DPMISCCAPS_SEPARATEALPHABLEND;
|
||||||
// Dual source blend disabled by default until a proper method to test for support is found
|
// Dual source blend disabled by default until a proper method to test for support is found
|
||||||
|
g_Config.backend_info.bSupports3DVision = true;
|
||||||
|
OSVERSIONINFO info;
|
||||||
|
ZeroMemory(&info, sizeof(OSVERSIONINFO));
|
||||||
|
info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
||||||
|
if (GetVersionEx(&info))
|
||||||
|
{
|
||||||
|
// dual source blending is only supported in windows 7 o newer. sorry xp users
|
||||||
|
// we cannot test for device caps because most drivers just declare the minimun caps
|
||||||
|
// and don't expose their support for some functionalities
|
||||||
|
g_Config.backend_info.bSupportsDualSourceBlend = g_Config.backend_info.bSupportsSeparateAlphaFunction && (info.dwPlatformId == VER_PLATFORM_WIN32_NT) && ((info.dwMajorVersion > 6) || ((info.dwMajorVersion == 6) && info.dwMinorVersion >= 1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
g_Config.backend_info.bSupportsDualSourceBlend = false;
|
g_Config.backend_info.bSupportsDualSourceBlend = false;
|
||||||
|
}
|
||||||
g_Config.backend_info.bSupportsFormatReinterpretation = true;
|
g_Config.backend_info.bSupportsFormatReinterpretation = true;
|
||||||
g_Config.backend_info.bSupportsPixelLighting = C_PLIGHTS + 40 <= maxConstants && C_PMATERIALS + 4 <= maxConstants;
|
g_Config.backend_info.bSupportsPixelLighting = C_PLIGHTS + 40 <= maxConstants && C_PMATERIALS + 4 <= maxConstants;
|
||||||
g_Config.backend_info.bSupportsEarlyZ = false;
|
g_Config.backend_info.bSupportsEarlyZ = false;
|
||||||
|
@ -139,6 +153,9 @@ bool VideoBackend::Initialize(void *&window_handle)
|
||||||
g_Config.GameIniLoad(SConfig::GetInstance().m_LocalCoreStartupParameter.m_strGameIni.c_str());
|
g_Config.GameIniLoad(SConfig::GetInstance().m_LocalCoreStartupParameter.m_strGameIni.c_str());
|
||||||
g_Config.UpdateProjectionHack();
|
g_Config.UpdateProjectionHack();
|
||||||
g_Config.VerifyValidity();
|
g_Config.VerifyValidity();
|
||||||
|
// as only some driver/hardware configurations support dual source blending only enable it if is
|
||||||
|
// configured by user
|
||||||
|
g_Config.backend_info.bSupportsDualSourceBlend &= g_Config.bForceDualSourceBlend;
|
||||||
UpdateActiveConfig();
|
UpdateActiveConfig();
|
||||||
|
|
||||||
window_handle = (void*)EmuWindow::Create((HWND)window_handle, GetModuleHandle(0), _T("Loading - Please wait."));
|
window_handle = (void*)EmuWindow::Create((HWND)window_handle, GetModuleHandle(0), _T("Loading - Please wait."));
|
||||||
|
|
|
@ -33,9 +33,12 @@ void SetPSConstant4fvByName(const char * name, unsigned int offset, const float
|
||||||
{
|
{
|
||||||
if (tmp.shader.UniformLocations[a] == -1)
|
if (tmp.shader.UniformLocations[a] == -1)
|
||||||
return;
|
return;
|
||||||
|
else if (tmp.shader.UniformSize[a] <= offset)
|
||||||
|
return;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glUniform4fv(tmp.shader.UniformLocations[a] + offset, count, f);
|
unsigned int maxcount= tmp.shader.UniformSize[a]-offset;
|
||||||
|
glUniform4fv(tmp.shader.UniformLocations[a] + offset, std::min(count, maxcount), f);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,17 +78,35 @@ void SHADER::SetProgramVariables()
|
||||||
glUniformBlockBinding(glprogid, VSBlock_id, 2);
|
glUniformBlockBinding(glprogid, VSBlock_id, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We cache our uniform locations for now
|
// UBO workaround
|
||||||
// Once we move up to a newer version of GLSL, ~1.30
|
for (int a = 0; a < NUM_UNIFORMS; ++a)
|
||||||
// We can remove this
|
{
|
||||||
|
|
||||||
// (Sonicadvance): For some reason this fails on my hardware
|
|
||||||
//glGetUniformIndices(glprogid, NUM_UNIFORMS, UniformNames, UniformLocations);
|
|
||||||
// Got to do it this crappy way.
|
|
||||||
UniformLocations[0] = glGetUniformLocation(glprogid, UniformNames[0]);
|
|
||||||
if (!g_ActiveConfig.backend_info.bSupportsGLSLUBO)
|
|
||||||
for (int a = 1; a < NUM_UNIFORMS; ++a)
|
|
||||||
UniformLocations[a] = glGetUniformLocation(glprogid, UniformNames[a]);
|
UniformLocations[a] = glGetUniformLocation(glprogid, UniformNames[a]);
|
||||||
|
UniformSize[a] = 0;
|
||||||
|
if(g_ActiveConfig.backend_info.bSupportsGLSLUBO)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!g_ActiveConfig.backend_info.bSupportsGLSLUBO)
|
||||||
|
{
|
||||||
|
int max_uniforms = 0;
|
||||||
|
char name[50];
|
||||||
|
int size;
|
||||||
|
|
||||||
|
glGetProgramiv(glprogid, GL_ACTIVE_UNIFORMS, &max_uniforms);
|
||||||
|
for(int i=0; i<max_uniforms; i++)
|
||||||
|
{
|
||||||
|
glGetActiveUniform(glprogid, i, sizeof(name), NULL, &size, NULL, name);
|
||||||
|
for (int a = 0; a < NUM_UNIFORMS; ++a)
|
||||||
|
{
|
||||||
|
if(strstr(name, UniformNames[a]))
|
||||||
|
{
|
||||||
|
UniformSize[a] = size;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Bind Texture Sampler
|
// Bind Texture Sampler
|
||||||
for (int a = 0; a <= 9; ++a)
|
for (int a = 0; a <= 9; ++a)
|
||||||
|
@ -538,8 +556,8 @@ void ProgramShaderCache::CreateHeader ( void )
|
||||||
|
|
||||||
, v==GLSL_120 ? "attribute" : "in"
|
, v==GLSL_120 ? "attribute" : "in"
|
||||||
, v==GLSL_120 ? "attribute" : "out"
|
, v==GLSL_120 ? "attribute" : "out"
|
||||||
, DriverDetails::HasBug(DriverDetails::BUG_BROKENCENTROID) ? "in" : v==GLSL_120 ? "varying" : "centroid in"
|
, v==GLSL_120 ? "varying" : DriverDetails::HasBug(DriverDetails::BUG_BROKENCENTROID) ? "in" : "centroid in"
|
||||||
, DriverDetails::HasBug(DriverDetails::BUG_BROKENCENTROID) ? "out" : v==GLSL_120 ? "varying" : "centroid out"
|
, v==GLSL_120 ? "varying" : DriverDetails::HasBug(DriverDetails::BUG_BROKENCENTROID) ? "out" : "centroid out"
|
||||||
|
|
||||||
, v==GLSL_120 ? "#define texture texture2D" : ""
|
, v==GLSL_120 ? "#define texture texture2D" : ""
|
||||||
, v==GLSL_120 ? "#define round(x) floor((x)+0.5f)" : ""
|
, v==GLSL_120 ? "#define round(x) floor((x)+0.5f)" : ""
|
||||||
|
|
|
@ -56,6 +56,7 @@ struct SHADER
|
||||||
|
|
||||||
std::string strvprog, strpprog;
|
std::string strvprog, strpprog;
|
||||||
GLint UniformLocations[NUM_UNIFORMS];
|
GLint UniformLocations[NUM_UNIFORMS];
|
||||||
|
u32 UniformSize[NUM_UNIFORMS];
|
||||||
|
|
||||||
void SetProgramVariables();
|
void SetProgramVariables();
|
||||||
void SetProgramBindings();
|
void SetProgramBindings();
|
||||||
|
|
|
@ -271,9 +271,9 @@ void InitDriverInfo()
|
||||||
{
|
{
|
||||||
std::string svendor = std::string(g_ogl_config.gl_vendor);
|
std::string svendor = std::string(g_ogl_config.gl_vendor);
|
||||||
std::string srenderer = std::string(g_ogl_config.gl_renderer);
|
std::string srenderer = std::string(g_ogl_config.gl_renderer);
|
||||||
|
std::string sversion = std::string(g_ogl_config.gl_version);
|
||||||
DriverDetails::Vendor vendor = DriverDetails::VENDOR_UNKNOWN;
|
DriverDetails::Vendor vendor = DriverDetails::VENDOR_UNKNOWN;
|
||||||
DriverDetails::Driver driver = DriverDetails::DRIVER_UNKNOWN;
|
DriverDetails::Driver driver = DriverDetails::DRIVER_UNKNOWN;
|
||||||
u32 devfamily = 0;
|
|
||||||
double version = 0.0;
|
double version = 0.0;
|
||||||
|
|
||||||
// Get the vendor first
|
// Get the vendor first
|
||||||
|
@ -281,13 +281,12 @@ void InitDriverInfo()
|
||||||
vendor = DriverDetails::VENDOR_NVIDIA;
|
vendor = DriverDetails::VENDOR_NVIDIA;
|
||||||
else if (svendor == "ATI Technologies Inc." || svendor == "Advanced Micro Devices, Inc.")
|
else if (svendor == "ATI Technologies Inc." || svendor == "Advanced Micro Devices, Inc.")
|
||||||
vendor = DriverDetails::VENDOR_ATI;
|
vendor = DriverDetails::VENDOR_ATI;
|
||||||
|
else if (std::string::npos != sversion.find("Mesa"))
|
||||||
|
vendor = DriverDetails::VENDOR_MESA;
|
||||||
else if (std::string::npos != svendor.find("Intel"))
|
else if (std::string::npos != svendor.find("Intel"))
|
||||||
vendor = DriverDetails::VENDOR_INTEL;
|
vendor = DriverDetails::VENDOR_INTEL;
|
||||||
else if (svendor == "ARM")
|
else if (svendor == "ARM")
|
||||||
{
|
|
||||||
vendor = DriverDetails::VENDOR_ARM;
|
vendor = DriverDetails::VENDOR_ARM;
|
||||||
driver = DriverDetails::DRIVER_ARM;
|
|
||||||
}
|
|
||||||
else if (svendor == "http://limadriver.org/")
|
else if (svendor == "http://limadriver.org/")
|
||||||
{
|
{
|
||||||
vendor = DriverDetails::VENDOR_ARM;
|
vendor = DriverDetails::VENDOR_ARM;
|
||||||
|
@ -308,24 +307,40 @@ void InitDriverInfo()
|
||||||
case DriverDetails::VENDOR_QUALCOMM:
|
case DriverDetails::VENDOR_QUALCOMM:
|
||||||
{
|
{
|
||||||
if (std::string::npos != srenderer.find("Adreno (TM) 3"))
|
if (std::string::npos != srenderer.find("Adreno (TM) 3"))
|
||||||
devfamily = 300;
|
driver = DriverDetails::DRIVER_QUALCOMM_3XX;
|
||||||
else
|
else
|
||||||
devfamily = 200;
|
driver = DriverDetails::DRIVER_QUALCOMM_2XX;
|
||||||
double glVersion;
|
double glVersion;
|
||||||
sscanf(g_ogl_config.gl_version, "OpenGL ES %lg V@%lg", &glVersion, &version);
|
sscanf(g_ogl_config.gl_version, "OpenGL ES %lg V@%lg", &glVersion, &version);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DriverDetails::VENDOR_ARM:
|
case DriverDetails::VENDOR_ARM:
|
||||||
if (std::string::npos != srenderer.find("Mali-T6"))
|
if (std::string::npos != srenderer.find("Mali-T6"))
|
||||||
devfamily = 600;
|
driver = DriverDetails::DRIVER_ARM_T6XX;
|
||||||
else if(std::string::npos != srenderer.find("Mali-4"))
|
else if(std::string::npos != srenderer.find("Mali-4"))
|
||||||
devfamily = 400;
|
driver = DriverDetails::DRIVER_ARM_4XX;
|
||||||
|
break;
|
||||||
|
case DriverDetails::VENDOR_MESA:
|
||||||
|
{
|
||||||
|
if(svendor == "nouveau")
|
||||||
|
driver = DriverDetails::DRIVER_NOUVEAU;
|
||||||
|
else if(svendor == "Intel Open Source Technology Center")
|
||||||
|
driver = DriverDetails::DRIVER_I965;
|
||||||
|
else if(std::string::npos != srenderer.find("AMD") || std::string::npos != srenderer.find("ATI"))
|
||||||
|
driver = DriverDetails::DRIVER_R600;
|
||||||
|
|
||||||
|
int major = 0;
|
||||||
|
int minor = 0;
|
||||||
|
int release = 0;
|
||||||
|
sscanf(g_ogl_config.gl_version, "%*s Mesa %d.%d.%d", &major, &minor, &release);
|
||||||
|
version = 100*major + 10*minor + release;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
// We don't care about these
|
// We don't care about these
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
DriverDetails::Init(vendor, driver, devfamily, version);
|
DriverDetails::Init(vendor, driver, version);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init functions
|
// Init functions
|
||||||
|
@ -491,18 +506,12 @@ Renderer::Renderer()
|
||||||
if(g_ogl_config.max_samples < 1)
|
if(g_ogl_config.max_samples < 1)
|
||||||
g_ogl_config.max_samples = 1;
|
g_ogl_config.max_samples = 1;
|
||||||
|
|
||||||
if(g_Config.backend_info.bSupportsGLSLUBO && (
|
if(g_Config.backend_info.bSupportsGLSLUBO && DriverDetails::HasBug(DriverDetails::BUG_BROKENUBO))
|
||||||
// hd3000 get corruption, hd4000 also and a big slowdown
|
{
|
||||||
!strcmp(g_ogl_config.gl_vendor, "Intel Open Source Technology Center") && (
|
|
||||||
!strcmp(g_ogl_config.gl_version, "3.0 Mesa 9.0.0") ||
|
|
||||||
!strcmp(g_ogl_config.gl_version, "3.0 Mesa 9.0.1") ||
|
|
||||||
!strcmp(g_ogl_config.gl_version, "3.0 Mesa 9.0.2") ||
|
|
||||||
!strcmp(g_ogl_config.gl_version, "3.0 Mesa 9.0.3") ||
|
|
||||||
!strcmp(g_ogl_config.gl_version, "3.0 Mesa 9.1.0") ||
|
|
||||||
!strcmp(g_ogl_config.gl_version, "3.0 Mesa 9.1.1") )
|
|
||||||
)) {
|
|
||||||
g_Config.backend_info.bSupportsGLSLUBO = false;
|
g_Config.backend_info.bSupportsGLSLUBO = false;
|
||||||
ERROR_LOG(VIDEO, "Buggy driver detected. Disable UBO");
|
ERROR_LOG(VIDEO, "Buggy driver detected. Disable UBO");
|
||||||
|
OSD::AddMessage("Major performance warning: Buggy GPU driver detected.", 20000);
|
||||||
|
OSD::AddMessage("Please either install the closed-source GPU driver or update your Mesa 3D version.", 20000);
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateActiveConfig();
|
UpdateActiveConfig();
|
||||||
|
@ -510,7 +519,7 @@ Renderer::Renderer()
|
||||||
OSD::AddMessage(StringFromFormat("Video Info: %s, %s, %s",
|
OSD::AddMessage(StringFromFormat("Video Info: %s, %s, %s",
|
||||||
g_ogl_config.gl_vendor,
|
g_ogl_config.gl_vendor,
|
||||||
g_ogl_config.gl_renderer,
|
g_ogl_config.gl_renderer,
|
||||||
g_ogl_config.gl_version).c_str(), 5000);
|
g_ogl_config.gl_version), 5000);
|
||||||
|
|
||||||
WARN_LOG(VIDEO,"Missing OGL Extensions: %s%s%s%s%s%s%s%s%s%s",
|
WARN_LOG(VIDEO,"Missing OGL Extensions: %s%s%s%s%s%s%s%s%s%s",
|
||||||
g_ActiveConfig.backend_info.bSupportsDualSourceBlend ? "" : "DualSourceBlend ",
|
g_ActiveConfig.backend_info.bSupportsDualSourceBlend ? "" : "DualSourceBlend ",
|
||||||
|
@ -1805,7 +1814,7 @@ void TakeScreenshot(ScrStrct* threadStruct)
|
||||||
|
|
||||||
// Show success messages
|
// Show success messages
|
||||||
OSD::AddMessage(StringFromFormat("Saved %i x %i %s", (int)FloatW, (int)FloatH,
|
OSD::AddMessage(StringFromFormat("Saved %i x %i %s", (int)FloatW, (int)FloatH,
|
||||||
threadStruct->filename.c_str()).c_str(), 2000);
|
threadStruct->filename.c_str()), 2000);
|
||||||
delete threadStruct;
|
delete threadStruct;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -33,9 +33,12 @@ void SetVSConstant4fvByName(const char * name, unsigned int offset, const float
|
||||||
{
|
{
|
||||||
if (tmp.shader.UniformLocations[a] == -1)
|
if (tmp.shader.UniformLocations[a] == -1)
|
||||||
return;
|
return;
|
||||||
|
else if (tmp.shader.UniformSize[a] <= offset)
|
||||||
|
return;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glUniform4fv(tmp.shader.UniformLocations[a] + offset, count, f);
|
unsigned int maxcount= tmp.shader.UniformSize[a]-offset;
|
||||||
|
glUniform4fv(tmp.shader.UniformLocations[a] + offset, std::min(count, maxcount), f);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue