Skip to content

Commit

Permalink
Implement CPU Affinity Control
Browse files Browse the repository at this point in the history
  • Loading branch information
KreitinnSoftware committed Jan 28, 2025
1 parent 81e42b2 commit 32be9c5
Show file tree
Hide file tree
Showing 8 changed files with 34 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -209,5 +209,6 @@ class GeneralSettings : AppCompatActivity() {
const val DISPLAY_RESOLUTION_DEFAULT_VALUE = "1280x720"
const val DEAD_ZONE = "deadZone"
const val MOUSE_SENSIBILITY = "mouseSensibility"
const val CPU_AFFINITY = "cpuAffinity"
}
}
5 changes: 5 additions & 0 deletions app/src/main/java/com/micewine/emu/activities/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ import com.micewine.emu.activities.GeneralSettings.Companion.BOX64_SHOWSEGV
import com.micewine.emu.activities.GeneralSettings.Companion.BOX64_SHOWSEGV_DEFAULT_VALUE
import com.micewine.emu.activities.GeneralSettings.Companion.BOX64_SSE42
import com.micewine.emu.activities.GeneralSettings.Companion.BOX64_SSE42_DEFAULT_VALUE
import com.micewine.emu.activities.GeneralSettings.Companion.CPU_AFFINITY
import com.micewine.emu.activities.GeneralSettings.Companion.DISPLAY_RESOLUTION
import com.micewine.emu.activities.GeneralSettings.Companion.DISPLAY_RESOLUTION_DEFAULT_VALUE
import com.micewine.emu.activities.GeneralSettings.Companion.ENABLE_DRI3
Expand Down Expand Up @@ -131,6 +132,7 @@ import com.micewine.emu.fragments.SetupFragment
import com.micewine.emu.fragments.SetupFragment.Companion.abortSetup
import com.micewine.emu.fragments.SetupFragment.Companion.dialogTitleText
import com.micewine.emu.fragments.SetupFragment.Companion.progressBarIsIndeterminate
import com.micewine.emu.fragments.WineSettingsFragment.Companion.availableCPUs
import com.micewine.emu.utils.DriveUtils
import com.micewine.emu.utils.FilePathResolver
import io.ByteWriter
Expand Down Expand Up @@ -865,6 +867,7 @@ class MainActivity : AppCompatActivity() {
var selectedFile: String = ""
var miceWineVersion: String = "MiceWine ${BuildConfig.VERSION_NAME} (git-${BuildConfig.GIT_SHORT_SHA})"
var vulkanDriverDeviceName: String? = null
var cpuAffinity: String? = null
private var selectedResolution: String? = ""

var selectedFragment = "HomeFragment"
Expand Down Expand Up @@ -975,6 +978,8 @@ class MainActivity : AppCompatActivity() {
enableCpuCounter = preferences.getBoolean(CPU_COUNTER_KEY, false)
enableDebugInfo = preferences.getBoolean(ENABLE_DEBUG_INFO_KEY, true)

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

vulkanDriverDeviceName = getVulkanDeviceName()
}

Expand Down
1 change: 1 addition & 0 deletions app/src/main/java/com/micewine/emu/core/ShellLoader.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.micewine.emu.activities.EmulationActivity.Companion.handler
import com.micewine.emu.activities.EmulationActivity.Companion.sharedLogs
import com.micewine.emu.activities.MainActivity.Companion.cpuAffinity
import com.micewine.emu.fragments.InfoDialogFragment
import com.micewine.emu.fragments.InfoDialogFragment.Companion.descriptionText
import com.micewine.emu.fragments.InfoDialogFragment.Companion.titleText
Expand Down
20 changes: 17 additions & 3 deletions app/src/main/java/com/micewine/emu/core/WineWrapper.kt
Original file line number Diff line number Diff line change
@@ -1,16 +1,30 @@
package com.micewine.emu.core

import android.os.Build
import com.micewine.emu.activities.MainActivity.Companion.cpuAffinity
import com.micewine.emu.activities.MainActivity.Companion.wineDisksFolder
import com.micewine.emu.activities.MainActivity.Companion.winePrefix
import com.micewine.emu.core.EnvVars.getEnv
import com.micewine.emu.core.ShellLoader.runCommand
import com.micewine.emu.core.ShellLoader.runCommandWithOutput
import java.io.File
import kotlin.math.abs

object WineWrapper {
private var IS_BOX64 = if (Build.SUPPORTED_ABIS[0] == "x86_64") "" else "box64"

private fun getCpuHexMask(): String {
val availCpus = Runtime.getRuntime().availableProcessors()
val cpuMask = MutableList(availCpus) { '0' }
val cpuAffinity = cpuAffinity?.replace(",", "")

for (i in 0..<cpuAffinity!!.length) {
cpuMask[abs(cpuAffinity[i].toString().toInt() - availCpus) - 1] = '1'
}

return Integer.toHexString(cpuMask.joinToString("").toInt(2))
}

fun wineServer(args: String) {
runCommand(
getEnv() + "$IS_BOX64 wineserver $args"
Expand All @@ -25,14 +39,14 @@ object WineWrapper {

fun wine(args: String) {
runCommand(
getEnv() + "WINEPREFIX=$winePrefix $IS_BOX64 wine $args"
getEnv() + "WINEPREFIX=$winePrefix taskset ${getCpuHexMask()} $IS_BOX64 wine $args"
)
}

fun wine(args: String, retLog: Boolean): String {
if (retLog) {
return runCommandWithOutput(
getEnv() + "BOX64_LOG=0 WINEPREFIX=$winePrefix $IS_BOX64 wine $args"
getEnv() + "BOX64_LOG=0 WINEPREFIX=$winePrefix taskset ${getCpuHexMask()} $IS_BOX64 wine $args"
)
}
return ""
Expand All @@ -41,7 +55,7 @@ object WineWrapper {
fun wine(args: String, cwd: String) {
runCommand(
"cd $cwd;" +
getEnv() + "WINEPREFIX=$winePrefix $IS_BOX64 wine $args"
getEnv() + "WINEPREFIX=$winePrefix taskset ${getCpuHexMask()} $IS_BOX64 wine $args"
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.micewine.emu.R
import com.micewine.emu.activities.GeneralSettings.Companion.CHECKBOX
import com.micewine.emu.activities.GeneralSettings.Companion.CPU_AFFINITY
import com.micewine.emu.activities.GeneralSettings.Companion.ENABLE_SERVICES
import com.micewine.emu.activities.GeneralSettings.Companion.ENABLE_SERVICES_DEFAULT_VALUE
import com.micewine.emu.activities.GeneralSettings.Companion.SPINNER
Expand Down Expand Up @@ -48,10 +50,15 @@ class WineSettingsFragment : Fragment() {

addToAdapter(R.string.wine_esync_title, R.string.null_description, null, SWITCH, WINE_ESYNC_DEFAULT_VALUE, WINE_ESYNC)
addToAdapter(R.string.enable_wine_services_title, R.string.null_description, null, SWITCH, ENABLE_SERVICES_DEFAULT_VALUE, ENABLE_SERVICES)
addToAdapter(R.string.cpu_affinity_title, R.string.null_description, availableCPUs, CHECKBOX, availableCPUs.joinToString(","), CPU_AFFINITY)
addToAdapter(R.string.wine_log_level_title, R.string.null_description, arrayOf("minimal", "default"), SPINNER, WINE_LOG_LEVEL_DEFAULT_VALUE, WINE_LOG_LEVEL)
}

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))
}

companion object {
val availableCPUs = (0 until Runtime.getRuntime().availableProcessors()).map { it.toString() }.toTypedArray()
}
}
1 change: 1 addition & 0 deletions app/src/main/res/values-pt-rBR/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -139,4 +139,5 @@
<string name="box64_manager_title">Gerenciador de Box64</string>
<string name="box64_manager_description">Gerenciar Versões do Box64</string>
<string name="mouse_captured">Mouse Capturado Pressione Voltar ou ESC para Soltar</string>
<string name="cpu_affinity_title">Afinidade de CPU</string>
</resources>
1 change: 1 addition & 0 deletions app/src/main/res/values-zh-rCN/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -139,4 +139,5 @@
<string name="box64_manager_title">Box64 管理器</string>
<string name="box64_manager_description">管理 Box64 版本</string>
<string name="mouse_captured">鼠标已捕获,按下返回键或ESC键释放</string>
<string name="cpu_affinity_title">CPU 关联性</string>
</resources>
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -162,4 +162,5 @@
<string name="box64_manager_title">Box64 Manager</string>
<string name="box64_manager_description">Manage Box64 Versions</string>
<string name="mouse_captured">Mouse Captured Press Back or ESC to Release</string>
<string name="cpu_affinity_title">CPU Affinity</string>
</resources>

0 comments on commit 32be9c5

Please sign in to comment.