Skip to content

Commit 9dad854

Browse files
urasmusEvergreen
authored andcommitted
Surface Cache Cleanups (replace Grid model with Volume model)
1 parent faf213b commit 9dad854

19 files changed

Lines changed: 332 additions & 340 deletions

Packages/com.unity.render-pipelines.core/Runtime/Lighting/SurfaceCache/Defrag.compute

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ void Defrag(Threading::Group group)
5050
Threading::Wave wave = group.GetWave();
5151

5252
const RingBuffer::Config config = RingBuffer::LoadConfig(_RingConfigBuffer, _RingConfigReadOffset);
53-
const bool isInRingContentRange = !RingBuffer::IsPositionUnused(config, patchIdx);
53+
const bool isInRingContentRange = RingBuffer::IsPositionInUse(config, patchIdx);
5454

5555
const uint firstLaneIndexOutsideContentRange = wave.Min(!isInRingContentRange ? wave.GetLaneIndex() : UINT_MAX);
5656
const bool isLaneIndexAfterFirstLaneIndexThatIsOutsideContentRange = firstLaneIndexOutsideContentRange == UINT_MAX || firstLaneIndexOutsideContentRange < wave.GetLaneIndex();
57-
const bool startEndHazardCheck = config.start != config.end || RingBuffer::IsPositionOutsideRangeAssumingStartNotEqualEnd((config.start - SUB_GROUP_SIZE) % patchCapacity, config.start, patchIdx);
57+
const bool startEndHazardCheck = config.start != config.end || !RingBuffer::IsPositionInUseAssumingStartNotEqualEnd((config.start - SUB_GROUP_SIZE) % patchCapacity, config.start, patchIdx);
5858

5959
const uint patchCellIdx = _PatchCellIndices[patchIdx];
6060
const uint isReclaimable =

