mirror of
https://github.com/gnif/LookingGlass.git
synced 2026-08-04 06:12:04 +00:00
[idd] make mode filtering rebuilds thread safe
This commit is contained in:
@@ -148,6 +148,7 @@ void CIndirectDeviceContext::QueryIddCxCapabilities()
|
|||||||
|
|
||||||
bool CIndirectDeviceContext::PopulateDefaultModes()
|
bool CIndirectDeviceContext::PopulateDefaultModes()
|
||||||
{
|
{
|
||||||
|
const CSettings::DisplayModes configuredModes =
|
||||||
g_settings.LoadModes();
|
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
|
||||||
@@ -155,13 +156,13 @@ bool CIndirectDeviceContext::PopulateDefaultModes()
|
|||||||
// 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;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,8 +47,6 @@ 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);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user