// Used for camera stacking where we need to update the parameters per camera internal void UpdateFromCamera(ref XRPass xrPass, Camera camera) { if (xrPass.enabled && display != null) { display.GetRenderPass(xrPass.multipassId, out var renderPass); display.GetCullingParameters(camera, renderPass.cullingPassIndex, out var cullingParams); // Disable legacy stereo culling path cullingParams.cullingOptions &= ~CullingOptions.Stereo; if (xrPass.singlePassEnabled) { xrPass = XRPass.Create(renderPass, multipassId: xrPass.multipassId, cullingParams, occlusionMeshMaterial); for (int renderParamIndex = 0; renderParamIndex < renderPass.GetRenderParameterCount(); ++renderParamIndex) { renderPass.GetRenderParameter(camera, renderParamIndex, out var renderParam); xrPass.AddView(renderPass, renderParam); } } else { renderPass.GetRenderParameter(camera, 0, out var renderParam); xrPass = XRPass.Create(renderPass, multipassId: xrPass.multipassId, cullingParams, occlusionMeshMaterial); xrPass.AddView(renderPass, renderParam); } } }
internal void EndLateLatching(Camera camera, XRPass xrPass) { if (display != null && xrPass.isLateLatchEnabled) { display.EndRecordingIfLateLatched(camera); xrPass.isLateLatchEnabled = false; } }
internal void BeginLateLatching(Camera camera, XRPass xrPass) { //Only support late latching for multiview use case if (display != null && xrPass.singlePassEnabled && xrPass.viewCount == 2) { display.BeginRecordingIfLateLatched(camera); xrPass.isLateLatchEnabled = true; } }
internal static RenderTargetHandle GetCameraTarget(XRPass xr) { #if ENABLE_VR && ENABLE_XR_MODULE if (xr.enabled) { return(new RenderTargetHandle(xr.renderTarget)); } #endif return(CameraTarget); }
internal void ReleaseFrame() { foreach (XRPass xrPass in framePasses) { if (xrPass != emptyPass) { XRPass.Release(xrPass); } } framePasses.Clear(); if (testRenderTexture) { RenderTexture.ReleaseTemporary(testRenderTexture); } }
// Used for camera stacking where we need to update the parameters per camera internal void UpdateFromCamera(ref XRPass xrPass, CameraData cameraData) { bool isGameCamera = (cameraData.camera.cameraType == CameraType.Game || cameraData.camera.cameraType == CameraType.VR); if (XRGraphicsAutomatedTests.enabled && XRGraphicsAutomatedTests.running && isGameCamera) { // XR test framework code path. Update 2nd view with camera's view projection data Matrix4x4 projMatrix = cameraData.camera.projectionMatrix; Matrix4x4 viewMatrix = cameraData.camera.worldToCameraMatrix; Rect viewport = new Rect(0, 0, testRenderTexture.width, testRenderTexture.height); int textureArraySlice = -1; xrPass.UpdateView(1, projMatrix, viewMatrix, viewport, textureArraySlice); // Update culling params for this xr pass using camera's culling params cameraData.camera.TryGetCullingParameters(false, out var cullingParams); //// Disable legacy stereo culling path cullingParams.cullingOptions &= ~CullingOptions.Stereo; xrPass.UpdateCullingParams(0, cullingParams); } else if (xrPass.enabled && display != null) { display.GetRenderPass(xrPass.multipassId, out var renderPass); display.GetCullingParameters(cameraData.camera, renderPass.cullingPassIndex, out var cullingParams); // Disable legacy stereo culling path cullingParams.cullingOptions &= ~CullingOptions.Stereo; xrPass.UpdateCullingParams(cullingPassId: renderPass.cullingPassIndex, cullingParams); if (xrPass.singlePassEnabled) { for (int renderParamIndex = 0; renderParamIndex < renderPass.GetRenderParameterCount(); ++renderParamIndex) { renderPass.GetRenderParameter(cameraData.camera, renderParamIndex, out var renderParam); xrPass.UpdateView(renderParamIndex, renderPass, renderParam); } } else { renderPass.GetRenderParameter(cameraData.camera, 0, out var renderParam); xrPass.UpdateView(0, renderPass, renderParam); } } }
internal void AddPassToFrame(XRPass xrPass) { framePasses.Add(xrPass); }
void CreateLayoutFromXrSdk(Camera camera, bool singlePassAllowed) { bool CanUseSinglePass(XRDisplaySubsystem.XRRenderPass renderPass) { if (renderPass.renderTargetDesc.dimension != TextureDimension.Tex2DArray) { return(false); } if (renderPass.GetRenderParameterCount() != 2 || renderPass.renderTargetDesc.volumeDepth != 2) { return(false); } renderPass.GetRenderParameter(camera, 0, out var renderParam0); renderPass.GetRenderParameter(camera, 1, out var renderParam1); if (renderParam0.textureArraySlice != 0 || renderParam1.textureArraySlice != 1) { return(false); } if (renderParam0.viewport != renderParam1.viewport) { return(false); } return(true); } for (int renderPassIndex = 0; renderPassIndex < display.GetRenderPassCount(); ++renderPassIndex) { display.GetRenderPass(renderPassIndex, out var renderPass); display.GetCullingParameters(camera, renderPass.cullingPassIndex, out var cullingParams); // Disable legacy stereo culling path cullingParams.cullingOptions &= ~CullingOptions.Stereo; if (singlePassAllowed && CanUseSinglePass(renderPass)) { var xrPass = XRPass.Create(renderPass, multipassId: framePasses.Count, cullingParams, occlusionMeshMaterial); for (int renderParamIndex = 0; renderParamIndex < renderPass.GetRenderParameterCount(); ++renderParamIndex) { renderPass.GetRenderParameter(camera, renderParamIndex, out var renderParam); xrPass.AddView(renderPass, renderParam); } AddPassToFrame(xrPass); } else { for (int renderParamIndex = 0; renderParamIndex < renderPass.GetRenderParameterCount(); ++renderParamIndex) { renderPass.GetRenderParameter(camera, renderParamIndex, out var renderParam); var xrPass = XRPass.Create(renderPass, multipassId: framePasses.Count, cullingParams, occlusionMeshMaterial); xrPass.AddView(renderPass, renderParam); AddPassToFrame(xrPass); } } } }
internal void AddPassToFrame(XRPass xrPass) { xrPass.UpdateOcclusionMesh(); framePasses.Add(xrPass); }