Merge branch 'master' into wii-network
This commit is contained in:
@@ -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]
|
||||||
|
|||||||
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
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
|
||||||
{
|
|
||||||
bool is_mapped[4] = {false,false,false,false};
|
|
||||||
|
|
||||||
for (unsigned int m = 0; m < 4; ++m)
|
for (unsigned int m = 0; m < 4; ++m)
|
||||||
{
|
{
|
||||||
for (i = m_players.begin(); i!=e; ++i)
|
if (m_pad_map[m] == -1)
|
||||||
{
|
{
|
||||||
if (i->second.pad_map[m] >= 0)
|
m_pad_map[m] = player.pid;
|
||||||
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,85 +249,30 @@ 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);
|
// called from ---GUI--- thread and ---NETPLAY--- thread
|
||||||
UpdatePadMapping(); // sync pad mappings with everyone
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// called from ---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
|
||||||
void NetPlayServer::AdjustPadBufferSize(unsigned int size)
|
void NetPlayServer::AdjustPadBufferSize(unsigned int size)
|
||||||
{
|
{
|
||||||
@@ -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;
|
||||||
private:
|
|
||||||
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; }
|
void AddMessage(const std::string& str, u32 ms)
|
||||||
};
|
|
||||||
|
|
||||||
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));
|
s_msgList.push_back(Message(str, 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)
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user