// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "RendererInterface.h" #include "SceneTexturesConfig.h" class FRDGBuilder; struct FSceneTextures; enum class ESceneTexture { Color, Depth, SmallDepth, Velocity, GBufferA, GBufferB, GBufferC, GBufferD, GBufferE, GBufferF, SSAO, CustomDepth, }; RENDERER_API FRDGTextureRef GetSceneTexture(const FSceneTextures& SceneTextures, ESceneTexture InSceneTexture); enum class ESceneTextureSetupMode : uint32 { None = 0, SceneColor = 1 << 0, SceneDepth = 1 << 1, SceneVelocity = 1 << 2, GBufferA = 1 << 3, GBufferB = 1 << 4, GBufferC = 1 << 5, GBufferD = 1 << 6, GBufferE = 1 << 7, GBufferF = 1 << 8, SSAO = 1 << 9, CustomDepth = 1 << 10, GBuffers = GBufferA | GBufferB | GBufferC | GBufferD | GBufferE | GBufferF, All = SceneColor | SceneDepth | SceneVelocity | GBuffers | SSAO | CustomDepth }; ENUM_CLASS_FLAGS(ESceneTextureSetupMode); /** Fills the shader parameter struct. */ extern RENDERER_API void SetupSceneTextureUniformParameters( FRDGBuilder& GraphBuilder, const FSceneTextures* SceneTextures, ERHIFeatureLevel::Type FeatureLevel, ESceneTextureSetupMode SetupMode, FSceneTextureUniformParameters& OutParameters); /** Returns RDG scene texture uniform buffer. */ extern RENDERER_API TRDGUniformBufferRef CreateSceneTextureUniformBuffer( FRDGBuilder& GraphBuilder, const FSceneTextures* SceneTextures, ERHIFeatureLevel::Type FeatureLevel, ESceneTextureSetupMode SetupMode = ESceneTextureSetupMode::All); /** Returns RDG scene texture uniform buffer for a specified View. */ extern RENDERER_API TRDGUniformBufferRef CreateSceneTextureUniformBuffer( FRDGBuilder& GraphBuilder, const FSceneView& View, ESceneTextureSetupMode SetupMode = ESceneTextureSetupMode::All); enum class EMobileSceneTextureSetupMode : uint32 { None = 0, SceneColor = 1 << 0, SceneDepth = 1 << 1, CustomDepth = 1 << 2, GBufferA = 1 << 3, GBufferB = 1 << 4, GBufferC = 1 << 5, GBufferD = 1 << 6, SceneDepthAux = 1 << 7, SceneVelocity = 1 << 8, GBuffers = GBufferA | GBufferB | GBufferC | GBufferD | SceneDepthAux, All = SceneColor | SceneDepth | CustomDepth | GBuffers | SceneVelocity }; ENUM_CLASS_FLAGS(EMobileSceneTextureSetupMode); /** Fills the scene texture uniform buffer struct. */ extern RENDERER_API void SetupMobileSceneTextureUniformParameters( FRDGBuilder& GraphBuilder, const FSceneTextures* SceneTextures, EMobileSceneTextureSetupMode SetupMode, FMobileSceneTextureUniformParameters& SceneTextureParameters); /** Creates the RDG mobile scene texture uniform buffer. */ extern RENDERER_API TRDGUniformBufferRef CreateMobileSceneTextureUniformBuffer( FRDGBuilder& GraphBuilder, const FSceneTextures* SceneTextures, EMobileSceneTextureSetupMode SetupMode = EMobileSceneTextureSetupMode::All); /** Creates the RDG mobile scene texture uniform buffer. */ extern RENDERER_API TRDGUniformBufferRef CreateMobileSceneTextureUniformBuffer( FRDGBuilder& GraphBuilder, const FSceneView& View, EMobileSceneTextureSetupMode SetupMode = EMobileSceneTextureSetupMode::All); /** Returns scene texture shader parameters containing the RDG uniform buffer for either mobile or deferred shading. */ extern RENDERER_API FSceneTextureShaderParameters CreateSceneTextureShaderParameters( FRDGBuilder& GraphBuilder, const FSceneTextures* SceneTextures, ERHIFeatureLevel::Type FeatureLevel, ESceneTextureSetupMode SetupMode = ESceneTextureSetupMode::All); /** Returns scene texture shader parameters containing the RDG uniform buffer for either mobile or deferred shading. */ extern RENDERER_API FSceneTextureShaderParameters CreateSceneTextureShaderParameters( FRDGBuilder& GraphBuilder, const FSceneView& View, ESceneTextureSetupMode SetupMode = ESceneTextureSetupMode::All); extern RENDERER_API FSceneTextureShaderParameters GetSceneTextureShaderParameters(const FSceneView& View); BEGIN_SHADER_PARAMETER_STRUCT(FSceneTextureExtractsParameters, ) SHADER_PARAMETER_STRUCT_REF(FSceneTextureUniformParameters, SceneTextures) SHADER_PARAMETER_STRUCT_REF(FMobileSceneTextureUniformParameters, MobileSceneTextures) END_SHADER_PARAMETER_STRUCT() /** Struct containing references to extracted RHI resources after RDG execution. All textures are * left in an SRV read state, so they can safely be used for read without being re-imported into * RDG. Likewise, the uniform buffer is non-RDG and can be used as is. */ class FSceneTextureExtracts : public FRenderResource { public: FRHIUniformBuffer* GetUniformBuffer() const { return UniformBuffer.IsValid() ? UniformBuffer.GetReference() : MobileUniformBuffer.GetReference(); } TUniformBufferRef GetUniformBufferRef() const { return UniformBuffer; } TUniformBufferRef GetMobileUniformBufferRef() const { return MobileUniformBuffer; } FSceneTextureExtractsParameters GetShaderParameters() const { FSceneTextureExtractsParameters Parameters; Parameters.SceneTextures = UniformBuffer; Parameters.MobileSceneTextures = MobileUniformBuffer; return Parameters; } FRHITexture* GetDepthTexture() const { return Depth ? Depth->GetRHI() : nullptr; } RENDERER_API void QueueExtractions(FRDGBuilder& GraphBuilder, const FSceneTextures& SceneTextures); private: RENDERER_API void Release(); void ReleaseRHI() override { Release(); } // Contains the resolved scene depth target. TRefCountPtr Depth; // Contains the resolved scene depth target. TRefCountPtr PartialDepth; // Contains the custom depth targets. TRefCountPtr CustomDepth; // Contains RHI scene texture uniform buffers referencing the extracted textures. TUniformBufferRef UniformBuffer; TUniformBufferRef MobileUniformBuffer; }; /** Returns the global scene texture extracts struct. */ const RENDERER_API FSceneTextureExtracts& GetSceneTextureExtracts(); /** Pass through to View.GetSceneTexturesConfig().Extent, useful in headers where the FViewInfo structure isn't exposed. */ extern RENDERER_API FIntPoint GetSceneTextureExtentFromView(const FViewInfo& View); /** Resets the scene texture extent history. Call this method after rendering with very large render * targets. The next scene render will create them at the requested size. */ extern RENDERER_API void ResetSceneTextureExtentHistory(); /** Registers system textures into RDG. */ extern RENDERER_API void CreateSystemTextures(FRDGBuilder& GraphBuilder); /** Returns whether scene textures have been initialized. */ UE_DEPRECATED(5.1, "Single pass multiple view family rendering makes this obsolete. Use ViewFamily.SceneTexturesConfig.IsValid() instead.") extern RENDERER_API bool IsSceneTexturesValid(); /** Returns the full-resolution scene texture extent. */ UE_DEPRECATED(5.1, "Single pass multiple view family rendering makes this obsolete. Use ViewFamily.SceneTexturesConfig.Extent instead.") extern RENDERER_API FIntPoint GetSceneTextureExtent(); /** Returns the feature level being used by the renderer. */ UE_DEPRECATED(5.1, "Single pass multiple view family rendering makes this obsolete. Use ViewFamily.SceneTexturesConfig.FeatureLevel instead.") extern RENDERER_API ERHIFeatureLevel::Type GetSceneTextureFeatureLevel();