Giant_Beast_2025/Plugins/MetaXR/Source/OculusXRHMD/Private/OpenXR/OculusXREnvironmentDepthExtensionPlugin.h

137 lines
6.9 KiB
C++

// Copyright (c) Meta Platforms, Inc. and affiliates.
#pragma once
#include <functional>
#include <mutex>
#include "khronos/openxr/openxr.h"
#include "IOpenXRExtensionPlugin.h"
#include "OculusXRHMDTypes.h"
#include "Shader.h"
#include "Misc/EngineVersionComparison.h"
namespace OculusXR
{
/// Texture handle which can be cast to GLuint, VkImage, ID3D11Texture2D*, or ID3D12Resource*
using TextureHandle = unsigned long long;
constexpr uint32 EYE_COUNT = 2;
void RenderHardOcclusions_RenderThread(IRendererModule* RendererModule, const FVector2f& DepthFactors,
const FMatrix44f ScreenToDepthMatrices[EYE_COUNT], FRHITexture* DepthTexture, FRHICommandList& RHICmdList, const FSceneView& InView);
void RenderEnvironmentDepthMinMaxTexture_RenderThread(IRendererModule* RendererModule, FTextureRHIRef EnvironmentDepthMinMaxTexture,
FTextureRHIRef EnvironmentDepthSwapchain, FRHICommandListImmediate& RHICmdList);
#ifdef WITH_OCULUS_BRANCH
extern PFN_xrCreateEnvironmentDepthProviderMETA xrCreateEnvironmentDepthProviderMETA;
extern PFN_xrDestroyEnvironmentDepthProviderMETA xrDestroyEnvironmentDepthProviderMETA;
extern PFN_xrStartEnvironmentDepthProviderMETA xrStartEnvironmentDepthProviderMETA;
extern PFN_xrStopEnvironmentDepthProviderMETA xrStopEnvironmentDepthProviderMETA;
extern PFN_xrCreateEnvironmentDepthSwapchainMETA xrCreateEnvironmentDepthSwapchainMETA;
extern PFN_xrDestroyEnvironmentDepthSwapchainMETA xrDestroyEnvironmentDepthSwapchainMETA;
extern PFN_xrEnumerateEnvironmentDepthSwapchainImagesMETA xrEnumerateEnvironmentDepthSwapchainImagesMETA;
extern PFN_xrGetEnvironmentDepthSwapchainStateMETA xrGetEnvironmentDepthSwapchainStateMETA;
extern PFN_xrAcquireEnvironmentDepthImageMETA xrAcquireEnvironmentDepthImageMETA;
extern PFN_xrSetEnvironmentDepthHandRemovalMETA xrSetEnvironmentDepthHandRemovalMETA;
class FEnvironmentDepthExtensionPlugin : public IOpenXRExtensionPlugin
{
public:
void RegisterOpenXRExtensionPlugin()
{
#if defined(WITH_OCULUS_BRANCH)
RegisterOpenXRExtensionModularFeature();
#endif
}
virtual void PostCreateSession(XrSession InSession) override;
virtual void BindExtensionPluginDelegates(class IOpenXRExtensionPluginDelegates& OpenXRHMD) override;
virtual bool GetRequiredExtensions(TArray<const ANSICHAR*>& OutExtensions) override;
virtual const void* OnCreateInstance(class IOpenXRHMDModule* InModule, const void* InNext) override;
virtual const void* OnCreateSession(XrInstance InInstance, XrSystemId InSystem, const void* InNext) override;
virtual void OnBeginRendering_GameThread(XrSession InSession) override;
virtual void OnBeginRenderingLate_RenderThread(XrSession InSession, FRHICommandListImmediate& RHICmdList) override;
virtual void PostBeginFrame_RHIThread(XrTime PredictedDisplayTime) override;
virtual void PostRenderBasePassMobile_RenderThread(FRHICommandList& RHICmdList, FSceneView& InView) override;
virtual void PostRenderBasePassDeferred_RenderThread(FRDGBuilder& GraphBuilder, FSceneView& InView,
const FRenderTargetBindingSlots& RenderTargets, TRDGUniformBufferRef<FSceneTextureUniformParameters> SceneTextures) override;
virtual bool OnStartGameFrame(FWorldContext& WorldContext) override;
virtual bool OnEndGameFrame(FWorldContext& WorldContext) override;
virtual void OnDestroySession(XrSession InSession) override;
virtual const void* OnLocateViews(XrSession InSession, XrTime InDisplayTime, XrViewConfigurationType ViewConfigurationType, const void* InNext) override;
#ifdef WITH_OCULUS_BRANCH
virtual bool FindEnvironmentDepthTexture_RenderThread(FTextureRHIRef& OutTexture, FTextureRHIRef& OutMinMaxTexture,
FVector2f& OutDepthFactors, FMatrix44f OutScreenToDepthMatrices[2], FMatrix44f OutDepthViewProjMatrices[2]) override;
#endif // WITH_OCULUS_BRANCH
bool StartEnvironmentDepth();
bool StopEnvironmentDepth();
void SetXROcclusionsMode(UObject* WorldContextObject, EOculusXROcclusionsMode Mode);
bool IsEnvironmentDepthStarted() const;
bool InitializeEnvironmentDepth_RenderThread();
bool DestroyEnvironmentDepth_RenderThread();
bool GetEnvironmentDepthTextureStageCount_RenderThread(int& OutStageCount);
bool GetEnvironmentDepthTexture_RenderThread(int Stage, TextureHandle& OutHandle);
bool SetEnvironmentDepthHandRemoval_RenderThread(bool Enabled);
bool StartEnvironmentDepth_RenderThread();
bool StopEnvironmentDepth_RenderThread();
bool AcquireEnvironmentDepthTexture_RHIThread(XrTime predictedDisplayTime);
bool GetEnvironmentDepthFrameDesc_RenderThread(TOptional<XrEnvironmentDepthImageMETA>& OutEnvironmentDepthFrameDesc);
private:
XrSession Session = XR_NULL_HANDLE;
XrSpace StageSpace = XR_NULL_HANDLE;
XrEnvironmentDepthProviderMETA EnvironmentDepthProviderMeta = XR_NULL_HANDLE;
XrEnvironmentDepthSwapchainMETA EnvironmentDepthSwapchainMeta = XR_NULL_HANDLE;
XrEnvironmentDepthSwapchainStateMETA EnvironmentDepthSwapchainStateMeta{ XR_TYPE_ENVIRONMENT_DEPTH_SWAPCHAIN_STATE_META };
std::mutex EnvironmentDepthTextureMutex;
bool bExtEnvironmentDepthAvailable = false;
bool bHandsRemovalSupported = false;
bool bEnvironmentDepthRunning = false;
std::function<FTextureRHIRef(uint32 InSizeX, uint32 InSizeY, EPixelFormat InFormat, const FClearValueBinding& InBinding, uint32 InNumMips,
uint32 InNumSamples, uint32 InNumSamplesTileMem, ERHIResourceType InResourceType, TextureHandle InTexture,
ETextureCreateFlags InTexCreateFlags)>
CreateTexture_RenderThread_Fn;
TArray<FTextureRHIRef> EnvironmentDepthSwapchain;
FTextureRHIRef EnvironmentDepthMinMaxTexture;
int PrevEnvironmentDepthMinMaxSwapchainIndex = -1;
TArray<TextureHandle> EnvironmentDepthTextures;
TOptional<XrEnvironmentDepthImageMETA> EnvironmentDepthFrameDesc;
std::atomic<bool> bHardOcclusionsEnabled = false;
std::atomic<bool> bSoftOcclusionsEnabled = false;
std::atomic<bool> bEnvironmentDepthHandRemovalEnabled = false;
FString RHIString;
IRendererModule* RendererModule = nullptr;
float WorldToMeters;
float WorldToMeters_RenderThread;
FTransform TrackingToWorld;
FTransform TrackingToWorld_RenderThread;
FQuat HeadOrientation;
FQuat HeadOrientation_RenderThread;
FQuat BaseOrientation;
FQuat BaseOrientation_RenderThread;
TArray<XrView> EyeViews;
TArray<XrView> EyeViews_RenderThread;
XrStructureType GetEnvironmentDepthSwapchainImageType() const;
bool ComputeEnvironmentDepthParameters_RenderThread(FVector2f& DepthFactors, FMatrix44f ScreenToDepth[EYE_COUNT],
FMatrix44f DepthViewProj[EYE_COUNT], int& SwapchainIndex);
TArray<FTextureRHIRef> CreateSwapChainTextures_RenderThread(uint32 InSizeX, uint32 InSizeY, EPixelFormat InFormat,
const FClearValueBinding& InBinding, uint32 InNumMips, uint32 InNumSamples, uint32 InNumSamplesTileMem, ERHIResourceType InResourceType,
const TArray<TextureHandle>& InTextures, ETextureCreateFlags InTexCreateFlags, const TCHAR* DebugName) const;
void PrepareAndRenderHardOcclusions_RenderThread(FRHICommandList& RHICmdList, FSceneView& InView);
};
#endif
} // namespace OculusXR