Skip to content

Commit 03aaff5

Browse files
svc-reach-platform-supportEvergreen
authored andcommitted
[Port] [6000.0] [VFX] Fix leak of new Mesh with BakeSDF API
1 parent cb5b151 commit 03aaff5

File tree

1 file changed

+65
-18
lines changed

1 file changed

+65
-18
lines changed

Packages/com.unity.visualeffectgraph/Runtime/Utilities/SDF/MeshToSDFBaker.cs

Lines changed: 65 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ private GraphicsBuffer
3939
private int m_nStepsJFA;
4040
private Kernels m_Kernels;
4141
private Mesh m_Mesh;
42+
private bool m_OwnsMesh;
4243
private RenderTexture m_textureVoxel, m_textureVoxelBis, m_DistanceTexture;
4344
private GraphicsBuffer m_bufferVoxel;
4445
private ComputeShader m_computeShader;
@@ -173,6 +174,28 @@ public Vector3 GetActualBoxSize()
173174
return m_SizeBox;
174175
}
175176

177+
private MeshToSDFBaker(Vector3 sizeBox,
178+
Vector3 center,
179+
int maxRes,
180+
Mesh mesh,
181+
bool ownsMesh,
182+
int signPassesCount,
183+
float threshold,
184+
float sdfOffset,
185+
CommandBuffer cmd)
186+
{
187+
LoadRuntimeResources();
188+
m_Mesh = mesh;
189+
m_OwnsMesh = ownsMesh;
190+
if (cmd != null)
191+
{
192+
m_Cmd = cmd;
193+
m_OwnsCommandBuffer = false;
194+
}
195+
SetParameters(sizeBox, center, maxRes, signPassesCount, threshold, sdfOffset);
196+
Init();
197+
}
198+
176199
/// <summary>
177200
/// Constructor of the class MeshToSDFBaker.
178201
/// </summary>
@@ -191,17 +214,9 @@ public MeshToSDFBaker(Vector3 sizeBox,
191214
int signPassesCount = 1,
192215
float threshold = 0.5f,
193216
float sdfOffset = 0.0f,
194-
CommandBuffer cmd = null)
217+
CommandBuffer cmd = null) :
218+
this(sizeBox, center, maxRes, mesh, false, signPassesCount, threshold, sdfOffset, cmd)
195219
{
196-
LoadRuntimeResources();
197-
m_Mesh = mesh;
198-
if (cmd != null)
199-
{
200-
m_Cmd = cmd;
201-
m_OwnsCommandBuffer = false;
202-
}
203-
SetParameters(sizeBox, center, maxRes, signPassesCount, threshold, sdfOffset);
204-
Init();
205220
}
206221

207222
/// <summary>
@@ -225,8 +240,10 @@ public MeshToSDFBaker(Vector3 sizeBox,
225240
float threshold = 0.5f,
226241
float sdfOffset = 0.0f,
227242
CommandBuffer cmd = null) :
228-
this(sizeBox, center, maxRes, InitMeshFromList(meshes, transforms), signPassesCount, threshold, sdfOffset, cmd)
243+
this(sizeBox, center, maxRes, InitMeshFromList(meshes, transforms), true, signPassesCount, threshold, sdfOffset, cmd)
229244
{
245+
if (!m_OwnsMesh)
246+
throw new InvalidOperationException("InitMeshFromList expects owns mesh flag to prevent leak");
230247
}
231248

232249
/// <summary>
@@ -240,6 +257,23 @@ public MeshToSDFBaker(Vector3 sizeBox,
240257
}
241258
}
242259

260+
private void Reinit(Vector3 sizeBox,
261+
Vector3 center,
262+
int maxRes,
263+
Mesh mesh,
264+
bool ownsMesh,
265+
int signPassesCount = 1,
266+
float threshold = 0.5f,
267+
float sdfOffset = 0.0f)
268+
{
269+
ReleaseMeshIfOwned();
270+
m_Mesh = mesh;
271+
m_OwnsMesh = ownsMesh;
272+
273+
SetParameters(sizeBox, center, maxRes, signPassesCount, threshold, sdfOffset);
274+
Init();
275+
}
276+
243277
/// <summary>
244278
/// Reinitialize the baker with the new mesh and provided parameters.
245279
/// </summary>
@@ -258,9 +292,7 @@ public void Reinit(Vector3 sizeBox,
258292
float threshold = 0.5f,
259293
float sdfOffset = 0.0f)
260294
{
261-
m_Mesh = mesh;
262-
SetParameters(sizeBox, center, maxRes, signPassesCount, threshold, sdfOffset);
263-
Init();
295+
Reinit(sizeBox, center, maxRes, mesh, false, signPassesCount, threshold, sdfOffset);
264296
}
265297

266298
/// <summary>
@@ -283,7 +315,9 @@ public void Reinit(Vector3 sizeBox,
283315
float threshold = 0.5f,
284316
float sdfOffset = 0.0f)
285317
{
286-
Reinit(sizeBox, center, maxRes, InitMeshFromList(meshes, transforms), signPassesCount, threshold, sdfOffset);
318+
Reinit(sizeBox, center, maxRes, InitMeshFromList(meshes, transforms), true, signPassesCount, threshold, sdfOffset);
319+
if (!m_OwnsMesh)
320+
throw new InvalidOperationException("InitMeshFromList expects owns mesh flag to prevent leak");
287321
}
288322

289323
private void SetParameters(Vector3 sizeBox, Vector3 center, int maxRes, int signPassesCount, float threshold, float sdfOffset)
@@ -773,7 +807,6 @@ public void BakeSDF()
773807

774808
private void InitMeshBuffers()
775809
{
776-
777810
if (m_Mesh.GetVertexAttributeFormat(VertexAttribute.Position) != VertexAttributeFormat.Float32)
778811
{
779812
throw new ArgumentException(
@@ -958,9 +991,22 @@ private void PerformDistanceTransformWinding()
958991
m_Cmd.EndSample("BakeSDF.DistanceTransform");
959992
}
960993

994+
private void ReleaseMeshIfOwned()
995+
{
996+
if (m_Mesh && m_OwnsMesh)
997+
{
998+
if (Application.isPlaying)
999+
Object.Destroy(m_Mesh);
1000+
else
1001+
Object.DestroyImmediate(m_Mesh);
1002+
m_Mesh = null;
1003+
m_OwnsMesh = false;
1004+
}
1005+
}
1006+
9611007
private void ReleaseBuffersAndTextures()
9621008
{
963-
//Release textures.
1009+
//Release textures.
9641010
ReleaseRenderTexture(ref m_textureVoxel);
9651011
ReleaseRenderTexture(ref m_textureVoxelBis);
9661012
ReleaseRenderTexture(ref m_DistanceTexture);
@@ -979,7 +1025,7 @@ private void ReleaseBuffersAndTextures()
9791025
ReleaseRenderTexture(ref m_RayMaps[i]);
9801026
}
9811027

982-
//Release buffers.
1028+
//Release buffers.
9831029
ReleaseGraphicsBuffer(ref m_bufferVoxel);
9841030
ReleaseGraphicsBuffer(ref m_TrianglesUV);
9851031
ReleaseGraphicsBuffer(ref m_TrianglesInVoxels);
@@ -1002,6 +1048,7 @@ private void ReleaseBuffersAndTextures()
10021048
/// </summary>
10031049
public void Dispose()
10041050
{
1051+
ReleaseMeshIfOwned();
10051052
ReleaseBuffersAndTextures();
10061053
GC.SuppressFinalize(this);
10071054
m_IsDisposed = true;

0 commit comments

Comments
 (0)