From 917affad0cb712d4e4c1a442589f7a4c61e5839b Mon Sep 17 00:00:00 2001 From: Soreepeong Date: Tue, 2 Jul 2024 14:25:32 +0900 Subject: [PATCH 1/2] Remove api9 compat from texture stuff --- .../Windows/Data/Widgets/TexWidget.cs | 4 - .../SharedImmediateTexture.cs | 106 ------------------ .../Internal/TextureManager.SharedTextures.cs | 4 +- 3 files changed, 2 insertions(+), 112 deletions(-) diff --git a/Dalamud/Interface/Internal/Windows/Data/Widgets/TexWidget.cs b/Dalamud/Interface/Internal/Windows/Data/Widgets/TexWidget.cs index a889d2a24..0d2b744b4 100644 --- a/Dalamud/Interface/Internal/Windows/Data/Widgets/TexWidget.cs +++ b/Dalamud/Interface/Internal/Windows/Data/Widgets/TexWidget.cs @@ -525,7 +525,6 @@ private unsafe void DrawLoadedTextures(ICollection textu ImGui.TableSetupColumn("Source", ImGuiTableColumnFlags.WidthStretch); ImGui.TableSetupColumn("RefCount", ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("RefCount__").X); ImGui.TableSetupColumn("SelfRef", ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("00.000___").X); - ImGui.TableSetupColumn("CanRevive", ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("CanRevive__").X); ImGui.TableSetupColumn( "Actions", ImGuiTableColumnFlags.WidthFixed, @@ -582,9 +581,6 @@ private unsafe void DrawLoadedTextures(ICollection textu ImGui.TableNextColumn(); this.TextCopiable(remain <= 0 ? "-" : $"{remain:00.000}", true, true); - ImGui.TableNextColumn(); - ImGui.TextUnformatted(texture.HasRevivalPossibility ? "Yes" : "No"); - ImGui.TableNextColumn(); if (ImGuiComponents.IconButton(FontAwesomeIcon.Save)) { diff --git a/Dalamud/Interface/Textures/Internal/SharedImmediateTextures/SharedImmediateTexture.cs b/Dalamud/Interface/Textures/Internal/SharedImmediateTextures/SharedImmediateTexture.cs index 1c218f6af..c71d83fe8 100644 --- a/Dalamud/Interface/Textures/Internal/SharedImmediateTextures/SharedImmediateTexture.cs +++ b/Dalamud/Interface/Textures/Internal/SharedImmediateTextures/SharedImmediateTexture.cs @@ -29,7 +29,6 @@ internal abstract class SharedImmediateTexture private bool resourceReleased; private int refCount; private long selfReferenceExpiry; - private IDalamudTextureWrap? availableOnAccessWrapForApi9; private CancellationTokenSource? cancellationTokenSource; private NotOwnedTextureWrap? nonOwningWrap; @@ -67,10 +66,6 @@ protected SharedImmediateTexture(string sourcePathForDebug) /// Gets the source path. Debug use only. public string SourcePathForDebug { get; } - /// Gets a value indicating whether this instance of supports revival. - /// - public bool HasRevivalPossibility => this.RevivalPossibility?.TryGetTarget(out _) is true; - /// Gets or sets the underlying texture wrap. public Task? UnderlyingWrap { get; set; } @@ -91,16 +86,6 @@ protected SharedImmediateTexture(string sourcePathForDebug) /// Intended to be called from implementors' constructors and . protected CancellationToken LoadCancellationToken => this.cancellationTokenSource?.Token ?? default; - /// Gets or sets a weak reference to an object that demands this objects to be alive. - /// - /// TextureManager must keep references to all shared textures, regardless of whether textures' contents are - /// flushed, because API9 functions demand that the returned textures may be stored so that they can used anytime, - /// possibly reviving a dead-inside object. The object referenced by this property is given out to such use cases, - /// which gets created from . If this no longer points to an alive - /// object, and is null, then this object is not used from API9 use case. - /// - private WeakReference? RevivalPossibility { get; set; } - /// public int AddRef() => this.TryAddRef(out var newRefCount) switch { @@ -180,7 +165,6 @@ public int ReleaseSelfReference(bool immediate) if (exp != Interlocked.CompareExchange(ref this.selfReferenceExpiry, SelfReferenceExpiryExpired, exp)) continue; - this.availableOnAccessWrapForApi9 = null; return this.Release(); } } @@ -255,35 +239,6 @@ public async Task RentAsync(CancellationToken cancellationT return new RefCountableWrappingTextureWrap(dtw, this); } - /// Gets a texture wrap which ensures that the values will be populated on access. - /// The texture wrap, or null if failed. - [Api10ToDo(Api10ToDoAttribute.DeleteCompatBehavior)] - public IDalamudTextureWrap? GetAvailableOnAccessWrapForApi9() - { - if (this.availableOnAccessWrapForApi9 is not null) - return this.availableOnAccessWrapForApi9; - - lock (this.reviveLock) - { - if (this.availableOnAccessWrapForApi9 is not null) - return this.availableOnAccessWrapForApi9; - - if (this.RevivalPossibility?.TryGetTarget(out this.availableOnAccessWrapForApi9) is true) - return this.availableOnAccessWrapForApi9; - - var newRefTask = this.RentAsync(this.LoadCancellationToken); - newRefTask.Wait(this.LoadCancellationToken); - if (!newRefTask.IsCompletedSuccessfully) - return null; - newRefTask.Result.Dispose(); - - this.availableOnAccessWrapForApi9 = new AvailableOnAccessTextureWrap(this); - this.RevivalPossibility = new(this.availableOnAccessWrapForApi9); - } - - return this.availableOnAccessWrapForApi9; - } - /// Adds a plugin to , in a thread-safe way. /// The plugin to add. public void AddOwnerPlugin(LocalPlugin plugin) @@ -383,9 +338,6 @@ private IRefCountable.RefCountResult TryAddRef(out int newRefCount) throw; } - if (this.RevivalPossibility?.TryGetTarget(out var target) is true) - this.availableOnAccessWrapForApi9 = target; - Interlocked.Increment(ref this.refCount); this.resourceReleased = false; return IRefCountable.RefCountResult.StillAlive; @@ -468,12 +420,6 @@ public bool TryGetWrap([NotNullWhen(true)] out IDalamudTextureWrap? texture, out public Task RentAsync(CancellationToken cancellationToken = default) => this.inner.RentAsync(cancellationToken); - /// - [Api10ToDo(Api10ToDoAttribute.DeleteCompatBehavior)] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public IDalamudTextureWrap? GetAvailableOnAccessWrapForApi9() => - this.inner.GetAvailableOnAccessWrapForApi9(); - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public void AddOwnerPlugin(LocalPlugin plugin) => @@ -562,56 +508,4 @@ protected override void Dispose(bool disposing) } } } - - /// A texture wrap that revives and waits for the underlying texture as needed on every access. - [Api10ToDo(Api10ToDoAttribute.DeleteCompatBehavior)] - private sealed class AvailableOnAccessTextureWrap : ForwardingTextureWrap - { - private readonly SharedImmediateTexture inner; - - /// Initializes a new instance of the class. - /// The shared texture. - public AvailableOnAccessTextureWrap(SharedImmediateTexture inner) => this.inner = inner; - - /// - public override IDalamudTextureWrap CreateWrapSharingLowLevelResource() - { - this.inner.AddRef(); - try - { - if (!this.inner.TryGetWrapCore(out var wrap, out _)) - { - this.inner.UnderlyingWrap?.Wait(); - - if (!this.inner.TryGetWrapCore(out wrap, out _)) - { - // Calling dispose on Empty4x4 is a no-op, so we can just return that. - this.inner.Release(); - return Service.Get().Empty4X4; - } - } - - return new RefCountableWrappingTextureWrap(wrap, this.inner); - } - catch - { - this.inner.Release(); - throw; - } - } - - /// - public override string ToString() => $"{nameof(AvailableOnAccessTextureWrap)}({this.inner})"; - - /// - protected override bool TryGetWrap(out IDalamudTextureWrap? wrap) - { - if (this.inner.TryGetWrapCore(out var t, out _)) - wrap = t; - - this.inner.UnderlyingWrap?.Wait(); - wrap = this.inner.nonOwningWrap ?? Service.Get().Empty4X4; - return true; - } - } } diff --git a/Dalamud/Interface/Textures/Internal/TextureManager.SharedTextures.cs b/Dalamud/Interface/Textures/Internal/TextureManager.SharedTextures.cs index e437b6c28..92152b1fb 100644 --- a/Dalamud/Interface/Textures/Internal/TextureManager.SharedTextures.cs +++ b/Dalamud/Interface/Textures/Internal/TextureManager.SharedTextures.cs @@ -159,7 +159,7 @@ public void FlushFromGameCache(string path) { if (this.gameDict.TryRemove(path, out var r)) { - if (r.ReleaseSelfReference(true) != 0 || r.HasRevivalPossibility) + if (r.ReleaseSelfReference(true) != 0) { lock (this.invalidatedTextures) this.invalidatedTextures.Add(r); @@ -201,7 +201,7 @@ static void RemoveFinalReleased(ConcurrentDictionary - v.ContentQueried && v.ReleaseSelfReference(false) == 0 && !v.HasRevivalPossibility; + v.ContentQueried && v.ReleaseSelfReference(false) == 0; } } } From 4248477955775661af9fbd40d514eb47a027ac89 Mon Sep 17 00:00:00 2001 From: Soreepeong Date: Wed, 3 Jul 2024 17:31:03 +0900 Subject: [PATCH 2/2] Make Empty4X4 actually transparent --- Dalamud/DalamudAsset.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Dalamud/DalamudAsset.cs b/Dalamud/DalamudAsset.cs index 15d342962..0d91a4b75 100644 --- a/Dalamud/DalamudAsset.cs +++ b/Dalamud/DalamudAsset.cs @@ -14,20 +14,20 @@ public enum DalamudAsset /// /// Nothing. /// - [DalamudAsset(DalamudAssetPurpose.Empty, data: new byte[0])] + [DalamudAsset(DalamudAssetPurpose.Empty, data: [])] Unspecified = 0, /// - /// : The fallback empty texture. + /// : A texture that is completely transparent. /// - [DalamudAsset(DalamudAssetPurpose.TextureFromRaw, data: new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 })] + [DalamudAsset(DalamudAssetPurpose.TextureFromRaw, data: [0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF])] [DalamudAssetRawTexture(4, 4, DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM, 8)] Empty4X4 = 1000, /// - /// : The fallback empty texture. + /// : A texture that is completely white. /// - [DalamudAsset(DalamudAssetPurpose.TextureFromRaw, data: new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0 })] + [DalamudAsset(DalamudAssetPurpose.TextureFromRaw, data: [0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0])] [DalamudAssetRawTexture(4, 4, DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM, 8)] White4X4 = 1014,