Skip to content

Commit 935e979

Browse files
thomas-zengEvergreen
authored andcommitted
[Quest][Foveated Rendering] prevent foveation for intermediate passes if dynamic resolution is active for RenderGraph
Jira: https://jira.unity3d.com/browse/UUM-68032 Prevent foveation for intermediate passes if dynamic resolution is active on Quest
1 parent 62aeeb1 commit 935e979

File tree

12 files changed

+66
-8
lines changed

12 files changed

+66
-8
lines changed

Packages/com.unity.render-pipelines.core/Runtime/XR/XRSystem.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,22 @@ public static void SetRenderScale(float renderScale)
226226
#endif
227227
}
228228

229+
230+
/// <summary>
231+
/// Used by the render pipeline to retrieve the renderViewportScale value from the XR display.
232+
/// One use case for retriving this value is that render pipeline can properly sync some SRP owned textures to scale accordingly
233+
/// </summary>
234+
/// <returns> Returns current scaleOfAllViewports value from the XRDisplaySubsystem. </returns>
235+
public static float GetRenderViewportScale()
236+
{
237+
#if ENABLE_VR && ENABLE_XR_MODULE
238+
239+
return s_Display.scaleOfAllViewports;
240+
#else
241+
return 1.0f;
242+
#endif
243+
}
244+
229245
/// <summary>
230246
/// Used by the render pipeline to initiate a new rendering frame through a XR layout.
231247
/// </summary>

Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthNormalOnlyPass.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,8 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur
204204
param.filteringSettings.batchLayerMask = batchLayerMask;
205205
passData.rendererList = renderGraph.CreateRendererList(param);
206206
builder.UseRendererList(passData.rendererList);
207-
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering);
207+
if (cameraData.xr.enabled)
208+
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && cameraData.xrUniversal.canFoveateIntermediatePasses);
208209

209210
UniversalRenderer universalRenderer = cameraData.renderer as UniversalRenderer;
210211
if (postSetGlobalTextures && universalRenderer != null)

Packages/com.unity.render-pipelines.universal/Runtime/Passes/DepthOnlyPass.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, ref Te
137137
// TODO RENDERGRAPH: culling? force culling off for testing
138138
builder.AllowPassCulling(false);
139139
builder.AllowGlobalStateModification(true);
140-
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering);
140+
if (cameraData.xr.enabled)
141+
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && cameraData.xrUniversal.canFoveateIntermediatePasses);
141142

142143
builder.SetRenderFunc((PassData data, RasterGraphContext context) =>
143144
{

Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawObjectsPass.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,12 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur
304304

305305
builder.AllowPassCulling(false);
306306
builder.AllowGlobalStateModification(true);
307-
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering);
307+
308+
if (cameraData.xr.enabled)
309+
{
310+
bool passSupportsFoveation = cameraData.xrUniversal.canFoveateIntermediatePasses || resourceData.isActiveTargetBackBuffer;
311+
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation);
312+
}
308313

309314
builder.SetRenderFunc((PassData data, RasterGraphContext context) =>
310315
{
@@ -451,7 +456,12 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur
451456
builder.AllowPassCulling(false);
452457
// Required here because of RenderingLayerUtils.SetupProperties
453458
builder.AllowGlobalStateModification(true);
454-
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering);
459+
460+
if (cameraData.xr.enabled)
461+
{
462+
bool passSupportsFoveation = cameraData.xrUniversal.canFoveateIntermediatePasses || resourceData.isActiveTargetBackBuffer;
463+
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation);
464+
}
455465

456466
builder.SetRenderFunc((RenderingLayersPassData data, RasterGraphContext context) =>
457467
{

Packages/com.unity.render-pipelines.universal/Runtime/Passes/DrawSkyboxPass.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,11 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Script
166166
}
167167

168168
builder.AllowPassCulling(false);
169-
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering);
169+
if (cameraData.xr.enabled)
170+
{
171+
bool passSupportsFoveation = cameraData.xrUniversal.canFoveateIntermediatePasses || resourceData.isActiveTargetBackBuffer;
172+
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation);
173+
}
170174

