mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-14 20:54:16 +01:00
ISIT: remove api9 compat, IDAM: make Empty4X4 transparent (#1877)
* Remove api9 compat from texture stuff * Make Empty4X4 actually transparent
This commit is contained in:
parent
bdc4c226d4
commit
7a90921358
4 changed files with 7 additions and 117 deletions
|
|
@ -14,20 +14,20 @@ public enum DalamudAsset
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Nothing.
|
/// Nothing.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DalamudAsset(DalamudAssetPurpose.Empty, data: new byte[0])]
|
[DalamudAsset(DalamudAssetPurpose.Empty, data: [])]
|
||||||
Unspecified = 0,
|
Unspecified = 0,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// <see cref="DalamudAssetPurpose.TextureFromRaw"/>: The fallback empty texture.
|
/// <see cref="DalamudAssetPurpose.TextureFromRaw"/>: A texture that is completely transparent.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[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)]
|
[DalamudAssetRawTexture(4, 4, DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM, 8)]
|
||||||
Empty4X4 = 1000,
|
Empty4X4 = 1000,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// <see cref="DalamudAssetPurpose.TextureFromRaw"/>: The fallback empty texture.
|
/// <see cref="DalamudAssetPurpose.TextureFromRaw"/>: A texture that is completely white.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[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)]
|
[DalamudAssetRawTexture(4, 4, DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM, 8)]
|
||||||
White4X4 = 1014,
|
White4X4 = 1014,
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -525,7 +525,6 @@ internal class TexWidget : IDataWindowWidget
|
||||||
ImGui.TableSetupColumn("Source", ImGuiTableColumnFlags.WidthStretch);
|
ImGui.TableSetupColumn("Source", ImGuiTableColumnFlags.WidthStretch);
|
||||||
ImGui.TableSetupColumn("RefCount", ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("RefCount__").X);
|
ImGui.TableSetupColumn("RefCount", ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("RefCount__").X);
|
||||||
ImGui.TableSetupColumn("SelfRef", ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("00.000___").X);
|
ImGui.TableSetupColumn("SelfRef", ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("00.000___").X);
|
||||||
ImGui.TableSetupColumn("CanRevive", ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("CanRevive__").X);
|
|
||||||
ImGui.TableSetupColumn(
|
ImGui.TableSetupColumn(
|
||||||
"Actions",
|
"Actions",
|
||||||
ImGuiTableColumnFlags.WidthFixed,
|
ImGuiTableColumnFlags.WidthFixed,
|
||||||
|
|
@ -582,9 +581,6 @@ internal class TexWidget : IDataWindowWidget
|
||||||
ImGui.TableNextColumn();
|
ImGui.TableNextColumn();
|
||||||
this.TextCopiable(remain <= 0 ? "-" : $"{remain:00.000}", true, true);
|
this.TextCopiable(remain <= 0 ? "-" : $"{remain:00.000}", true, true);
|
||||||
|
|
||||||
ImGui.TableNextColumn();
|
|
||||||
ImGui.TextUnformatted(texture.HasRevivalPossibility ? "Yes" : "No");
|
|
||||||
|
|
||||||
ImGui.TableNextColumn();
|
ImGui.TableNextColumn();
|
||||||
if (ImGuiComponents.IconButton(FontAwesomeIcon.Save))
|
if (ImGuiComponents.IconButton(FontAwesomeIcon.Save))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,6 @@ internal abstract class SharedImmediateTexture
|
||||||
private bool resourceReleased;
|
private bool resourceReleased;
|
||||||
private int refCount;
|
private int refCount;
|
||||||
private long selfReferenceExpiry;
|
private long selfReferenceExpiry;
|
||||||
private IDalamudTextureWrap? availableOnAccessWrapForApi9;
|
|
||||||
private CancellationTokenSource? cancellationTokenSource;
|
private CancellationTokenSource? cancellationTokenSource;
|
||||||
private NotOwnedTextureWrap? nonOwningWrap;
|
private NotOwnedTextureWrap? nonOwningWrap;
|
||||||
|
|
||||||
|
|
@ -67,10 +66,6 @@ internal abstract class SharedImmediateTexture
|
||||||
/// <summary>Gets the source path. Debug use only.</summary>
|
/// <summary>Gets the source path. Debug use only.</summary>
|
||||||
public string SourcePathForDebug { get; }
|
public string SourcePathForDebug { get; }
|
||||||
|
|
||||||
/// <summary>Gets a value indicating whether this instance of <see cref="SharedImmediateTexture"/> supports revival.
|
|
||||||
/// </summary>
|
|
||||||
public bool HasRevivalPossibility => this.RevivalPossibility?.TryGetTarget(out _) is true;
|
|
||||||
|
|
||||||
/// <summary>Gets or sets the underlying texture wrap.</summary>
|
/// <summary>Gets or sets the underlying texture wrap.</summary>
|
||||||
public Task<IDalamudTextureWrap>? UnderlyingWrap { get; set; }
|
public Task<IDalamudTextureWrap>? UnderlyingWrap { get; set; }
|
||||||
|
|
||||||
|
|
@ -91,16 +86,6 @@ internal abstract class SharedImmediateTexture
|
||||||
/// Intended to be called from implementors' constructors and <see cref="LoadUnderlyingWrap"/>.</summary>
|
/// Intended to be called from implementors' constructors and <see cref="LoadUnderlyingWrap"/>.</summary>
|
||||||
protected CancellationToken LoadCancellationToken => this.cancellationTokenSource?.Token ?? default;
|
protected CancellationToken LoadCancellationToken => this.cancellationTokenSource?.Token ?? default;
|
||||||
|
|
||||||
/// <summary>Gets or sets a weak reference to an object that demands this objects to be alive.</summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// 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 <see cref="GetAvailableOnAccessWrapForApi9"/>. If this no longer points to an alive
|
|
||||||
/// object, and <see cref="availableOnAccessWrapForApi9"/> is null, then this object is not used from API9 use case.
|
|
||||||
/// </remarks>
|
|
||||||
private WeakReference<IDalamudTextureWrap>? RevivalPossibility { get; set; }
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public int AddRef() => this.TryAddRef(out var newRefCount) switch
|
public int AddRef() => this.TryAddRef(out var newRefCount) switch
|
||||||
{
|
{
|
||||||
|
|
@ -180,7 +165,6 @@ internal abstract class SharedImmediateTexture
|
||||||
if (exp != Interlocked.CompareExchange(ref this.selfReferenceExpiry, SelfReferenceExpiryExpired, exp))
|
if (exp != Interlocked.CompareExchange(ref this.selfReferenceExpiry, SelfReferenceExpiryExpired, exp))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
this.availableOnAccessWrapForApi9 = null;
|
|
||||||
return this.Release();
|
return this.Release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -255,35 +239,6 @@ internal abstract class SharedImmediateTexture
|
||||||
return new RefCountableWrappingTextureWrap(dtw, this);
|
return new RefCountableWrappingTextureWrap(dtw, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Gets a texture wrap which ensures that the values will be populated on access.</summary>
|
|
||||||
/// <returns>The texture wrap, or null if failed.</returns>
|
|
||||||
[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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>Adds a plugin to <see cref="ownerPlugins"/>, in a thread-safe way.</summary>
|
/// <summary>Adds a plugin to <see cref="ownerPlugins"/>, in a thread-safe way.</summary>
|
||||||
/// <param name="plugin">The plugin to add.</param>
|
/// <param name="plugin">The plugin to add.</param>
|
||||||
public void AddOwnerPlugin(LocalPlugin plugin)
|
public void AddOwnerPlugin(LocalPlugin plugin)
|
||||||
|
|
@ -383,9 +338,6 @@ internal abstract class SharedImmediateTexture
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.RevivalPossibility?.TryGetTarget(out var target) is true)
|
|
||||||
this.availableOnAccessWrapForApi9 = target;
|
|
||||||
|
|
||||||
Interlocked.Increment(ref this.refCount);
|
Interlocked.Increment(ref this.refCount);
|
||||||
this.resourceReleased = false;
|
this.resourceReleased = false;
|
||||||
return IRefCountable.RefCountResult.StillAlive;
|
return IRefCountable.RefCountResult.StillAlive;
|
||||||
|
|
@ -468,12 +420,6 @@ internal abstract class SharedImmediateTexture
|
||||||
public Task<IDalamudTextureWrap> RentAsync(CancellationToken cancellationToken = default) =>
|
public Task<IDalamudTextureWrap> RentAsync(CancellationToken cancellationToken = default) =>
|
||||||
this.inner.RentAsync(cancellationToken);
|
this.inner.RentAsync(cancellationToken);
|
||||||
|
|
||||||
/// <inheritdoc cref="SharedImmediateTexture.GetAvailableOnAccessWrapForApi9"/>
|
|
||||||
[Api10ToDo(Api10ToDoAttribute.DeleteCompatBehavior)]
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
public IDalamudTextureWrap? GetAvailableOnAccessWrapForApi9() =>
|
|
||||||
this.inner.GetAvailableOnAccessWrapForApi9();
|
|
||||||
|
|
||||||
/// <inheritdoc cref="SharedImmediateTexture.AddOwnerPlugin"/>
|
/// <inheritdoc cref="SharedImmediateTexture.AddOwnerPlugin"/>
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public void AddOwnerPlugin(LocalPlugin plugin) =>
|
public void AddOwnerPlugin(LocalPlugin plugin) =>
|
||||||
|
|
@ -562,56 +508,4 @@ internal abstract class SharedImmediateTexture
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>A texture wrap that revives and waits for the underlying texture as needed on every access.</summary>
|
|
||||||
[Api10ToDo(Api10ToDoAttribute.DeleteCompatBehavior)]
|
|
||||||
private sealed class AvailableOnAccessTextureWrap : ForwardingTextureWrap
|
|
||||||
{
|
|
||||||
private readonly SharedImmediateTexture inner;
|
|
||||||
|
|
||||||
/// <summary>Initializes a new instance of the <see cref="AvailableOnAccessTextureWrap"/> class.</summary>
|
|
||||||
/// <param name="inner">The shared texture.</param>
|
|
||||||
public AvailableOnAccessTextureWrap(SharedImmediateTexture inner) => this.inner = inner;
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
|
||||||
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<DalamudAssetManager>.Get().Empty4X4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return new RefCountableWrappingTextureWrap(wrap, this.inner);
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
this.inner.Release();
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
|
||||||
public override string ToString() => $"{nameof(AvailableOnAccessTextureWrap)}({this.inner})";
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
|
||||||
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<DalamudAssetManager>.Get().Empty4X4;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -159,7 +159,7 @@ internal sealed partial class TextureManager
|
||||||
{
|
{
|
||||||
if (this.gameDict.TryRemove(path, out var r))
|
if (this.gameDict.TryRemove(path, out var r))
|
||||||
{
|
{
|
||||||
if (r.ReleaseSelfReference(true) != 0 || r.HasRevivalPossibility)
|
if (r.ReleaseSelfReference(true) != 0)
|
||||||
{
|
{
|
||||||
lock (this.invalidatedTextures)
|
lock (this.invalidatedTextures)
|
||||||
this.invalidatedTextures.Add(r);
|
this.invalidatedTextures.Add(r);
|
||||||
|
|
@ -201,7 +201,7 @@ internal sealed partial class TextureManager
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
static bool TextureFinalReleasePredicate(SharedImmediateTexture v) =>
|
static bool TextureFinalReleasePredicate(SharedImmediateTexture v) =>
|
||||||
v.ContentQueried && v.ReleaseSelfReference(false) == 0 && !v.HasRevivalPossibility;
|
v.ContentQueried && v.ReleaseSelfReference(false) == 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue