Files
UnrealEngineUWP/Engine/Source/Runtime/Renderer/Private/DBufferTextures.cpp
aurel cordonnier d17d20ca36 Merge from Release-Engine-Test @ 16758890 to UE5/Main
This represents UE4/Main @ 16738161 and Dev-PerfTest @ 16737719 (and Release-17.00 @ 16658211)

[CL 16763350 by aurel cordonnier in ue5-main branch]
2021-06-23 17:51:32 -04:00

102 lines
4.2 KiB
C++

// 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);
const bool bPerPixelDBufferMask = FDataDrivenShaderPlatformInfo::GetSupportsPerPixelDBufferMask(ShaderPlatform);
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;
}