[idd] make mode filtering rebuilds thread safe

This commit is contained in:
Geoffrey McRae
2026-08-04 13:48:23 +10:00
parent f0696e079f
commit 84d1427cab
3 changed files with 15 additions and 16 deletions

View File

@@ -148,20 +148,21 @@ void CIndirectDeviceContext::QueryIddCxCapabilities()
bool CIndirectDeviceContext::PopulateDefaultModes() bool CIndirectDeviceContext::PopulateDefaultModes()
{ {
g_settings.LoadModes(); const CSettings::DisplayModes configuredModes =
g_settings.LoadModes();
// Build the new mode list into a local first so we only hold the lock for // Build the new mode list into a local first so we only hold the lock for
// the swap. IddCx readers may be iterating the live container on another // the swap. IddCx readers may be iterating the live container on another
// thread; a clear()/push_back() under them would reallocate the backing // thread; a clear()/push_back() under them would reallocate the backing
// store and crash. std::move makes the publish a pointer swap. // store and crash. std::move makes the publish a pointer swap.
CSettings::DisplayModes newModes; CSettings::DisplayModes newModes;
newModes.reserve(g_settings.GetDisplayModes().size()); newModes.reserve(configuredModes.size());
const UINT64 alignment = m_alignSize ? m_alignSize : const UINT64 alignment = m_alignSize ? m_alignSize :
D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT; D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
bool hasPreferred = false; bool hasPreferred = false;
for (const auto& configuredMode : g_settings.GetDisplayModes()) for (const auto& configuredMode : configuredModes)
{ {
UINT64 frameSize; UINT64 frameSize;
UINT64 requiredIVSHMEMSize; UINT64 requiredIVSHMEMSize;

View File

@@ -32,24 +32,24 @@ CSettings::CSettings()
{ {
} }
void CSettings::LoadModes() CSettings::DisplayModes CSettings::LoadModes()
{ {
const unsigned defaultRefresh = GetDefaultRefresh(); const unsigned defaultRefresh = GetDefaultRefresh();
m_displayModes.clear(); DisplayModes displayModes;
bool hasPreferred = false; bool hasPreferred = false;
DisplayMode m; DisplayMode m;
if (GetExtraMode(m)) if (GetExtraMode(m))
{ {
DEBUG_INFO("ExtraMode: %ux%u@%u%s", m.width, m.height, m.refresh, m.preferred ? "*" : ""); DEBUG_INFO("ExtraMode: %ux%u@%u%s", m.width, m.height, m.refresh, m.preferred ? "*" : "");
m_displayModes.push_back(m); displayModes.push_back(m);
hasPreferred = m.preferred; hasPreferred = m.preferred;
} }
std::vector<std::wstring> entries; std::vector<std::wstring> entries;
if (!ReadModesValue(entries)) if (!ReadModesValue(entries))
{ {
m_displayModes.reserve(m_displayModes.size() + displayModes.reserve(displayModes.size() +
ARRAYSIZE(DefaultDisplayModes)); ARRAYSIZE(DefaultDisplayModes));
for (int i = 0; i < ARRAYSIZE(DefaultDisplayModes); ++i) for (int i = 0; i < ARRAYSIZE(DefaultDisplayModes); ++i)
@@ -59,9 +59,9 @@ void CSettings::LoadModes()
m.refresh = defaultRefresh; m.refresh = defaultRefresh;
m.preferred = !hasPreferred && (i == DefaultPreferredDisplayMode); m.preferred = !hasPreferred && (i == DefaultPreferredDisplayMode);
m.extraMode = false; m.extraMode = false;
m_displayModes.push_back(m); displayModes.push_back(m);
} }
return; return displayModes;
} }
for (const auto& line : entries) for (const auto& line : entries)
@@ -69,10 +69,11 @@ void CSettings::LoadModes()
{ {
if (hasPreferred) if (hasPreferred)
m.preferred = false; m.preferred = false;
m_displayModes.push_back(m); displayModes.push_back(m);
} }
DEBUG_INFO("Parsed %d modes", m_displayModes.size()); DEBUG_INFO("Parsed %d modes", displayModes.size());
return displayModes;
} }
void CSettings::SetExtraMode(const DisplayMode& mode) void CSettings::SetExtraMode(const DisplayMode& mode)

View File

@@ -38,8 +38,7 @@ class CSettings
CSettings(); CSettings();
void LoadModes(); DisplayModes LoadModes();
const DisplayModes& GetDisplayModes() { return m_displayModes; }
void SetExtraMode(const DisplayMode & mode); void SetExtraMode(const DisplayMode & mode);
bool GetExtraMode(DisplayMode & mode); bool GetExtraMode(DisplayMode & mode);
unsigned GetDefaultRefresh() const; unsigned GetDefaultRefresh() const;
@@ -48,10 +47,8 @@ class CSettings
bool ReadBoolValue(const wchar_t* name, bool defaultValue = false); bool ReadBoolValue(const wchar_t* name, bool defaultValue = false);
private: private:
DisplayModes m_displayModes;
bool ReadModesValue(std::vector<std::wstring> &out) const; bool ReadModesValue(std::vector<std::wstring> &out) const;
bool ParseModeString(const std::wstring& in, DisplayMode& out); bool ParseModeString(const std::wstring& in, DisplayMode& out);
}; };
extern CSettings g_settings; extern CSettings g_settings;