Skip to content

Commit

Permalink
Release loaded textures when freeing node.
Browse files Browse the repository at this point in the history
  • Loading branch information
Kurochi51 committed Jul 18, 2024
1 parent 3b689bf commit dc6ea94
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 37 deletions.
1 change: 0 additions & 1 deletion TickTracker/GlobalSuppressions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,4 @@
[assembly: SuppressMessage("Design", "MA0038:Make method static (deprecated, use CA1822 instead)", Justification = "Obsolete", Scope = "member", Target = "~M:TickTracker.Helpers.Utilities.IsAddonReady(FFXIVClientStructs.FFXIV.Component.GUI.AtkUnitBase*)~System.Boolean")]
[assembly: SuppressMessage("Design", "MA0038:Make method static (deprecated, use CA1822 instead)", Justification = "Obsolete", Scope = "member", Target = "~M:TickTracker.Helpers.Utilities.IsTarget(Dalamud.Game.ClientState.Objects.SubKinds.IPlayerCharacter,FFXIVClientStructs.FFXIV.Client.Game.Character.Character*)~System.Boolean")]
[assembly: SuppressMessage("Design", "MA0038:Make method static (deprecated, use CA1822 instead)", Justification = "Obsolete", Scope = "member", Target = "~M:TickTracker.Helpers.Utilities.AddonOverlap(FFXIVClientStructs.FFXIV.Component.GUI.AtkUnitBase*,TickTracker.Windows.BarWindowBase,System.Boolean)~System.Boolean")]
[assembly: SuppressMessage("Design", "MA0038:Make method static (deprecated, use CA1822 instead)", Justification = "Obsolete", Scope = "member", Target = "~M:TickTracker.NativeNodes.ImageNode.FreeResources(FFXIVClientStructs.FFXIV.Component.GUI.AtkUldPartsList*[])~System.Void")]
[assembly: SuppressMessage("Design", "MA0049:Type name should not match containing namespace", Justification = "...and I took that personally.", Scope = "type", Target = "~T:TickTracker.TickTracker")]
54 changes: 19 additions & 35 deletions TickTracker/NativeNodes/ImageNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,15 +95,7 @@ private void ParseUld(UldFile uld, out int uldPartsListAmount, out PartsData[] u
var currentAtkPartsList = (AtkUldPartsList*)IMemorySpace.GetUISpace()->Malloc((ulong)sizeof(AtkUldPartsList), 8);
if (currentAtkPartsList is null)
{
for (var j = i - 1; j >= 0; j--)
{
for (var k = 0; k < atkUldPartsListArray[j]->PartCount; k++)
{
IMemorySpace.Free(atkUldPartsListArray[j]->Parts[k].UldAsset, (ulong)sizeof(AtkUldAsset));
}
IMemorySpace.Free(atkUldPartsListArray[j]->Parts, (ulong)(sizeof(AtkUldPart) * atkUldPartsListArray[j]->PartCount));
IMemorySpace.Free(atkUldPartsListArray[j], (ulong)sizeof(AtkUldPartsList));
}
FreeResources(atkUldPartsListArray, i - 1, increase: false);
return null;
}
currentAtkPartsList->Id = uldPartsListArray[i].Id;
Expand All @@ -112,31 +104,15 @@ private void ParseUld(UldFile uld, out int uldPartsListAmount, out PartsData[] u
if (currentAtkPartList is null)
{
IMemorySpace.Free(currentAtkPartsList, (ulong)sizeof(AtkUldPartsList));
for (var j = i - 1; j >= 0; j--)
{
for (var k = 0; k < atkUldPartsListArray[j]->PartCount; k++)
{
IMemorySpace.Free(atkUldPartsListArray[j]->Parts[k].UldAsset, (ulong)sizeof(AtkUldAsset));
}
IMemorySpace.Free(atkUldPartsListArray[j]->Parts, (ulong)(sizeof(AtkUldPart) * atkUldPartsListArray[j]->PartCount));
IMemorySpace.Free(atkUldPartsListArray[j], (ulong)sizeof(AtkUldPartsList));
}
FreeResources(atkUldPartsListArray, i - 1, increase: false);
return null;
}
currentAtkPartsList->Parts = currentAtkPartList;
if (!PopulatePartsList(ref currentAtkPartsList, uldPartsListArray[i], hqTexture))
{
IMemorySpace.Free(currentAtkPartList, (ulong)(sizeof(AtkUldPart) * currentAtkPartsList->PartCount));
IMemorySpace.Free(currentAtkPartsList, (ulong)sizeof(AtkUldPartsList));
for (var j = i - 1; j >= 0; j--)
{
for (var k = 0; k < atkUldPartsListArray[j]->PartCount; k++)
{
IMemorySpace.Free(atkUldPartsListArray[j]->Parts[k].UldAsset, (ulong)sizeof(AtkUldAsset));
}
IMemorySpace.Free(atkUldPartsListArray[j]->Parts, (ulong)(sizeof(AtkUldPart) * atkUldPartsListArray[j]->PartCount));
IMemorySpace.Free(atkUldPartsListArray[j], (ulong)sizeof(AtkUldPartsList));
}
FreeResources(atkUldPartsListArray, i - 1, increase: false);
return null;
}
atkUldPartsListArray[i] = currentAtkPartsList;
Expand All @@ -153,6 +129,8 @@ private bool PopulatePartsList(ref AtkUldPartsList* currentPartsList, PartsData
{
for (var j = i - 1; j >= 0; j--)
{
currentPartsList->Parts[j].UldAsset->AtkTexture.ReleaseTexture();
currentPartsList->Parts[j].UldAsset->AtkTexture.Destroy(free: false);
IMemorySpace.Free(currentPartsList->Parts[j].UldAsset, (ulong)sizeof(AtkUldAsset));
}
return false;
Expand Down Expand Up @@ -202,6 +180,8 @@ private bool PopulatePartsList(ref AtkUldPartsList* currentPartsList, PartsData
log.Error("Memory for the node AtkUldAsset of AtkUldPart {i} could not be allocated.", i);
for (var j = i - 1; j >= 0; j--)
{
imageNodePartsList->Parts[j].UldAsset->AtkTexture.ReleaseTexture();
imageNodePartsList->Parts[j].UldAsset->AtkTexture.Destroy(free: false);
IMemorySpace.Free(imageNodePartsList->Parts[j].UldAsset, (ulong)sizeof(AtkUldAsset));
}
IMemorySpace.Free(imageNodePartsList->Parts, (ulong)(sizeof(AtkUldPart) * imageNodePartsList->PartCount));
Expand Down Expand Up @@ -364,6 +344,8 @@ private void DestroyImagePartsList()
{
for (var i = 0; i < imageNode->PartsList->PartCount; i++)
{
imageNode->PartsList->Parts[i].UldAsset->AtkTexture.ReleaseTexture();
imageNode->PartsList->Parts[i].UldAsset->AtkTexture.Destroy(free: false);
IMemorySpace.Free(imageNode->PartsList->Parts[i].UldAsset, (ulong)sizeof(AtkUldAsset));
}
IMemorySpace.Free(imageNode->PartsList->Parts, (ulong)(sizeof(AtkUldPart) * imageNode->PartsList->PartCount));
Expand All @@ -383,12 +365,7 @@ public void DestroyNode()
{
NativeUi.UnlinkNode(imageNode, imageNodeParent->GetComponent());
}
for (var i = 0; i < imageNode->PartsList->PartCount; i++)
{
IMemorySpace.Free(imageNode->PartsList->Parts[i].UldAsset, (ulong)sizeof(AtkUldAsset));
}
IMemorySpace.Free(imageNode->PartsList->Parts, (ulong)(sizeof(AtkUldPart) * imageNode->PartsList->PartCount));
IMemorySpace.Free(imageNode->PartsList, (ulong)sizeof(AtkUldPartsList));
DestroyImagePartsList();
imageNode->AtkResNode.Destroy(free: false);
IMemorySpace.Free(imageNode, (ulong)sizeof(AtkImageNode));
imageNode = null;
Expand All @@ -399,12 +376,19 @@ public void DestroyNode()
/// Release a <see cref="AtkUldPartsList"/> pointer array created by <see cref="CreateAtkUldPartsListArray"/> of your instance of <see cref="ImageNode"/>.
/// </summary>
/// <param name="atkUldPartsListArray"></param>
public void FreeResources(AtkUldPartsList*[] atkUldPartsListArray)
public void FreeResources(AtkUldPartsList*[] atkUldPartsListArray, int start = 0, bool increase = true)
{
for (var i = 0; i < atkUldPartsListArray.Length; i++)
void Operator(ref int i)
=> i = increase ? i + 1 : i - 1;
bool Comparison(int a, int b)
=> increase ? a < b : a >= 0;

for (var i = start; Comparison(i, atkUldPartsListArray.Length); Operator(ref i))
{
for (var j = 0; j < atkUldPartsListArray[i]->PartCount; j++)
{
atkUldPartsListArray[i]->Parts[j].UldAsset->AtkTexture.ReleaseTexture();
atkUldPartsListArray[i]->Parts[j].UldAsset->AtkTexture.Destroy(free: false);
IMemorySpace.Free(atkUldPartsListArray[i]->Parts[j].UldAsset, (ulong)sizeof(AtkUldAsset));
}
IMemorySpace.Free(atkUldPartsListArray[i]->Parts, (ulong)(sizeof(AtkUldPart) * atkUldPartsListArray[i]->PartCount));
Expand Down
1 change: 0 additions & 1 deletion TickTracker/TickTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,6 @@ public TickTracker(IDalamudPluginInterface _pluginInterface,

private void PenumbraCheck()
{

try
{
var plo = pluginInterface.InstalledPlugins.SingleOrDefault(gon => gon.InternalName.Equals("Penumbra", StringComparison.Ordinal));
Expand Down

0 comments on commit dc6ea94

Please sign in to comment.