10#include "RayTracingPayloadType.h"
134#define DECLARE_LUMEN_RAYTRACING_SHADER(ShaderClass) \
136 ShaderClass() = default; \
137 ShaderClass(const ShaderMetaType::CompiledShaderInitializerType & Initializer)\
138 : FLumenHardwareRayTracingShaderBase(Initializer) {}\
139 using TComputeShaderType = class ShaderClass##CS; \
140 using TRayGenShaderType = class ShaderClass##RGS;
142#define DECLARE_STOCHASTIC_LIGHTING_COMPUTE_RAYTRACING_SHADER(ShaderClass) \
143 DECLARE_GLOBAL_SHADER(ShaderClass##CS) \
144 SHADER_USE_PARAMETER_STRUCT(ShaderClass##CS, ShaderClass) \
145 static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters) \
147 FPermutationDomain PermutationVector(Parameters.PermutationId); \
148 if (PermutationVector.Get<FLumenHardwareRayTracingShaderBase::FBasePermutationDomain>().Get<FUseThreadGroupSize64>() && !RHISupportsWaveSize64(Parameters.Platform)) \
152 return ShaderClass::ShouldCompilePermutation(Parameters, Lumen::ERayTracingShaderDispatchType::Inline); \
154 static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)\
156 FPermutationDomain PermutationVector(Parameters.PermutationId); \
157 const bool UseThreadGroupSize64 = PermutationVector.Get<FLumenHardwareRayTracingShaderBase::FBasePermutationDomain>().Get<FUseThreadGroupSize64>() ; \
158 FIntPoint Size = GetThreadGroupSizeInternal(Lumen::ERayTracingShaderDispatchType::Inline, UseThreadGroupSize64); \
159 OutEnvironment.SetDefine(TEXT("INLINE_RAY_TRACING_THREAD_GROUP_SIZE_X"), Size.X); \
160 OutEnvironment.SetDefine(TEXT("INLINE_RAY_TRACING_THREAD_GROUP_SIZE_Y"), Size.Y); \
161 const bool bUseTracingFeedback = PermutationVector.Get<FLumenHardwareRayTracingShaderBase::FBasePermutationDomain>().Get<FUseTracingFeedback>(); \
162 OutEnvironment.SetDefine(TEXT("ENABLE_TRACING_FEEDBACK"), bUseTracingFeedback); \
163 ShaderClass::ModifyCompilationEnvironment(Parameters, Lumen::ERayTracingShaderDispatchType::Inline, OutEnvironment); \
164 ModifyCompilationEnvironmentInternal(Lumen::ERayTracingShaderDispatchType::Inline, UseThreadGroupSize64, OutEnvironment); \
166 static FPermutationDomain MakePermutationVector(ShaderClass::FPermutationDomain PermutationVector, const FViewInfo& View) \
168 FLumenHardwareRayTracingShaderBase::FBasePermutationDomain Base; \
169 Base.Set<FUseThreadGroupSize64>(UseThreadGroupSize64(View.GetShaderPlatform())); \
170 Base.Set<FUseTracingFeedback>(View.bRayTracingFeedbackEnabled); \
171 Base.Set<FNaniteRayTracing>(Nanite::GetRayTracingMode() != Nanite::ERayTracingMode::Fallback); \
172 PermutationVector.Set<FLumenHardwareRayTracingShaderBase::FBasePermutationDomain>(Base); \
173 return PermutationVector; \
175 static FIntPoint GetThreadGroupSize(EShaderPlatform ShaderPlatform) { return GetThreadGroupSizeInternal(Lumen::ERayTracingShaderDispatchType::Inline, UseThreadGroupSize64(ShaderPlatform)); } \
176 static ERayTracingPayloadType GetRayTracingPayloadType(const int32 PermutationId) { return static_cast<ERayTracingPayloadType>(0); }
178#define IMPLEMENT_LUMEN_COMPUTE_RAYTRACING_SHADER(ShaderClass) \
179 class ShaderClass##CS : public ShaderClass \
181 DECLARE_STOCHASTIC_LIGHTING_COMPUTE_RAYTRACING_SHADER(ShaderClass) \
182 static void AddLumenRayTracingDispatchIndirect(FRDGBuilder& GraphBuilder, FRDGEventName&& EventName, const FViewInfo& View, ShaderClass::FPermutationDomain PermutationVector, \
183 ShaderClass::FParameters* PassParameters, FRDGBufferRef IndirectArgsBuffer, uint32 IndirectArgsOffset, ERDGPassFlags ComputePassFlags) \
185 TShaderRef<ShaderClass##CS> ComputeShader = View.ShaderMap->GetShader<ShaderClass##CS>(MakePermutationVector(PermutationVector, View)); \
186 FComputeShaderUtils::AddPass(GraphBuilder, std::move(EventName), ComputePassFlags, ComputeShader, PassParameters, IndirectArgsBuffer, IndirectArgsOffset); \
188 static void AddLumenRayTracingDispatch(FRDGBuilder& GraphBuilder, FRDGEventName&& EventName, const FViewInfo& View, ShaderClass::FPermutationDomain PermutationVector, \
189 ShaderClass::FParameters* PassParameters, FIntVector GroupCount, ERDGPassFlags ComputePassFlags) \
191 TShaderRef<ShaderClass##CS> ComputeShader = View.ShaderMap->GetShader<ShaderClass##CS>(MakePermutationVector(PermutationVector, View)); \
192 FComputeShaderUtils::AddPass(GraphBuilder, std::move(EventName), ComputePassFlags, ComputeShader, PassParameters, GroupCount); \
196#define IMPLEMENT_MEGALIGHT_COMPUTE_RAYTRACING_SHADER(ShaderClass) \
197 class ShaderClass##CS : public ShaderClass \
199 DECLARE_STOCHASTIC_LIGHTING_COMPUTE_RAYTRACING_SHADER(ShaderClass) \
200 static void AddMegaLightRayTracingDispatchIndirect(FRDGBuilder& GraphBuilder, FRDGEventName&& EventName, const FViewInfo& View, ShaderClass::FPermutationDomain PermutationVector, \
201 ShaderClass::FParameters* PassParameters, FRDGBufferRef IndirectArgsBuffer, uint32 IndirectArgsOffset, ERDGPassFlags ComputePassFlags) \
203 TShaderRef<ShaderClass##CS> ComputeShader = View.ShaderMap->GetShader<ShaderClass##CS>(MakePermutationVector(PermutationVector, View)); \
204 FComputeShaderUtils::AddPass(GraphBuilder, std::move(EventName), ComputePassFlags, ComputeShader, PassParameters, IndirectArgsBuffer, IndirectArgsOffset); \
206 static void AddMegaLightRayTracingDispatch(FRDGBuilder& GraphBuilder, FRDGEventName&& EventName, const FViewInfo& View, ShaderClass::FPermutationDomain PermutationVector, \
207 ShaderClass::FParameters* PassParameters, FIntVector GroupCount, ERDGPassFlags ComputePassFlags) \
209 TShaderRef<ShaderClass##CS> ComputeShader = View.ShaderMap->GetShader<ShaderClass##CS>(MakePermutationVector(PermutationVector, View)); \
210 FComputeShaderUtils::AddPass(GraphBuilder, std::move(EventName), ComputePassFlags, ComputeShader, PassParameters, GroupCount); \
215template<
typename TShaderClass>
220 typename TShaderClass::FParameters* Parameters,
246 Pipeline = View.LumenRayTracingData.PipelineState;
247 SBT = View.LumenRayTracingData.ShaderBindingTable;
251 Resolution.
X, Resolution.
Y);
256template<
typename TShaderClass>
261 typename TShaderClass::FParameters* Parameters,
265 uint32 IndirectArgsOffset,
291 Pipeline = View.LumenRayTracingData.PipelineState;
292 SBT = View.LumenRayTracingData.ShaderBindingTable;
301#define DECLARE_STOCHASTIC_LIGHTING_RAYGEN_RAYTRACING_SHADER(ShaderClass) \
302 DECLARE_GLOBAL_SHADER(ShaderClass##RGS) \
303 SHADER_USE_ROOT_PARAMETER_STRUCT(ShaderClass##RGS, ShaderClass) \
304 static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters) \
306 FPermutationDomain PermutationVector(Parameters.PermutationId); \
307 if (PermutationVector.Get<FLumenHardwareRayTracingShaderBase::FBasePermutationDomain>().Get<FUseThreadGroupSize64>()) \
311 return ShaderClass::ShouldCompilePermutation(Parameters, Lumen::ERayTracingShaderDispatchType::RayGen); \
313 static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment) \
315 ShaderClass::ModifyCompilationEnvironment(Parameters, Lumen::ERayTracingShaderDispatchType::RayGen, OutEnvironment); \
316 ModifyCompilationEnvironmentInternal(Lumen::ERayTracingShaderDispatchType::RayGen, false, OutEnvironment); \
318 static FIntPoint GetThreadGroupSize() { return GetThreadGroupSizeInternal(Lumen::ERayTracingShaderDispatchType::RayGen, false); } \
319 static const FShaderBindingLayout* GetShaderBindingLayout(const FShaderPermutationParameters& Parameters) \
321 return RayTracing::GetShaderBindingLayout(Parameters.Platform); \
324#define IMPLEMENT_LUMEN_RAYGEN_RAYTRACING_SHADER(ShaderClass) \
325 class ShaderClass##RGS : public ShaderClass \
327 DECLARE_STOCHASTIC_LIGHTING_RAYGEN_RAYTRACING_SHADER(ShaderClass) \
328 static void AddLumenRayTracingDispatchIndirect(FRDGBuilder& GraphBuilder, FRDGEventName&& EventName, const FViewInfo& View, ShaderClass::FPermutationDomain PermutationVector, \
329 ShaderClass::FParameters* PassParameters, FRDGBufferRef IndirectArgsBuffer, uint32 IndirectArgsOffset, bool bUseMinimalPayload, ERDGPassFlags ComputePassFlags) \
331 TShaderRef<ShaderClass##RGS> RayGenerationShader = View.ShaderMap->GetShader<ShaderClass##RGS>(PermutationVector); \
332 AddStochasticLightingRayTraceDispatchIndirectPass(GraphBuilder, std::move(EventName), RayGenerationShader, PassParameters, PassParameters->SharedParameters.TracingParameters.Scene, PassParameters->SharedParameters.NaniteRayTracing, IndirectArgsBuffer, IndirectArgsOffset, View, bUseMinimalPayload, ComputePassFlags); \
334 static void AddLumenRayTracingDispatch(FRDGBuilder& GraphBuilder, FRDGEventName&& EventName, const FViewInfo& View, ShaderClass::FPermutationDomain PermutationVector, \
335 ShaderClass::FParameters* PassParameters, FIntPoint DispatchResolution, bool bUseMinimalPayload, ERDGPassFlags ComputePassFlags) \
337 TShaderRef<ShaderClass##RGS> RayGenerationShader = View.ShaderMap->GetShader<ShaderClass##RGS>(PermutationVector); \
338 AddStochasticLightingRayTraceDispatchPass(GraphBuilder, std::move(EventName), RayGenerationShader, PassParameters, PassParameters->SharedParameters.TracingParameters.Scene, PassParameters->SharedParameters.NaniteRayTracing, DispatchResolution, View, bUseMinimalPayload, ComputePassFlags); \
342#define IMPLEMENT_MEGALIGHT_RAYGEN_RAYTRACING_SHADER(ShaderClass) \
343 class ShaderClass##RGS : public ShaderClass \
345 DECLARE_STOCHASTIC_LIGHTING_RAYGEN_RAYTRACING_SHADER(ShaderClass) \
346 static void AddMegaLightRayTracingDispatchIndirect(FRDGBuilder& GraphBuilder, FRDGEventName&& EventName, const FViewInfo& View, ShaderClass::FPermutationDomain PermutationVector, \
347 ShaderClass::FParameters* PassParameters, FRDGBufferRef IndirectArgsBuffer, uint32 IndirectArgsOffset, bool bUseMinimalPayload, ERDGPassFlags ComputePassFlags) \
349 TShaderRef<ShaderClass##RGS> RayGenerationShader = View.ShaderMap->GetShader<ShaderClass##RGS>(PermutationVector); \
350 AddStochasticLightingRayTraceDispatchIndirectPass(GraphBuilder, std::move(EventName), RayGenerationShader, PassParameters, PassParameters->MegaLightsParameters.Scene, PassParameters->NaniteRayTracing, IndirectArgsBuffer, IndirectArgsOffset, View, bUseMinimalPayload, ComputePassFlags); \
352 static void AddMegaLightRayTracingDispatch(FRDGBuilder& GraphBuilder, FRDGEventName&& EventName, const FViewInfo& View, ShaderClass::FPermutationDomain PermutationVector, \
353 ShaderClass::FParameters* PassParameters, FIntPoint DispatchResolution, bool bUseMinimalPayload, ERDGPassFlags ComputePassFlags) \
355 TShaderRef<ShaderClass##RGS> RayGenerationShader = View.ShaderMap->GetShader<ShaderClass##RGS>(PermutationVector); \
356 AddStochasticLightingRayTraceDispatchPass(GraphBuilder, std::move(EventName), RayGenerationShader, PassParameters, PassParameters->MegaLightsParameters.Scene, PassParameters->NaniteRayTracing, DispatchResolution, View, bUseMinimalPayload, ComputePassFlags); \
360#define IMPLEMENT_LUMEN_RAYGEN_AND_COMPUTE_RAYTRACING_SHADERS(ShaderClass) \
361 IMPLEMENT_LUMEN_COMPUTE_RAYTRACING_SHADER(ShaderClass) \
362 IMPLEMENT_LUMEN_RAYGEN_RAYTRACING_SHADER(ShaderClass)
364#define IMPLEMENT_MEGALIGHT_RAYGEN_AND_COMPUTE_RAYTRACING_SHADERS(ShaderClass) \
365 IMPLEMENT_MEGALIGHT_COMPUTE_RAYTRACING_SHADER(ShaderClass) \
366 IMPLEMENT_MEGALIGHT_RAYGEN_RAYTRACING_SHADER(ShaderClass)
391 && FLumenHardwareRayTracingShaderBase::ShouldCompilePermutation(Parameters,
ShaderDispatchType);
400 FLumenHardwareRayTracingShaderBase::FSharedParameters* SharedParameters);
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
EReflectionsMethod
Definition DeferredShadingRenderer.h:307
EDiffuseIndirectMethod
Definition DeferredShadingRenderer.h:291
@ RaytracingAccelerationStructure
ERDGPassFlags
Definition RenderGraphDefinitions.h:128
void ClearUnusedGraphResources(const TShaderRef< TShaderClass > &Shader, const FShaderParametersMetadata *ParametersMetadata, typename TShaderClass::FParameters *InoutParameters, std::initializer_list< FRDGResourceRef > ExcludeList={})
Definition RenderGraphUtils.h:195
bool DoesPlatformSupportLumenGI(EShaderPlatform Platform, bool bSkipProjectCheck)
Definition RenderUtils.cpp:2358
#define SHADER_PARAMETER_RDG_BUFFER_SRV(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1800
#define SHADER_PARAMETER_RDG_BUFFER_UAV(ShaderType, MemberName)
Definition ShaderParameterMacros.h:1812
#define BEGIN_UNIFORM_BUFFER_STRUCT(StructTypeName, DllStorage)
Definition ShaderParameterMacros.h:1512
#define BEGIN_SHADER_PARAMETER_STRUCT(StructTypeName, DllStorage)
Definition ShaderParameterMacros.h:1482
#define SHADER_PARAMETER_STRUCT_REF(StructType, MemberName)
Definition ShaderParameterMacros.h:1909
#define SHADER_PARAMETER_STRUCT_INCLUDE(StructType, MemberName)
Definition ShaderParameterMacros.h:1895
#define END_UNIFORM_BUFFER_STRUCT()
Definition ShaderParameterMacros.h:1520
#define SHADER_PARAMETER_RDG_UNIFORM_BUFFER(StructType, MemberName)
Definition ShaderParameterMacros.h:1823
#define END_SHADER_PARAMETER_STRUCT()
Definition ShaderParameterMacros.h:1485
#define SHADER_PARAMETER(MemberType, MemberName)
Definition ShaderParameterMacros.h:1684
void SetShaderParameters(FRHIBatchedShaderParameters &BatchedParameters, const FShaderParameterBindings &Bindings, const FShaderParametersMetadata *ParametersMetadata, const void *InParametersData)
Definition ShaderParameterStruct.cpp:883
#define SHADER_PERMUTATION_BOOL(InDefineName)
Definition ShaderPermutation.h:482
Definition GlobalShader.h:269
Definition RenderGraphResources.h:1321
FRHIBuffer * GetIndirectRHICallBuffer() const
Definition RenderGraphResources.h:1338
Definition RenderGraphBuilder.h:49
FRDGPassRef AddPass(FRDGEventName &&Name, const ParameterStructType *ParameterStruct, ERDGPassFlags Flags, ExecuteLambdaType &&ExecuteLambda)
Definition RenderGraphEvent.h:38
virtual RENDERCORE_API void MarkResourceAsUsed()
The following methods may only be called during pass execution.
FRHIBatchedShaderParameters & GetScratchShaderParameters()
Definition RHICommandList.h:1190
Definition RHICommandList.h:3819
void RayTraceDispatchIndirect(FRayTracingPipelineState *Pipeline, FRHIRayTracingShader *RayGenShader, FRHIShaderBindingTable *SBT, const FRayTracingShaderBindings &GlobalResourceBindings, FRHIBuffer *ArgumentBuffer, uint32 ArgumentOffset)
Definition RHICommandList.h:3687
void RayTraceDispatch(FRayTracingPipelineState *Pipeline, FRHIRayTracingShader *RayGenShader, FRHIShaderBindingTable *SBT, const FRayTracingShaderBindings &GlobalResourceBindings, uint32 Width, uint32 Height)
Definition RHICommandList.h:3668
Definition RHIResources.h:3863
Definition PipelineStateCache.cpp:1285
Definition SceneRendering.h:1132
void ModifyCompilationEnvironment(EShaderPlatform Platform, FDecalBlendDesc DecalBlendDesc, EDecalRenderStage DecalRenderStage, FShaderCompilerEnvironment &OutEnvironment)
Definition DecalRenderingCommon.cpp:959
bool ShouldCompilePermutation(ELightmapQuality LightmapQuality, const FMeshMaterialShaderPermutationParameters &Parameters)
Definition LightMapRendering.cpp:48
Definition LumenHardwareRayTracingCommon.h:22
uint32 GetHitLightingShadowTranslucencyMode()
Definition LumenHardwareRayTracingCommon.cpp:289
EHitLightingMode GetHitLightingMode(const FViewInfo &View, EDiffuseIndirectMethod DiffuseIndirectMethod)
Definition LumenHardwareRayTracingCommon.cpp:247
void SetRayTracingSceneOptions(const FViewInfo &View, EDiffuseIndirectMethod DiffuseIndirectMethod, EReflectionsMethod ReflectionsMethod, RayTracing::FSceneOptions &SceneOptions)
Definition LumenHardwareRayTracingCommon.cpp:232
bool UseHitLightingDirectLighting()
Definition LumenHardwareRayTracingCommon.cpp:299
uint32 GetHitLightingShadowMode()
Definition LumenHardwareRayTracingCommon.cpp:284
bool IsInlineSupported()
Definition LumenHardwareRayTracingCommon.cpp:187
EAvoidSelfIntersectionsMode GetAvoidSelfIntersectionsMode()
Definition LumenHardwareRayTracingCommon.cpp:198
bool IsRayGenSupported()
Definition LumenHardwareRayTracingCommon.cpp:192
bool UseHitLightingSkylight(EDiffuseIndirectMethod DiffuseIndirectMethod)
Definition LumenHardwareRayTracingCommon.cpp:304
bool UseSurfaceCacheAlphaMasking()
Definition LumenHardwareRayTracingCommon.cpp:212
bool UseReflectionCapturesForHitLighting()
Definition LumenHardwareRayTracingCommon.cpp:315
float GetFarFieldBias()
Definition LumenHardwareRayTracingCommon.cpp:342
bool UseHitLightingForceOpaque()
Definition LumenHardwareRayTracingCommon.cpp:294
bool UseShaderExecutionReordering()
Definition LumenHardwareRayTracingCommon.cpp:336
EAvoidSelfIntersectionsMode
Definition LumenHardwareRayTracingCommon.h:24
EHitLightingMode
Definition LumenHardwareRayTracingCommon.h:33
@ HitLightingForReflections
Definition DeferredShadingRenderer.cpp:316
ESurfaceCacheSampling
Definition Lumen.h:122
Definition SceneManagement.h:73
@ RayGen
Definition VulkanCommon.h:44
Definition RenderUtils.cpp:2080
Definition GlobalShader.h:73
Definition RenderGraphDefinitions.h:103
Definition RHIShaderParameters.h:241
Definition ShaderCore.h:544
const EShaderPlatform Platform
Definition ShaderPermutation.h:29
Definition RayTracing.h:27
Definition Optional.h:131
Definition ShaderPermutation.h:229
IntType Y
Definition IntPoint.h:37
IntType X
Definition IntPoint.h:34