2019-12-26 14:45:42 -05:00
// Copyright Epic Games, Inc. All Rights Reserved.
2018-12-18 21:41:17 -05:00
# include "BuiltInRayTracingShaders.h"
2021-01-11 09:49:56 -04:00
# include "ShaderParameterUtils.h"
2022-02-08 13:19:37 -05:00
# include "PipelineStateCache.h"
2023-01-31 01:12:18 -05:00
# include "RendererInterface.h"
2018-12-18 21:41:17 -05:00
# if RHI_RAYTRACING
2022-10-28 23:28:11 -04:00
# include "RayTracingPayloadType.h"
2023-03-28 05:25:01 -04:00
uint32 GetRaytracingMaterialPayloadSizeFullySimplified ( )
2023-01-31 01:12:18 -05:00
{
2023-09-01 15:06:19 -04:00
if ( Substrate : : IsSubstrateEnabled ( ) )
2023-03-27 08:31:19 -04:00
{
2023-09-01 15:06:19 -04:00
// All the data from FPackedMaterialClosestHitPayload except FSubstrateRaytracingPayload (see RayTracingCommon.ush)
2023-03-27 08:31:19 -04:00
uint32 PayloadSizeBytes = 6 * sizeof ( uint32 ) ;
2023-09-01 15:06:19 -04:00
// The remaining data from FSubstrateRaytracingPayload.
2023-03-28 05:25:01 -04:00
const bool bFullySimplifiedMaterial = true ; // This is needed because ERayTracingPayloadType::RayTracingMaterial will be fully simplified, see FShaderType::ModifyCompilationEnvironment.
2023-09-01 15:06:19 -04:00
PayloadSizeBytes + = Substrate : : GetRayTracingMaterialPayloadSizeInBytes ( bFullySimplifiedMaterial ) ;
2023-03-27 08:31:19 -04:00
return PayloadSizeBytes ;
}
return 64u ;
2023-01-31 01:12:18 -05:00
}
2022-11-30 13:53:00 -05:00
IMPLEMENT_RT_PAYLOAD_TYPE ( ERayTracingPayloadType : : Default , 24 ) ;
2023-03-28 05:25:01 -04:00
IMPLEMENT_RT_PAYLOAD_TYPE_FUNCTION ( ERayTracingPayloadType : : RayTracingMaterial , GetRaytracingMaterialPayloadSizeFullySimplified ) ;
2022-11-30 13:53:00 -05:00
2022-10-27 10:21:14 -04:00
IMPLEMENT_GLOBAL_SHADER ( FDefaultPayloadMS , " /Engine/Private/RayTracing/RayTracingBuiltInShaders.usf " , " DefaultPayloadMS " , SF_RayMiss ) ;
IMPLEMENT_GLOBAL_SHADER ( FPackedMaterialClosestHitPayloadMS , " /Engine/Private/RayTracing/RayTracingBuiltInShaders.usf " , " PackedMaterialClosestHitPayloadMS " , SF_RayMiss ) ;
2021-01-11 09:49:56 -04:00
IMPLEMENT_GLOBAL_SHADER ( FRayTracingDispatchDescCS , " /Engine/Private/RayTracing/RayTracingDispatchDesc.usf " , " RayTracingDispatchDescCS " , SF_Compute ) ;
2022-10-28 23:28:11 -04:00
ERayTracingPayloadType FDefaultPayloadMS : : GetRayTracingPayloadType ( const int32 PermutationId )
{
return ERayTracingPayloadType : : Default ;
}
ERayTracingPayloadType FPackedMaterialClosestHitPayloadMS : : GetRayTracingPayloadType ( const int32 PermutationId )
{
return ERayTracingPayloadType : : RayTracingMaterial ;
}
2021-01-11 09:49:56 -04:00
void FRayTracingDispatchDescCS : : Dispatch ( FRHICommandList & RHICmdList ,
const void * DispatchDescInput , uint32 DispatchDescSize , uint32 DispatchDescDimensionsOffset ,
FRHIShaderResourceView * DispatchDimensionsSRV , uint32 DimensionsBufferOffset ,
FRHIUnorderedAccessView * DispatchDescOutputUAV )
{
const uint32 DispatchDescSizeDwords = DispatchDescSize / 4 ;
const uint32 DispatchDescDimensionsOffsetDwords = DispatchDescDimensionsOffset / 4 ;
checkf ( DimensionsBufferOffset % 4 = = 0 , TEXT ( " Dispatch dimensions buffer offset must be DWORD-aligned " ) ) ;
const uint32 DimensionsBufferOffsetDwords = DimensionsBufferOffset / 4 ;
check ( DispatchDescSizeDwords < = DispatchDescMaxSizeDwords ) ;
TShaderMapRef < FRayTracingDispatchDescCS > ComputeShader ( GetGlobalShaderMap ( GMaxRHIFeatureLevel ) ) ;
FRHIComputeShader * ShaderRHI = ComputeShader . GetComputeShader ( ) ;
2022-02-08 13:19:37 -05:00
SetComputePipelineState ( RHICmdList , ShaderRHI ) ;
2021-01-11 09:49:56 -04:00
static_assert ( DispatchDescMaxSizeDwords % 4 = = 0 , " DispatchDescMaxSizeDwords must be a multiple of 4 " ) ;
static constexpr uint32 DispatchDescMaxSizeUint4s = DispatchDescMaxSizeDwords / 4 ;
FUintVector4 DispatchDescData [ DispatchDescMaxSizeUint4s ] = { } ;
FMemory : : Memcpy ( DispatchDescData , DispatchDescInput , DispatchDescSize ) ;
2023-02-03 15:45:12 -05:00
FRHIBatchedShaderParameters & BatchedParameters = RHICmdList . GetScratchShaderParameters ( ) ;
2021-01-11 09:49:56 -04:00
2023-02-03 13:03:11 -05:00
SetShaderValueArray ( BatchedParameters , ComputeShader - > DispatchDescInputParam , DispatchDescData , DispatchDescMaxSizeUint4s ) ;
SetShaderValue ( BatchedParameters , ComputeShader - > DispatchDescSizeDwordsParam , DispatchDescSizeDwords ) ;
SetShaderValue ( BatchedParameters , ComputeShader - > DispatchDescDimensionsOffsetDwordsParam , DispatchDescDimensionsOffsetDwords ) ;
SetShaderValue ( BatchedParameters , ComputeShader - > DimensionsBufferOffsetDwordsParam , DimensionsBufferOffsetDwords ) ;
SetSRVParameter ( BatchedParameters , ComputeShader - > DispatchDimensionsParam , DispatchDimensionsSRV ) ;
SetUAVParameter ( BatchedParameters , ComputeShader - > DispatchDescOutputParam , DispatchDescOutputUAV ) ;
RHICmdList . SetBatchedShaderParameters ( ComputeShader . GetComputeShader ( ) , BatchedParameters ) ;
2021-01-11 09:49:56 -04:00
RHICmdList . DispatchComputeShader ( 1 , 1 , 1 ) ;
2023-09-01 10:28:05 -04:00
if ( RHICmdList . NeedsShaderUnbinds ( ) )
{
FRHIBatchedShaderUnbinds & BatchedUnbinds = RHICmdList . GetScratchShaderUnbinds ( ) ;
2023-02-03 13:03:11 -05:00
2023-09-01 10:28:05 -04:00
UnsetSRVParameter ( BatchedUnbinds , ComputeShader - > DispatchDimensionsParam ) ;
UnsetUAVParameter ( BatchedUnbinds , ComputeShader - > DispatchDescOutputParam ) ;
RHICmdList . SetBatchedShaderUnbinds ( ComputeShader . GetComputeShader ( ) , BatchedUnbinds ) ;
}
2021-01-11 09:49:56 -04:00
}
2018-12-18 21:41:17 -05:00
# endif // RHI_RAYTRACING