171175
builder.SetRenderFunc((PassData data, RasterGraphContext context) =>
172176
{

Packages/com.unity.render-pipelines.universal/Runtime/Passes/FinalBlitPass.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,12 @@ internal void Render(RenderGraph renderGraph, UniversalCameraData cameraData, in
287287
passData.destination = dest;
288288
builder.SetRenderAttachment(dest, 0, AccessFlags.Write);
289289

290+
#if ENABLE_VR && ENABLE_XR_MODULE
291+
// This is a screen-space pass, make sure foveated rendering is disabled for non-uniform renders
292+
bool passSupportsFoveation = !XRSystem.foveatedRenderingCaps.HasFlag(FoveatedRenderingCaps.NonUniformRaster);
293+
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation);
294+
#endif
295+
290296
if (outputsToHDR && overlayUITexture.IsValid())
291297
{
292298
VolumeStack stack = VolumeManager.instance.stack;

Packages/com.unity.render-pipelines.universal/Runtime/Passes/MotionVectorRenderPass.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ private static void DrawCameraMotionVectors(RasterCommandBuffer cmd, XRPass xr,
132132
#if ENABLE_VR && ENABLE_XR_MODULE
133133
bool foveatedRendering = xr.supportsFoveatedRendering;
134134
bool nonUniformFoveatedRendering = foveatedRendering && XRSystem.foveatedRenderingCaps.HasFlag(FoveatedRenderingCaps.NonUniformRaster);
135+
135136
if (foveatedRendering)
136137
{
137138
if (nonUniformFoveatedRendering)
@@ -219,7 +220,8 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, Textur
219220
// TODO RENDERGRAPH: culling? force culling off for testing
220221
builder.AllowPassCulling(false);
221222
builder.AllowGlobalStateModification(true);
222-
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering);
223+
if (cameraData.xr.enabled)
224+
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && cameraData.xrUniversal.canFoveateIntermediatePasses);
223225

224226
passData.motionVectorColor = motionVectorColor;
225227
builder.SetRenderAttachment(motionVectorColor, 0, AccessFlags.Write);

Packages/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,8 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer
313313

314314
builder.AllowPassCulling(false);
315315
builder.AllowGlobalStateModification(true);
316-
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering);
316+
if (cameraData.xr.enabled)
317+
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && cameraData.xrUniversal.canFoveateIntermediatePasses);
317318

318319
builder.SetRenderFunc((PassData data, RasterGraphContext rgContext) =>
319320
{

Packages/com.unity.render-pipelines.universal/Runtime/Passes/XROcclusionMeshPass.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,11 @@ internal void Render(RenderGraph renderGraph, ContextContainer frameData, in Tex
7272
// TODO RENDERGRAPH: culling? force culling off for testing
7373
builder.AllowPassCulling(false);
7474
builder.AllowGlobalStateModification(true);
75-
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering);
75+
if (cameraData.xr.enabled)
76+
{
77+
bool passSupportsFoveation = cameraData.xrUniversal.canFoveateIntermediatePasses || resourceData.isActiveTargetBackBuffer;
78+
builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation);
79+
}
7680

7781
builder.SetRenderFunc((PassData data, RasterGraphContext context) =>
7882
{

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,6 +1038,11 @@ internal void BeginRenderGraphXRRendering(RenderGraph renderGraph)
10381038
if (!cameraData.xr.enabled)
10391039
return;
10401040

1041+
bool isDefaultXRViewport = XRSystem.GetRenderViewportScale() == 1.0f;
1042+
// For untethered XR, intermediate pass' foveation is currenlty unsupported with non-default viewport.
1043+
// Must be configured during the recording timeline before adding other XR intermediate passes.
1044+
cameraData.xrUniversal.canFoveateIntermediatePasses = !PlatformAutoDetect.isXRMobile || isDefaultXRViewport;
1045+
10411046
using (var builder = renderGraph.AddRasterRenderPass<BeginXRPassData>("BeginXRRendering", out var passData,
10421047
Profiling.beginXRRendering))
10431048
{

0 commit comments

Comments
 (0)