Skip to content

Commit 7bb7776

Browse files
elliomanEvergreen
authored andcommitted
[2023.3][URP] Changing check for Auto Mode in ShAutoDetect.
Users have complained about performance issues on some platforms due to a change in SH Evaluation mode causing them to use PerPixel instead of PerVertex. This PR makes sure those platform use PerVertex when set to Auto. This PR does the following: - Adds a few platforms to ShAutoDetect to use PerVertex when Auto is selected. - Renames `XRPlatformBuildTimeDetect` to `PlatformBuildTimeDetect` as it's now used for more than XR. - Fixes a few typos and indentation.
1 parent 4554420 commit 7bb7776

File tree

2 files changed

+51
-46
lines changed

2 files changed

+51
-46
lines changed

Packages/com.unity.render-pipelines.universal/Editor/ShaderBuildPreprocessor.cs

Lines changed: 33 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -134,18 +134,21 @@ public static VolumeFeatures volumeFeatures
134134
private static VolumeFeatures s_VolumeFeatures;
135135
private static List<ShaderFeatures> s_SupportedFeaturesList = new();
136136

137-
// Helper calss to detect XR build targets at build time.
138-
internal sealed class XRPlatformBuildTimeDetect
137+
// Helper class to detect XR build targets at build time.
138+
internal sealed class PlatformBuildTimeDetect
139139
{
140-
private static XRPlatformBuildTimeDetect xrPlatformInfo;
140+
private static PlatformBuildTimeDetect s_PlatformInfo;
141141
internal bool isStandaloneXR { get; private set; }
142142
internal bool isHololens { get; private set; }
143143
internal bool isQuest { get; private set; }
144+
internal bool isSwitch { get; private set; }
144145

145-
private XRPlatformBuildTimeDetect()
146+
private PlatformBuildTimeDetect()
146147
{
148+
BuildTargetGroup buildTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget);
149+
isSwitch = buildTargetGroup == BuildTargetGroup.Switch;
150+
147151
#if XR_MANAGEMENT_4_0_1_OR_NEWER
148-
var buildTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget);
149152
var buildTargetSettings = XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(buildTargetGroup);
150153
if (buildTargetSettings != null && buildTargetSettings.AssignedSettings != null && buildTargetSettings.AssignedSettings.activeLoaders.Count > 0)
151154
{
@@ -156,17 +159,17 @@ private XRPlatformBuildTimeDetect()
156159
#endif
157160
}
158161

159-
internal static XRPlatformBuildTimeDetect GetInstance()
162+
internal static PlatformBuildTimeDetect GetInstance()
160163
{
161-
if (xrPlatformInfo == null)
162-
xrPlatformInfo = new XRPlatformBuildTimeDetect();
164+
if (s_PlatformInfo == null)
165+
s_PlatformInfo = new PlatformBuildTimeDetect();
163166

164-
return xrPlatformInfo;
167+
return s_PlatformInfo;
165168
}
166169

167170
internal static void ClearInstance()
168171
{
169-
xrPlatformInfo = null;
172+
s_PlatformInfo = null;
170173
}
171174
}
172175

@@ -207,7 +210,7 @@ public void OnPreprocessBuild(BuildReport report)
207210
// Called after the build has finished...
208211
public void OnPostprocessBuild(BuildReport report)
209212
{
210-
XRPlatformBuildTimeDetect.ClearInstance();
213+
PlatformBuildTimeDetect.ClearInstance();
211214
#if PROFILE_BUILD
212215
Profiler.enabled = false;
213216
#endif
@@ -237,13 +240,9 @@ private static void GatherShaderFeatures(bool isDevelopmentBuild)
237240
private static void GetGlobalAndPlatformSettings(bool isDevelopmentBuild)
238241
{
239242
if (GraphicsSettings.TryGetRenderPipelineSettings<ShaderStrippingSetting>(out var shaderStrippingSettings))
240-
{
241243
s_StripDebugDisplayShaders = !isDevelopmentBuild || shaderStrippingSettings.stripRuntimeDebugShaders;
242-
}
243244
else
244-
{
245245
s_StripDebugDisplayShaders = true;
246-
}
247246

248247
if (GraphicsSettings.TryGetRenderPipelineSettings<URPShaderStrippingSetting>(out var urpShaderStrippingSettings))
249248
{
@@ -252,30 +251,29 @@ private static void GetGlobalAndPlatformSettings(bool isDevelopmentBuild)
252251
s_StripScreenCoordOverrideVariants = urpShaderStrippingSettings.stripScreenCoordOverrideVariants;
253252
}
254253

255-
#if XR_MANAGEMENT_4_0_1_OR_NEWER
256-
// XR Stripping
257-
XRGeneralSettings generalSettings = XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget));
258-
s_StripXRVariants = generalSettings == null || generalSettings.Manager == null || generalSettings.Manager.activeLoaders.Count <= 0;
254+
PlatformBuildTimeDetect platformBuildTimeDetect = PlatformBuildTimeDetect.GetInstance();
255+
bool isShaderAPIMobileDefined = GraphicsSettings.HasShaderDefine(BuiltinShaderDefine.SHADER_API_MOBILE);
256+
if (platformBuildTimeDetect.isSwitch || isShaderAPIMobileDefined)
257+
s_UseSHPerVertexForSHAuto = true;
259258

