2023-12-12 15:12:11 -05:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "../Common.ush"
|
|
|
|
|
#include "../SceneData.ush"
|
|
|
|
|
#include "VirtualShadowMapPageCacheCommon.ush"
|
|
|
|
|
#include "VirtualShadowMapCacheInvalidation.ush"
|
|
|
|
|
#include "../WaveOpUtil.ush"
|
|
|
|
|
#include "../InstanceCulling/InstanceCullingLoadBalancer.ush"
|
|
|
|
|
|
2024-01-17 19:35:33 -05:00
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-12 15:12:11 -05:00
|
|
|
[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;
|
|
|
|
|
|
2024-01-17 19:35:33 -05:00
|
|
|
FInstanceInvalidationPayload Payload = DecodeInstanceInvalidationPayload(WorkSetup.Item.Payload);
|
|
|
|
|
bool bForceStatic = (Payload.Flags & VSM_INVALIDATION_PAYLOAD_FLAG_FORCE_STATIC) != 0;
|
2023-12-12 15:12:11 -05:00
|
|
|
|
2024-01-17 19:35:33 -05:00
|
|
|
InvalidateInstancePages(Payload.VirtualShadowMapId, InstanceId, bForceStatic);
|
2023-12-12 15:12:11 -05:00
|
|
|
}
|