You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
This is meant to help avoid inconsistencies between GetRayTracingPayloadType() and the shader code. As an example of the usage, convert RayTracingDebug related shaders to only enable the payload conditionally. Fix the current incorrect mixing of payload uses in the same shader by introducing a permutation for the material version of the debug shader vs. the one that uses the debug payload (this was previously a runtime shader parameter only which implied two different payloads could theoretically be compiled into one RTPSO). Also conditionaly enable some of the simpler payload types like the niagara and decal ones that are only used in a few places. Other payloads will be handled in future refactors. Split RayTracingDebug.usf into smaller files that only have one raytracing entry in them to reduce the amount of counditional logic needed around payloads. #rb Yuriy.ODonnell #jira none #preflight 635c49e9ae6840072d4df82f [CL 22849513 by chris kulla in ue5-main branch]
78 lines
3.7 KiB
C++
78 lines
3.7 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "BuiltInRayTracingShaders.h"
|
|
#include "ShaderParameterUtils.h"
|
|
#include "PipelineStateCache.h"
|
|
|
|
#if RHI_RAYTRACING
|
|
|
|
#include "RayTracingPayloadType.h"
|
|
|
|
IMPLEMENT_GLOBAL_SHADER( FDefaultMainCHS, "/Engine/Private/RayTracing/RayTracingBuiltInShaders.usf", "DefaultMainCHS", SF_RayHitGroup);
|
|
IMPLEMENT_GLOBAL_SHADER( FDefaultMainCHSOpaqueAHS, "/Engine/Private/RayTracing/RayTracingBuiltInShaders.usf", "closesthit=DefaultMainCHS anyhit=DefaultOpaqueAHS", SF_RayHitGroup);
|
|
IMPLEMENT_GLOBAL_SHADER( FDefaultPayloadMS, "/Engine/Private/RayTracing/RayTracingBuiltInShaders.usf", "DefaultPayloadMS", SF_RayMiss);
|
|
IMPLEMENT_GLOBAL_SHADER( FPackedMaterialClosestHitPayloadMS, "/Engine/Private/RayTracing/RayTracingBuiltInShaders.usf", "PackedMaterialClosestHitPayloadMS", SF_RayMiss);
|
|
|
|
IMPLEMENT_GLOBAL_SHADER(FRayTracingDispatchDescCS, "/Engine/Private/RayTracing/RayTracingDispatchDesc.usf", "RayTracingDispatchDescCS", SF_Compute);
|
|
|
|
|
|
ERayTracingPayloadType FDefaultMainCHS::GetRayTracingPayloadType(const int32 PermutationId)
|
|
{
|
|
return ERayTracingPayloadType::Default;
|
|
}
|
|
|
|
ERayTracingPayloadType FDefaultMainCHSOpaqueAHS::GetRayTracingPayloadType(const int32 PermutationId)
|
|
{
|
|
return ERayTracingPayloadType::Default;
|
|
}
|
|
|
|
ERayTracingPayloadType FDefaultPayloadMS::GetRayTracingPayloadType(const int32 PermutationId)
|
|
{
|
|
return ERayTracingPayloadType::Default;
|
|
}
|
|
|
|
ERayTracingPayloadType FPackedMaterialClosestHitPayloadMS::GetRayTracingPayloadType(const int32 PermutationId)
|
|
{
|
|
return ERayTracingPayloadType::RayTracingMaterial;
|
|
}
|
|
|
|
|
|
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();
|
|
SetComputePipelineState(RHICmdList, ShaderRHI);
|
|
|
|
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);
|
|
|
|
SetShaderValueArray(RHICmdList, ShaderRHI, ComputeShader->DispatchDescInputParam, DispatchDescData, DispatchDescMaxSizeUint4s);
|
|
SetShaderValue(RHICmdList, ShaderRHI, ComputeShader->DispatchDescSizeDwordsParam, DispatchDescSizeDwords);
|
|
SetShaderValue(RHICmdList, ShaderRHI, ComputeShader->DispatchDescDimensionsOffsetDwordsParam, DispatchDescDimensionsOffsetDwords);
|
|
SetShaderValue(RHICmdList, ShaderRHI, ComputeShader->DimensionsBufferOffsetDwordsParam, DimensionsBufferOffsetDwords);
|
|
|
|
SetSRVParameter(RHICmdList, ShaderRHI, ComputeShader->DispatchDimensionsParam, DispatchDimensionsSRV);
|
|
SetUAVParameter(RHICmdList, ShaderRHI, ComputeShader->DispatchDescOutputParam, DispatchDescOutputUAV);
|
|
|
|
RHICmdList.DispatchComputeShader(1, 1, 1);
|
|
|
|
SetSRVParameter(RHICmdList, ShaderRHI, ComputeShader->DispatchDimensionsParam, nullptr);
|
|
SetUAVParameter(RHICmdList, ShaderRHI, ComputeShader->DispatchDescOutputParam, nullptr);
|
|
}
|
|
|
|
#endif // RHI_RAYTRACING
|