180 lines
6.8 KiB
C++
180 lines
6.8 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
/*================================================================================================
|
|
VirtualShadowMapDefinitions.h: used in virtual shadow map shaders and C++ code to define common constants
|
|
!!! Changing this file requires recompilation of the engine !!!
|
|
=================================================================================================*/
|
|
|
|
#pragma once
|
|
|
|
// Page size is 128x128
|
|
#define VSM_LOG2_PAGE_SIZE 7u
|
|
#define VSM_PAGE_SIZE (1u << VSM_LOG2_PAGE_SIZE)
|
|
#define VSM_PAGE_SIZE_MASK (VSM_PAGE_SIZE - 1u)
|
|
// Page table size is 128x128 (total 16k)
|
|
#define VSM_LOG2_LEVEL0_DIM_PAGES_XY 7u
|
|
#define VSM_LEVEL0_DIM_PAGES_XY (1u << VSM_LOG2_LEVEL0_DIM_PAGES_XY)
|
|
#define VSM_MAX_MIP_LEVELS (VSM_LOG2_LEVEL0_DIM_PAGES_XY + 1u)
|
|
#define VSM_VIRTUAL_MAX_RESOLUTION_XY (VSM_LEVEL0_DIM_PAGES_XY * VSM_PAGE_SIZE)
|
|
#define VSM_RASTER_WINDOW_PAGES (4u)
|
|
|
|
// receiver mask is 8x8
|
|
#define VSM_LOG2_RECEIVER_MASK_SIZE 3u
|
|
#define VSM_RECEIVER_MASK_SIZE (1u << VSM_LOG2_RECEIVER_MASK_SIZE)
|
|
#define VSM_RECEIVER_MASK_MASK (VSM_RECEIVER_MASK_SIZE - 1u)
|
|
#define VSM_RECEIVER_MASK_SUBMASK (VSM_RECEIVER_MASK_MASK >> 1u)
|
|
|
|
// Page table layout in a 2D texture (array, probably or atlas perhaps) base level, with space for mips next to it
|
|
#define VSM_PAGE_TABLE_TEX2D_SIZE_X (VSM_LEVEL0_DIM_PAGES_XY)
|
|
#define VSM_PAGE_TABLE_TEX2D_SIZE_Y (VSM_LEVEL0_DIM_PAGES_XY + VSM_LEVEL0_DIM_PAGES_XY / 2)
|
|
|
|
#define VIRTUAL_SHADOW_MAP_VISUALIZE_NONE 0
|
|
#define VIRTUAL_SHADOW_MAP_VISUALIZE_SHADOW_FACTOR (1 << 0)
|
|
#define VIRTUAL_SHADOW_MAP_VISUALIZE_CLIPMAP_OR_MIP (1 << 1)
|
|
#define VIRTUAL_SHADOW_MAP_VISUALIZE_VIRTUAL_PAGE (1 << 2)
|
|
#define VIRTUAL_SHADOW_MAP_VISUALIZE_CACHED_PAGE (1 << 3)
|
|
#define VIRTUAL_SHADOW_MAP_VISUALIZE_SMRT_RAY_COUNT (1 << 4)
|
|
#define VIRTUAL_SHADOW_MAP_VISUALIZE_CLIPMAP_VIRTUAL_SPACE (1 << 5)
|
|
#define VIRTUAL_SHADOW_MAP_VISUALIZE_GENERAL_DEBUG (1 << 6)
|
|
#define VIRTUAL_SHADOW_MAP_VISUALIZE_DIRTY_PAGE (1 << 7)
|
|
#define VIRTUAL_SHADOW_MAP_VISUALIZE_GPU_INVALIDATED_PAGE (1 << 8)
|
|
#define VIRTUAL_SHADOW_MAP_VISUALIZE_MERGED_PAGE (1 << 9)
|
|
#define VIRTUAL_SHADOW_MAP_VISUALIZE_NANITE_OVERDRAW (1 << 10)
|
|
|
|
// Bias used to store negative clip levels in less than 32 bits
|
|
#define VSM_PACKED_CLIP_LEVEL_BIAS 1024
|
|
|
|
#define VSM_PROJ_FLAG_CURRENT_DISTANT_LIGHT (1U << 0)
|
|
#define VSM_PROJ_FLAG_UNCACHED (1U << 1) // Used to indicate that the light is uncached and should only render to dynamic pages
|
|
#define VSM_PROJ_FLAG_UNREFERENCED (1U << 2) // Used to indicate that the light is not referenced/rendered to this render
|
|
#define VSM_PROJ_FLAG_IS_COARSE_CLIP_LEVEL (1U << 3) // Used to indicate that the clip level is a coarse level
|
|
#define VSM_PROJ_FLAG_IS_FIRST_PERSON_SHADOW (1U << 4) // Used to indicate that this is a "first-person" shadow
|
|
#define VSM_PROJ_FLAG_USE_RECEIVER_MASK (1U << 5) // Used to enable receiver masks on this light
|
|
|
|
// Hard limit for max distant lights supported 8k for now - we may revise later. We need to keep them in a fixed range for now to make allocation easy and minimize overhead for indexing.
|
|
#define VSM_MAX_SINGLE_PAGE_SHADOW_MAPS (1024U * 8U)
|
|
|
|
#define VSM_INVALIDATION_PAYLOAD_FLAG_NONE 0
|
|
#define VSM_INVALIDATION_PAYLOAD_FLAG_FORCE_STATIC (1 << 0)
|
|
// 8 bit flags, 24 bit VSM ID
|
|
#define VSM_INVALIDATION_PAYLOAD_FLAG_BITS 8
|
|
|
|
|
|
#define VSM_STAT_REQUESTED_THIS_FRAME_PAGES 0
|
|
#define VSM_STAT_STATIC_CACHED_PAGES 1
|
|
#define VSM_STAT_STATIC_INVALIDATED_PAGES 2
|
|
#define VSM_STAT_DYNAMIC_CACHED_PAGES 3
|
|
#define VSM_STAT_DYNAMIC_INVALIDATED_PAGES 4
|
|
#define VSM_STAT_EMPTY_PAGES 5
|
|
#define VSM_STAT_NON_NANITE_INSTANCES_TOTAL 6
|
|
#define VSM_STAT_NON_NANITE_INSTANCES_DRAWN 7
|
|
#define VSM_STAT_NON_NANITE_INSTANCES_HZB_CULLED 8
|
|
#define VSM_STAT_NON_NANITE_INSTANCES_PAGE_MASK_CULLED 9
|
|
#define VSM_STAT_NON_NANITE_INSTANCES_EMPTY_RECT_CULLED 10
|
|
#define VSM_STAT_NON_NANITE_INSTANCES_FRUSTUM_CULLED 11
|
|
#define VSM_STAT_NUM_PAGES_TO_MERGE 12
|
|
#define VSM_STAT_NUM_PAGES_TO_CLEAR 13
|
|
#define VSM_STAT_NUM_HZB_PAGES_BUILT 14
|
|
#define VSM_STAT_ALLOCATED_NEW 15
|
|
#define VSM_STAT_NANITE_CLUSTERS_HW 16
|
|
#define VSM_STAT_NANITE_CLUSTERS_SW 17
|
|
#define VSM_STAT_NANITE_TRIANGLES 18
|
|
#define VSM_STAT_NANITE_INSTANCES_MAIN 19
|
|
#define VSM_STAT_NANITE_INSTANCES_POST 20
|
|
#define VSM_STAT_WPO_CONSIDERED_PAGES 21
|
|
#define VSM_STAT_OVERFLOW_FLAGS 22
|
|
#define VSM_STAT_TMP_1 23
|
|
#define VSM_STAT_TMP_2 24
|
|
#define VSM_STAT_TMP_3 25
|
|
#define VSM_STAT_NUM 26
|
|
|
|
#define VSM_STAT_OVERFLOW_FLAG_MARKING_JOB_QUEUE (1<<0)
|
|
#define VSM_STAT_OVERFLOW_FLAG_OPP_MAX_LIGHTS (1<<1)
|
|
#define VSM_STAT_OVERFLOW_FLAG_PAGE_POOL (1<<2)
|
|
#define VSM_STAT_OVERFLOW_FLAG_VISIBLE_INSTANCES (1<<3)
|
|
#define VSM_STAT_OVERFLOW_FLAG_NUM 4
|
|
|
|
#define VSM_STATUS_MSG_PAGE_MANAGEMENT 0
|
|
#define VSM_STATUS_MSG_OVERFLOW 1
|
|
|
|
// Projection Shader Data
|
|
#define VSM_PSD_STRIDE (16 * 18)
|
|
|
|
// Nanite Performance Feedback
|
|
#define VSM_NPF_HEADER_TOTAL_HW_CLUSTERS 0
|
|
#define VSM_NPF_HEADER_TOTAL_SW_CLUSTERS 1
|
|
#define VSM_NPF_SIZEOF_HEADER 2
|
|
#define VSM_NPF_ENTRY_HW_CLUSTERS 0
|
|
#define VSM_NPF_ENTRY_SW_CLUSTERS 1
|
|
#define VSM_NPF_SIZEOF_ENTRY 2
|
|
|
|
// Throttle Buffer
|
|
#define VSM_TB_HEADER_TOTAL_HW_CLUSTERS 0
|
|
#define VSM_TB_HEADER_TOTAL_SW_CLUSTERS 1
|
|
#define VSM_TB_HEADER_MAX_HW_CLUSTERS 2
|
|
#define VSM_TB_HEADER_MAX_SW_CLUSTERS 3
|
|
#define VSM_TB_HEADER_TOTAL_THROTTLE 4
|
|
#define VSM_TB_SIZEOF_HEADER 5
|
|
#define VSM_TB_ENTRY_HW_CLUSTERS 0
|
|
#define VSM_TB_ENTRY_SW_CLUSTERS 1
|
|
#define VSM_TB_ENTRY_THROTTLE 2
|
|
#define VSM_TB_SIZEOF_ENTRY 3
|
|
|
|
#ifdef __cplusplus
|
|
#include "HLSLTypeAliases.h"
|
|
#include "HLSLMathAliases.h"
|
|
|
|
namespace UE::HLSL
|
|
{
|
|
#endif
|
|
|
|
struct FVSMVisibleInstanceCmd
|
|
{
|
|
uint PackedPageInfo;
|
|
uint InstanceIdAndFlags;
|
|
uint IndirectArgIndex;
|
|
};
|
|
|
|
struct FVSMCullingBatchInfo
|
|
{
|
|
uint FirstPrimaryView;
|
|
uint NumPrimaryViews;
|
|
};
|
|
|
|
struct FNextVirtualShadowMapData
|
|
{
|
|
int NextVirtualShadowMapId;
|
|
int2 PageAddressOffset;
|
|
int _Padding;
|
|
};
|
|
|
|
//ExtraBias must >= 0
|
|
inline uint GetMipLevelLocal(float Footprint, uint MipMode, float ShadowMapResolutionLodBias, float GlobalResolutionLodBias, float ExtraBias = 0.0f)
|
|
{
|
|
float MipLevelFloat = log2(Footprint) + ShadowMapResolutionLodBias + GlobalResolutionLodBias + ExtraBias;
|
|
uint MipLevel = uint(max(floor(MipLevelFloat), 0.0f));
|
|
MipLevel = min(MipLevel, (VSM_MAX_MIP_LEVELS - 1U));
|
|
|
|
if (MipMode == 1)
|
|
{
|
|
// Even mips
|
|
MipLevel &= ~(1U);
|
|
}
|
|
else if (MipMode == 2)
|
|
{
|
|
// Odd mips
|
|
MipLevel |= 1U;
|
|
}
|
|
|
|
return MipLevel;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
} // namespace UE::HLSL
|
|
|
|
using FVSMVisibleInstanceCmd = UE::HLSL::FVSMVisibleInstanceCmd;
|
|
using FVSMCullingBatchInfo = UE::HLSL::FVSMCullingBatchInfo;
|
|
using FNextVirtualShadowMapData = UE::HLSL::FNextVirtualShadowMapData;
|
|
|
|
#endif
|