Skip to content

Commit 225c133

Browse files
Implement Initial MangoHud Configuration Generator (For using MangoHud Options Like FPS Limit), Implement FPS Limitter, Set BOX64_MMAP32 Default Value to True
1 parent 6fc0c9a commit 225c133

File tree

14 files changed

+173
-56
lines changed

14 files changed

+173
-56
lines changed

app/src/main/java/com/micewine/emu/activities/DriverManagerActivity.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ import androidx.appcompat.widget.Toolbar
88
import androidx.fragment.app.Fragment
99
import com.google.gson.Gson
1010
import com.micewine.emu.R
11+
import com.micewine.emu.activities.MainActivity.Companion.enableMangoHUD
12+
import com.micewine.emu.activities.MainActivity.Companion.fpsLimit
1113
import com.micewine.emu.activities.MainActivity.Companion.setSharedVars
14+
import com.micewine.emu.activities.MainActivity.Companion.usrDir
1215
import com.micewine.emu.databinding.ActivityDriverManagerBinding
1316
import com.micewine.emu.fragments.DriverListFragment
1417
import java.io.File
@@ -69,5 +72,18 @@ class DriverManagerActivity : AppCompatActivity() {
6972

7073
destIcd.writeText(json)
7174
}
75+
76+
fun generateMangoHUDConfFile() {
77+
val mangoHudConfFile = File("$usrDir/etc/MangoHud.conf")
78+
val options = StringBuilder()
79+
80+
options.append("fps_limit=$fpsLimit\n")
81+
82+
if (!enableMangoHUD) {
83+
options.append("no_display\n")
84+
}
85+
86+
mangoHudConfFile.writeText(options.toString())
87+
}
7288
}
7389
}

app/src/main/java/com/micewine/emu/activities/GeneralSettingsActivity.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.appcompat.app.AppCompatActivity
1212
import androidx.appcompat.widget.Toolbar
1313
import androidx.fragment.app.Fragment
1414
import com.micewine.emu.R
15+
import com.micewine.emu.activities.MainActivity.Companion.screenFpsLimit
1516
import com.micewine.emu.activities.MainActivity.Companion.setSharedVars
1617
import com.micewine.emu.databinding.ActivityGeneralSettingsBinding
1718
import com.micewine.emu.fragments.Box64SettingsFragment
@@ -127,11 +128,12 @@ class GeneralSettingsActivity : AppCompatActivity() {
127128
const val SWITCH = 1
128129
const val SPINNER = 2
129130
const val CHECKBOX = 3
131+
const val SEEKBAR = 4
130132

131133
const val BOX64_LOG = "BOX64_LOG"
132134
const val BOX64_LOG_DEFAULT_VALUE = "1"
133135
const val BOX64_MMAP32 = "BOX64_MMAP32"
134-
const val BOX64_MMAP32_DEFAULT_VALUE = false
136+
const val BOX64_MMAP32_DEFAULT_VALUE = true
135137
const val BOX64_AVX = "BOX64_AVX"
136138
const val BOX64_AVX_DEFAULT_VALUE = "2"
137139
const val BOX64_SSE42 = "BOX64_SSE42"
@@ -211,5 +213,6 @@ class GeneralSettingsActivity : AppCompatActivity() {
211213
const val DEAD_ZONE = "deadZone"
212214
const val MOUSE_SENSIBILITY = "mouseSensibility"
213215
const val CPU_AFFINITY = "cpuAffinity"
216+
const val FPS_LIMIT = "fpsLimit"
214217
}
215218
}

