Preserve vanilla GPS provider class values

This commit is contained in:
2026-06-20 16:13:33 -05:00
parent d6d0ed9766
commit 1c54bd453d
2 changed files with 131 additions and 17 deletions
+73 -17
View File
@@ -175,18 +175,23 @@ constexpr uintptr_t kGpsCostMultiplierTableRva = 0x3154D28;
constexpr std::array<float, 7> kGpsPatchedCostMultipliers = {
12.0f, 7.0f, 2.5f, 0.0f, 3.0f, 2.0f, 1.25f,
};
constexpr std::array<float, 64> kGpsPatchedProviderClassMultipliers = [] {
std::array<float, 64> values{};
values.fill(1.0f);
constexpr size_t kGpsProviderClassCount = 64;
values[1] = 0.70f;
values[3] = 1.45f;
values[4] = 1.25f;
values[5] = 1.75f;
values[15] = 0.80f;
struct GpsProviderClassOverride
{
size_t classId;
float multiplier;
};
return values;
}();
constexpr std::array<GpsProviderClassOverride, 5> kGpsProviderClassOverrides = {{
{1, 0.70f},
{3, 1.45f},
{4, 1.25f},
{5, 1.75f},
{15, 0.80f},
}};
constexpr std::array<size_t, 6> kGpsProviderClassProbeIds = {1, 3, 4, 5, 14, 15};
HMODULE gModule = nullptr;
std::mutex gLogMutex;
@@ -1635,6 +1640,52 @@ void AppendFloatArray(std::ostringstream& aLine, const char* aLabel, const float
aLine.precision(precision);
}
void AppendGpsProviderClassSamples(std::ostringstream& aLine, const char* aLabel, const float* aValues,
size_t aCount)
{
const auto flags = aLine.flags();
const auto precision = aLine.precision();
aLine << " " << aLabel << "=[";
bool first = true;
for (const auto classId : kGpsProviderClassProbeIds)
{
if (classId >= aCount)
{
continue;
}
if (!first)
{
aLine << ",";
}
first = false;
aLine << classId << ":" << std::fixed << std::setprecision(2) << aValues[classId];
}
aLine << "]";
aLine.flags(flags);
aLine.precision(precision);
}
void AppendGpsProviderClassOverrides(std::ostringstream& aLine)
{
const auto flags = aLine.flags();
const auto precision = aLine.precision();
aLine << " overrides=[";
for (size_t index = 0; index < kGpsProviderClassOverrides.size(); ++index)
{
if (index > 0)
{
aLine << ",";
}
const auto& item = kGpsProviderClassOverrides[index];
aLine << item.classId << ":" << std::fixed << std::setprecision(2) << item.multiplier;
}
aLine << "]";
aLine.flags(flags);
aLine.precision(precision);
}
class ScopedGpsCostTablePatch
{
public:
@@ -1763,7 +1814,13 @@ public:
}
std::memcpy(m_original.data(), m_table, sizeof(m_original));
std::memcpy(m_table, kGpsPatchedProviderClassMultipliers.data(), sizeof(m_original));
for (const auto& item : kGpsProviderClassOverrides)
{
if (item.classId < m_original.size())
{
m_table[item.classId] = item.multiplier;
}
}
m_active = true;
LogPatch("gps-provider-class-patch applied", nullptr);
}
@@ -1788,7 +1845,7 @@ private:
}
const auto patchLogCall = NextGpsAsyncLogCall(gGpsProviderClassPatchLogCount);
if (patchLogCall >= 48)
if (patchLogCall >= 128)
{
return;
}
@@ -1803,11 +1860,10 @@ private:
}
if (m_table && IsReadableMemory(m_table, sizeof(m_original)))
{
AppendFloatArray(line, "current", m_table, m_original.size());
AppendGpsProviderClassSamples(line, "current", m_table, m_original.size());
}
AppendFloatArray(line, "original", m_original.data(), m_original.size());
AppendFloatArray(line, "patched", kGpsPatchedProviderClassMultipliers.data(),
kGpsPatchedProviderClassMultipliers.size());
AppendGpsProviderClassSamples(line, "original", m_original.data(), m_original.size());
AppendGpsProviderClassOverrides(line);
LogRed4ext(line.str());
}
@@ -1816,7 +1872,7 @@ private:
uint32_t m_searchCall = 0;
uintptr_t m_vtableRva = 0;
bool m_active = false;
std::array<float, kGpsPatchedProviderClassMultipliers.size()> m_original{};
std::array<float, kGpsProviderClassCount> m_original{};
};
void AppendRouteJobSummary(std::ostringstream& aLine, const char* aPrefix, void* aJob)