Files
UnrealEngine/Engine/Shaders/Private/VirtualShadowMaps/VirtualShadowMapCacheLoadBalancer.usf
2025-05-18 13:04:45 +08:00

54 lines
1.8 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
// Do not use shared samplers as it requires the View uniform buffer, which is not bound for this shader.
#define USE_HZB_SHARED_SAMPLERS 0
#include "../Common.ush"
#include "../SceneData.ush"
#include "VirtualShadowMapPageCacheCommon.ush"
#include "VirtualShadowMapCacheInvalidation.ush"
#include "../WaveOpUtil.ush"
#include "../InstanceCulling/InstanceCullingLoadBalancer.ush"
struct FInstanceInvalidationPayload
{
int VirtualShadowMapId;
uint Flags;
};
FInstanceInvalidationPayload DecodeInstanceInvalidationPayload(uint Payload)
{
FInstanceInvalidationPayload Result;
Result.VirtualShadowMapId = Payload >> VSM_INVALIDATION_PAYLOAD_FLAG_BITS;
Result.Flags = Payload & ((1U<<VSM_INVALIDATION_PAYLOAD_FLAG_BITS)-1U);
return Result;
}
[numthreads(CS_1D_GROUP_SIZE_X, 1, 1)]
void InvalidateInstancePagesLoadBalancerCS(
uint3 GroupId : SV_GroupID,
uint GroupThreadIndex : SV_GroupIndex,
uint3 DispatchThreadId : SV_DispatchThreadID)
{
FInstanceWorkSetup WorkSetup = InstanceCullingLoadBalancer_Setup(GroupId, GroupThreadIndex, 0U, true);
if (!WorkSetup.bValid)
{
return;
}
const uint InstanceId = WorkSetup.Item.InstanceDataOffset + uint(WorkSetup.LocalItemIndex);
const uint ShadowMapIndex = WorkSetup.GroupIndexPerBatch;
if (!IsValidInstanceAndCastShadows(InstanceId))
{
return;
}
checkSlow(ShadowMapIndex < VirtualShadowMap.NumFullShadowMaps);
const int VirtualShadowMapId = VSM_MAX_SINGLE_PAGE_SHADOW_MAPS + ShadowMapIndex;
FInstanceInvalidationPayload Payload = DecodeInstanceInvalidationPayload(WorkSetup.Item.Payload);
bool bForceStatic = (Payload.Flags & VSM_INVALIDATION_PAYLOAD_FLAG_FORCE_STATIC) != 0;
InvalidateInstancePages(FVirtualShadowMapHandle::MakeFromId(Payload.VirtualShadowMapId), InstanceId, bForceStatic ? VSM_EXTENDED_FLAG_INVALIDATE_STATIC : 0u);
}