118 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // @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
 |