Skip to content

Commit

Permalink
VMManager: Set affinities for threads
Browse files Browse the repository at this point in the history
  • Loading branch information
stenzek authored and refractionpcsx2 committed Jun 6, 2022
1 parent 9b7ae49 commit 543fb28
Show file tree
Hide file tree
Showing 10 changed files with 308 additions and 10 deletions.
2 changes: 2 additions & 0 deletions pcsx2-qt/QtHost.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,8 @@ void QtHost::SetDefaultConfig()
{
EmuConfig = Pcsx2Config();
EmuFolders::SetDefaults();
EmuFolders::EnsureFoldersExist();
VMManager::SetHardwareDependentDefaultSettings(EmuConfig);

SettingsInterface& si = *s_base_settings_interface.get();
si.SetUIntValue("UI", "SettingsVersion", SETTINGS_VERSION);
Expand Down
1 change: 1 addition & 0 deletions pcsx2-qt/Settings/SystemSettingsWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ SystemSettingsWidget::SystemSettingsWidget(SettingsDialog* dialog, QWidget* pare
m_ui.setupUi(this);

SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.eeCycleSkipping, "EmuCore/Speedhacks", "EECycleSkip", DEFAULT_EE_CYCLE_SKIP);
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.affinityControl, "EmuCore/CPU", "AffinityControlMode", 0);

SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.MTVU, "EmuCore/Speedhacks", "vuThread", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.instantVU1, "EmuCore/Speedhacks", "vu1Instant", true);
Expand Down
46 changes: 46 additions & 0 deletions pcsx2-qt/Settings/SystemSettingsWidget.ui
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,52 @@
</item>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Affinity Control:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="affinityControl">
<item>
<property name="text">
<string>Disabled</string>
</property>
</item>
<item>
<property name="text">
<string>EE &gt; VU &gt; GS</string>
</property>
</item>
<item>
<property name="text">
<string>EE &gt; GS &gt; VU</string>
</property>
</item>
<item>
<property name="text">
<string>VU &gt; EE &gt; GS</string>
</property>
</item>
<item>
<property name="text">
<string>VU &gt; GS &gt; EE</string>
</property>
</item>
<item>
<property name="text">
<string>GS &gt; EE &gt; VU</string>
</property>
</item>
<item>
<property name="text">
<string>GS &gt; VU &gt; EE</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
Expand Down
1 change: 1 addition & 0 deletions pcsx2/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1604,6 +1604,7 @@ target_link_libraries(PCSX2_FLAGS INTERFACE
ryml
chdr-static
libzip::zip
cpuinfo
ZLIB::ZLIB
PkgConfig::SOUNDTOUCH
PkgConfig::SAMPLERATE
Expand Down
4 changes: 3 additions & 1 deletion pcsx2/Config.h
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,8 @@ struct Pcsx2Config
SSE_MXCSR sseMXCSR;
SSE_MXCSR sseVUMXCSR;

u32 AffinityControlMode;

CpuOptions();
void LoadSave(SettingsWrapper& wrap);
void ApplySanityCheck();
Expand All @@ -407,7 +409,7 @@ struct Pcsx2Config

bool operator==(const CpuOptions& right) const
{
return OpEqu(sseMXCSR) && OpEqu(sseVUMXCSR) && OpEqu(Recompiler);
return OpEqu(sseMXCSR) && OpEqu(sseVUMXCSR) && OpEqu(AffinityControlMode) && OpEqu(Recompiler);
}

bool operator!=(const CpuOptions& right) const
Expand Down
24 changes: 23 additions & 1 deletion pcsx2/GS/Renderers/SW/GSRasterizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@
#include "PerformanceMetrics.h"
#include "common/StringUtil.h"

#ifdef PCSX2_CORE
#include "VMManager.h"
#endif

#define ENABLE_DRAW_STATS 0

int GSRasterizerData::s_counter = 0;
Expand Down Expand Up @@ -1176,7 +1180,25 @@ GSRasterizerList::~GSRasterizerList()
void GSRasterizerList::OnWorkerStartup(int i)
{
Threading::SetNameOfCurrentThread(StringUtil::StdStringFromFormat("GS-SW-%d", i).c_str());
PerformanceMetrics::SetGSSWThread(i, Threading::ThreadHandle::GetForCallingThread());

Threading::ThreadHandle handle(Threading::ThreadHandle::GetForCallingThread());

#ifdef PCSX2_CORE
if (EmuConfig.Cpu.AffinityControlMode != 0)
{
const std::vector<u32>& procs = VMManager::GetSortedProcessorList();
const u32 processor_index = (THREAD_VU1 ? 3 : 2) + i;
if (processor_index < procs.size())
{
const u32 procid = procs[processor_index];
const u64 affinity = static_cast<u64>(1) << procid;
Console.WriteLn("Pinning GS thread %d to CPU %u (0x%llx)", i, procid, affinity);
handle.SetAffinity(affinity);
}
}
#endif

PerformanceMetrics::SetGSSWThread(i, std::move(handle));
}

void GSRasterizerList::OnWorkerShutdown(int i)
Expand Down
3 changes: 3 additions & 0 deletions pcsx2/Pcsx2Config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,12 +238,14 @@ Pcsx2Config::CpuOptions::CpuOptions()
{
sseMXCSR.bitmask = DEFAULT_sseMXCSR;
sseVUMXCSR.bitmask = DEFAULT_sseVUMXCSR;
AffinityControlMode = 0;
}

void Pcsx2Config::CpuOptions::ApplySanityCheck()
{
sseMXCSR.ClearExceptionFlags().DisableExceptions();
sseVUMXCSR.ClearExceptionFlags().DisableExceptions();
AffinityControlMode = std::min<u32>(AffinityControlMode, 6);

Recompiler.ApplySanityCheck();
}
Expand All @@ -255,6 +257,7 @@ void Pcsx2Config::CpuOptions::LoadSave(SettingsWrapper& wrap)
SettingsWrapBitBoolEx(sseMXCSR.DenormalsAreZero, "FPU.DenormalsAreZero");
SettingsWrapBitBoolEx(sseMXCSR.FlushToZero, "FPU.FlushToZero");
SettingsWrapBitfieldEx(sseMXCSR.RoundingControl, "FPU.Roundmode");
SettingsWrapEntry(AffinityControlMode);

SettingsWrapBitBoolEx(sseVUMXCSR.DenormalsAreZero, "VU.DenormalsAreZero");
SettingsWrapBitBoolEx(sseVUMXCSR.FlushToZero, "VU.FlushToZero");
Expand Down
Loading

0 comments on commit 543fb28

Please sign in to comment.