// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "IDisplayClusterShadersTextureUtils.h" #include "Templates/SharedPointer.h" #include "RHICommandList.h" /** * Texture utils class for nDisplay. */ class FDisplayClusterShadersTextureUtils : public IDisplayClusterShadersTextureUtils , public TSharedFromThis { public: virtual ~FDisplayClusterShadersTextureUtils() = default; /** * Return new instance of the resource utils. * * @param RHICmdList - RHI API */ static TSharedRef CreateTextureUtils_RenderThread(FRHICommandListImmediate& RHICmdList); /** * Return new instance of the resource utils. * @param GraphBuilder - RDG builder */ static TSharedRef CreateTextureUtils_RenderThread(FRDGBuilder& GraphBuilder); public: //~Begin IDisplayClusterShadersTextureUtils virtual TSharedRef ResolveTextureContext(const FDisplayClusterShadersTextureViewportContext& Input, const FDisplayClusterShadersTextureViewportContext& Output) override; virtual TSharedRef ResolveTextureContext(const FDisplayClusterShadersTextureUtilsSettings& InSettings, const FDisplayClusterShadersTextureViewportContext& Input, const FDisplayClusterShadersTextureViewportContext& Output) override; virtual TSharedRef Resolve() override; virtual TSharedRef Resolve(const FDisplayClusterShadersTextureUtilsSettings& Settings) override; virtual TSharedRef ForEachContextByPredicate(TFunctionDisplayClusterShaders_TextureContextIterator&& InFunction) override; virtual TSharedRef ForEachContextByPredicate(const FDisplayClusterShadersTextureUtilsSettings& Settings, TFunctionDisplayClusterShaders_TextureContextIterator&& InFunction) override; virtual TSharedRef SetInput(const FDisplayClusterShadersTextureViewport& InTextureViewport, const int32 InContextNum = INDEX_NONE) override; virtual TSharedRef SetOutput(const FDisplayClusterShadersTextureViewport& InTextureViewport, const int32 InContextNum = INDEX_NONE) override; virtual TSharedRef SetInput(const IDisplayClusterViewportProxy* InViewportProxy, const EDisplayClusterViewportResourceType InResourceType, const int32 InContextNum = INDEX_NONE) override; virtual TSharedRef SetOutput(const IDisplayClusterViewportProxy* InViewportProxy, const EDisplayClusterViewportResourceType InResourceType,const int32 InContextNum = INDEX_NONE) override; virtual TSharedRef SetInputEncoding(const FDisplayClusterColorEncoding& InColorEncoding) override; virtual TSharedRef SetOutputEncoding(const FDisplayClusterColorEncoding& InColorEncoding) override; virtual const FDisplayClusterShadersTextureParameters& GetInputTextureParameters() const override { return InputTextureParameters; } virtual const FDisplayClusterShadersTextureParameters& GetOutputTextureParameters() const override { return OutputTextureParameters; } //~~ End IDisplayClusterShadersTextureUtils public: /** Return true if RDG is required. */ virtual bool ShouldUseRDG() const { return false; } /** * Implements Transition and copy * * @param Input - Input texture with rect * @param Output - Output texture with rect * @param Settings - current settings * * @return false, if it isn't possible */ virtual bool TransitionAndCopyTexture( const FDisplayClusterShadersTextureViewport& Input, const FDisplayClusterShadersTextureViewport& Output, const FDisplayClusterShadersTextureUtilsSettings& Settings) { return false; } /** * Implements resample shader * * @param Input - Input texture with rect * @param Output - Output texture with rect * @param Settings - current settings * * @return false, if it isn't possible */ virtual bool ResampleColorEncodingCopyRect( const FDisplayClusterShadersTextureViewportContext& Input, const FDisplayClusterShadersTextureViewportContext& Output, const FDisplayClusterShadersTextureUtilsSettings& Settings) { return false; } /** Create a new input texture from the output and copy the image as well. * * @param OutTextureViewport - (out) The new texture * @param InTextureViewport - (in) the source texture to be clone (size and format) * @param InDebugName - (opt) texture debug name * * @return true on success. */ virtual bool CloneTextureViewportResourceForRenderPass( FDisplayClusterShadersTextureViewport& OutTextureViewport, const FDisplayClusterShadersTextureViewport& InTextureViewport, const TCHAR* InDebugName) { return false; }; /** Update texture viewport data for render pass * return false if error */ virtual bool InitializeTextureViewportForRenderPass( FDisplayClusterShadersTextureViewport& InOutTextureViewport, const TCHAR* InDebugName) { return true; }; /** * Implements texture context resolving * * @param Input - Input texture with rect * @param Output - Output texture with rect * @param Settings - current settings * * @return false, if it isn't possible */ virtual bool ImplementTextureContextResolve( const FDisplayClusterShadersTextureViewportContext& Input, const FDisplayClusterShadersTextureViewportContext& Output, const FDisplayClusterShadersTextureUtilsSettings& Settings); public: /** Get texture parameter from the nDisplay viewport resourece * * @param InViewportProxy - viewport proxy object with resources to retrieve * @param InResourceType - Type of the viewport resource * * @return themself */ static FDisplayClusterShadersTextureParameters GetTextureParametersFromViewport( const IDisplayClusterViewportProxy* InViewportProxy, const EDisplayClusterViewportResourceType InResourceType); /** Returns true if a resampling shader should be used to copy this texture. * * @param InputTextureContext - input texture context * @param OutputTextureContext - output texture context * @param Settings - current settings */ bool ShouldUseResampleShader( const FDisplayClusterShadersTextureViewportContext& InputTextureContext, const FDisplayClusterShadersTextureViewportContext& OutputTextureContext, const FDisplayClusterShadersTextureUtilsSettings& Settings) const; /** Iterate through contexts matching these settings. */ void ImplForEachContextByPredicate( const FDisplayClusterShadersTextureUtilsSettings& Settings, TFunctionDisplayClusterShaders_TextureContextIterator&& TextureContextIteratorFunc); protected: /** Input textures parameters. */ FDisplayClusterShadersTextureParameters InputTextureParameters; /** Output textures parameters. */ FDisplayClusterShadersTextureParameters OutputTextureParameters; }; /** * RDI:Texture utils class for nDisplay. */ class FDisplayClusterShadersRHITextureUtils : public FDisplayClusterShadersTextureUtils { public: virtual ~FDisplayClusterShadersRHITextureUtils() { if (GraphBuilderUniquePtr) { // If using RDG, call execute at the end GraphBuilderUniquePtr->Execute(); GraphBuilderUniquePtr.Reset(); } // And finally release pooled RTT PooledRenderTargets.Reset(); } FDisplayClusterShadersRHITextureUtils(FRHICommandListImmediate& InRHICmdList) : FDisplayClusterShadersTextureUtils(), RHICmdList(InRHICmdList) { } public: //~Begin IDisplayClusterShadersTextureUtils virtual FRDGBuilder& GetOrCreateRDGBuilder() override { if (!GraphBuilderUniquePtr.IsValid()) { GraphBuilderUniquePtr = MakeUnique(RHICmdList); } return *GraphBuilderUniquePtr; } //~~End IDisplayClusterShadersTextureUtils public: //~Begin FDisplayClusterShadersTextureUtils virtual bool TransitionAndCopyTexture(const FDisplayClusterShadersTextureViewport& Input, const FDisplayClusterShadersTextureViewport& Output, const FDisplayClusterShadersTextureUtilsSettings& Settings) override; virtual bool ResampleColorEncodingCopyRect(const FDisplayClusterShadersTextureViewportContext& Input, const FDisplayClusterShadersTextureViewportContext& Output, const FDisplayClusterShadersTextureUtilsSettings& Settings) override; virtual bool CloneTextureViewportResourceForRenderPass(FDisplayClusterShadersTextureViewport& OutTextureViewport, const FDisplayClusterShadersTextureViewport& InTextureViewport, const TCHAR* InDebugName) override; virtual bool InitializeTextureViewportForRenderPass(FDisplayClusterShadersTextureViewport& InOutTextureViewport, const TCHAR* InDebugName) override; virtual bool ShouldUseRDG() const override { return GraphBuilderUniquePtr.IsValid(); } //~~End FDisplayClusterShadersTextureUtils private: // Stored RHI api ref FRHICommandListImmediate& RHICmdList; /** Temporary RTTs*/ TArray> PooledRenderTargets; // A GraphBuilder that can be created on request. TUniquePtr GraphBuilderUniquePtr; }; /** * RDG:Texture utils class for nDisplay. */ class FDisplayClusterShadersRDGTextureUtils : public FDisplayClusterShadersTextureUtils { public: virtual ~FDisplayClusterShadersRDGTextureUtils() = default; FDisplayClusterShadersRDGTextureUtils(FRDGBuilder& InGraphBuilder) : FDisplayClusterShadersTextureUtils(), GraphBuilder(InGraphBuilder) { } public: //~Begin IDisplayClusterShadersTextureUtils virtual FRDGBuilder& GetOrCreateRDGBuilder() override { return GraphBuilder; } //~~End IDisplayClusterShadersTextureUtils public: //~Begin FDisplayClusterShadersTextureUtils virtual bool TransitionAndCopyTexture(const FDisplayClusterShadersTextureViewport& Input, const FDisplayClusterShadersTextureViewport& Output, const FDisplayClusterShadersTextureUtilsSettings& Settings) override; virtual bool ResampleColorEncodingCopyRect(const FDisplayClusterShadersTextureViewportContext& Input, const FDisplayClusterShadersTextureViewportContext& Output, const FDisplayClusterShadersTextureUtilsSettings& Settings) override; virtual bool CloneTextureViewportResourceForRenderPass(FDisplayClusterShadersTextureViewport& OutTextureViewport, const FDisplayClusterShadersTextureViewport& InTextureViewport, const TCHAR* InDebugName) override; virtual bool InitializeTextureViewportForRenderPass(FDisplayClusterShadersTextureViewport& InOutTextureViewport, const TCHAR* InDebugName) override; virtual bool ShouldUseRDG() const override { return true; } //~~End FDisplayClusterShadersTextureUtils private: // Stored RDG api ref FRDGBuilder& GraphBuilder; };