mirror of
https://github.com/GreemDev/Ryujinx.git
synced 2025-04-29 15:49:25 -04:00
This is not a continuation of the Metal backend; this is simply bringing the branch up to date and merging it as-is behind an experiment. --------- Co-authored-by: Isaac Marovitz <isaacryu@icloud.com> Co-authored-by: Samuliak <samuliak77@gmail.com> Co-authored-by: SamoZ256 <96914946+SamoZ256@users.noreply.github.com> Co-authored-by: Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com> Co-authored-by: riperiperi <rhy3756547@hotmail.com> Co-authored-by: Gabriel A <gab.dark.100@gmail.com>
77 lines
1.7 KiB
C#
77 lines
1.7 KiB
C#
using SharpMetal.Metal;
|
|
using System;
|
|
using System.Runtime.Versioning;
|
|
using System.Threading;
|
|
|
|
namespace Ryujinx.Graphics.Metal
|
|
{
|
|
[SupportedOSPlatform("macos")]
|
|
class FenceHolder : IDisposable
|
|
{
|
|
private MTLCommandBuffer _fence;
|
|
private int _referenceCount;
|
|
private bool _disposed;
|
|
|
|
public FenceHolder(MTLCommandBuffer fence)
|
|
{
|
|
_fence = fence;
|
|
_referenceCount = 1;
|
|
}
|
|
|
|
public MTLCommandBuffer GetUnsafe()
|
|
{
|
|
return _fence;
|
|
}
|
|
|
|
public bool TryGet(out MTLCommandBuffer fence)
|
|
{
|
|
int lastValue;
|
|
do
|
|
{
|
|
lastValue = _referenceCount;
|
|
|
|
if (lastValue == 0)
|
|
{
|
|
fence = default;
|
|
return false;
|
|
}
|
|
} while (Interlocked.CompareExchange(ref _referenceCount, lastValue + 1, lastValue) != lastValue);
|
|
|
|
fence = _fence;
|
|
return true;
|
|
}
|
|
|
|
public MTLCommandBuffer Get()
|
|
{
|
|
Interlocked.Increment(ref _referenceCount);
|
|
return _fence;
|
|
}
|
|
|
|
public void Put()
|
|
{
|
|
if (Interlocked.Decrement(ref _referenceCount) == 0)
|
|
{
|
|
_fence = default;
|
|
}
|
|
}
|
|
|
|
public void Wait()
|
|
{
|
|
_fence.WaitUntilCompleted();
|
|
}
|
|
|
|
public bool IsSignaled()
|
|
{
|
|
return _fence.Status == MTLCommandBufferStatus.Completed;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
if (!_disposed)
|
|
{
|
|
Put();
|
|
_disposed = true;
|
|
}
|
|
}
|
|
}
|
|
}
|