Shader output format mismatch with RenderTargets

I found 2 Shader output format mismatch with their Render Target, after enabling AGC validation.

1st one in ‘FVelocityPS’. I saw that it got refactored recently, but it is missing changes A & B for shader compatibility. B change is of particular importance for PC PSO compatibility.

2nd one is in Lumen Front Layer Translucency. This also got refactored to ‘FFrontLayerTranslucencyGBufferPS’ but still not taking into account the Render Target format as defined by ‘Lumen::GetFrontLayerTranslucencyNormalFormat()’ and allocated in ‘RenderFrontLayerTranslucency()’.

**** CHANGE A ****
class FVelocityPS : public FMeshMaterialShader
{
public:
...
 
static void ModifyCompilationEnvironment
{
    ...
    OutEnvironment.SetRenderTargetOutputFormat(0, FVelocityRendering::GetFormat(Parameters.Platform)); <== CODE CHANGE
    OutEnvironment.SetRenderTargetOutputFormat(1, FVelocityRendering::GetFormat(Parameters.Platform)); <== CODE CHANGE
}
...
}
 
**** CHANGE B ****
void ModifyBasePassCSPSCompilationEnvironment(const FMeshMaterialShaderPermutationParameters& Parameters, EGBufferLayout GBufferLayout, bool bEnableSkyLight, FShaderCompilerEnvironment& OutEnvironment)
{
    ...
    const bool bOutputVelocity = (GBufferLayout == GBL_ForceVelocity) ||
    FVelocityRendering::BasePassCanOutputVelocity(Parameters.Platform);
 
    if (bOutputVelocity)
    {
        // As defined in BasePassPixelShader.usf. Also account for Substrate setting velocity in slot 1 as described in FetchLegacyGBufferInfo.
        const int32 VelocityIndex = (Substrate::IsSubstrateEnabled() && !Substrate::IsSubstrateBlendableGBufferEnabled(Parameters.Platform)) ? 1 : (IsForwardShadingEnabled(Parameters.Platform) ? 1 : 4);
        OutEnvironment.SetRenderTargetOutputFormat(VelocityIndex, FVelocityRendering::GetFormat(Parameters.Platform)); <== CODE CHANGE
    }
...
}
 
**** CHANGE C ****
class FLumenFrontLayerTranslucencyClearGBufferPS : public FGlobalShader
{
    ...
    <= METHOD ADDED =>
    static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
    {
        FGlobalShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
        OutEnvironment.SetRenderTargetOutputFormat(0, Lumen::GetFrontLayerTranslucencyNormalFormat());
    }
};
 
**** CHANGE D ****
class FLumenFrontLayerTranslucencyGBufferPS : public FMeshMaterialShader
{
    ...
    <= METHOD ADDED =>
    static void ModifyCompilationEnvironment(const FMeshMaterialShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
    {
        FMeshMaterialShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
        OutEnvironment.SetRenderTargetOutputFormat(0, Lumen::GetFrontLayerTranslucencyNormalFormat());
    }
};

[Attachment Removed]

Steps to Reproduce
On PS5, I’m launching our game with PS5 command buffer validation enabled, and looking at the validation error that pops up.

The particulars will definitely vary with each rendering feature actives.

[Attachment Removed]

Hello there,

Thanks for providing these fixes! I’m doing a little testing in latest and anticipate having issue links for tracking soon.

It looks like C & D were addressed by this changelist in 5.8

CL#51228994 (6335e2) [Front Layer Translucency] Added missing SetRenderTargetOutputFormat(…) calls to FFrontLayerTranslucencyClearGBufferPS and FFrontLayerTranslucencyGBufferPS.

- caused validation issues on some platforms.

However, I’m not seeing that A & B were addressed yet.

[Attachment Removed]

I’ve created https://issues.unrealengine.com/issue/UE\-385737 which should be visible soon for tracking, thanks again!

[Attachment Removed]