85 lines
3.3 KiB
C++
85 lines
3.3 KiB
C++
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
|
|
#pragma once
|
|
#include "CoreMinimal.h"
|
|
#include "SceneViewExtension.h"
|
|
#include "XRSwapChain.h"
|
|
#include "OpenXR/IOculusXRExtensionPlugin.h"
|
|
|
|
#if defined(WITH_OCULUS_BRANCH)
|
|
|
|
DECLARE_LOG_CATEGORY_EXTERN(LogOculusSpaceWarpExtensionPlugin, Log, All);
|
|
|
|
struct FOpenXRSwapchainProperties;
|
|
|
|
namespace OculusXR
|
|
{
|
|
class FSpaceWarpExtensionPlugin : public IOculusXRExtensionPlugin
|
|
{
|
|
public:
|
|
FSpaceWarpExtensionPlugin();
|
|
|
|
// IOpenXRExtensionPlugin
|
|
virtual bool GetRequiredExtensions(TArray<const ANSICHAR*>& OutExtensions) override;
|
|
virtual void* OnEnumerateViewConfigurationViews(XrInstance InInstance, XrSystemId InSystem, XrViewConfigurationType InViewConfigurationType, uint32_t InViewIndex, void* InNext) override;
|
|
virtual const void* OnCreateInstance(IOpenXRHMDModule* InModule, const void* InNext) override;
|
|
virtual void PostCreateInstance(XrInstance InInstance) override;
|
|
virtual void PostCreateSession(XrSession InSession) override;
|
|
virtual void OnBeginRendering_RenderThread(XrSession InSession) override;
|
|
virtual const void* OnBeginProjectionView(XrSession InSession, int32 InLayerIndex, int32 InViewIndex, const void* InNext) override;
|
|
virtual void PostBeginFrame_RHIThread(XrTime PredictedDisplayTime) override;
|
|
virtual const void* OnEndFrame(XrSession InSession, XrTime DisplayTime, const void* InNext) override;
|
|
virtual void PostEndFrame_RHIThread() override;
|
|
virtual void AllocateRenderTargetTextures_RenderThread() override;
|
|
virtual bool GetRecommendedVelocityTextureSize_RenderThread(FIntPoint& OutTextureSize) override;
|
|
virtual FXRSwapChainPtr GetVelocitySwapchain_RenderThread() override;
|
|
virtual FXRSwapChainPtr GetVelocityDepthSwapchain_RenderThread() override;
|
|
|
|
bool IsSpaceWarpEnabled() const;
|
|
|
|
private:
|
|
class FSpaceWarpViewExtension : public FHMDSceneViewExtension
|
|
{
|
|
public:
|
|
FSpaceWarpViewExtension(const FAutoRegister& AutoRegister, FSpaceWarpExtensionPlugin* InPlugin);
|
|
|
|
// ISceneViewExtension
|
|
virtual void SetupViewFamily(FSceneViewFamily& InViewFamily) override;
|
|
virtual void SetupView(FSceneViewFamily& InViewFamily, FSceneView& InView) override;
|
|
virtual void BeginRenderViewFamily(FSceneViewFamily& InViewFamily) override;
|
|
|
|
private:
|
|
friend FSpaceWarpExtensionPlugin;
|
|
|
|
FSpaceWarpExtensionPlugin* SpaceWarpExtensionPlugin = nullptr;
|
|
};
|
|
|
|
struct FPipelinedVelocityState
|
|
{
|
|
FXRSwapChainPtr VelocitySwapchain;
|
|
FXRSwapChainPtr VelocityDepthSwapchain;
|
|
|
|
bool bEnabled = false;
|
|
};
|
|
|
|
TArray<TSharedPtr<XrSwapchainSubImage>> VelocityImages_RHIThread;
|
|
TArray<TSharedPtr<XrSwapchainSubImage>> VelocityDepthImages_RHIThread;
|
|
TArray<TSharedPtr<XrCompositionLayerSpaceWarpInfoFB>> SpaceWarpLayerInfo_RHIThread;
|
|
|
|
std::atomic<bool> bSpaceWarpExtensionEnabled = false;
|
|
bool bIsMobileMultiViewEnabled = false;
|
|
|
|
TSharedPtr<FSpaceWarpViewExtension> SpaceWarpViewExtension = nullptr;
|
|
FPipelinedVelocityState PipelinedVelocityState_RenderThread = {};
|
|
FPipelinedVelocityState PipelinedVelocityState_RHIThread = {};
|
|
|
|
XrViewConfigurationType SelectedViewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO;
|
|
XrSystemSpaceWarpPropertiesFB SpaceWarpSystemProperties = { XR_TYPE_SYSTEM_SPACE_WARP_PROPERTIES_FB };
|
|
|
|
FTransform LastTrackingToWorld = FTransform::Identity;
|
|
};
|
|
|
|
} // namespace OculusXR
|
|
|
|
#endif // defined(WITH_OCULUS_BRANCH)
|