Files
UnrealEngine/Engine/Source/Runtime/Renderer/Private/MaterialCache/MaterialCacheShaders.cpp
2025-05-18 13:04:45 +08:00

142 lines
7.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "MaterialCache/MaterialCacheShaders.h"
#include "MaterialCache/MaterialCache.h"
#include "DataDrivenShaderPlatformInfo.h"
using FMaterialCacheUnwrapVS0 = FMaterialCacheUnwrapVS<false>;
using FMaterialCacheUnwrapVS1 = FMaterialCacheUnwrapVS<true>;
IMPLEMENT_MATERIAL_SHADER_TYPE(template<>, FMaterialCacheUnwrapVS0, TEXT("/Engine/Private/MaterialCache/MaterialCacheUnwrapVertexShader.usf"), TEXT("Main"), SF_Vertex);
IMPLEMENT_MATERIAL_SHADER_TYPE(template<>, FMaterialCacheUnwrapVS1, TEXT("/Engine/Private/MaterialCache/MaterialCacheUnwrapVertexShader.usf"), TEXT("Main"), SF_Vertex);
IMPLEMENT_MATERIAL_SHADER_TYPE(, FMaterialCacheUnwrapPS, TEXT("/Engine/Private/MaterialCache/MaterialCacheUnwrapPixelShader.usf"), TEXT("Main"), SF_Pixel);
IMPLEMENT_MATERIAL_SHADER_TYPE(, FMaterialCacheNaniteShadeCS, TEXT("/Engine/Private/MaterialCache/MaterialCacheUnwrapNaniteShade.usf"), TEXT("Main"), SF_Compute);
IMPLEMENT_MATERIAL_SHADER_TYPE(, FMaterialCacheShadeCS, TEXT("/Engine/Private/MaterialCache/MaterialCacheShade.usf"), TEXT("Main"), SF_Compute);
IMPLEMENT_GLOBAL_SHADER(FMaterialCacheABufferWritePagesCS, "/Engine/Private/MaterialCache/MaterialCacheABufferPages.usf", "WritePagesMain", SF_Compute);
template<bool bSupportsViewportFromVS>
bool FMaterialCacheUnwrapVS<bSupportsViewportFromVS>::ShouldCompilePermutation(const FMeshMaterialShaderPermutationParameters& Parameters)
{
const bool bSupportsMaterialCache = Parameters.MaterialParameters.bSupportsMaterialCache || Parameters.MaterialParameters.bIsDefaultMaterial;
return IsMaterialCacheSupported(Parameters.Platform) && bSupportsMaterialCache;
}
template<bool bSupportsViewportFromVS>
void FMaterialCacheUnwrapVS<bSupportsViewportFromVS>::ModifyCompilationEnvironment(const FMaterialShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
{
OutEnvironment.SetDefine(TEXT("MATERIAL_CACHE"), 1);
OutEnvironment.SetDefine(TEXT("SUPPORTS_VIEWPORT_FROM_VS"), bSupportsViewportFromVS);
// TODO[MP]: Add permutation for lack of support
OutEnvironment.CompilerFlags.Add(CFLAG_RootConstants);
}
bool FMaterialCacheUnwrapPS::ShouldCompilePermutation(const FMeshMaterialShaderPermutationParameters& Parameters)
{
const bool bSupportsMaterialCache = Parameters.MaterialParameters.bSupportsMaterialCache || Parameters.MaterialParameters.bIsDefaultMaterial;
return IsMaterialCacheSupported(Parameters.Platform) && bSupportsMaterialCache;
}
void FMaterialCacheUnwrapPS::ModifyCompilationEnvironment(const FMaterialShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
{
FMeshMaterialShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
OutEnvironment.SetDefine(TEXT("SUBSTRATE_INLINE_SHADING"), 1);
OutEnvironment.SetDefine(TEXT("SUBSTRATE_USE_FULLYSIMPLIFIED_MATERIAL"), 1);
OutEnvironment.SetDefine(TEXT("SCENE_TEXTURES_DISABLED"), 1);
OutEnvironment.SetDefine(TEXT("MATERIAL_CACHE"), 1);
}
bool FMaterialCacheNaniteShadeCS::ShouldCompilePermutation(const FMeshMaterialShaderPermutationParameters& Parameters)
{
const bool bSupportsMaterialCache = Parameters.MaterialParameters.bSupportsMaterialCache || Parameters.MaterialParameters.bIsDefaultMaterial;
return
IsMaterialCacheSupported(Parameters.Platform) &&
FDataDrivenShaderPlatformInfo::GetSupportsBindless(Parameters.Platform) &&
Parameters.VertexFactoryType->SupportsNaniteRendering() &&
Parameters.VertexFactoryType->SupportsComputeShading() &&
bSupportsMaterialCache;
}
FMaterialCacheNaniteShadeCS::FMaterialCacheNaniteShadeCS(const ShaderMetaType::CompiledShaderInitializerType& Initializer): FMeshMaterialShader(Initializer)
{
PassDataParam.Bind(Initializer.ParameterMap, TEXT("PassData"));
PageIndirectionsParam.Bind(Initializer.ParameterMap, TEXT("PageIndirections"));
}
void FMaterialCacheNaniteShadeCS::ModifyCompilationEnvironment(const FMeshMaterialShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
{
FMeshMaterialShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
OutEnvironment.SetDefine(TEXT("SUBSTRATE_INLINE_SHADING"), 1);
OutEnvironment.SetDefine(TEXT("SUBSTRATE_USE_FULLYSIMPLIFIED_MATERIAL"), 1);
OutEnvironment.SetDefine(TEXT("SCENE_TEXTURES_DISABLED"), 1);
OutEnvironment.SetDefine(TEXT("MATERIAL_CACHE"), 1);
// Force shader model 6.0+
OutEnvironment.CompilerFlags.Add(CFLAG_ForceDXC);
OutEnvironment.CompilerFlags.Add(CFLAG_HLSL2021);
OutEnvironment.CompilerFlags.Add(CFLAG_RootConstants);
OutEnvironment.CompilerFlags.Add(CFLAG_CheckForDerivativeOps);
}
void FMaterialCacheNaniteShadeCS::SetPassParameters(FRHIBatchedShaderParameters& BatchedParameters, const FUintVector4& PassData, FRHIShaderResourceView* PageIndirections)
{
SetShaderValue(BatchedParameters, PassDataParam, PassData);
SetSRVParameter(BatchedParameters, PageIndirectionsParam, PageIndirections);
}
bool FMaterialCacheShadeCS::ShouldCompilePermutation(const FMeshMaterialShaderPermutationParameters& Parameters)
{
const bool bSupportsMaterialCache = Parameters.MaterialParameters.bSupportsMaterialCache || Parameters.MaterialParameters.bIsDefaultMaterial;
return
IsMaterialCacheSupported(Parameters.Platform) &&
FDataDrivenShaderPlatformInfo::GetSupportsBindless(Parameters.Platform) &&
Parameters.VertexFactoryType->SupportsNaniteRendering() &&
Parameters.VertexFactoryType->SupportsComputeShading() &&
bSupportsMaterialCache;
}
FMaterialCacheShadeCS::FMaterialCacheShadeCS(const ShaderMetaType::CompiledShaderInitializerType& Initializer): FMeshMaterialShader(Initializer)
{
PassDataParam.Bind(Initializer.ParameterMap, TEXT("PassData"));
PageIndirectionsParam.Bind(Initializer.ParameterMap, TEXT("PageIndirections"));
}
void FMaterialCacheShadeCS::ModifyCompilationEnvironment(const FMeshMaterialShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
{
FMeshMaterialShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
OutEnvironment.SetDefine(TEXT("SUBSTRATE_INLINE_SHADING"), 1);
OutEnvironment.SetDefine(TEXT("SUBSTRATE_USE_FULLYSIMPLIFIED_MATERIAL"), 1);
OutEnvironment.SetDefine(TEXT("SCENE_TEXTURES_DISABLED"), 1);
OutEnvironment.SetDefine(TEXT("USE_ANALYTIC_DERIVATIVES"), 1);
OutEnvironment.SetDefine(TEXT("MATERIAL_CACHE"), 1);
// Force shader model 6.0+
OutEnvironment.CompilerFlags.Add(CFLAG_ForceDXC);
OutEnvironment.CompilerFlags.Add(CFLAG_HLSL2021);
OutEnvironment.CompilerFlags.Add(CFLAG_RootConstants);
OutEnvironment.CompilerFlags.Add(CFLAG_CheckForDerivativeOps);
}
void FMaterialCacheShadeCS::SetPassParameters(FRHIBatchedShaderParameters& BatchedParameters, const FUintVector4& PassData, FRHIShaderResourceView* PageIndirections)
{
SetShaderValue(BatchedParameters, PassDataParam, PassData);
SetSRVParameter(BatchedParameters, PageIndirectionsParam, PageIndirections);
}
bool FMaterialCacheABufferWritePagesCS::ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
{
return IsMaterialCacheSupported(Parameters.Platform);
}
/** Instantiations **/
template class FMaterialCacheUnwrapVS<false>;
template class FMaterialCacheUnwrapVS<true>;