260-
if (XRPlatformBuildTimeDetect.GetInstance().isStandaloneXR)
261-
s_StripDebugDisplayShaders = true;
259+
// XR Stripping
260+
#if XR_MANAGEMENT_4_0_1_OR_NEWER
261+
BuildTargetGroup buildTargetGroup = BuildPipeline.GetBuildTargetGroup(EditorUserBuildSettings.activeBuildTarget);
262+
XRGeneralSettings generalSettings = XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(buildTargetGroup);
263+
s_StripXRVariants = generalSettings == null || generalSettings.Manager == null || generalSettings.Manager.activeLoaders.Count <= 0;
262264

263-
if (XRPlatformBuildTimeDetect.GetInstance().isHololens)
264-
{
265-
s_KeepOffVariantForAdditionalLights = true;
266-
s_UseSoftShadowQualityLevelKeywords = true;
267-
s_UseSHPerVertexForSHAuto = true;
268-
}
265+
if (platformBuildTimeDetect.isStandaloneXR)
266+
s_StripDebugDisplayShaders = true;
269267

270-
if (XRPlatformBuildTimeDetect.GetInstance().isQuest)
271-
{
272-
s_KeepOffVariantForAdditionalLights = true;
273-
s_UseSoftShadowQualityLevelKeywords = true;
274-
s_UseSHPerVertexForSHAuto = true;
275-
}
268+
if (platformBuildTimeDetect.isHololens || platformBuildTimeDetect.isQuest)
269+
{
270+
s_KeepOffVariantForAdditionalLights = true;
271+
s_UseSoftShadowQualityLevelKeywords = true;
272+
s_UseSHPerVertexForSHAuto = true;
273+
}
276274
#else
277-
s_UseSoftShadowQualityLevelKeywords = false;
278-
s_StripXRVariants = true;
275+
s_UseSoftShadowQualityLevelKeywords = false;
276+
s_StripXRVariants = true;
279277
#endif
280278
}
281279

Packages/com.unity.render-pipelines.universal/Runtime/UniversalRenderPipelineCore.cs

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1918,9 +1918,9 @@ internal enum URPProfileId
19181918
}
19191919

19201920
// Internal class to detect and cache runtime platform information.
1921-
// TODO: refine the logic to provide platform abstraction. Eg, we should devide platforms based on capabilities and perf budget.
1922-
// TODO: isXRMobile is a bad catagory. Alignment and refactor needed.
1923-
// TODO: Compress all the query data into "isXRMobile" style bools and enums.
1921+
// TODO: refine the logic to provide platform abstraction. Eg, we should divide platforms based on capabilities and perf budget.
1922+
// TODO: isXRMobile is a bad category. Alignment and refactor needed.
1923+
// TODO: Compress all the query data into "isXRMobile" style booleans and enums.
19241924
internal static class PlatformAutoDetect
19251925
{
19261926
/// <summary>
@@ -1929,17 +1929,19 @@ internal static class PlatformAutoDetect
19291929
internal static void Initialize()
19301930
{
19311931
bool isRunningMobile = false;
1932-
#if ENABLE_VR && ENABLE_VR_MODULE
1933-
#if PLATFORM_WINRT || PLATFORM_ANDROID
1934-
isRunningMobile = IsRunningXRMobile();
1935-
#endif
1936-
#endif
1932+
#if ENABLE_VR && ENABLE_VR_MODULE
1933+
#if PLATFORM_WINRT || PLATFORM_ANDROID
1934+
isRunningMobile = IsRunningXRMobile();
1935+
#endif
1936+
#endif
1937+
19371938
isXRMobile = isRunningMobile;
19381939
isShaderAPIMobileDefined = GraphicsSettings.HasShaderDefine(BuiltinShaderDefine.SHADER_API_MOBILE);
1940+
isSwitch = Application.platform == RuntimePlatform.Switch;
19391941
}
19401942

19411943
#if ENABLE_VR && ENABLE_VR_MODULE
1942-
#if PLATFORM_WINRT || PLATFORM_ANDROID
1944+
#if PLATFORM_WINRT || PLATFORM_ANDROID
19431945
// XR mobile platforms are not treated as dedicated mobile platforms in Core. Handle them specially here. (Quest and HL).
19441946
private static List<XR.XRDisplaySubsystem> displaySubsystemList = new List<XR.XRDisplaySubsystem>();
19451947
private static bool IsRunningXRMobile()
@@ -1958,7 +1960,7 @@ private static bool IsRunningXRMobile()
19581960
}
19591961
return false;
19601962
}
1961-
#endif
1963+
#endif
19621964
#endif
19631965

19641966
/// <summary>
@@ -1971,6 +1973,11 @@ private static bool IsRunningXRMobile()
19711973
/// </summary>
19721974
internal static bool isShaderAPIMobileDefined { get; private set; } = false;
19731975

1976+
/// <summary>
1977+
/// If true, then the runtime platform is set to Switch.
1978+
/// </summary>
1979+
internal static bool isSwitch { get; private set; } = false;
1980+
19741981
/// <summary>
19751982
/// Gives the SH evaluation mode when set to automatically detect.
19761983
/// </summary>
@@ -1980,7 +1987,7 @@ internal static ShEvalMode ShAutoDetect(ShEvalMode mode)
19801987
{
19811988
if (mode == ShEvalMode.Auto)
19821989
{
1983-
if (PlatformAutoDetect.isXRMobile)
1990+
if (isXRMobile || isShaderAPIMobileDefined || isSwitch)
19841991
return ShEvalMode.PerVertex;
19851992
else
19861993
return ShEvalMode.PerPixel;

0 commit comments

Comments
 (0)