Skip to content

Commit

Permalink
Implement Initial MangoHud Configuration Generator (For using MangoHu…
Browse files Browse the repository at this point in the history
…d Options Like FPS Limit), Implement FPS Limitter, Set BOX64_MMAP32 Default Value to True
  • Loading branch information
KreitinnSoftware committed Feb 6, 2025
1 parent 6fc0c9a commit 225c133
Show file tree
Hide file tree
Showing 14 changed files with 173 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment
import com.google.gson.Gson
import com.micewine.emu.R
import com.micewine.emu.activities.MainActivity.Companion.enableMangoHUD
import com.micewine.emu.activities.MainActivity.Companion.fpsLimit
import com.micewine.emu.activities.MainActivity.Companion.setSharedVars
import com.micewine.emu.activities.MainActivity.Companion.usrDir
import com.micewine.emu.databinding.ActivityDriverManagerBinding
import com.micewine.emu.fragments.DriverListFragment
import java.io.File
Expand Down Expand Up @@ -69,5 +72,18 @@ class DriverManagerActivity : AppCompatActivity() {

destIcd.writeText(json)
}

fun generateMangoHUDConfFile() {
val mangoHudConfFile = File("$usrDir/etc/MangoHud.conf")
val options = StringBuilder()

options.append("fps_limit=$fpsLimit\n")

if (!enableMangoHUD) {
options.append("no_display\n")
}

mangoHudConfFile.writeText(options.toString())
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment
import com.micewine.emu.R
import com.micewine.emu.activities.MainActivity.Companion.screenFpsLimit
import com.micewine.emu.activities.MainActivity.Companion.setSharedVars
import com.micewine.emu.databinding.ActivityGeneralSettingsBinding
import com.micewine.emu.fragments.Box64SettingsFragment
Expand Down Expand Up @@ -127,11 +128,12 @@ class GeneralSettingsActivity : AppCompatActivity() {
const val SWITCH = 1
const val SPINNER = 2
const val CHECKBOX = 3
const val SEEKBAR = 4

const val BOX64_LOG = "BOX64_LOG"
const val BOX64_LOG_DEFAULT_VALUE = "1"
const val BOX64_MMAP32 = "BOX64_MMAP32"
const val BOX64_MMAP32_DEFAULT_VALUE = false
const val BOX64_MMAP32_DEFAULT_VALUE = true
const val BOX64_AVX = "BOX64_AVX"
const val BOX64_AVX_DEFAULT_VALUE = "2"
const val BOX64_SSE42 = "BOX64_SSE42"
Expand Down Expand Up @@ -211,5 +213,6 @@ class GeneralSettingsActivity : AppCompatActivity() {
const val DEAD_ZONE = "deadZone"
const val MOUSE_SENSIBILITY = "mouseSensibility"
const val CPU_AFFINITY = "cpuAffinity"
const val FPS_LIMIT = "fpsLimit"
}
}
13 changes: 11 additions & 2 deletions app/src/main/java/com/micewine/emu/activities/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import android.view.KeyEvent
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.WindowManager
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
Expand All @@ -33,6 +34,7 @@ import com.google.android.material.bottomnavigation.BottomNavigationView
import com.micewine.emu.BuildConfig
import com.micewine.emu.R
import com.micewine.emu.activities.DriverManagerActivity.Companion.generateICDFile
import com.micewine.emu.activities.DriverManagerActivity.Companion.generateMangoHUDConfFile
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.BOX64_AVX
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.BOX64_AVX_DEFAULT_VALUE
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.BOX64_DYNAREC_ALIGNED_ATOMICS
Expand Down Expand Up @@ -88,6 +90,7 @@ import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_MANG
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_MANGOHUD_DEFAULT_VALUE
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_SERVICES
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_SERVICES_DEFAULT_VALUE
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.FPS_LIMIT
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SELECTED_BOX64
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SELECTED_D3DX_RENDERER
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SELECTED_D3DX_RENDERER_DEFAULT_VALUE
Expand Down Expand Up @@ -121,14 +124,14 @@ import com.micewine.emu.core.ShellLoader.runCommandWithOutput
import com.micewine.emu.core.WineWrapper
import com.micewine.emu.core.WineWrapper.getCpuHexMask
import com.micewine.emu.databinding.ActivityMainBinding
import com.micewine.emu.fragments.AboutFragment
import com.micewine.emu.fragments.AskInstallRatPackageFragment
import com.micewine.emu.fragments.AskInstallRatPackageFragment.Companion.ratCandidate
import com.micewine.emu.fragments.DeleteGameItemFragment
import com.micewine.emu.fragments.EditGamePreferencesFragment
import com.micewine.emu.fragments.FileManagerFragment
import com.micewine.emu.fragments.FileManagerFragment.Companion.refreshFiles
import com.micewine.emu.fragments.FloatingFileManagerFragment
import com.micewine.emu.fragments.AboutFragment
import com.micewine.emu.fragments.EditGamePreferencesFragment
import com.micewine.emu.fragments.SettingsFragment
import com.micewine.emu.fragments.SetupFragment
import com.micewine.emu.fragments.SetupFragment.Companion.abortSetup
Expand Down Expand Up @@ -171,6 +174,7 @@ class MainActivity : AppCompatActivity() {
val driverLibPath = File("$ratPackagesDir/$selectedDriver/pkg-header").readLines()[4].substringAfter("=")

generateICDFile(driverLibPath, File("$appRootDir/vulkan_icd.json"))
generateMangoHUDConfFile()

setSharedVars(this@MainActivity)

Expand Down Expand Up @@ -953,6 +957,8 @@ class MainActivity : AppCompatActivity() {
var miceWineVersion: String = "MiceWine ${BuildConfig.VERSION_NAME} (git-${BuildConfig.GIT_SHORT_SHA})"
var vulkanDriverDeviceName: String? = null
var cpuAffinity: String? = null
var screenFpsLimit: Int = 60
var fpsLimit: Int = 0
private var selectedResolution: String? = ""

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

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

screenFpsLimit = (activity.getSystemService(WINDOW_SERVICE) as WindowManager).defaultDisplay.refreshRate.toInt()
fpsLimit = preferences.getInt(FPS_LIMIT, screenFpsLimit)

vulkanDriverDeviceName = getVulkanDeviceName()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.micewine.emu.adapters

import android.annotation.SuppressLint
import android.app.Activity
import android.content.SharedPreferences
import android.database.DataSetObserver
Expand All @@ -9,6 +10,8 @@ import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.CheckBox
import android.widget.SeekBar
import android.widget.SeekBar.OnSeekBarChangeListener
import android.widget.Spinner
import android.widget.SpinnerAdapter
import android.widget.TextView
Expand All @@ -21,6 +24,7 @@ import com.micewine.emu.activities.GeneralSettingsActivity.Companion.CHECKBOX
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.DISPLAY_MODE
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.DISPLAY_MODE_DEFAULT_VALUE
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.DISPLAY_RESOLUTION
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SEEKBAR
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SPINNER
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SWITCH
import com.micewine.emu.fragments.DisplaySettingsFragment.Companion.getNativeResolutions
Expand All @@ -42,6 +46,7 @@ class AdapterSettingsPreferences(
return ViewHolder(itemView)
}

@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val sList = settingsList[position]
holder.settingsName.setText(sList.titleSettings)
Expand Down Expand Up @@ -71,6 +76,8 @@ class AdapterSettingsPreferences(
SWITCH -> {
holder.spinnerOptions.visibility = View.GONE
holder.settingsSwitch.visibility = View.VISIBLE
holder.seekBar.visibility = View.GONE
holder.seekBarValue.visibility = View.GONE

holder.settingsSwitch.isChecked = preferences.getBoolean(sList.key, sList.defaultValue.toBoolean())
holder.settingsSwitch.setOnClickListener {
Expand All @@ -83,6 +90,8 @@ class AdapterSettingsPreferences(
SPINNER -> {
holder.settingsSwitch.visibility = View.GONE
holder.spinnerOptions.visibility = View.VISIBLE
holder.seekBar.visibility = View.GONE
holder.seekBarValue.visibility = View.GONE

holder.spinnerOptions.adapter = ArrayAdapter(
activity,
Expand Down Expand Up @@ -128,6 +137,8 @@ class AdapterSettingsPreferences(
CHECKBOX -> {
holder.settingsSwitch.visibility = View.GONE
holder.spinnerOptions.visibility = View.VISIBLE
holder.seekBar.visibility = View.GONE
holder.seekBarValue.visibility = View.GONE

holder.spinnerOptions.adapter = CheckableAdapter(
activity,
Expand All @@ -137,19 +148,62 @@ class AdapterSettingsPreferences(
holder.spinnerOptions
)
}
SEEKBAR -> {
holder.settingsSwitch.visibility = View.GONE
holder.spinnerOptions.visibility = View.GONE
holder.seekBar.visibility = View.VISIBLE
holder.seekBarValue.visibility = View.VISIBLE

holder.seekBar.min = sList.seekBarMaxMinValues!![0]
holder.seekBar.max = sList.seekBarMaxMinValues!![1]

holder.seekBar.progress = preferences.getInt(sList.key, sList.defaultValue.toInt())

if (holder.seekBar.progress == 0) {
holder.seekBarValue.text = activity.getString(R.string.unlimited)
} else {
holder.seekBarValue.text = "${holder.seekBar.progress} FPS"
}

holder.seekBar.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {
override fun onProgressChanged(
seekBar: SeekBar?,
progress: Int,
fromUser: Boolean
) {
if (progress == 0) {
holder.seekBarValue.text = activity.getString(R.string.unlimited)
} else {
holder.seekBarValue.text = "$progress FPS"
}

preferences.edit().apply {
putInt(sList.key, progress)
apply()
}
}

override fun onStartTrackingTouch(seekBar: SeekBar?) {
}

override fun onStopTrackingTouch(seekBar: SeekBar?) {
}
})
}
}
}

override fun getItemCount(): Int {
return settingsList.size
}

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener {
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
val settingsName: TextView = itemView.findViewById(R.id.title_preferences_model)
val settingsDescription: TextView = itemView.findViewById(R.id.description_preferences_model)
val spinnerOptions: Spinner = itemView.findViewById(R.id.keyBindSpinner)
val settingsSwitch: SwitchCompat = itemView.findViewById(R.id.optionSwitch)
val seekBar: SeekBar = itemView.findViewById(R.id.seekBar)
val seekBarValue: TextView = itemView.findViewById(R.id.seekBarValue)

init {
itemView.setOnClickListener(this)
Expand All @@ -165,7 +219,7 @@ class AdapterSettingsPreferences(
}
}

class SettingsListSpinner(var titleSettings: Int, var descriptionSettings: Int, var spinnerOptions: Array<String>?, var type: Int, var defaultValue: String, var key: String)
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)

class CheckableAdapter(
val activity: Activity,
Expand Down
7 changes: 2 additions & 5 deletions app/src/main/java/com/micewine/emu/core/EnvVars.kt
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,8 @@ object EnvVars {
vars.add("DXVK_ASYNC=1")
vars.add("DXVK_STATE_CACHE_PATH=$homeDir/.cache/dxvk-shader-cache")
vars.add("DXVK_HUD=$selectedDXVKHud")

if (enableMangoHUD) {
vars.add("MANGOHUD=1")
vars.add("MANGOHUD_CONFIGFILE=$usrDir/etc/MangoHud.conf")
}
vars.add("MANGOHUD=1")
vars.add("MANGOHUD_CONFIGFILE=$usrDir/etc/MangoHud.conf")

if (Build.SUPPORTED_ABIS[0] != "x86_64") {
vars.add("BOX64_LOG=$box64LogLevel")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,6 @@ class Box64SettingsFragment : Fragment() {
}

private fun addToAdapter(titleId: Int, descriptionId: Int, valuesArray: Array<String>?, type: Int, defaultValue: Any, keyId: String) {
settingsList.add(SettingsListSpinner(titleId, descriptionId, valuesArray, type, "$defaultValue", keyId))
settingsList.add(SettingsListSpinner(titleId, descriptionId, valuesArray, null, type, "$defaultValue", keyId))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class DisplaySettingsFragment : Fragment() {
}

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

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_DRI3
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_DRI3_DEFAULT_VALUE
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_MANGOHUD
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.ENABLE_MANGOHUD_DEFAULT_VALUE
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.FPS_LIMIT
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SEEKBAR
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SELECTED_D3DX_RENDERER
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SELECTED_D3DX_RENDERER_DEFAULT_VALUE
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SELECTED_DXVK_HUD_PRESET
Expand All @@ -32,6 +34,7 @@ import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SELECTED_WI
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SPINNER
import com.micewine.emu.activities.GeneralSettingsActivity.Companion.SWITCH
import com.micewine.emu.activities.MainActivity.Companion.appRootDir
import com.micewine.emu.activities.MainActivity.Companion.screenFpsLimit
import com.micewine.emu.adapters.AdapterSettingsPreferences
import com.micewine.emu.adapters.AdapterSettingsPreferences.SettingsListSpinner
import java.io.File
Expand Down Expand Up @@ -89,6 +92,7 @@ class DriversSettingsFragment : Fragment() {
addToAdapter(R.string.select_dxvk_title, R.string.null_description, dxvkVersions.toTypedArray(), SPINNER, SELECTED_DXVK_DEFAULT_VALUE, SELECTED_DXVK)
addToAdapter(R.string.select_vkd3d_title, R.string.null_description, vkd3dVersions.toTypedArray(), SPINNER, SELECTED_VKD3D_DEFAULT_VALUE, SELECTED_VKD3D)
addToAdapter(R.string.enable_mangohud_title, R.string.null_description, null, SWITCH, ENABLE_MANGOHUD_DEFAULT_VALUE, ENABLE_MANGOHUD)
addToAdapter(R.string.fps_limit_title, R.string.null_description, null, arrayOf(0, screenFpsLimit), SEEKBAR, screenFpsLimit, FPS_LIMIT)
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)
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)
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)
Expand All @@ -104,6 +108,10 @@ class DriversSettingsFragment : Fragment() {
}

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

private fun addToAdapter(titleId: Int, descriptionId: Int, valuesArray: Array<String>?, seekBarMaxMinValues: Array<Int>, type: Int, defaultValue: Any, keyId: String) {
settingsList.add(SettingsListSpinner(titleId, descriptionId, valuesArray, seekBarMaxMinValues, type, "$defaultValue", keyId))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class WineSettingsFragment : Fragment() {
}

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

companion object {
Expand Down
Loading

0 comments on commit 225c133

Please sign in to comment.