From 4f2f1c439212dae8952c37c4f04965bb0a8c3467 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 9 Nov 2023 19:14:31 +0100 Subject: [PATCH] Tilt: Fix some edge cases leading to division by zero and similar. --- Core/TiltEventProcessor.cpp | 19 +++++++++++++++++-- GPU/Common/GPUStateUtils.h | 2 -- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Core/TiltEventProcessor.cpp b/Core/TiltEventProcessor.cpp index 571f58f84f55..63003d47f8ae 100644 --- a/Core/TiltEventProcessor.cpp +++ b/Core/TiltEventProcessor.cpp @@ -35,8 +35,11 @@ void GenerateTriggerButtonEvent(int digitalX, int digitalY); // deadzone is normalized - 0 to 1 // sensitivity controls how fast the deadzone reaches max value inline float ApplyDeadzone(float x, float deadzone) { + if (deadzone >= 0.99f) { + // Meaningless, and not reachable with normal controls. + return x; + } const float factor = 1.0f / (1.0f - deadzone); - if (x > deadzone) { return (x - deadzone) * factor + deadzone; } else if (x < -deadzone) { @@ -55,7 +58,9 @@ inline void ApplyInverseDeadzone(float x, float y, float *outX, float *outY, flo } if (circular) { float magnitude = sqrtf(x * x + y * y); - magnitude = (magnitude + inverseDeadzone) / magnitude; + if (magnitude > 0.00001f) { + magnitude = (magnitude + inverseDeadzone) / magnitude; + } *outX = Clamp(x * magnitude, -1.0f, 1.0f); *outY = Clamp(y * magnitude, -1.0f, 1.0f); } else { @@ -83,6 +88,10 @@ void ProcessTilt(bool landscape, float calibrationAngle, float x, float y, float float yAngle = angleAroundX - calibrationAngle; float xAngle = asinf(down.x); + _dbg_assert_(!my_isnanorinf(angleAroundX)); + _dbg_assert_(!my_isnanorinf(yAngle)); + _dbg_assert_(!my_isnanorinf(xAngle)); + float tiltX = xAngle; float tiltY = yAngle; @@ -107,11 +116,17 @@ void ProcessTilt(bool landscape, float calibrationAngle, float x, float y, float float adjustedTiltX = ApplyDeadzone(tiltX, g_Config.fTiltAnalogDeadzoneRadius); float adjustedTiltY = ApplyDeadzone(tiltY, g_Config.fTiltAnalogDeadzoneRadius); + _dbg_assert_(!my_isnanorinf(adjustedTiltX)); + _dbg_assert_(!my_isnanorinf(adjustedTiltY)); + // Unlike regular deadzone, where per-axis is okay, inverse deadzone (to compensate for game deadzones) really needs to be // applied on the two axes together. // TODO: Share this code with the joystick code. For now though, we keep it separate. ApplyInverseDeadzone(adjustedTiltX, adjustedTiltY, &adjustedTiltX, &adjustedTiltY, g_Config.fTiltInverseDeadzone, g_Config.bTiltCircularInverseDeadzone); + _dbg_assert_(!my_isnanorinf(adjustedTiltX)); + _dbg_assert_(!my_isnanorinf(adjustedTiltY)); + rawTiltAnalogX = adjustedTiltX; rawTiltAnalogY = adjustedTiltY; GenerateAnalogStickEvent(adjustedTiltX, adjustedTiltY); diff --git a/GPU/Common/GPUStateUtils.h b/GPU/Common/GPUStateUtils.h index a786190f6046..af1f6c6ed38b 100644 --- a/GPU/Common/GPUStateUtils.h +++ b/GPU/Common/GPUStateUtils.h @@ -249,8 +249,6 @@ struct GenericLogicState { // Same logicOp is kept. } } - - void Log(); }; struct ComputedPipelineState {