Ryujinx/src/Ryujinx.Graphics.Vulkan/FenceHolder.cs
TSRBerry 801b71a128
[Ryujinx.Graphics.Vulkan] Address dotnet-format issues (#5378)
* dotnet format style --severity info

Some changes were manually reverted.

* dotnet format analyzers --serverity info

Some changes have been minimally adapted.

* Restore a few unused methods and variables

* Silence dotnet format IDE0060 warnings

* Silence dotnet format IDE0059 warnings

* Address dotnet format CA1816 warnings

* Fix new dotnet-format issues after rebase

* Address most dotnet format whitespace warnings

* Apply dotnet format whitespace formatting

A few of them have been manually reverted and the corresponding warning was silenced

* Format if-blocks correctly

* Another rebase, another dotnet format run

* Run dotnet format whitespace after rebase

* Run dotnet format style after rebase

* Run dotnet format analyzers after rebase

* Run dotnet format style after rebase

* Run dotnet format after rebase and remove unused usings

- analyzers
- style
- whitespace

* Disable 'prefer switch expression' rule

* Add comments to disabled warnings

* Simplify properties and array initialization, Use const when possible, Remove trailing commas

* Run dotnet format after rebase

* Address IDE0251 warnings

* Address a few disabled IDE0060 warnings

* Silence IDE0060 in .editorconfig

* Revert "Simplify properties and array initialization, Use const when possible, Remove trailing commas"

This reverts commit 9462e4136c0a2100dc28b20cf9542e06790aa67e.

* dotnet format whitespace after rebase

* First dotnet format pass

* Fix naming rule violations

* Remove redundant code

* Rename generics

* Address review feedback

* Remove SetOrigin
2023-07-01 12:31:42 +02:00

98 lines
2.2 KiB
C#

using Silk.NET.Vulkan;
using System;
using System.Threading;
namespace Ryujinx.Graphics.Vulkan
{
class FenceHolder : IDisposable
{
private readonly Vk _api;
private readonly Device _device;
private Fence _fence;
private int _referenceCount;
private bool _disposed;
public unsafe FenceHolder(Vk api, Device device)
{
_api = api;
_device = device;
var fenceCreateInfo = new FenceCreateInfo
{
SType = StructureType.FenceCreateInfo,
};
api.CreateFence(device, in fenceCreateInfo, null, out _fence).ThrowOnError();
_referenceCount = 1;
}
public Fence GetUnsafe()
{
return _fence;
}
public bool TryGet(out Fence 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 Fence Get()
{
Interlocked.Increment(ref _referenceCount);
return _fence;
}
public void Put()
{
if (Interlocked.Decrement(ref _referenceCount) == 0)
{
_api.DestroyFence(_device, _fence, Span<AllocationCallbacks>.Empty);
_fence = default;
}
}
public void Wait()
{
Span<Fence> fences = stackalloc Fence[]
{
_fence,
};
FenceHelper.WaitAllIndefinitely(_api, _device, fences);
}
public bool IsSignaled()
{
Span<Fence> fences = stackalloc Fence[]
{
_fence,
};
return FenceHelper.AllSignaled(_api, _device, fences);
}
public void Dispose()
{
if (!_disposed)
{
Put();
_disposed = true;
}
}
}
}