aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Vulkan/Auto.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/Auto.cs')
-rw-r--r--src/Ryujinx.Graphics.Vulkan/Auto.cs24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/Auto.cs b/src/Ryujinx.Graphics.Vulkan/Auto.cs
index fdce7232..026dd2b6 100644
--- a/src/Ryujinx.Graphics.Vulkan/Auto.cs
+++ b/src/Ryujinx.Graphics.Vulkan/Auto.cs
@@ -18,6 +18,12 @@ namespace Ryujinx.Graphics.Vulkan
void AddCommandBufferDependencies(CommandBufferScoped cbs);
}
+ interface IMirrorable<T> where T : IDisposable
+ {
+ Auto<T> GetMirrorable(CommandBufferScoped cbs, ref int offset, int size, out bool mirrored);
+ void ClearMirrors(CommandBufferScoped cbs, int offset, int size);
+ }
+
class Auto<T> : IAutoPrivate, IDisposable where T : IDisposable
{
private int _referenceCount;
@@ -26,6 +32,7 @@ namespace Ryujinx.Graphics.Vulkan
private readonly BitMap _cbOwnership;
private readonly MultiFenceHolder _waitable;
private readonly IAutoPrivate[] _referencedObjs;
+ private readonly IMirrorable<T> _mirrorable;
private bool _disposed;
private bool _destroyed;
@@ -37,6 +44,11 @@ namespace Ryujinx.Graphics.Vulkan
_cbOwnership = new BitMap(CommandBufferPool.MaxCommandBuffers);
}
+ public Auto(T value, IMirrorable<T> mirrorable, MultiFenceHolder waitable, params IAutoPrivate[] referencedObjs) : this(value, waitable, referencedObjs)
+ {
+ _mirrorable = mirrorable;
+ }
+
public Auto(T value, MultiFenceHolder waitable, params IAutoPrivate[] referencedObjs) : this(value)
{
_waitable = waitable;
@@ -48,9 +60,17 @@ namespace Ryujinx.Graphics.Vulkan
}
}
- public T Get(CommandBufferScoped cbs, int offset, int size)
+ public T GetMirrorable(CommandBufferScoped cbs, ref int offset, int size, out bool mirrored)
+ {
+ var mirror = _mirrorable.GetMirrorable(cbs, ref offset, size, out mirrored);
+ mirror._waitable?.AddBufferUse(cbs.CommandBufferIndex, offset, size, false);
+ return mirror.Get(cbs);
+ }
+
+ public T Get(CommandBufferScoped cbs, int offset, int size, bool write = false)
{
- _waitable?.AddBufferUse(cbs.CommandBufferIndex, offset, size);
+ _mirrorable?.ClearMirrors(cbs, offset, size);
+ _waitable?.AddBufferUse(cbs.CommandBufferIndex, offset, size, write);
return Get(cbs);
}