#if ENABLE_VR && ENABLE_XR_MODULE using System; using UnityEngine.Rendering.RenderGraphModule; using UnityEngine.Experimental.Rendering; namespace UnityEngine.Rendering.Universal { /// /// Draw the XR occlusion mesh into the current depth buffer when XR is enabled. /// public partial class XROcclusionMeshPass : ScriptableRenderPass { public XROcclusionMeshPass(RenderPassEvent evt) { profilingSampler = new ProfilingSampler("Draw XR Occlusion Mesh"); renderPassEvent = evt; } private static void ExecutePass(RasterCommandBuffer cmd, PassData data) { if (data.xr.hasValidOcclusionMesh) { if (data.isActiveTargetBackBuffer) cmd.SetViewport(data.xr.GetViewport()); data.xr.RenderOcclusionMesh(cmd, renderIntoTexture: data.shouldYFlip); } } private class PassData { internal XRPass xr; internal bool isActiveTargetBackBuffer; internal bool shouldYFlip; internal TextureHandle cameraColorAttachment; } internal void Render(RenderGraph renderGraph, ContextContainer frameData, in TextureHandle cameraColorAttachment, in TextureHandle cameraDepthAttachment) { UniversalCameraData cameraData = frameData.Get(); UniversalResourceData resourceData = frameData.Get(); using (var builder = renderGraph.AddRasterRenderPass(passName, out var passData, profilingSampler)) { passData.xr = cameraData.xr; passData.cameraColorAttachment = cameraColorAttachment; builder.SetRenderAttachment(cameraColorAttachment, 0); builder.SetRenderAttachmentDepth(cameraDepthAttachment, AccessFlags.ReadWrite); passData.isActiveTargetBackBuffer = resourceData.isActiveTargetBackBuffer; builder.AllowGlobalStateModification(true); if (cameraData.xr.enabled) { bool passSupportsFoveation = cameraData.xrUniversal.canFoveateIntermediatePasses || resourceData.isActiveTargetBackBuffer; builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation); // Multiview render regions are incompatible with the inner (foveal) pass in Quad View if (!cameraData.xr.isQuadViewInnerPass) { builder.SetExtendedFeatureFlags(ExtendedFeatureFlags.MultiviewRenderRegionsCompatible); } } builder.SetRenderFunc((PassData data, RasterGraphContext context) => { passData.shouldYFlip = RenderingUtils.IsHandleYFlipped(context, in data.cameraColorAttachment); ExecutePass(context.cmd, data); }); return; } } } } #endif