Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[APV] Cell streaming system #5731

Merged
merged 108 commits into from
Oct 20, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
75c954a
Updated MeshGizmo to handle both traingles and lines.
JulienIgnace-Unity Aug 5, 2021
570493f
Fixed cell and brick debug scale
JulienIgnace-Unity Aug 5, 2021
1bfc541
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Aug 11, 2021
53f4f3f
With a null ref exception when applying virtual offset on unloaded sc…
JulienIgnace-Unity Aug 13, 2021
70a3d3d
Fixed an issue causing failure of the bake when multiple scenes are l…
JulienIgnace-Unity Aug 13, 2021
d381f78
Faster new version of debug probes with compute buffers instead of co…
JulienIgnace-Unity Aug 17, 2021
00a460e
Fixed debug probes after domain relaod when using L1
JulienIgnace-Unity Aug 17, 2021
e128c24
Fixed compute buffer probe debug
JulienIgnace-Unity Aug 17, 2021
51eac63
Matched cell debug culling with cell culling used for probe debug.
JulienIgnace-Unity Aug 17, 2021
c3160d6
Revert "Matched cell debug culling with cell culling used for probe d…
JulienIgnace-Unity Aug 17, 2021
31180f1
Fixed per probe culling.
JulienIgnace-Unity Aug 17, 2021
0a7730f
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Aug 18, 2021
78596c7
Revert "Fixed compute buffer probe debug"
JulienIgnace-Unity Aug 18, 2021
72a75b4
Revert "Faster new version of debug probes with compute buffers inste…
JulienIgnace-Unity Aug 18, 2021
1cbd0b5
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Aug 19, 2021
b44cde7
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Aug 19, 2021
f762552
Merge branch 'hd/apv-msic-fixes' of https://github.com/Unity-Technolo…
JulienIgnace-Unity Aug 19, 2021
4c7f031
Cleaning in preparation for streaming
JulienIgnace-Unity Aug 19, 2021
f0d5e5c
More cleanup + Fix debug upon load/unload of cells
JulienIgnace-Unity Aug 19, 2021
4fdb748
Fix GCAlloc
JulienIgnace-Unity Aug 23, 2021
efa24b7
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Aug 24, 2021
e89c332
Add missing update function
JulienIgnace-Unity Aug 25, 2021
8a8b47d
Proper error handling on apv texture allocation failure
JulienIgnace-Unity Aug 25, 2021
c580086
Handle APV index allocation failure
JulienIgnace-Unity Aug 25, 2021
7a7e08e
Small cleanup
JulienIgnace-Unity Aug 25, 2021
a584b9b
Create hidden per scene data
FrancescoC-unity Aug 27, 2021
87fed75
Start using new mode in baking workflow (Need to fix the tmp send data)
FrancescoC-unity Aug 27, 2021
922f827
Remove loading/removal from authoring
FrancescoC-unity Aug 30, 2021
49da9e8
Need to switch branch, move profile data to asset
FrancescoC-unity Aug 31, 2021
7e86ae5
Almost completely get rid of baking reference volume
FrancescoC-unity Aug 31, 2021
a92bf42
remove baking ref from realtime subdiv (but not working :p)
FrancescoC-unity Aug 31, 2021
5221d9b
Precomputed chunk budget for indices and sh pool
JulienIgnace-Unity Aug 31, 2021
fb26eaf
Revert "remove baking ref from realtime subdiv (but not working :p)"
FrancescoC-unity Aug 31, 2021
17fd32e
Remove all probe ref volume authroing from baking, yay!
FrancescoC-unity Aug 31, 2021
809f560
Moving draw gizmo away and remove all reference of authoring from baking
FrancescoC-unity Sep 1, 2021
332ec81
Make sure baking profile is available if required during non baking
FrancescoC-unity Sep 1, 2021
e628d77
Load profile info from the asset
FrancescoC-unity Sep 1, 2021
802547a
Fix dilation refresh
FrancescoC-unity Sep 1, 2021
a59557d
Moved probe pool chunk size constant to ProbeBrickPool
JulienIgnace-Unity Sep 1, 2021
afaf065
Moved internal array to its own class
JulienIgnace-Unity Sep 1, 2021
24fee3a
Removed empty update for now
JulienIgnace-Unity Sep 1, 2021
26328aa
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Sep 1, 2021
ab018ad
Post merge fix
JulienIgnace-Unity Sep 1, 2021
4559ebc
remove some other things
FrancescoC-unity Sep 1, 2021
22d13cf
remove asset
FrancescoC-unity Sep 2, 2021
8f88873
Small rename
FrancescoC-unity Sep 2, 2021
b7c8fc4
Merge branch 'HDRP/new-apv-workflow-backend' of https://github.com/Un…
JulienIgnace-Unity Sep 2, 2021
eb52367
Move field inside EDITOR tags
FrancescoC-unity Sep 2, 2021
520c27c
Post merge fix
JulienIgnace-Unity Sep 2, 2021
1c765d8
Fix issue when no profile is ever loaded (i.e. first time a project i…
FrancescoC-unity Sep 2, 2021
793a308
guards
FrancescoC-unity Sep 2, 2021
a65116c
Merge branch 'HDRP/new-apv-workflow-backend' of https://github.com/Un…
JulienIgnace-Unity Sep 2, 2021
5552a6f
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Sep 3, 2021
e6c7d64
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Sep 6, 2021
6375a26
Streaming V1 (non functional)
JulienIgnace-Unity Sep 8, 2021
1f8526b
Fixed adding the same cells multiple times to the system.
JulienIgnace-Unity Sep 9, 2021
59df65c
Fixed cell sorting
JulienIgnace-Unity Sep 9, 2021
2268168
Fixed wrong unload of unloaded cells.
JulienIgnace-Unity Sep 10, 2021
e2f8bd1
Fixed a mistake in chunk estimation calculation.
JulienIgnace-Unity Sep 10, 2021
50295ab
Moved cell streaing stuff to its own file
JulienIgnace-Unity Sep 13, 2021
467874d
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Sep 13, 2021
7a04814
Merge branch 'hd/apv-cell-streaming' of https://github.com/Unity-Tech…
JulienIgnace-Unity Sep 13, 2021
02e4621
Fixed cell camera distance computation
JulienIgnace-Unity Sep 13, 2021
cdacf4f
GCAlloc hunt 1
JulienIgnace-Unity Sep 14, 2021
771022c
Pool a lot of internal objects to avoid gcallocs
JulienIgnace-Unity Sep 14, 2021
74fd909
Preallocated temporary Color arrays for updating SH textures
JulienIgnace-Unity Sep 14, 2021
933c678
Added various API and tests to DynamicArray
JulienIgnace-Unity Sep 15, 2021
534d049
Quicksort WIP
JulienIgnace-Unity Sep 15, 2021
4b4fcc2
Implemented quicksort
JulienIgnace-Unity Sep 16, 2021
e65b6e6
Reverted wrong change
JulienIgnace-Unity Sep 16, 2021
8fa4822
Moved QuickSort to a class extension and completed doc
JulienIgnace-Unity Sep 16, 2021
c4dfa09
Small improvement to AddRange
JulienIgnace-Unity Sep 16, 2021
be6493f
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Sep 16, 2021
5dd31b7
Post merge fix
JulienIgnace-Unity Sep 16, 2021
d77069c
Update Changelog
JulienIgnace-Unity Sep 16, 2021
9aa5b44
Merge branch 'hd/apv-cell-streaming' of https://github.com/Unity-Tech…
JulienIgnace-Unity Sep 16, 2021
5d2f8df
Merge branch 'hd/dynamic-array-improvements' of https://github.com/Un…
JulienIgnace-Unity Sep 16, 2021
9d56479
Moved internal array to DynamicArray
JulienIgnace-Unity Sep 17, 2021
d162005
Pooled CellInfo to avoid allocation
JulienIgnace-Unity Sep 17, 2021
3cc6639
Split Update of SH texture in several chunks to avoid allocations.
JulienIgnace-Unity Sep 20, 2021
8022bbf
Fixed chunk copy
JulienIgnace-Unity Sep 20, 2021
8f275a6
Fixed Temporary DataLoc lifetime.
JulienIgnace-Unity Sep 20, 2021
c2b8ba4
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Sep 20, 2021
08d6d59
Relax some condition on RemoveRange in DynamicArray
JulienIgnace-Unity Sep 20, 2021
ba00940
Revert MeshGizmo modifications
JulienIgnace-Unity Sep 20, 2021
be16a6a
Restored changed/hidden gizmo when Cells aren't loaded.
JulienIgnace-Unity Sep 20, 2021
287d3fd
Reverted a bit of temp test code.
JulienIgnace-Unity Sep 20, 2021
5e1e4b3
Small Clean
JulienIgnace-Unity Sep 20, 2021
b0197d4
Added a way to disable streaming of cells.
JulienIgnace-Unity Sep 21, 2021
087a401
Fixed hideFlags for pool textures
JulienIgnace-Unity Sep 21, 2021
c81c29d
partial index buffer update to improve performance.
JulienIgnace-Unity Sep 21, 2021
736bfcb
Fixed an issue where cells would stay in internal structures even aft…
JulienIgnace-Unity Sep 21, 2021
7b832eb
Added names to texture allocated for APV
JulienIgnace-Unity Sep 22, 2021
c9f95a3
Removed useless comment
JulienIgnace-Unity Sep 22, 2021
baa9da3
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Sep 22, 2021
adcaa62
Fixed wrong bound for loop
JulienIgnace-Unity Sep 24, 2021
393bc55
Addressed most PR review feedback
JulienIgnace-Unity Sep 24, 2021
6c51d0a
Filled incoming chunks left over space with black.
JulienIgnace-Unity Sep 24, 2021
d30a196
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Sep 27, 2021
9cfac88
Handled the case where not every cell fit in memory when performing d…
JulienIgnace-Unity Oct 7, 2021
0119f3d
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Oct 7, 2021
a532ab5
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Oct 8, 2021
c93e747
Reworked baking to avoid using runtime structure to fill baked assets
JulienIgnace-Unity Oct 8, 2021
8b96607
Moved reference counting into CellInfo
JulienIgnace-Unity Oct 8, 2021
0b2abad
Moved the APV cell streaming options to the HDRP asset.
JulienIgnace-Unity Oct 12, 2021
d70b848
Fixed cleanup of loaded data
JulienIgnace-Unity Oct 12, 2021
18f7ae8
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Oct 18, 2021
a307b05
Merge branch 'master' of https://github.com/Unity-Technologies/Graphi…
JulienIgnace-Unity Oct 20, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Split Update of SH texture in several chunks to avoid allocations.
  • Loading branch information
JulienIgnace-Unity committed Sep 20, 2021
commit 3cc6639dead313ed20b1df90287c81df3b2f7bb6
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace UnityEngine.Experimental.Rendering
{
internal class ProbeBrickPool
{
const int kProbeIndexPoolAllocationSize = 64;
const int kProbeIndexPoolAllocationSize = 64; // 128;

[DebuggerDisplay("Chunk ({x}, {y}, {z})")]
public struct BrickChunkAlloc
Expand Down Expand Up @@ -123,7 +123,7 @@ internal void EnsureTextureValidity()
}

internal static int GetChunkSize() { return kProbeIndexPoolAllocationSize; }
internal int GetChunkSizeInProbeCount() { return kProbeIndexPoolAllocationSize * kBrickProbeCountTotal; }
internal static int GetChunkSizeInProbeCount() { return kProbeIndexPoolAllocationSize * kBrickProbeCountTotal; }

internal int GetPoolWidth() { return m_Pool.width; }
internal int GetPoolHeight() { return m_Pool.height; }
Expand Down Expand Up @@ -197,14 +197,12 @@ internal void Deallocate(List<BrickChunkAlloc> allocations)
m_FreeList.Push(brick);
}

internal void Update(DataLocation source, List<BrickChunkAlloc> srcLocations, List<BrickChunkAlloc> dstLocations, ProbeVolumeSHBands bands)
internal void Update(DataLocation source, List<BrickChunkAlloc> srcLocations, List<BrickChunkAlloc> dstLocations, int destStartIndex, ProbeVolumeSHBands bands)
{
Debug.Assert(srcLocations.Count == dstLocations.Count);

for (int i = 0; i < srcLocations.Count; i++)
{
BrickChunkAlloc src = srcLocations[i];
BrickChunkAlloc dst = dstLocations[i];
BrickChunkAlloc dst = dstLocations[destStartIndex + i];

for (int j = 0; j < kBrickProbeCountPerDim; j++)
{
Expand Down Expand Up @@ -342,16 +340,16 @@ static void SetPixel(DynamicArray<Color> data, int x, int y, int z, int dataLocW
data[index] = value;
}

public static void FillDataLocation(ref DataLocation loc, SphericalHarmonicsL2[] shl2, ProbeVolumeSHBands bands)
public static void FillDataLocation(ref DataLocation loc, SphericalHarmonicsL2[] shl2, int startIndex, int count, ProbeVolumeSHBands bands)
{
int numBricks = shl2.Length / kBrickProbeCountTotal;
int shidx = 0;
int shidx = startIndex;
int bx = 0, by = 0, bz = 0;
Color c = new Color();

ValidateTemporaryBuffers(loc, bands);
JulienIgnace-Unity marked this conversation as resolved.
Show resolved Hide resolved

for (int brickIdx = 0; brickIdx < shl2.Length; brickIdx += kBrickProbeCountTotal)
for (int brickIdx = startIndex; brickIdx < count && brickIdx < shl2.Length; brickIdx += kBrickProbeCountTotal)
{
for (int z = 0; z < kBrickProbeCountPerDim; z++)
{
Expand Down Expand Up @@ -422,7 +420,7 @@ public static void FillDataLocation(ref DataLocation loc, SphericalHarmonicsL2[]
{
by = 0;
bz += kBrickProbeCountPerDim;
Debug.Assert(bz < loc.depth || brickIdx == shl2.Length - kBrickProbeCountTotal, "Location depth exceeds data texture.");
Debug.Assert(bz < loc.depth || brickIdx == count - kBrickProbeCountTotal, "Location depth exceeds data texture.");
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -287,9 +287,9 @@ void CreateInstancedProbes()
{
var brickSize = cell.bricks[i / 64].subdivisionLevel;

int chunkIndex = i / m_Pool.GetChunkSizeInProbeCount();
int chunkIndex = i / ProbeBrickPool.GetChunkSizeInProbeCount();
var chunk = chunks[chunkIndex];
int indexInChunk = i % m_Pool.GetChunkSizeInProbeCount();
int indexInChunk = i % ProbeBrickPool.GetChunkSizeInProbeCount();
int brickIdx = indexInChunk / 64;
int indexInBrick = indexInChunk % 64;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ public enum ProbeVolumeSHBands
/// </summary>
public partial class ProbeReferenceVolume
{
const int kProbeIndexPoolAllocationSize = 128;
const int kTemporaryDataLocChunkCount = 8;

[System.Serializable]
internal class Cell
Expand Down Expand Up @@ -492,6 +492,7 @@ public struct RuntimeResources

internal Dictionary<int, CellInfo> cells = new Dictionary<int, CellInfo>();
ObjectPool<CellInfo> m_CellInfoPool = new ObjectPool<CellInfo>(x => x.Clear(), null, false);
ProbeBrickPool.DataLocation m_TemporaryDataLocation;

internal ProbeVolumeSceneData sceneData;

Expand Down Expand Up @@ -1005,6 +1006,8 @@ void InitProbeReferenceVolume(ProbeVolumeTextureMemoryBudget memoryBudget, Probe
m_PositionOffsets[m_PositionOffsets.Length - 1] = 1.0f;
Profiler.EndSample();

m_TemporaryDataLocation = ProbeBrickPool.CreateDataLocation(kTemporaryDataLocChunkCount * ProbeBrickPool.GetChunkSizeInProbeCount(), compressed: false, m_SHBands, out var allocatedBytes);

m_ProbeReferenceVolumeInit = true;

ClearDebugData();
Expand Down Expand Up @@ -1068,6 +1071,7 @@ internal void Clear()
m_Pool.Clear();
m_Index.Clear();
cells.Clear();
m_TemporaryDataLocation.Cleanup();
}

if (clearAssetsOnVolumeClear)
Expand All @@ -1094,38 +1098,41 @@ bool AddBricks(CellInfo cellInfo, ProbeBrickIndex.CellIndexUpdateInfo cellUpdate
if (!m_Pool.Allocate(brickChunksCount, cellInfo.chunkList))
return false;

// Create temporary allocation to copy SH data over to main atlas.
var dataloc = ProbeBrickPool.CreateDataLocation(cell.sh.Length, compressed: false, m_SHBands, out var allocatedBytes);
ProbeBrickPool.FillDataLocation(ref dataloc, cell.sh, m_SHBands);

// copy chunks into pool
m_TmpSrcChunks.Clear();
Chunk c;
c.x = 0;
c.y = 0;
c.z = 0;

// currently this code assumes that the texture width is a multiple of the allocation chunk size
for (int i = 0; i < cellInfo.chunkList.Count; i++)
int chunkIndex = 0;
while (chunkIndex < cellInfo.chunkList.Count)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks correct, but is delicate, have you stress tested this a bit to see if all looks fine?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tested as much as I could but it could be interesting to test with bigger/more complex scenes as well. As it is, it's hard to force streaming activity in a relevant way :/

{
m_TmpSrcChunks.Add(c);
c.x += chunkSize * ProbeBrickPool.kBrickProbeCountPerDim;
if (c.x >= dataloc.width)
int chunkToProcess = Math.Min(kTemporaryDataLocChunkCount, cellInfo.chunkList.Count - chunkIndex);
ProbeBrickPool.FillDataLocation(ref m_TemporaryDataLocation, cell.sh, chunkIndex * ProbeBrickPool.GetChunkSizeInProbeCount(), chunkToProcess * ProbeBrickPool.GetChunkSizeInProbeCount(), m_SHBands);

// copy chunks into pool
m_TmpSrcChunks.Clear();
Chunk c;
c.x = 0;
c.y = 0;
c.z = 0;

// currently this code assumes that the texture width is a multiple of the allocation chunk size
for (int j = 0; j < chunkToProcess; j++)
{
c.x = 0;
c.y += ProbeBrickPool.kBrickProbeCountPerDim;
if (c.y >= dataloc.height)
m_TmpSrcChunks.Add(c);
c.x += chunkSize * ProbeBrickPool.kBrickProbeCountPerDim;
if (c.x >= m_TemporaryDataLocation.width)
{
c.y = 0;
c.z += ProbeBrickPool.kBrickProbeCountPerDim;
c.x = 0;
c.y += ProbeBrickPool.kBrickProbeCountPerDim;
if (c.y >= m_TemporaryDataLocation.height)
{
c.y = 0;
c.z += ProbeBrickPool.kBrickProbeCountPerDim;
}
}
}
}

// Update pool textures with incoming SH data and ignore any potential frame latency related issues for now.
m_Pool.Update(dataloc, m_TmpSrcChunks, cellInfo.chunkList, m_SHBands);
// Update pool textures with incoming SH data and ignore any potential frame latency related issues for now.
m_Pool.Update(m_TemporaryDataLocation, m_TmpSrcChunks, cellInfo.chunkList, chunkIndex, m_SHBands);

dataloc.Cleanup();
chunkIndex += kTemporaryDataLocChunkCount;
}

m_BricksLoaded = true;

Expand Down