From b30d56ccc0a03c41c758afcd47f5d19fa34b0a98 Mon Sep 17 00:00:00 2001 From: Jonathan Hamilton Date: Thu, 17 May 2018 09:39:39 -0700 Subject: [PATCH] Texture AverageDiff: Do more in int space and avoid excessive float conversion Multiplying 2x 8bit values is guaranteed to fit in 16bits, 4 channels then in 18bits, which means an 'int' shouild be sufficient to avoid overflows --- Source/Core/VideoCommon/TextureCacheBase.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Source/Core/VideoCommon/TextureCacheBase.cpp b/Source/Core/VideoCommon/TextureCacheBase.cpp index 1b385dcbfe..c84bb6ec38 100644 --- a/Source/Core/VideoCommon/TextureCacheBase.cpp +++ b/Source/Core/VideoCommon/TextureCacheBase.cpp @@ -608,13 +608,14 @@ private: const auto* row2 = ptr2; for (u32 j = 0; j < shape.width; ++j, row1 += 4, row2 += 4) { + int pixel_diff = 0; for (int channel = 0; channel < 4; channel++) { - const float diff = - std::abs(static_cast(row1[channel]) - static_cast(row2[channel])); - const float diff_squared = diff * diff; - average_diff += diff_squared; + const int diff = static_cast(row1[channel]) - static_cast(row2[channel]); + const int diff_squared = diff * diff; + pixel_diff += diff_squared; } + average_diff += pixel_diff; } ptr1 += shape.row_length; ptr2 += shape.row_length;