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-01-31 01:12:18 -05:00
|
|
|
uint32 GetRaytracingMaterialPayloadSize()
|
|
|
|
|
{
|
|
|
|
|
return Strata::IsStrataEnabled() ? Strata::GetRayTracingMaterialPayloadSizeInBytes() : 64u;
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-30 13:53:00 -05:00
|
|
|
IMPLEMENT_RT_PAYLOAD_TYPE(ERayTracingPayloadType::Default, 24);
|
2023-01-31 01:12:18 -05:00
|
|
|
IMPLEMENT_RT_PAYLOAD_TYPE_FUNCTION(ERayTracingPayloadType::RayTracingMaterial, GetRaytracingMaterialPayloadSize);
|
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-02-03 13:03:11 -05:00
|
|
|
BatchedParameters.Reset();
|
|
|
|
|
|
|
|
|
|
SetSRVParameter(BatchedParameters, ComputeShader->DispatchDimensionsParam, nullptr);
|
|
|
|
|
SetUAVParameter(BatchedParameters, ComputeShader->DispatchDescOutputParam, nullptr);
|
|
|
|
|
RHICmdList.SetBatchedShaderParameters(ComputeShader.GetComputeShader(), BatchedParameters);
|
2021-01-11 09:49:56 -04:00
|
|
|
}
|
|
|
|
|
|
2018-12-18 21:41:17 -05:00
|
|
|
#endif // RHI_RAYTRACING
|