Files
UnrealEngineUWP/Engine/Source/Runtime/Renderer/Private/MobileSeparateTranslucencyPass.cpp
Dmitriy Dyomin 5b65c180e0 Fixed crash in a separate translucency rendering with mobile deferred shading enabled
#rb none
#preflight 635f2ce1e27df24a3f713d4b

[CL 22856412 by Dmitriy Dyomin in ue5-main branch]
2022-10-30 22:06:50 -04:00

73 lines
3.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
/*=============================================================================
MobileSeparateTranslucencyPass.cpp - Mobile specific separate translucency pass
=============================================================================*/
#include "MobileSeparateTranslucencyPass.h"
#include "TranslucentRendering.h"
#include "DynamicPrimitiveDrawing.h"
#include "MobileBasePassRendering.h"
#include "ScenePrivate.h"
BEGIN_SHADER_PARAMETER_STRUCT(FMobileSeparateTranslucencyPassParameters, )
SHADER_PARAMETER_STRUCT_REF(FViewUniformShaderParameters, View)
SHADER_PARAMETER_RDG_UNIFORM_BUFFER(FMobileBasePassUniformParameters, MobileBasePass)
SHADER_PARAMETER_STRUCT_INCLUDE(FInstanceCullingDrawParams, InstanceCullingDrawParams)
RENDER_TARGET_BINDING_SLOTS()
END_SHADER_PARAMETER_STRUCT()
bool IsMobileSeparateTranslucencyActive(const FViewInfo* Views, int32 NumViews)
{
for (int32 ViewIdx = 0; ViewIdx < NumViews; ++ViewIdx)
{
if (IsMobileSeparateTranslucencyActive(Views[ViewIdx]))
{
return true;
}
}
return false;
}
bool IsMobileSeparateTranslucencyActive(const FViewInfo& View)
{
return View.ParallelMeshDrawCommandPasses[EMeshPass::TranslucencyAfterDOF].HasAnyDraw();
}
void AddMobileSeparateTranslucencyPass(FRDGBuilder& GraphBuilder, FScene* Scene, const FViewInfo& View, const FMobileSeparateTranslucencyInputs& Inputs)
{
// Whether BasePass uses single pass rendering with framebuffer fetch
const bool bSinglePassRendering = !Inputs.bRequiresMultiPass;
FMobileSeparateTranslucencyPassParameters* PassParameters = GraphBuilder.AllocParameters<FMobileSeparateTranslucencyPassParameters>();
PassParameters->RenderTargets[0] = FRenderTargetBinding(Inputs.SceneColor.Texture, ERenderTargetLoadAction::ELoad);
if (bSinglePassRendering)
{
if (MobileRequiresSceneDepthAux(View.GetShaderPlatform()))
{
PassParameters->RenderTargets[1] = FRenderTargetBinding(Inputs.SceneDepthAux.Texture, ERenderTargetLoadAction::ELoad);
}
PassParameters->RenderTargets.SubpassHint = ESubpassHint::DepthReadSubpass;
}
PassParameters->RenderTargets.DepthStencil = FDepthStencilBinding(Inputs.SceneDepth.Texture, ERenderTargetLoadAction::ELoad, ERenderTargetLoadAction::ELoad, FExclusiveDepthStencil::DepthRead_StencilRead);
PassParameters->View = View.ViewUniformBuffer;
EMobileSceneTextureSetupMode SetupMode = EMobileSceneTextureSetupMode::SceneDepth | EMobileSceneTextureSetupMode::SceneDepthAux | EMobileSceneTextureSetupMode::CustomDepth;
PassParameters->MobileBasePass = CreateMobileBasePassUniformBuffer(GraphBuilder, View, EMobileBasePass::Translucent, SetupMode);
const_cast<FViewInfo&>(View).ParallelMeshDrawCommandPasses[EMeshPass::TranslucencyAfterDOF].BuildRenderingCommands(GraphBuilder, Scene->GPUScene, PassParameters->InstanceCullingDrawParams);
GraphBuilder.AddPass(
RDG_EVENT_NAME("SeparateTranslucency %dx%d", View.ViewRect.Width(), View.ViewRect.Height()),
PassParameters,
ERDGPassFlags::Raster,
[&View, PassParameters, bSinglePassRendering](FRHICommandList& RHICmdList)
{
if (bSinglePassRendering)
{
RHICmdList.NextSubpass();
}
// Set the view family's render target/viewport.
RHICmdList.SetViewport(View.ViewRect.Min.X, View.ViewRect.Min.Y, 0.0f, View.ViewRect.Max.X, View.ViewRect.Max.Y, 1.0f);
View.ParallelMeshDrawCommandPasses[EMeshPass::TranslucencyAfterDOF].DispatchDraw(nullptr, RHICmdList, &PassParameters->InstanceCullingDrawParams);
});
}