Files
UnrealEngineUWP/Engine/Source/Runtime/RenderCore/Private/BuiltInRayTracingShaders.cpp
Yuriy ODonnell c2ca012ff9 Implemented support for indirect ray tracing dispatch in D3D12 / DXR 1.1.
#rb Kenzo.Terelst
#jira UE-106035

[CL 15036968 by Yuriy ODonnell in ue5-main branch]
2021-01-11 09:49:56 -04:00

56 lines
3.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "BuiltInRayTracingShaders.h"
#include "ShaderParameterUtils.h"
#if RHI_RAYTRACING
IMPLEMENT_GLOBAL_SHADER( FOcclusionMainRG, "/Engine/Private/RayTracing/RayTracingBuiltInShaders.usf", "OcclusionMainRG", SF_RayGen);
IMPLEMENT_GLOBAL_SHADER( FIntersectionMainRG, "/Engine/Private/RayTracing/RayTracingBuiltInShaders.usf", "IntersectionMainRG", SF_RayGen);
IMPLEMENT_SHADER_TYPE(, FIntersectionMainCHS, TEXT("/Engine/Private/RayTracing/RayTracingBuiltInShaders.usf"), TEXT("IntersectionMainCHS"), SF_RayHitGroup);
IMPLEMENT_SHADER_TYPE(, FDefaultMainCHS, TEXT("/Engine/Private/RayTracing/RayTracingBuiltInShaders.usf"), TEXT("DefaultMainCHS"), SF_RayHitGroup);
IMPLEMENT_SHADER_TYPE(, FDefaultMainCHSOpaqueAHS, TEXT("/Engine/Private/RayTracing/RayTracingBuiltInShaders.usf"), TEXT("closesthit=DefaultMainCHS anyhit=DefaultOpaqueAHS"), SF_RayHitGroup);
IMPLEMENT_SHADER_TYPE(, FDefaultPayloadMS, TEXT("/Engine/Private/RayTracing/RayTracingBuiltInShaders.usf"), TEXT("DefaultPayloadMS"), SF_RayMiss);
IMPLEMENT_SHADER_TYPE(, FPackedMaterialClosestHitPayloadMS, TEXT("/Engine/Private/RayTracing/RayTracingBuiltInShaders.usf"), TEXT("PackedMaterialClosestHitPayloadMS"), SF_RayMiss);
IMPLEMENT_GLOBAL_SHADER(FRayTracingDispatchDescCS, "/Engine/Private/RayTracing/RayTracingDispatchDesc.usf", "RayTracingDispatchDescCS", SF_Compute);
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();
RHICmdList.SetComputeShader(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