From 9e69a610cb1fe5c7bbeef304627dadc9566f2160 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 29 Oct 2019 08:42:53 +0100 Subject: [PATCH] [dxgi] Use 64-bit integers for refresh rate matching math Otherwise, there may be integer overflows for certain parameter values. --- src/dxgi/dxgi_output.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/dxgi/dxgi_output.cpp b/src/dxgi/dxgi_output.cpp index 3d79bdfcd..29c6a4b46 100644 --- a/src/dxgi/dxgi_output.cpp +++ b/src/dxgi/dxgi_output.cpp @@ -491,10 +491,12 @@ namespace dxvk { if (TargetMode.RefreshRate.Numerator && TargetMode.RefreshRate.Denominator) { minDiffRefreshRate = std::accumulate( - Modes.begin(), Modes.end(), std::numeric_limits::max(), - [&TargetMode] (uint32_t current, const DXGI_MODE_DESC1& mode) { - uint32_t rate = mode.RefreshRate.Numerator * TargetMode.RefreshRate.Denominator / mode.RefreshRate.Denominator; - uint32_t diff = std::abs(int32_t(rate - TargetMode.RefreshRate.Numerator)); + Modes.begin(), Modes.end(), std::numeric_limits::max(), + [&TargetMode] (uint64_t current, const DXGI_MODE_DESC1& mode) { + uint64_t rate = uint64_t(mode.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); }); } @@ -531,8 +533,10 @@ namespace dxvk { } if (TargetMode.RefreshRate.Numerator && TargetMode.RefreshRate.Denominator) { - uint32_t rate = it->RefreshRate.Numerator * TargetMode.RefreshRate.Denominator / it->RefreshRate.Denominator; - uint32_t diff = std::abs(int32_t(rate - TargetMode.RefreshRate.Numerator)); + uint64_t rate = uint64_t(it->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; }