mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
[dxgi] Use 64-bit integers for refresh rate matching math
Otherwise, there may be integer overflows for certain parameter values.
This commit is contained in:
parent
c4e5323e0e
commit
9e69a610cb
@ -491,10 +491,12 @@ namespace dxvk {
|
|||||||
|
|
||||||
if (TargetMode.RefreshRate.Numerator && TargetMode.RefreshRate.Denominator) {
|
if (TargetMode.RefreshRate.Numerator && TargetMode.RefreshRate.Denominator) {
|
||||||
minDiffRefreshRate = std::accumulate(
|
minDiffRefreshRate = std::accumulate(
|
||||||
Modes.begin(), Modes.end(), std::numeric_limits<uint32_t>::max(),
|
Modes.begin(), Modes.end(), std::numeric_limits<uint64_t>::max(),
|
||||||
[&TargetMode] (uint32_t current, const DXGI_MODE_DESC1& mode) {
|
[&TargetMode] (uint64_t current, const DXGI_MODE_DESC1& mode) {
|
||||||
uint32_t rate = mode.RefreshRate.Numerator * TargetMode.RefreshRate.Denominator / mode.RefreshRate.Denominator;
|
uint64_t rate = uint64_t(mode.RefreshRate.Numerator)
|
||||||
uint32_t diff = std::abs(int32_t(rate - TargetMode.RefreshRate.Numerator));
|
* uint64_t(TargetMode.RefreshRate.Denominator)
|
||||||
|
/ uint64_t(mode.RefreshRate.Denominator);
|
||||||
|
uint64_t diff = std::abs(int64_t(rate - uint64_t(TargetMode.RefreshRate.Numerator)));
|
||||||
return std::min(current, diff);
|
return std::min(current, diff);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -531,8 +533,10 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (TargetMode.RefreshRate.Numerator && TargetMode.RefreshRate.Denominator) {
|
if (TargetMode.RefreshRate.Numerator && TargetMode.RefreshRate.Denominator) {
|
||||||
uint32_t rate = it->RefreshRate.Numerator * TargetMode.RefreshRate.Denominator / it->RefreshRate.Denominator;
|
uint64_t rate = uint64_t(it->RefreshRate.Numerator)
|
||||||
uint32_t diff = std::abs(int32_t(rate - TargetMode.RefreshRate.Numerator));
|
* uint64_t(TargetMode.RefreshRate.Denominator)
|
||||||
|
/ uint64_t(it->RefreshRate.Denominator);
|
||||||
|
uint64_t diff = std::abs(int64_t(rate - uint64_t(TargetMode.RefreshRate.Numerator)));
|
||||||
skipMode |= diff != minDiffRefreshRate;
|
skipMode |= diff != minDiffRefreshRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user