2021-05-28 13:43:34 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "DBufferTextures.h"
# include "RendererUtils.h"
# include "RenderGraphUtils.h"
# include "SceneUtils.h"
# include "ScenePrivate.h"
bool FDBufferTextures : : IsValid ( ) const
{
check ( ! DBufferA | | ( DBufferB & & DBufferC ) ) ;
return HasBeenProduced ( DBufferA ) ;
}
EDecalDBufferMaskTechnique GetDBufferMaskTechnique ( EShaderPlatform ShaderPlatform )
{
const bool bWriteMaskDBufferMask = RHISupportsRenderTargetWriteMask ( ShaderPlatform ) ;
2021-06-23 17:51:32 -04:00
const bool bPerPixelDBufferMask = FDataDrivenShaderPlatformInfo : : GetSupportsPerPixelDBufferMask ( ShaderPlatform ) ;
2021-05-28 13:43:34 -04:00
checkf ( ! bWriteMaskDBufferMask | | ! bPerPixelDBufferMask , TEXT ( " The WriteMask and PerPixel DBufferMask approaches cannot be enabled at the same time. They are mutually exclusive. " ) ) ;
if ( bWriteMaskDBufferMask )
{
return EDecalDBufferMaskTechnique : : WriteMask ;
}
else if ( bPerPixelDBufferMask )
{
return EDecalDBufferMaskTechnique : : PerPixel ;
}
return EDecalDBufferMaskTechnique : : Disabled ;
}
FDBufferTextures CreateDBufferTextures ( FRDGBuilder & GraphBuilder , FIntPoint Extent , EShaderPlatform ShaderPlatform )
{
FDBufferTextures DBufferTextures ;
if ( IsUsingDBuffers ( ShaderPlatform ) )
{
const EDecalDBufferMaskTechnique DBufferMaskTechnique = GetDBufferMaskTechnique ( ShaderPlatform ) ;
const ETextureCreateFlags WriteMaskFlags = DBufferMaskTechnique = = EDecalDBufferMaskTechnique : : WriteMask ? TexCreate_NoFastClearFinalize | TexCreate_DisableDCC : TexCreate_None ;
const ETextureCreateFlags BaseFlags = WriteMaskFlags | TexCreate_ShaderResource | TexCreate_RenderTargetable ;
const ERDGTextureFlags TextureFlags = DBufferMaskTechnique ! = EDecalDBufferMaskTechnique : : Disabled
? ERDGTextureFlags : : MaintainCompression
: ERDGTextureFlags : : None ;
FRDGTextureDesc Desc = FRDGTextureDesc : : Create2D ( Extent , PF_B8G8R8A8 , FClearValueBinding : : None , BaseFlags ) ;
Desc . Flags = BaseFlags | GFastVRamConfig . DBufferA ;
Desc . ClearValue = FClearValueBinding : : Black ;
DBufferTextures . DBufferA = GraphBuilder . CreateTexture ( Desc , TEXT ( " DBufferA " ) , TextureFlags ) ;
Desc . Flags = BaseFlags | GFastVRamConfig . DBufferB ;
Desc . ClearValue = FClearValueBinding ( FLinearColor ( 128.0f / 255.0f , 128.0f / 255.0f , 128.0f / 255.0f , 1 ) ) ;
DBufferTextures . DBufferB = GraphBuilder . CreateTexture ( Desc , TEXT ( " DBufferB " ) , TextureFlags ) ;
Desc . Flags = BaseFlags | GFastVRamConfig . DBufferC ;
Desc . ClearValue = FClearValueBinding ( FLinearColor ( 0 , 0 , 0 , 1 ) ) ;
DBufferTextures . DBufferC = GraphBuilder . CreateTexture ( Desc , TEXT ( " DBufferC " ) , TextureFlags ) ;
if ( DBufferMaskTechnique = = EDecalDBufferMaskTechnique : : PerPixel )
{
// Note: 32bpp format is used here to utilize color compression hardware (same as other DBuffer targets).
// This significantly reduces bandwidth for clearing, writing and reading on some GPUs.
// While a smaller format, such as R8_UINT, will use less video memory, it will result in slower clears and higher bandwidth requirements.
check ( Desc . Format = = PF_B8G8R8A8 ) ;
Desc . Flags = TexCreate_ShaderResource | TexCreate_RenderTargetable ;
Desc . ClearValue = FClearValueBinding : : Transparent ;
DBufferTextures . DBufferMask = GraphBuilder . CreateTexture ( Desc , TEXT ( " DBufferMask " ) ) ;
}
}
return DBufferTextures ;
}
FDBufferParameters GetDBufferParameters ( FRDGBuilder & GraphBuilder , const FDBufferTextures & DBufferTextures , EShaderPlatform ShaderPlatform )
{
const FRDGSystemTextures & SystemTextures = FRDGSystemTextures : : Get ( GraphBuilder ) ;
FDBufferParameters Parameters ;
Parameters . DBufferATextureSampler = TStaticSamplerState < > : : GetRHI ( ) ;
Parameters . DBufferBTextureSampler = TStaticSamplerState < > : : GetRHI ( ) ;
Parameters . DBufferCTextureSampler = TStaticSamplerState < > : : GetRHI ( ) ;
Parameters . DBufferATexture = SystemTextures . BlackAlphaOne ;
Parameters . DBufferBTexture = SystemTextures . DefaultNormal8Bit ;
Parameters . DBufferCTexture = SystemTextures . BlackAlphaOne ;
Parameters . DBufferRenderMask = SystemTextures . White ;
if ( DBufferTextures . IsValid ( ) )
{
Parameters . DBufferATexture = DBufferTextures . DBufferA ;
Parameters . DBufferBTexture = DBufferTextures . DBufferB ;
Parameters . DBufferCTexture = DBufferTextures . DBufferC ;
if ( DBufferTextures . DBufferMask )
{
Parameters . DBufferRenderMask = DBufferTextures . DBufferMask ;
}
}
return Parameters ;
}