app/src/main/java/com/micewine/emu/activities/MainActivity.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import android.view.KeyEvent
2121
import android.view.Menu
2222
import android.view.MenuItem
2323
import android.view.View
24+
import android.view.WindowManager
2425
import android.widget.Toast
2526
import androidx.appcompat.app.AppCompatActivity
2627
import androidx.fragment.app.Fragment
@@ -33,6 +34,7 @@ import com.google.android.material.bottomnavigation.BottomNavigationView
3334
import com.micewine.emu.BuildConfig
3435
import com.micewine.emu.R
3536
import com.micewine.emu.activities.DriverManagerActivity.Companion.generateICDFile
37+
import com.micewine.emu.activities.DriverManagerActivity.Companion.generateMangoHUDConfFile
3638
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.BOX64_AVX
3739
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.BOX64_AVX_DEFAULT_VALUE
3840
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.BOX64_DYNAREC_ALIGNED_ATOMICS
@@ -88,6 +90,7 @@ import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_MANG
8890
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_MANGOHUD_DEFAULT_VALUE
8991
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_SERVICES
9092
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_SERVICES_DEFAULT_VALUE
93+
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.FPS_LIMIT
9194
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SELECTED_BOX64
9295
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SELECTED_D3DX_RENDERER
9396
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SELECTED_D3DX_RENDERER_DEFAULT_VALUE
@@ -121,14 +124,14 @@ import com.micewine.emu.core.ShellLoader.runCommandWithOutput
121124
import com.micewine.emu.core.WineWrapper
122125
import com.micewine.emu.core.WineWrapper.getCpuHexMask
123126
import com.micewine.emu.databinding.ActivityMainBinding
127+
import com.micewine.emu.fragments.AboutFragment
124128
import com.micewine.emu.fragments.AskInstallRatPackageFragment
125129
import com.micewine.emu.fragments.AskInstallRatPackageFragment.Companion.ratCandidate
126130
import com.micewine.emu.fragments.DeleteGameItemFragment
131+
import com.micewine.emu.fragments.EditGamePreferencesFragment
127132
import com.micewine.emu.fragments.FileManagerFragment
128133
import com.micewine.emu.fragments.FileManagerFragment.Companion.refreshFiles
129134
import com.micewine.emu.fragments.FloatingFileManagerFragment
130-
import com.micewine.emu.fragments.AboutFragment
131-
import com.micewine.emu.fragments.EditGamePreferencesFragment
132135
import com.micewine.emu.fragments.SettingsFragment
133136
import com.micewine.emu.fragments.SetupFragment
134137
import com.micewine.emu.fragments.SetupFragment.Companion.abortSetup
@@ -171,6 +174,7 @@ class MainActivity : AppCompatActivity() {
171174
val driverLibPath = File("$ratPackagesDir/$selectedDriver/pkg-header").readLines()[4].substringAfter("=")
172175

173176
generateICDFile(driverLibPath, File("$appRootDir/vulkan_icd.json"))
177+
generateMangoHUDConfFile()
174178

175179
setSharedVars(this@MainActivity)
176180

@@ -953,6 +957,8 @@ class MainActivity : AppCompatActivity() {
953957
var miceWineVersion: String = "MiceWine ${BuildConfig.VERSION_NAME} (git-${BuildConfig.GIT_SHORT_SHA})"
954958
var vulkanDriverDeviceName: String? = null
955959
var cpuAffinity: String? = null
960+
var screenFpsLimit: Int = 60
961+
var fpsLimit: Int = 0
956962
private var selectedResolution: String? = ""
957963

958964
var selectedFragment = "ShortcutsFragment"
@@ -1069,6 +1075,9 @@ class MainActivity : AppCompatActivity() {
10691075

10701076
cpuAffinity = preferences.getString(CPU_AFFINITY, availableCPUs.joinToString(","))
10711077

1078+
screenFpsLimit = (activity.getSystemService(WINDOW_SERVICE) as WindowManager).defaultDisplay.refreshRate.toInt()
1079+
fpsLimit = preferences.getInt(FPS_LIMIT, screenFpsLimit)
1080+
10721081
vulkanDriverDeviceName = getVulkanDeviceName()
10731082
}
10741083

app/src/main/java/com/micewine/emu/adapters/AdapterSettingsPreferences.kt

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.micewine.emu.adapters
22

3+
import android.annotation.SuppressLint
34
import android.app.Activity
45
import android.content.SharedPreferences
56
import android.database.DataSetObserver
@@ -9,6 +10,8 @@ import android.view.ViewGroup
910
import android.widget.AdapterView
1011
import android.widget.ArrayAdapter
1112
import android.widget.CheckBox
13+
import android.widget.SeekBar
14+
import android.widget.SeekBar.OnSeekBarChangeListener
1215
import android.widget.Spinner
1316
import android.widget.SpinnerAdapter
1417
import android.widget.TextView
@@ -21,6 +24,7 @@ import com.micewine.emu.activities.GeneralSettingsActivity.Companion.CHECKBOX
2124
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.DISPLAY_MODE
2225
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.DISPLAY_MODE_DEFAULT_VALUE
2326
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.DISPLAY_RESOLUTION
27+
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SEEKBAR
2428
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SPINNER
2529
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SWITCH
2630
import com.micewine.emu.fragments.DisplaySettingsFragment.Companion.getNativeResolutions
@@ -42,6 +46,7 @@ class AdapterSettingsPreferences(
4246
return ViewHolder(itemView)
4347
}
4448

49+
@SuppressLint("SetTextI18n")
4550
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
4651
val sList = settingsList[position]
4752
holder.settingsName.setText(sList.titleSettings)
@@ -71,6 +76,8 @@ class AdapterSettingsPreferences(
7176
SWITCH -> {
7277
holder.spinnerOptions.visibility = View.GONE
7378
holder.settingsSwitch.visibility = View.VISIBLE
79+
holder.seekBar.visibility = View.GONE
80+
holder.seekBarValue.visibility = View.GONE
7481

7582
holder.settingsSwitch.isChecked = preferences.getBoolean(sList.key, sList.defaultValue.toBoolean())
7683
holder.settingsSwitch.setOnClickListener {
@@ -83,6 +90,8 @@ class AdapterSettingsPreferences(
8390
SPINNER -> {
8491
holder.settingsSwitch.visibility = View.GONE
8592
holder.spinnerOptions.visibility = View.VISIBLE
93+
holder.seekBar.visibility = View.GONE
94+
holder.seekBarValue.visibility = View.GONE
8695

8796
holder.spinnerOptions.adapter = ArrayAdapter(
8897
activity,
@@ -128,6 +137,8 @@ class AdapterSettingsPreferences(
128137
CHECKBOX -> {
129138
holder.settingsSwitch.visibility = View.GONE
130139
holder.spinnerOptions.visibility = View.VISIBLE
140+
holder.seekBar.visibility = View.GONE
141+
holder.seekBarValue.visibility = View.GONE
131142

132143
holder.spinnerOptions.adapter = CheckableAdapter(
133144
activity,
@@ -137,19 +148,62 @@ class AdapterSettingsPreferences(
137148
holder.spinnerOptions
138149
)
139150
}
151+
SEEKBAR -> {
152+
holder.settingsSwitch.visibility = View.GONE
153+
holder.spinnerOptions.visibility = View.GONE
154+
holder.seekBar.visibility = View.VISIBLE
155+
holder.seekBarValue.visibility = View.VISIBLE
156+
157+
holder.seekBar.min = sList.seekBarMaxMinValues!![0]
158+
holder.seekBar.max = sList.seekBarMaxMinValues!![1]
159+
160+
holder.seekBar.progress = preferences.getInt(sList.key, sList.defaultValue.toInt())
161+
162+
if (holder.seekBar.progress == 0) {
163+
holder.seekBarValue.text = activity.getString(R.string.unlimited)
164+
} else {
165+
holder.seekBarValue.text = "${holder.seekBar.progress} FPS"
166+
}
167+
168+
holder.seekBar.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {
169+
override fun onProgressChanged(
170+
seekBar: SeekBar?,
171+
progress: Int,
172+
fromUser: Boolean
173+
) {
174+
if (progress == 0) {
175+
holder.seekBarValue.text = activity.getString(R.string.unlimited)
176+
} else {
177+
holder.seekBarValue.text = "$progress FPS"
178+
}
179+
180+
preferences.edit().apply {
181+
putInt(sList.key, progress)
182+
apply()
183+
}
184+
}
185+
186+
override fun onStartTrackingTouch(seekBar: SeekBar?) {
187+
}
188+
189+
override fun onStopTrackingTouch(seekBar: SeekBar?) {
190+
}
191+
})
192+
}
140193
}
141194
}
142195

143196
override fun getItemCount(): Int {
144197
return settingsList.size
145198
}
146199

147-
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
148-
View.OnClickListener {
200+
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
149201
val settingsName: TextView = itemView.findViewById(R.id.title_preferences_model)
150202
val settingsDescription: TextView = itemView.findViewById(R.id.description_preferences_model)
151203
val spinnerOptions: Spinner = itemView.findViewById(R.id.keyBindSpinner)
152204
val settingsSwitch: SwitchCompat = itemView.findViewById(R.id.optionSwitch)
205+
val seekBar: SeekBar = itemView.findViewById(R.id.seekBar)
206+
val seekBarValue: TextView = itemView.findViewById(R.id.seekBarValue)
153207

154208
init {
155209
itemView.setOnClickListener(this)
@@ -165,7 +219,7 @@ class AdapterSettingsPreferences(
165219
}
166220
}
167221

168-
class SettingsListSpinner(var titleSettings: Int, var descriptionSettings: Int, var spinnerOptions: Array<String>?, var type: Int, var defaultValue: String, var key: String)
222+
class SettingsListSpinner(var titleSettings: Int, var descriptionSettings: Int, var spinnerOptions: Array<String>?, var seekBarMaxMinValues: Array<Int>?, var type: Int, var defaultValue: String, var key: String)
169223

170224
class CheckableAdapter(
171225
val activity: Activity,

app/src/main/java/com/micewine/emu/core/EnvVars.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,8 @@ object EnvVars {
111111
vars.add("DXVK_ASYNC=1")
112112
vars.add("DXVK_STATE_CACHE_PATH=$homeDir/.cache/dxvk-shader-cache")
113113
vars.add("DXVK_HUD=$selectedDXVKHud")
114-
115-
if (enableMangoHUD) {
116-
vars.add("MANGOHUD=1")
117-
vars.add("MANGOHUD_CONFIGFILE=$usrDir/etc/MangoHud.conf")
118-
}
114+
vars.add("MANGOHUD=1")
115+
vars.add("MANGOHUD_CONFIGFILE=$usrDir/etc/MangoHud.conf")
119116

120117
if (Build.SUPPORTED_ABIS[0] != "x86_64") {
121118
vars.add("BOX64_LOG=$box64LogLevel")

app/src/main/java/com/micewine/emu/fragments/Box64SettingsFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,6 @@ class Box64SettingsFragment : Fragment() {
117117
}
118118

119119
private fun addToAdapter(titleId: Int, descriptionId: Int, valuesArray: Array<String>?, type: Int, defaultValue: Any, keyId: String) {
120-
settingsList.add(SettingsListSpinner(titleId, descriptionId, valuesArray, type, "$defaultValue", keyId))
120+
settingsList.add(SettingsListSpinner(titleId, descriptionId, valuesArray, null, type, "$defaultValue", keyId))
121121
}
122122
}

app/src/main/java/com/micewine/emu/fragments/DisplaySettingsFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class DisplaySettingsFragment : Fragment() {
6767
}
6868

6969
private fun addToAdapter(titleId: Int, descriptionId: Int, valuesArray: Array<String>?, type: Int, defaultValue: Any, keyId: String) {
70-
settingsList.add(SettingsListSpinner(titleId, descriptionId, valuesArray, type, defaultValue.toString(), keyId))
70+
settingsList.add(SettingsListSpinner(titleId, descriptionId, valuesArray, null, type, defaultValue.toString(), keyId))
7171
}
7272

7373
companion object {

app/src/main/java/com/micewine/emu/fragments/DriversSettingsFragment.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_DRI3
1313
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_DRI3_DEFAULT_VALUE
1414
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_MANGOHUD
1515
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_MANGOHUD_DEFAULT_VALUE
16+
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.FPS_LIMIT
17+
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SEEKBAR
1618
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SELECTED_D3DX_RENDERER
1719
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SELECTED_D3DX_RENDERER_DEFAULT_VALUE
1820
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SELECTED_DXVK_HUD_PRESET
@@ -32,6 +34,7 @@ import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SELECTED_WI
3234
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SPINNER
3335
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SWITCH
3436
import com.micewine.emu.activities.MainActivity.Companion.appRootDir
37+
import com.micewine.emu.activities.MainActivity.Companion.screenFpsLimit
3538
import com.micewine.emu.adapters.AdapterSettingsPreferences
3639
import com.micewine.emu.adapters.AdapterSettingsPreferences.SettingsListSpinner
3740
import java.io.File
@@ -89,6 +92,7 @@ class DriversSettingsFragment : Fragment() {
8992
addToAdapter(R.string.select_dxvk_title, R.string.null_description, dxvkVersions.toTypedArray(), SPINNER, SELECTED_DXVK_DEFAULT_VALUE, SELECTED_DXVK)
9093
addToAdapter(R.string.select_vkd3d_title, R.string.null_description, vkd3dVersions.toTypedArray(), SPINNER, SELECTED_VKD3D_DEFAULT_VALUE, SELECTED_VKD3D)
9194
addToAdapter(R.string.enable_mangohud_title, R.string.null_description, null, SWITCH, ENABLE_MANGOHUD_DEFAULT_VALUE, ENABLE_MANGOHUD)
95+
addToAdapter(R.string.fps_limit_title, R.string.null_description, null, arrayOf(0, screenFpsLimit), SEEKBAR, screenFpsLimit, FPS_LIMIT)
9296
addToAdapter(R.string.select_dxvk_hud_preset_title, R.string.null_description, arrayOf("fps", "gpuload", "devinfo", "version", "api"), CHECKBOX, SELECTED_DXVK_HUD_PRESET_DEFAULT_VALUE, SELECTED_DXVK_HUD_PRESET)
9397
addToAdapter(R.string.mesa_vk_wsi_present_mode_title, R.string.null_description, arrayOf("fifo", "relaxed", "mailbox", "immediate"), SPINNER, SELECTED_MESA_VK_WSI_PRESENT_MODE_DEFAULT_VALUE, SELECTED_MESA_VK_WSI_PRESENT_MODE)
9498
addToAdapter(R.string.tu_debug_title, R.string.null_description, arrayOf("noconform", "flushall", "syncdraw", "sysmem", "gmem", "nolrz", "noubwc", "nomultipos", "forcebin"), CHECKBOX, SELECTED_TU_DEBUG_PRESET_DEFAULT_VALUE, SELECTED_TU_DEBUG_PRESET)
@@ -104,6 +108,10 @@ class DriversSettingsFragment : Fragment() {
104108
}
105109

106110
private fun addToAdapter(titleId: Int, descriptionId: Int, valuesArray: Array<String>?, type: Int, defaultValue: Any, keyId: String) {
107-
settingsList.add(SettingsListSpinner(titleId, descriptionId, valuesArray, type, "$defaultValue", keyId))
111+
settingsList.add(SettingsListSpinner(titleId, descriptionId, valuesArray, null, type, "$defaultValue", keyId))
112+
}
113+
114+
private fun addToAdapter(titleId: Int, descriptionId: Int, valuesArray: Array<String>?, seekBarMaxMinValues: Array<Int>, type: Int, defaultValue: Any, keyId: String) {
115+
settingsList.add(SettingsListSpinner(titleId, descriptionId, valuesArray, seekBarMaxMinValues, type, "$defaultValue", keyId))
108116
}
109117
}

app/src/main/java/com/micewine/emu/fragments/WineSettingsFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class WineSettingsFragment : Fragment() {
5555
}
5656

5757
private fun addToAdapter(titleId: Int, descriptionId: Int, valuesArray: Array<String>?, type: Int, defaultValue: Any, keyId: String) {
58-
settingsList.add(SettingsListSpinner(titleId, descriptionId, valuesArray, type, "$defaultValue", keyId))
58+
settingsList.add(SettingsListSpinner(titleId, descriptionId, valuesArray, null, type, "$defaultValue", keyId))
5959
}
6060

6161
companion object {

0 commit comments

Comments
 (0)