Skip to content

Commit f9d7240

Browse files
authored
FIX: ISXB-925 Fixed an issue where changing InputSettings instance for the Input System wouldn't affect feature flags. (#1954)
* FIX: ISXB-925 Fixed an issue where changing InputSettings instance for the Input System wouldn't affect feature flags.
1 parent 29cde6c commit f9d7240

File tree

5 files changed

+77
-34
lines changed

5 files changed

+77
-34
lines changed

Assets/Tests/InputSystem/CoreTests_Actions.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,34 @@
3030
// in terms of complexity.
3131
partial class CoreTests
3232
{
33+
// ISXB-925: Feature flag values should live with containing settings instance.
34+
[TestCase(InputFeatureNames.kUseReadValueCaching)]
35+
[TestCase(InputFeatureNames.kUseOptimizedControls)]
36+
[TestCase(InputFeatureNames.kParanoidReadValueCachingChecks)]
37+
[TestCase(InputFeatureNames.kDisableUnityRemoteSupport)]
38+
[TestCase(InputFeatureNames.kRunPlayerUpdatesInEditMode)]
39+
#if UNITY_INPUT_SYSTEM_PROJECT_WIDE_ACTIONS
40+
[TestCase(InputFeatureNames.kUseIMGUIEditorForAssets)]
41+
#endif
42+
public void Settings_ShouldStoreSettingsAndFeatureFlags(string featureName)
43+
{
44+
using (var settings = Scoped.Object(InputSettings.CreateInstance<InputSettings>()))
45+
{
46+
InputSystem.settings = settings.value;
47+
48+
Assert.That(InputSystem.settings.IsFeatureEnabled(featureName), Is.False);
49+
settings.value.SetInternalFeatureFlag(featureName, true);
50+
Assert.That(InputSystem.settings.IsFeatureEnabled(featureName), Is.True);
51+
52+
using (var other = Scoped.Object(InputSettings.CreateInstance<InputSettings>()))
53+
{
54+
InputSystem.settings = other.value;
55+
56+
Assert.That(InputSystem.settings.IsFeatureEnabled(featureName), Is.False);
57+
}
58+
}
59+
}
60+
3361
[Test]
3462
[Category("Actions")]
3563
public void Actions_WhenShortcutsDisabled_AllConflictingActionsTrigger()

Packages/com.unity.inputsystem/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ however, it has to be formatted properly to pass verification tests.
2828
- Fixed InputActionReference issues when domain reloads are disabled [ISXB-601](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-601), [ISXB-718](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-718), [ISXB-900](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-900)
2929
- Fixed a performance issue with many objects using multiple action maps [ISXB-573](https://issuetracker.unity3d.com/product/unity/issues/guid/ISXB-573).
3030
- Fixed an variable scope shadowing issue causing compilation to fail on Unity 2019 LTS.
31+
- Fixed an issue where changing `InputSettings` instance would not affect associated feature flags.
3132

3233
### Added
3334
- Added additional device information when logging the error due to exceeding the maximum number of events processed

Packages/com.unity.inputsystem/InputSystem/Controls/InputControl.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -929,7 +929,7 @@ public void ApplyParameterChanges()
929929
private void SetOptimizedControlDataType()
930930
{
931931
// setting check need to be inline so we clear optimizations if setting is disabled after the fact
932-
m_OptimizedControlDataType = InputSettings.optimizedControlsFeatureEnabled
932+
m_OptimizedControlDataType = InputSystem.s_Manager.optimizedControlsFeatureEnabled
933933
? CalculateOptimizedControlDataType()
934934
: (FourCC)InputStateBlock.kFormatInvalid;
935935
}
@@ -957,7 +957,7 @@ internal void SetOptimizedControlDataTypeRecursively()
957957
[Conditional("UNITY_EDITOR")]
958958
internal void EnsureOptimizationTypeHasNotChanged()
959959
{
960-
if (!InputSettings.optimizedControlsFeatureEnabled)
960+
if (!InputSystem.s_Manager.optimizedControlsFeatureEnabled)
961961
return;
962962

963963
var currentOptimizedControlDataType = CalculateOptimizedControlDataType();
@@ -1172,7 +1172,7 @@ public ref readonly TValue value
11721172

11731173
if (
11741174
// if feature is disabled we re-evaluate every call
1175-
!InputSettings.readValueCachingFeatureEnabled
1175+
!InputSystem.s_Manager.readValueCachingFeatureEnabled
11761176
// if cached value is stale we re-evaluate and clear the flag
11771177
|| m_CachedValueIsStale
11781178
// if a processor in stack needs to be re-evaluated, but unprocessedValue is still can be cached
@@ -1183,7 +1183,7 @@ public ref readonly TValue value
11831183
m_CachedValueIsStale = false;
11841184
}
11851185
#if DEBUG
1186-
else if (InputSettings.paranoidReadValueCachingChecksEnabled)
1186+
else if (InputSystem.s_Manager.paranoidReadValueCachingChecksEnabled)
11871187
{
11881188
var oldUnprocessedValue = m_UnprocessedCachedValue;
11891189
var newUnprocessedValue = unprocessedValue;
@@ -1225,7 +1225,7 @@ internal unsafe ref readonly TValue unprocessedValue
12251225

12261226
if (
12271227
// if feature is disabled we re-evaluate every call
1228-
!InputSettings.readValueCachingFeatureEnabled
1228+
!InputSystem.s_Manager.readValueCachingFeatureEnabled
12291229
// if cached value is stale we re-evaluate and clear the flag
12301230
|| m_UnprocessedCachedValueIsStale
12311231
)
@@ -1234,7 +1234,7 @@ internal unsafe ref readonly TValue unprocessedValue
12341234
m_UnprocessedCachedValueIsStale = false;
12351235
}
12361236
#if DEBUG
1237-
else if (InputSettings.paranoidReadValueCachingChecksEnabled)
1237+
else if (InputSystem.s_Manager.paranoidReadValueCachingChecksEnabled)
12381238
{
12391239
var currentUnprocessedValue = ReadUnprocessedValueFromState(currentStatePtr);
12401240
if (CompareValue(ref currentUnprocessedValue, ref m_UnprocessedCachedValue))

Packages/com.unity.inputsystem/InputSystem/InputManager.cs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Diagnostics;
44
using System.Linq;
5+
using System.Runtime.CompilerServices;
56
using System.Text;
67
using Unity.Collections;
78
using UnityEngine.InputSystem.Composites;
@@ -2116,6 +2117,33 @@ internal struct AvailableDevice
21162117
internal IInputRuntime m_Runtime;
21172118
internal InputMetrics m_Metrics;
21182119
internal InputSettings m_Settings;
2120+
2121+
// Extract as booleans (from m_Settings) because feature check is in the hot path
2122+
2123+
private bool m_OptimizedControlsFeatureEnabled;
2124+
internal bool optimizedControlsFeatureEnabled
2125+
{
2126+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2127+
get => m_OptimizedControlsFeatureEnabled;
2128+
set => m_OptimizedControlsFeatureEnabled = value;
2129+
}
2130+
2131+
private bool m_ReadValueCachingFeatureEnabled;
2132+
internal bool readValueCachingFeatureEnabled
2133+
{
2134+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2135+
get => m_ReadValueCachingFeatureEnabled;
2136+
set => m_ReadValueCachingFeatureEnabled = value;
2137+
}
2138+
2139+
private bool m_ParanoidReadValueCachingChecksEnabled;
2140+
internal bool paranoidReadValueCachingChecksEnabled
2141+
{
2142+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2143+
get => m_ParanoidReadValueCachingChecksEnabled;
2144+
set => m_ParanoidReadValueCachingChecksEnabled = value;
2145+
}
2146+
21192147
#if UNITY_INPUT_SYSTEM_PROJECT_WIDE_ACTIONS
21202148
private InputActionAsset m_Actions;
21212149
#endif
@@ -2644,6 +2672,11 @@ internal void ApplySettings()
26442672
#if UNITY_EDITOR
26452673
runPlayerUpdatesInEditMode = m_Settings.IsFeatureEnabled(InputFeatureNames.kRunPlayerUpdatesInEditMode);
26462674
#endif
2675+
2676+
// Extract feature flags into fields since used in hot-path
2677+
m_ReadValueCachingFeatureEnabled = m_Settings.IsFeatureEnabled((InputFeatureNames.kUseReadValueCaching));
2678+
m_OptimizedControlsFeatureEnabled = m_Settings.IsFeatureEnabled((InputFeatureNames.kUseOptimizedControls));
2679+
m_ParanoidReadValueCachingChecksEnabled = m_Settings.IsFeatureEnabled((InputFeatureNames.kParanoidReadValueCachingChecks));
26472680
}
26482681

26492682
// Cache some values.
@@ -3542,7 +3575,7 @@ private void ResetCurrentProcessedEventBytesForDevices()
35423575
[Conditional("UNITY_EDITOR")]
35433576
void CheckAllDevicesOptimizedControlsHaveValidState()
35443577
{
3545-
if (!InputSettings.optimizedControlsFeatureEnabled)
3578+
if (!InputSystem.s_Manager.m_OptimizedControlsFeatureEnabled)
35463579
return;
35473580

35483581
foreach (var device in devices)
@@ -3732,7 +3765,7 @@ private unsafe void WriteStateChange(InputStateBuffers.DoubleBuffers buffers, in
37323765
deviceStateSize);
37333766
}
37343767

3735-
if (InputSettings.readValueCachingFeatureEnabled)
3768+
if (InputSystem.s_Manager.m_ReadValueCachingFeatureEnabled)
37363769
{
37373770
// if the buffers have just been flipped, and we're doing a full state update, then the state from the
37383771
// previous update is now in the back buffer, and we should be comparing to that when checking what

Packages/com.unity.inputsystem/InputSystem/InputSettings.cs

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -717,27 +717,13 @@ public void SetInternalFeatureFlag(string featureName, bool enabled)
717717
if (string.IsNullOrEmpty(featureName))
718718
throw new ArgumentNullException(nameof(featureName));
719719

720-
switch (featureName)
721-
{
722-
case InputFeatureNames.kUseOptimizedControls:
723-
optimizedControlsFeatureEnabled = enabled;
724-
break;
725-
case InputFeatureNames.kUseReadValueCaching:
726-
readValueCachingFeatureEnabled = enabled;
727-
break;
728-
case InputFeatureNames.kParanoidReadValueCachingChecks:
729-
paranoidReadValueCachingChecksEnabled = enabled;
730-
break;
731-
default:
732-
if (m_FeatureFlags == null)
733-
m_FeatureFlags = new HashSet<string>();
734-
735-
if (enabled)
736-
m_FeatureFlags.Add(featureName.ToUpperInvariant());
737-
else
738-
m_FeatureFlags.Remove(featureName.ToUpperInvariant());
739-
break;
740-
}
720+
if (m_FeatureFlags == null)
721+
m_FeatureFlags = new HashSet<string>();
722+
723+
if (enabled)
724+
m_FeatureFlags.Add(featureName.ToUpperInvariant());
725+
else
726+
m_FeatureFlags.Remove(featureName.ToUpperInvariant());
741727

742728
OnChange();
743729
}
@@ -778,11 +764,6 @@ internal bool IsFeatureEnabled(string featureName)
778764
return m_FeatureFlags != null && m_FeatureFlags.Contains(featureName.ToUpperInvariant());
779765
}
780766

781-
// Needs a static field because feature check is in the hot path
782-
internal static bool optimizedControlsFeatureEnabled = false;
783-
internal static bool readValueCachingFeatureEnabled;
784-
internal static bool paranoidReadValueCachingChecksEnabled;
785-
786767
internal void OnChange()
787768
{
788769
if (InputSystem.settings == this)

0 commit comments

Comments
 (0)