From 8c44649f0169c155f514d2de3d3bf991f3f52b80 Mon Sep 17 00:00:00 2001 From: Gliniak Date: Sat, 16 Mar 2024 19:31:00 +0100 Subject: [PATCH] [GPU] Another attempt to fix memleaks caused by depth_bias_slope_scaled --- src/xenia/base/math.h | 13 +++++++++++++ src/xenia/gpu/draw_util.cc | 2 ++ 2 files changed, 15 insertions(+) diff --git a/src/xenia/base/math.h b/src/xenia/base/math.h index f244b1ff1..5d81bee9a 100644 --- a/src/xenia/base/math.h +++ b/src/xenia/base/math.h @@ -597,6 +597,19 @@ inline T sat_sub(T a, T b) { } return T(result); } + +template +inline T roundToNearestOrderOfMagnitude(T value) { + if (!value) { + return value; + } + + const double order = std::pow(10, std::floor(std::log10(std::fabs(value)))); + const double rounded = std::round(value / order) * order; + + return static_cast(rounded); +} + namespace divisors { union IDivExtraInfo { uint32_t value_; diff --git a/src/xenia/gpu/draw_util.cc b/src/xenia/gpu/draw_util.cc index 879313d38..e3cd3acc9 100644 --- a/src/xenia/gpu/draw_util.cc +++ b/src/xenia/gpu/draw_util.cc @@ -95,6 +95,8 @@ void GetPreferredFacePolygonOffset(const RegisterFile& regs, !pa_su_sc_mode_cntl.cull_front) { scale = regs[XE_GPU_REG_PA_SU_POLY_OFFSET_FRONT_SCALE].f32; offset = regs[XE_GPU_REG_PA_SU_POLY_OFFSET_FRONT_OFFSET].f32; + + scale = roundToNearestOrderOfMagnitude(scale); } if (pa_su_sc_mode_cntl.poly_offset_back_enable && !pa_su_sc_mode_cntl.cull_back && !scale && !offset) {