VRTowerDef/Plugins/MetaXR/Source/OculusXRHMD/Private/OculusXRHMD_CustomPresent.h

118 lines
5.8 KiB
C
Raw Permalink Normal View History

2024-05-29 08:53:41 +00:00
// @lint-ignore-every LICENSELINT
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "OculusXRHMDPrivate.h"
#if OCULUS_HMD_SUPPORTED_PLATFORMS
#include "OculusXRHMD_Settings.h"
#include "OculusXRHMD_GameFrame.h"
#include "XRSwapChain.h"
#include "RHI.h"
#include "RendererInterface.h"
#include "IStereoLayers.h"
#include "XRRenderBridge.h"
#if PLATFORM_WINDOWS
#include "Windows/WindowsHWrapper.h"
#endif
DECLARE_STATS_GROUP(TEXT("OculusXRHMD"), STATGROUP_OculusXRHMD, STATCAT_Advanced);
DECLARE_CYCLE_STAT(TEXT("BeginRendering"), STAT_BeginRendering, STATGROUP_OculusXRHMD);
DECLARE_CYCLE_STAT(TEXT("FinishRendering"), STAT_FinishRendering, STATGROUP_OculusXRHMD);
DECLARE_FLOAT_COUNTER_STAT(TEXT("LatencyRender"), STAT_LatencyRender, STATGROUP_OculusXRHMD);
DECLARE_FLOAT_COUNTER_STAT(TEXT("LatencyTimewarp"), STAT_LatencyTimewarp, STATGROUP_OculusXRHMD);
DECLARE_FLOAT_COUNTER_STAT(TEXT("LatencyPostPresent"), STAT_LatencyPostPresent, STATGROUP_OculusXRHMD);
DECLARE_FLOAT_COUNTER_STAT(TEXT("ErrorRender"), STAT_ErrorRender, STATGROUP_OculusXRHMD);
DECLARE_FLOAT_COUNTER_STAT(TEXT("ErrorTimewarp"), STAT_ErrorTimewarp, STATGROUP_OculusXRHMD);
namespace OculusXRHMD
{
//-------------------------------------------------------------------------------------------------
// FCustomPresent
//-------------------------------------------------------------------------------------------------
class FCustomPresent : public FXRRenderBridge
{
public:
FCustomPresent(class FOculusXRHMD* InOculusXRHMD, ovrpRenderAPIType InRenderAPI, EPixelFormat InDefaultPixelFormat, bool InSupportsSRGB);
// FXRRenderBridge/FRHICustomPresent
virtual bool NeedsNativePresent() override;
virtual bool Present(int32& SyncInterval) override;
virtual void FinishRendering_RHIThread();
ovrpRenderAPIType GetRenderAPI() const { return RenderAPI; }
virtual bool IsUsingCorrectDisplayAdapter() const { return true; }
void UpdateMirrorTexture_RenderThread();
void ReleaseResources_RHIThread();
void Shutdown();
FTexture2DRHIRef GetMirrorTexture() { return MirrorTextureRHI; }
virtual void* GetOvrpInstance() const { return nullptr; }
virtual void* GetOvrpPhysicalDevice() const { return nullptr; }
virtual void* GetOvrpDevice() const { return nullptr; }
virtual void* GetOvrpCommandQueue() const { return nullptr; }
EPixelFormat GetPixelFormat(EPixelFormat InFormat) const;
EPixelFormat GetPixelFormat(ovrpTextureFormat InFormat) const;
EPixelFormat GetDefaultPixelFormat() const { return DefaultPixelFormat; }
ovrpTextureFormat GetOvrpTextureFormat(EPixelFormat InFormat, bool usesRGB = true) const;
ovrpTextureFormat GetDefaultOvrpTextureFormat() const { return DefaultOvrpTextureFormat; }
ovrpTextureFormat GetDefaultDepthOvrpTextureFormat() const { return DefaultDepthOvrpTextureFormat; }
static bool IsSRGB(ovrpTextureFormat InFormat);
virtual int GetSystemRecommendedMSAALevel() const;
virtual int GetLayerFlags() const { return 0; }
virtual FTextureRHIRef CreateTexture_RenderThread(uint32 InSizeX, uint32 InSizeY, EPixelFormat InFormat, FClearValueBinding InBinding, uint32 InNumMips, uint32 InNumSamples, uint32 InNumSamplesTileMem, ERHIResourceType InResourceType, ovrpTextureHandle InTexture, ETextureCreateFlags TexCreateFlags) = 0;
FXRSwapChainPtr CreateSwapChain_RenderThread(uint32 InSizeX, uint32 InSizeY, EPixelFormat InFormat, FClearValueBinding InBinding, uint32 InNumMips, uint32 InNumSamples, uint32 InNumSamplesTileMem, ERHIResourceType InResourceType, const TArray<ovrpTextureHandle>& InTextures, ETextureCreateFlags InTexCreateFlags, const TCHAR* DebugName);
TArray<FTextureRHIRef> CreateSwapChainTextures_RenderThread(uint32 InSizeX, uint32 InSizeY, EPixelFormat InFormat, FClearValueBinding InBinding, uint32 InNumMips, uint32 InNumSamples, uint32 InNumSamplesTileMem, ERHIResourceType InResourceType, const TArray<ovrpTextureHandle>& InTextures, ETextureCreateFlags InTexCreateFlags, const TCHAR* DebugName);
void CopyTexture_RenderThread(FRHICommandListImmediate& RHICmdList, FRHITexture* DstTexture, FRHITexture* SrcTexture, FIntRect DstRect = FIntRect(), FIntRect SrcRect = FIntRect(), bool bAlphaPremultiply = false, bool bNoAlphaWrite = false, bool bInvertY = true, bool sRGBSource = false, bool bInvertAlpha = false) const;
void SubmitGPUCommands_RenderThread(FRHICommandListImmediate& RHICmdList);
virtual void SubmitGPUFrameTime(float GPUFrameTime) {}
// This is a hack to turn force FSR off when we allocate our FDM to avoid a crash on Quest 3
// TODO: Remove this for UE 5.3 after there's an engine-side fix
virtual void UseFragmentDensityMapOverShadingRate_RHIThread(){};
#ifdef WITH_OCULUS_BRANCH
virtual void UpdateFoveationOffsets_RHIThread(bool bUseOffsets, FIntPoint Offsets[2]){};
#endif // WITH_OCULUS_BRANCH
bool SupportsSRGB()
{
return bSupportsSRGB;
}
bool SupportsSubsampled() { return bSupportsSubsampled; }
protected:
FOculusXRHMD* OculusXRHMD;
ovrpRenderAPIType RenderAPI;
EPixelFormat DefaultPixelFormat;
bool bSupportsSRGB;
bool bSupportsSubsampled;
ovrpTextureFormat DefaultOvrpTextureFormat;
ovrpTextureFormat DefaultDepthOvrpTextureFormat;
IRendererModule* RendererModule;
FTexture2DRHIRef MirrorTextureRHI;
bool bIsStandaloneStereoDevice;
};
//-------------------------------------------------------------------------------------------------
// APIs
//-------------------------------------------------------------------------------------------------
#if OCULUS_HMD_SUPPORTED_PLATFORMS_D3D11
FCustomPresent* CreateCustomPresent_D3D11(FOculusXRHMD* InOculusXRHMD);
#endif
#if OCULUS_HMD_SUPPORTED_PLATFORMS_D3D12
FCustomPresent* CreateCustomPresent_D3D12(FOculusXRHMD* InOculusXRHMD);
#endif
#if OCULUS_HMD_SUPPORTED_PLATFORMS_VULKAN
FCustomPresent* CreateCustomPresent_Vulkan(FOculusXRHMD* InOculusXRHMD);
#endif
} // namespace OculusXRHMD
#endif //OCULUS_HMD_SUPPORTED_PLATFORMS