Packages/com.unity.render-pipelines.core/Runtime/Lighting/SurfaceCache/Eviction.compute

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@ uint ModuloDistance(uint a, uint b, uint modulo)
2222
[numthreads(256, 1, 1)]
2323
void Evict(uint patchIdx : SV_DispatchThreadID)
2424
{
25-
if (patchCapacity <= patchIdx)
26-
return;
27-
28-
if (RingBuffer::IsPositionUnused(_RingConfigBuffer, _RingConfigOffset, patchIdx))
25+
if (!RingBuffer::IsPositionInUse(_RingConfigBuffer, _RingConfigOffset, patchIdx))
2926
return;
3027

3128
const uint cellIdx = _PatchCellIndices[patchIdx];

Packages/com.unity.render-pipelines.core/Runtime/Lighting/SurfaceCache/PatchUtil.hlsl

Lines changed: 50 additions & 50 deletions
Large diffs are not rendered by default.

Packages/com.unity.render-pipelines.core/Runtime/Lighting/SurfaceCache/PathTracing.hlsl

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ float3 SampleOutgoingRadianceAssumingLambertianBrdf(
5151
bool multiBounce,
5252
IrradianceBufferType patchIrradiances,
5353
StructuredBuffer<uint> cellPatchIndices,
54-
uint gridSize,
54+
uint volumeSpatialResolution,
5555
StructuredBuffer<int3> cascadeOffsets,
56-
float3 gridTargetPos,
56+
float3 volumeTargetPos,
5757
uint cascadeCount,
58-
float voxelMinSize,
58+
float volumeVoxelMinSize,
5959
float3 albedo,
6060
float3 emission)
6161
{
@@ -82,7 +82,7 @@ float3 SampleOutgoingRadianceAssumingLambertianBrdf(
8282

8383
if (multiBounce)
8484
{
85-
float3 cacheRead = PatchUtil::ReadPlanarIrradiance(gridTargetPos, patchIrradiances, cellPatchIndices, gridSize, cascadeOffsets, cascadeCount, voxelMinSize, position, normal);
85+
float3 cacheRead = PatchUtil::ReadPlanarIrradiance(volumeTargetPos, patchIrradiances, cellPatchIndices, volumeSpatialResolution, cascadeOffsets, cascadeCount, volumeVoxelMinSize, position, normal);
8686
if (all(cacheRead != PatchUtil::invalidIrradiance))
8787
radianceSample += cacheRead;
8888
}
@@ -104,11 +104,11 @@ float3 SampleIncomingRadianceAssumingLambertianBrdf(
104104
SamplerState envSampler,
105105
IrradianceBufferType patchIrradiances,
106106
StructuredBuffer<uint> cellPatchIndices,
107-
uint gridSize,
107+
uint volumeSpatialResolution,
108108
StructuredBuffer<int3> cascadeOffsets,
109-
float3 gridTargetPos,
109+
float3 volumeTargetPos,
110110
uint cascadeCount,
111-
float voxelMinSize)
111+
float volumeVoxelMinSize)
112112
{
113113
UnifiedRT::Hit hitResult = UnifiedRT::TraceRayClosestHit(dispatchInfo, accelStruct, 0xFFFFFFFF, ray, UnifiedRT::kRayFlagNone);
114114
float3 radianceSample;
@@ -146,11 +146,11 @@ float3 SampleIncomingRadianceAssumingLambertianBrdf(
146146
multiBounce,
147147
patchIrradiances,
148148
cellPatchIndices,
149-
gridSize,
149+
volumeSpatialResolution,
150150
cascadeOffsets,
151-
gridTargetPos,
151+
volumeTargetPos,
152152
cascadeCount,
153-
voxelMinSize,
153+
volumeVoxelMinSize,
154154
hitMat.baseColor,
155155
hitMat.emissive);
156156
}

Packages/com.unity.render-pipelines.core/Runtime/Lighting/SurfaceCache/RestirCandidateTemporal.hlsl

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ SamplerState sampler_EnvironmentCubemap;
2323
UNIFIED_RT_DECLARE_ACCEL_STRUCT(_RayTracingAccelerationStructure);
2424

2525
uint _FrameIdx;
26-
uint _GridSize;
26+
uint _VolumeSpatialResolution;
2727
uint _CascadeCount;
28-
float _VoxelMinSize;
28+
float _VolumeVoxelMinSize;
29+
float3 _VolumeTargetPos;
2930
uint _MultiBounce;
3031
float _ConfidenceCap;
3132
uint _ValidationFrameInterval;
3233
uint _RingConfigOffset;
33-
float3 _GridTargetPos;
3434
float _MaterialAtlasTexelSize; // The size of 1 texel in the atlases above
3535
float _AlbedoBoost;
3636
float3 _DirectionalLightDirection;
@@ -40,7 +40,7 @@ void GenerateCandidateAndResampleTemporally(UnifiedRT::DispatchInfo dispatchInfo
4040
{
4141
uint patchIdx = dispatchInfo.dispatchThreadID.x;
4242

43-
if (RingBuffer::IsPositionUnused(_RingConfigBuffer, _RingConfigOffset, patchIdx))
43+
if (!RingBuffer::IsPositionInUse(_RingConfigBuffer, _RingConfigOffset, patchIdx))
4444
return;
4545

4646
UnifiedRT::RayTracingAccelStruct accelStruct = UNIFIED_RT_GET_ACCEL_STRUCT(_RayTracingAccelerationStructure);
@@ -124,11 +124,11 @@ void GenerateCandidateAndResampleTemporally(UnifiedRT::DispatchInfo dispatchInfo
124124
_MultiBounce,
125125
_PatchIrradiances,
126126
_CellPatchIndices,
127-
_GridSize,
127+
_VolumeSpatialResolution,
128128
_CascadeOffsets,
129-
_GridTargetPos,
129+
_VolumeTargetPos,
130130
_CascadeCount,
131-
_VoxelMinSize,
131+
_VolumeVoxelMinSize,
132132
mat.baseColor,
133133
mat.emissive);
134134
}
@@ -173,11 +173,11 @@ void GenerateCandidateAndResampleTemporally(UnifiedRT::DispatchInfo dispatchInfo
173173
sampler_EnvironmentCubemap,
174174
_PatchIrradiances,
175175
_CellPatchIndices,
176-
_GridSize,
176+
_VolumeSpatialResolution,
177177
_CascadeOffsets,
178-
_GridTargetPos,
178+
_VolumeTargetPos,
179179
_CascadeCount,
180-
_VoxelMinSize);
180+
_VolumeVoxelMinSize);
181181

182182
if (all(radianceSample != invalidRadianceSample))
183183
{

Packages/com.unity.render-pipelines.core/Runtime/Lighting/SurfaceCache/RestirEstimation.compute

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ float _ShortHysteresis;
2020
[numthreads(64, 1, 1)]
2121
void Estimate(uint patchIdx : SV_DispatchThreadID)
2222
{
23-
if (RingBuffer::IsPositionUnused(_RingConfigBuffer, _RingConfigOffset, patchIdx))
23+
if (!RingBuffer::IsPositionInUse(_RingConfigBuffer, _RingConfigOffset, patchIdx))
2424
return;
2525

2626
const Realization realization = _PatchRealizations[patchIdx];

Packages/com.unity.render-pipelines.core/Runtime/Lighting/SurfaceCache/RestirSpatial.compute

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,23 @@ StructuredBuffer<int3> _CascadeOffsets;
1616

1717
uint _FrameIdx;
1818
uint _CascadeCount;
19-
uint _GridSize;
19+
uint _VolumeSpatialResolution;
2020
uint _SampleCount;
2121
float _FilterSize;
22-
float _VoxelMinSize;
2322
uint _RingConfigOffset;
24-
float3 _GridTargetPos;
23+
float _VolumeVoxelMinSize;
24+
float3 _VolumeTargetPos;
2525

2626
[numthreads(64, 1, 1)]
2727
void ResampleSpatially(uint patchIdx : SV_DispatchThreadID)
2828
{
29-
if (RingBuffer::IsPositionUnused(_RingConfigBuffer, _RingConfigOffset, patchIdx))
29+
if (!RingBuffer::IsPositionInUse(_RingConfigBuffer, _RingConfigOffset, patchIdx))
3030
return;
3131

3232
Reservoir reservoir;
3333

3434
const PatchUtil::PatchGeometry patchGeo = _PatchGeometries[patchIdx];
35-
const int cascadeResolution = PatchUtil::ResolveCascadeIndex(_GridTargetPos, patchGeo.position, _GridSize, _CascadeCount, _VoxelMinSize);
35+
const int cascadeResolution = PatchUtil::ResolveCascadeIndex(_VolumeTargetPos, patchGeo.position, _VolumeSpatialResolution, _CascadeCount, _VolumeVoxelMinSize);
3636
const uint cascadeIdx = cascadeResolution != -1 ? cascadeResolution : _CascadeCount - 1;
3737

3838
QrngKronecker rng;
@@ -51,10 +51,10 @@ void ResampleSpatially(uint patchIdx : SV_DispatchThreadID)
5151
OrthoBasisFromVector(patchGeo.normal, up, right);
5252

5353
const float2 jitter = (float2(rng.GetFloat(0), rng.GetFloat(1)) * 2.0f - 1.0f) * _FilterSize;
54-
const float3 displacement = (up * jitter.x + right * jitter.y) * PatchUtil::GetVoxelSize(_VoxelMinSize, cascadeIdx);
54+
const float3 displacement = (up * jitter.x + right * jitter.y) * PatchUtil::GetVoxelSize(_VolumeVoxelMinSize, cascadeIdx);
5555
const float3 jitteredPosition = patchGeo.position + displacement;
5656

57-
uint neighbourPatchIdx = PatchUtil::FindPatchIndex(_GridTargetPos, _CellPatchIndices, _GridSize, _CascadeOffsets, _CascadeCount, _VoxelMinSize, jitteredPosition, patchGeo.normal);
57+
uint neighbourPatchIdx = PatchUtil::FindPatchIndex(_VolumeTargetPos, _CellPatchIndices, _VolumeSpatialResolution, _CascadeOffsets, _CascadeCount, _VolumeVoxelMinSize, jitteredPosition, patchGeo.normal);
5858
if (neighbourPatchIdx != PatchUtil::invalidPatchIndex)
5959
{
6060
Realization realization = _InputPatchRealizations[neighbourPatchIdx];

Packages/com.unity.render-pipelines.core/Runtime/Lighting/SurfaceCache/RingBuffer.hlsl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,28 +36,28 @@ namespace RingBuffer
3636
return config;
3737
}
3838

39-
bool IsPositionOutsideRangeAssumingStartNotEqualEnd(uint start, uint end, uint pos)
39+
bool IsPositionInUseAssumingStartNotEqualEnd(uint start, uint end, uint pos)
4040
{
4141
if(start < end)
42-
return !(start <= pos && pos < end);
42+
return start <= pos && pos < end;
4343
else if(end < start)
44-
return end <= pos && pos < start;
44+
return !(end <= pos && pos < start);
4545
else
4646
return true; // expected to never be taken
4747
}
4848

49-
bool IsPositionUnused(Config config, uint index)
49+
bool IsPositionInUse(Config config, uint index)
5050
{
51-
if (config.count == patchCapacity)
52-
return config.count != patchCapacity;
51+
if (config.start == config.end)
52+
return config.count == patchCapacity;
5353
else
54-
return IsPositionOutsideRangeAssumingStartNotEqualEnd(config.start, config.end, index);
54+
return IsPositionInUseAssumingStartNotEqualEnd(config.start, config.end, index);
5555
}
5656

57-
bool IsPositionUnused(RingConfigBufferType buffer, uint bufferOffset, uint index)
57+
bool IsPositionInUse(RingConfigBufferType buffer, uint bufferOffset, uint index)
5858
{
5959
Config config = LoadConfig(buffer, bufferOffset);
60-
return IsPositionUnused(config, index);
60+
return IsPositionInUse(config, index);
6161
}
6262
}
6363

Packages/com.unity.render-pipelines.core/Runtime/Lighting/SurfaceCache/RisEstimation.hlsl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,15 @@ SamplerState sampler_EnvironmentCubemap;
5151
UNIFIED_RT_DECLARE_ACCEL_STRUCT(_RayTracingAccelerationStructure);
5252

5353
uint _FrameIdx;
54-
uint _GridSize;
54+
uint _VolumeSpatialResolution;
5555
uint _CascadeCount;
56-
float _VoxelMinSize;
5756
uint _MultiBounce;
5857
uint _CandidateCount;
5958
float _TargetFunctionUpdateWeight;
6059
uint _RingConfigOffset;
6160
float _ShortHysteresis;
62-
float3 _GridTargetPos;
61+
float3 _VolumeTargetPos;
62+
float _VolumeVoxelMinSize;
6363
float _MaterialAtlasTexelSize; // The size of 1 texel in the atlases above
6464
float _AlbedoBoost;
6565
float3 _DirectionalLightDirection;
@@ -112,7 +112,7 @@ void Estimate(UnifiedRT::DispatchInfo dispatchInfo)
112112
{
113113
uint patchIdx = dispatchInfo.dispatchThreadID.x;
114114

115-
if (RingBuffer::IsPositionUnused(_RingConfigBuffer, _RingConfigOffset, patchIdx))
115+
if (!RingBuffer::IsPositionInUse(_RingConfigBuffer, _RingConfigOffset, patchIdx))
116116
return;
117117

118118
uint candidateCount = _CandidateCount;
@@ -169,11 +169,11 @@ void Estimate(UnifiedRT::DispatchInfo dispatchInfo)
169169
sampler_EnvironmentCubemap,
170170
_PatchIrradiances,
171171
_CellPatchIndices,
172-
_GridSize,
172+
_VolumeSpatialResolution,
173173
_CascadeOffsets,
174-
_GridTargetPos,
174+
_VolumeTargetPos,
175175
_CascadeCount,
176-
_VoxelMinSize);
176+
_VolumeVoxelMinSize);
177177

178178
// If we hit the backface of a water-tight piece of geometry we do nothing. This is to prevent accumulating "false" darkness
179179
// which can give artifacts if a patch reappears after temporarily being inside moving geometry.

Packages/com.unity.render-pipelines.core/Runtime/Lighting/SurfaceCache/Scrolling.compute

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,34 +13,34 @@ RWStructuredBuffer<uint> _PatchCellIndices;
1313
StructuredBuffer<int3> _NewCascadeOffsets;
1414

1515
int4 _OldCascadeOffsets[cascadeMax];
16-
uint _GridSize;
16+
uint _VolumeSpatialResolution;
1717
uint _CascadeCount;
1818

1919
[numthreads(8, 8, 8)]
2020
void Scroll(uint3 threadId : SV_DispatchThreadID)
2121
{
22-
if (any(uint3(_GridSize, _GridSize, _GridSize * _CascadeCount) <= threadId))
22+
if (any(uint3(_VolumeSpatialResolution, _VolumeSpatialResolution, _VolumeSpatialResolution * _CascadeCount) <= threadId))
2323
return;
2424

25-
const uint3 positionStorageSpace = threadId % _GridSize;
25+
const uint3 positionStorageSpace = threadId % _VolumeSpatialResolution;
2626

27-
const uint cascadeIdx = threadId.z / _GridSize;
27+
const uint cascadeIdx = threadId.z / _VolumeSpatialResolution;
2828
const int3 newCascadeOffset = _NewCascadeOffsets[cascadeIdx];
2929
const int3 oldCascadeOffset = _OldCascadeOffsets[cascadeIdx].xyz;
3030

3131
const int3 positionStorageSpaceInt = int3(positionStorageSpace);
32-
const int3 oldPositionGridSpace = PatchUtil::ConvertStorageSpaceToGridSpace(positionStorageSpaceInt, _GridSize, oldCascadeOffset);
32+
const int3 oldPositionVolumeSpace = PatchUtil::ConvertStorageSpaceToVolumeSpace(positionStorageSpaceInt, _VolumeSpatialResolution, oldCascadeOffset);
3333

3434
const int3 offsetDelta = newCascadeOffset - oldCascadeOffset;
35-
const int3 offsettedOldPositionGridSpace = oldPositionGridSpace - offsetDelta;
35+
const int3 offsettedOldPositionVolumeSpace = oldPositionVolumeSpace - offsetDelta;
3636

37-
// If the old position (in grid space) is outside [0, GridSize]^3 after the scroll (offsetDelta) has been applied, we know
37+
// If the old position (in volume space) is outside [0, VolumeSpatialResolution]^3 after the scroll (offsetDelta) has been applied, we know
3838
// it will no longer be queried, so we can remove it.
39-
if (any(VECTOR_LOGIC_OR(offsettedOldPositionGridSpace < 0, (int)_GridSize <= offsettedOldPositionGridSpace)))
39+
if (any(VECTOR_LOGIC_OR(offsettedOldPositionVolumeSpace < 0, (int)_VolumeSpatialResolution <= offsettedOldPositionVolumeSpace)))
4040
{
41-
for (uint directionIdx = 0; directionIdx < PatchUtil::gridCellAngularResolution * PatchUtil::gridCellAngularResolution; ++directionIdx)
41+
for (uint directionIdx = 0; directionIdx < PatchUtil::volumeAngularResolution * PatchUtil::volumeAngularResolution; ++directionIdx)
4242
{
43-
const uint cellIdx = PatchUtil::GetCellIndex(cascadeIdx, positionStorageSpace, directionIdx, _GridSize, PatchUtil::gridCellAngularResolution);
43+
const uint cellIdx = PatchUtil::GetCellIndex(cascadeIdx, positionStorageSpace, directionIdx, _VolumeSpatialResolution, PatchUtil::volumeAngularResolution);
4444
const uint patchIdx = _CellPatchIndices[cellIdx];
4545

4646
if (patchIdx != PatchUtil::invalidCellIndex)

0 commit comments

Comments
 (0)