misc: chore: Use explicit types & fix object creation

This commit is contained in:
KeatonTheBot
2026-05-30 16:26:50 -05:00
parent 9d3fecf334
commit 76a123b81d
454 changed files with 3042 additions and 2961 deletions
+1 -1
View File
@@ -63,7 +63,7 @@ namespace Ryujinx.Graphics.Vulkan
public T GetMirrorable(CommandBufferScoped cbs, ref int offset, int size, out bool mirrored)
{
var mirror = _mirrorable.GetMirrorable(cbs, ref offset, size, out mirrored);
Auto<T> mirror = _mirrorable.GetMirrorable(cbs, ref offset, size, out mirrored);
mirror._waitable?.AddBufferUse(cbs.CommandBufferIndex, offset, size, false);
return mirror.Get(cbs);
}
@@ -110,7 +110,7 @@ namespace Ryujinx.Graphics.Vulkan
{
lock (_resources)
{
foreach (var resource in _resources.Values)
foreach (BackgroundResource resource in _resources.Values)
{
resource.Dispose();
}
+2 -2
View File
@@ -357,7 +357,7 @@ namespace Ryujinx.Graphics.Vulkan
{
// Generic pipeline memory barriers will work for desktop GPUs.
// They do require a few more access flags on the subpass dependency, though.
foreach (var barrier in _imageBarriers)
foreach (BarrierWithStageFlags<ImageMemoryBarrier, TextureStorage> barrier in _imageBarriers)
{
_memoryBarriers.Add(new BarrierWithStageFlags<MemoryBarrier, int>(
barrier.Flags,
@@ -377,7 +377,7 @@ namespace Ryujinx.Graphics.Vulkan
{
PipelineStageFlags allFlags = PipelineStageFlags.None;
foreach (var barrier in _memoryBarriers)
foreach (BarrierWithStageFlags<MemoryBarrier, int> barrier in _memoryBarriers)
{
allFlags |= barrier.Flags.Dest;
}
+4 -4
View File
@@ -231,11 +231,11 @@ namespace Ryujinx.Graphics.Vulkan
public BitMapStruct<T> Union(BitMapStruct<T> other)
{
var result = new BitMapStruct<T>();
BitMapStruct<T> result = new();
var masksSpan = _masks.AsSpan();
var oMasksSpan = other._masks.AsSpan();
var nMasksSpan = result._masks.AsSpan();
Span<long> masksSpan = _masks.AsSpan();
Span<long> oMasksSpan = other._masks.AsSpan();
Span<long> nMasksSpan = result._masks.AsSpan();
for (int i = 0; i < masksSpan.Length; i++)
{
+24 -24
View File
@@ -117,7 +117,7 @@ namespace Ryujinx.Graphics.Vulkan
public unsafe Auto<DisposableBufferView> CreateView(VkFormat format, int offset, int size, Action invalidateView)
{
var bufferViewCreateInfo = new BufferViewCreateInfo
BufferViewCreateInfo bufferViewCreateInfo = new()
{
SType = StructureType.BufferViewCreateInfo,
Buffer = new VkBuffer(_bufferHandle),
@@ -126,7 +126,7 @@ namespace Ryujinx.Graphics.Vulkan
Range = (uint)size,
};
_gd.Api.CreateBufferView(_device, in bufferViewCreateInfo, null, out var bufferView).ThrowOnError();
_gd.Api.CreateBufferView(_device, in bufferViewCreateInfo, null, out BufferView bufferView).ThrowOnError();
return new Auto<DisposableBufferView>(new DisposableBufferView(_gd.Api, _device, bufferView), this, _waitable, _buffer);
}
@@ -187,7 +187,7 @@ namespace Ryujinx.Graphics.Vulkan
return false;
}
var key = ToMirrorKey(offset, size);
ulong key = ToMirrorKey(offset, size);
if (_mirrors.TryGetValue(key, out StagingBufferReserved reserved))
{
@@ -209,14 +209,14 @@ namespace Ryujinx.Graphics.Vulkan
// Build data for the new mirror.
var baseData = new Span<byte>((void*)(_map + offset), size);
var modData = _pendingData.AsSpan(offset, size);
Span<byte> baseData = new((void*)(_map + offset), size);
Span<byte> modData = _pendingData.AsSpan(offset, size);
StagingBufferReserved? newMirror = _gd.BufferManager.StagingBuffer.TryReserveData(cbs, size);
if (newMirror != null)
{
var mirror = newMirror.Value;
StagingBufferReserved mirror = newMirror.Value;
_pendingDataRanges.FillData(baseData, modData, offset, new Span<byte>((void*)(mirror.Buffer._map + mirror.Offset), size));
if (_mirrors.Count == 0)
@@ -323,13 +323,13 @@ namespace Ryujinx.Graphics.Vulkan
private void UploadPendingData(CommandBufferScoped cbs, int offset, int size)
{
var ranges = _pendingDataRanges.FindOverlaps(offset, size);
List<BufferMirrorRangeList.Range> ranges = _pendingDataRanges.FindOverlaps(offset, size);
if (ranges != null)
{
_pendingDataRanges.Remove(offset, size);
foreach (var range in ranges)
foreach (BufferMirrorRangeList.Range range in ranges)
{
int rangeOffset = Math.Max(offset, range.Offset);
int rangeSize = Math.Min(offset + size, range.End) - rangeOffset;
@@ -370,7 +370,7 @@ namespace Ryujinx.Graphics.Vulkan
public BufferHandle GetHandle()
{
var handle = _bufferHandle;
ulong handle = _bufferHandle;
return Unsafe.As<ulong, BufferHandle>(ref handle);
}
@@ -407,7 +407,7 @@ namespace Ryujinx.Graphics.Vulkan
if (_flushFence != null)
{
var fence = _flushFence;
FenceHolder fence = _flushFence;
Interlocked.Increment(ref _flushWaiting);
// Don't wait in the lock.
@@ -485,7 +485,7 @@ namespace Ryujinx.Graphics.Vulkan
public bool RemoveOverlappingMirrors(int offset, int size)
{
List<ulong> toRemove = null;
foreach (var key in _mirrors.Keys)
foreach (ulong key in _mirrors.Keys)
{
(int keyOffset, int keySize) = FromMirrorKey(key);
if (!(offset + size <= keyOffset || offset >= keyOffset + keySize))
@@ -498,7 +498,7 @@ namespace Ryujinx.Graphics.Vulkan
if (toRemove != null)
{
foreach (var key in toRemove)
foreach (ulong key in toRemove)
{
_mirrors.Remove(key);
}
@@ -610,8 +610,8 @@ namespace Ryujinx.Graphics.Vulkan
BufferHolder srcHolder = _gd.BufferManager.Create(_gd, dataSize, baseType: BufferAllocationType.HostMapped);
srcHolder.SetDataUnchecked(0, data);
var srcBuffer = srcHolder.GetBuffer();
var dstBuffer = this.GetBuffer(cbs.Value.CommandBuffer, true);
Auto<DisposableBuffer> srcBuffer = srcHolder.GetBuffer();
Auto<DisposableBuffer> dstBuffer = this.GetBuffer(cbs.Value.CommandBuffer, true);
Copy(_gd, cbs.Value, srcBuffer, dstBuffer, 0, offset, dataSize);
@@ -666,7 +666,7 @@ namespace Ryujinx.Graphics.Vulkan
endRenderPass?.Invoke();
var dstBuffer = GetBuffer(cbs.CommandBuffer, dstOffset, data.Length, true).Get(cbs, dstOffset, data.Length, true).Value;
VkBuffer dstBuffer = GetBuffer(cbs.CommandBuffer, dstOffset, data.Length, true).Get(cbs, dstOffset, data.Length, true).Value;
InsertBufferBarrier(
_gd,
@@ -713,8 +713,8 @@ namespace Ryujinx.Graphics.Vulkan
int size,
bool registerSrcUsage = true)
{
var srcBuffer = registerSrcUsage ? src.Get(cbs, srcOffset, size).Value : src.GetUnsafe().Value;
var dstBuffer = dst.Get(cbs, dstOffset, size, true).Value;
VkBuffer srcBuffer = registerSrcUsage ? src.Get(cbs, srcOffset, size).Value : src.GetUnsafe().Value;
VkBuffer dstBuffer = dst.Get(cbs, dstOffset, size, true).Value;
InsertBufferBarrier(
gd,
@@ -727,7 +727,7 @@ namespace Ryujinx.Graphics.Vulkan
dstOffset,
size);
var region = new BufferCopy((ulong)srcOffset, (ulong)dstOffset, (ulong)size);
BufferCopy region = new((ulong)srcOffset, (ulong)dstOffset, (ulong)size);
gd.Api.CmdCopyBuffer(cbs.CommandBuffer, srcBuffer, dstBuffer, 1, &region);
@@ -808,9 +808,9 @@ namespace Ryujinx.Graphics.Vulkan
return null;
}
var key = new I8ToI16CacheKey(_gd);
I8ToI16CacheKey key = new(_gd);
if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out var holder))
if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out BufferHolder holder))
{
holder = _gd.BufferManager.Create(_gd, (size * 2 + 3) & ~3, baseType: BufferAllocationType.DeviceLocal);
@@ -832,9 +832,9 @@ namespace Ryujinx.Graphics.Vulkan
return null;
}
var key = new AlignedVertexBufferCacheKey(_gd, stride, alignment);
AlignedVertexBufferCacheKey key = new(_gd, stride, alignment);
if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out var holder))
if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out BufferHolder holder))
{
int alignedStride = (stride + (alignment - 1)) & -alignment;
@@ -858,9 +858,9 @@ namespace Ryujinx.Graphics.Vulkan
return null;
}
var key = new TopologyConversionCacheKey(_gd, pattern, indexSize);
TopologyConversionCacheKey key = new(_gd, pattern, indexSize);
if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out var holder))
if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out BufferHolder holder))
{
// The destination index size is always I32.
+42 -42
View File
@@ -96,20 +96,20 @@ namespace Ryujinx.Graphics.Vulkan
public unsafe BufferHandle CreateHostImported(VulkanRenderer gd, nint pointer, int size)
{
var usage = HostImportedBufferUsageFlags;
BufferUsageFlags usage = HostImportedBufferUsageFlags;
if (gd.Capabilities.SupportsIndirectParameters)
{
usage |= BufferUsageFlags.IndirectBufferBit;
}
var externalMemoryBuffer = new ExternalMemoryBufferCreateInfo
ExternalMemoryBufferCreateInfo externalMemoryBuffer = new()
{
SType = StructureType.ExternalMemoryBufferCreateInfo,
HandleTypes = ExternalMemoryHandleTypeFlags.HostAllocationBitExt,
};
var bufferCreateInfo = new BufferCreateInfo
BufferCreateInfo bufferCreateInfo = new()
{
SType = StructureType.BufferCreateInfo,
Size = (ulong)size,
@@ -118,13 +118,13 @@ namespace Ryujinx.Graphics.Vulkan
PNext = &externalMemoryBuffer,
};
gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out var buffer).ThrowOnError();
gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out VkBuffer buffer).ThrowOnError();
(Auto<MemoryAllocation> allocation, ulong offset) = gd.HostMemoryAllocator.GetExistingAllocation(pointer, (ulong)size);
gd.Api.BindBufferMemory(_device, buffer, allocation.GetUnsafe().Memory, allocation.GetUnsafe().Offset + offset);
var holder = new BufferHolder(gd, _device, buffer, allocation, size, BufferAllocationType.HostMapped, BufferAllocationType.HostMapped, (int)offset);
BufferHolder holder = new(gd, _device, buffer, allocation, size, BufferAllocationType.HostMapped, BufferAllocationType.HostMapped, (int)offset);
BufferCount++;
@@ -135,7 +135,7 @@ namespace Ryujinx.Graphics.Vulkan
public unsafe BufferHandle CreateSparse(VulkanRenderer gd, ReadOnlySpan<BufferRange> storageBuffers)
{
var usage = DefaultBufferUsageFlags;
BufferUsageFlags usage = DefaultBufferUsageFlags;
if (gd.Capabilities.SupportsIndirectParameters)
{
@@ -149,7 +149,7 @@ namespace Ryujinx.Graphics.Vulkan
size += (ulong)range.Size;
}
var bufferCreateInfo = new BufferCreateInfo()
BufferCreateInfo bufferCreateInfo = new()
{
SType = StructureType.BufferCreateInfo,
Size = size,
@@ -158,10 +158,10 @@ namespace Ryujinx.Graphics.Vulkan
Flags = BufferCreateFlags.SparseBindingBit | BufferCreateFlags.SparseAliasedBit
};
gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out var buffer).ThrowOnError();
gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out VkBuffer buffer).ThrowOnError();
var memoryBinds = new SparseMemoryBind[storageBuffers.Length];
var storageAllocations = new Auto<MemoryAllocation>[storageBuffers.Length];
SparseMemoryBind[] memoryBinds = new SparseMemoryBind[storageBuffers.Length];
Auto<MemoryAllocation>[] storageAllocations = new Auto<MemoryAllocation>[storageBuffers.Length];
int storageAllocationsCount = 0;
ulong dstOffset = 0;
@@ -170,9 +170,9 @@ namespace Ryujinx.Graphics.Vulkan
{
BufferRange range = storageBuffers[index];
if (TryGetBuffer(range.Handle, out var existingHolder))
if (TryGetBuffer(range.Handle, out BufferHolder existingHolder))
{
(var memory, var offset) = existingHolder.GetDeviceMemoryAndOffset();
(DeviceMemory memory, ulong offset) = existingHolder.GetDeviceMemoryAndOffset();
memoryBinds[index] = new SparseMemoryBind()
{
@@ -224,7 +224,7 @@ namespace Ryujinx.Graphics.Vulkan
gd.Api.QueueBindSparse(gd.Queue, 1, in bindSparseInfo, default).ThrowOnError();
}
var holder = new BufferHolder(gd, _device, buffer, (int)size, storageAllocations);
BufferHolder holder = new(gd, _device, buffer, (int)size, storageAllocations);
BufferCount++;
@@ -288,14 +288,14 @@ namespace Ryujinx.Graphics.Vulkan
public unsafe MemoryRequirements GetHostImportedUsageRequirements(VulkanRenderer gd)
{
var usage = HostImportedBufferUsageFlags;
BufferUsageFlags usage = HostImportedBufferUsageFlags;
if (gd.Capabilities.SupportsIndirectParameters)
{
usage |= BufferUsageFlags.IndirectBufferBit;
}
var bufferCreateInfo = new BufferCreateInfo
BufferCreateInfo bufferCreateInfo = new()
{
SType = StructureType.BufferCreateInfo,
Size = (ulong)Environment.SystemPageSize,
@@ -303,9 +303,9 @@ namespace Ryujinx.Graphics.Vulkan
SharingMode = SharingMode.Exclusive,
};
gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out var buffer).ThrowOnError();
gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out VkBuffer buffer).ThrowOnError();
gd.Api.GetBufferMemoryRequirements(_device, buffer, out var requirements);
gd.Api.GetBufferMemoryRequirements(_device, buffer, out MemoryRequirements requirements);
gd.Api.DestroyBuffer(_device, buffer, null);
@@ -320,7 +320,7 @@ namespace Ryujinx.Graphics.Vulkan
bool sparseCompatible = false,
BufferAllocationType fallbackType = BufferAllocationType.Auto)
{
var usage = DefaultBufferUsageFlags;
BufferUsageFlags usage = DefaultBufferUsageFlags;
if (forConditionalRendering && gd.Capabilities.SupportsConditionalRendering)
{
@@ -331,7 +331,7 @@ namespace Ryujinx.Graphics.Vulkan
usage |= BufferUsageFlags.IndirectBufferBit;
}
var bufferCreateInfo = new BufferCreateInfo
BufferCreateInfo bufferCreateInfo = new()
{
SType = StructureType.BufferCreateInfo,
Size = (ulong)size,
@@ -339,8 +339,8 @@ namespace Ryujinx.Graphics.Vulkan
SharingMode = SharingMode.Exclusive,
};
gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out var buffer).ThrowOnError();
gd.Api.GetBufferMemoryRequirements(_device, buffer, out var requirements);
gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out VkBuffer buffer).ThrowOnError();
gd.Api.GetBufferMemoryRequirements(_device, buffer, out MemoryRequirements requirements);
if (sparseCompatible)
{
@@ -351,7 +351,7 @@ namespace Ryujinx.Graphics.Vulkan
do
{
var allocateFlags = type switch
MemoryPropertyFlags allocateFlags = type switch
{
BufferAllocationType.HostMappedNoCache => DefaultBufferMemoryNoCacheFlags,
BufferAllocationType.HostMapped => DefaultBufferMemoryFlags,
@@ -402,7 +402,7 @@ namespace Ryujinx.Graphics.Vulkan
if (buffer.Handle != 0)
{
var holder = new BufferHolder(gd, _device, buffer, allocation, size, baseType, resultType);
BufferHolder holder = new(gd, _device, buffer, allocation, size, baseType, resultType);
return holder;
}
@@ -414,7 +414,7 @@ namespace Ryujinx.Graphics.Vulkan
public Auto<DisposableBufferView> CreateView(BufferHandle handle, VkFormat format, int offset, int size, Action invalidateView)
{
if (TryGetBuffer(handle, out var holder))
if (TryGetBuffer(handle, out BufferHolder holder))
{
return holder.CreateView(format, offset, size, invalidateView);
}
@@ -424,7 +424,7 @@ namespace Ryujinx.Graphics.Vulkan
public Auto<DisposableBuffer> GetBuffer(CommandBuffer commandBuffer, BufferHandle handle, bool isWrite, bool isSSBO = false)
{
if (TryGetBuffer(handle, out var holder))
if (TryGetBuffer(handle, out BufferHolder holder))
{
return holder.GetBuffer(commandBuffer, isWrite, isSSBO);
}
@@ -434,7 +434,7 @@ namespace Ryujinx.Graphics.Vulkan
public Auto<DisposableBuffer> GetBuffer(CommandBuffer commandBuffer, BufferHandle handle, int offset, int size, bool isWrite)
{
if (TryGetBuffer(handle, out var holder))
if (TryGetBuffer(handle, out BufferHolder holder))
{
return holder.GetBuffer(commandBuffer, offset, size, isWrite);
}
@@ -444,7 +444,7 @@ namespace Ryujinx.Graphics.Vulkan
public Auto<DisposableBuffer> GetBufferI8ToI16(CommandBufferScoped cbs, BufferHandle handle, int offset, int size)
{
if (TryGetBuffer(handle, out var holder))
if (TryGetBuffer(handle, out BufferHolder holder))
{
return holder.GetBufferI8ToI16(cbs, offset, size);
}
@@ -454,7 +454,7 @@ namespace Ryujinx.Graphics.Vulkan
public Auto<DisposableBuffer> GetAlignedVertexBuffer(CommandBufferScoped cbs, BufferHandle handle, int offset, int size, int stride, int alignment)
{
if (TryGetBuffer(handle, out var holder))
if (TryGetBuffer(handle, out BufferHolder holder))
{
return holder.GetAlignedVertexBuffer(cbs, offset, size, stride, alignment);
}
@@ -464,7 +464,7 @@ namespace Ryujinx.Graphics.Vulkan
public Auto<DisposableBuffer> GetBufferTopologyConversion(CommandBufferScoped cbs, BufferHandle handle, int offset, int size, IndexBufferPattern pattern, int indexSize)
{
if (TryGetBuffer(handle, out var holder))
if (TryGetBuffer(handle, out BufferHolder holder))
{
return holder.GetBufferTopologyConversion(cbs, offset, size, pattern, indexSize);
}
@@ -486,14 +486,14 @@ namespace Ryujinx.Graphics.Vulkan
{
BufferHolder drawCountBufferHolder = null;
if (!TryGetBuffer(indexBuffer.Handle, out var indexBufferHolder) ||
!TryGetBuffer(indirectBuffer.Handle, out var indirectBufferHolder) ||
if (!TryGetBuffer(indexBuffer.Handle, out BufferHolder indexBufferHolder) ||
!TryGetBuffer(indirectBuffer.Handle, out BufferHolder indirectBufferHolder) ||
(hasDrawCount && !TryGetBuffer(drawCountBuffer.Handle, out drawCountBufferHolder)))
{
return (null, null);
}
var indexBufferKey = new TopologyConversionIndirectCacheKey(
TopologyConversionIndirectCacheKey indexBufferKey = new(
gd,
pattern,
indexSize,
@@ -505,16 +505,16 @@ namespace Ryujinx.Graphics.Vulkan
indexBuffer.Offset,
indexBuffer.Size,
indexBufferKey,
out var convertedIndexBuffer);
out BufferHolder convertedIndexBuffer);
var indirectBufferKey = new IndirectDataCacheKey(pattern);
IndirectDataCacheKey indirectBufferKey = new(pattern);
bool hasConvertedIndirectBuffer = indirectBufferHolder.TryGetCachedConvertedBuffer(
indirectBuffer.Offset,
indirectBuffer.Size,
indirectBufferKey,
out var convertedIndirectBuffer);
out BufferHolder convertedIndirectBuffer);
var drawCountBufferKey = new DrawCountCacheKey();
DrawCountCacheKey drawCountBufferKey = new();
bool hasCachedDrawCount = true;
if (hasDrawCount)
@@ -568,7 +568,7 @@ namespace Ryujinx.Graphics.Vulkan
// Any modification of the indirect buffer should invalidate the index buffers that are associated with it,
// since we used the indirect data to find the range of the index buffer that is used.
var indexBufferDependency = new Dependency(
Dependency indexBufferDependency = new(
indexBufferHolder,
indexBuffer.Offset,
indexBuffer.Size,
@@ -590,7 +590,7 @@ namespace Ryujinx.Graphics.Vulkan
// If we have a draw count, any modification of the draw count should invalidate all indirect buffers
// where we used it to find the range of indirect data that is actually used.
var indirectBufferDependency = new Dependency(
Dependency indirectBufferDependency = new(
indirectBufferHolder,
indirectBuffer.Offset,
indirectBuffer.Size,
@@ -609,7 +609,7 @@ namespace Ryujinx.Graphics.Vulkan
public Auto<DisposableBuffer> GetBuffer(CommandBuffer commandBuffer, BufferHandle handle, bool isWrite, out int size)
{
if (TryGetBuffer(handle, out var holder))
if (TryGetBuffer(handle, out BufferHolder holder))
{
size = holder.Size;
return holder.GetBuffer(commandBuffer, isWrite);
@@ -621,7 +621,7 @@ namespace Ryujinx.Graphics.Vulkan
public PinnedSpan<byte> GetData(BufferHandle handle, int offset, int size)
{
if (TryGetBuffer(handle, out var holder))
if (TryGetBuffer(handle, out BufferHolder holder))
{
return holder.GetData(offset, size);
}
@@ -636,7 +636,7 @@ namespace Ryujinx.Graphics.Vulkan
public void SetData(BufferHandle handle, int offset, ReadOnlySpan<byte> data, CommandBufferScoped? cbs, Action endRenderPass)
{
if (TryGetBuffer(handle, out var holder))
if (TryGetBuffer(handle, out BufferHolder holder))
{
holder.SetData(offset, data, cbs, endRenderPass);
}
@@ -644,7 +644,7 @@ namespace Ryujinx.Graphics.Vulkan
public void Delete(BufferHandle handle)
{
if (TryGetBuffer(handle, out var holder))
if (TryGetBuffer(handle, out BufferHolder holder))
{
holder.Dispose();
_buffers.Remove((int)Unsafe.As<BufferHandle, ulong>(ref handle));
@@ -38,7 +38,7 @@ namespace Ryujinx.Graphics.Vulkan
public readonly bool Remove(int offset, int size)
{
var list = _ranges;
List<Range> list = _ranges;
bool removedAny = false;
if (list != null)
{
@@ -56,7 +56,7 @@ namespace Ryujinx.Graphics.Vulkan
int endOffset = offset + size;
int startIndex = overlapIndex;
var currentOverlap = list[overlapIndex];
Range currentOverlap = list[overlapIndex];
// Orphan the start of the overlap.
if (currentOverlap.Offset < offset)
@@ -102,7 +102,7 @@ namespace Ryujinx.Graphics.Vulkan
public void Add(int offset, int size)
{
var list = _ranges;
List<Range> list = _ranges;
if (list != null)
{
int overlapIndex = BinarySearch(list, offset, size);
@@ -118,8 +118,8 @@ namespace Ryujinx.Graphics.Vulkan
while (overlapIndex < list.Count && list[overlapIndex].OverlapsWith(offset, size))
{
var currentOverlap = list[overlapIndex];
var currentOverlapEndOffset = currentOverlap.Offset + currentOverlap.Size;
Range currentOverlap = list[overlapIndex];
int currentOverlapEndOffset = currentOverlap.Offset + currentOverlap.Size;
if (offset > currentOverlap.Offset)
{
@@ -156,7 +156,7 @@ namespace Ryujinx.Graphics.Vulkan
public readonly bool OverlapsWith(int offset, int size)
{
var list = _ranges;
List<Range> list = _ranges;
if (list == null)
{
return false;
@@ -167,7 +167,7 @@ namespace Ryujinx.Graphics.Vulkan
public readonly List<Range> FindOverlaps(int offset, int size)
{
var list = _ranges;
List<Range> list = _ranges;
if (list == null)
{
return null;
@@ -205,7 +205,7 @@ namespace Ryujinx.Graphics.Vulkan
int middle = left + (range >> 1);
var item = list[middle];
Range item = list[middle];
if (item.OverlapsWith(offset, size))
{
@@ -230,7 +230,7 @@ namespace Ryujinx.Graphics.Vulkan
int size = baseData.Length;
int endOffset = offset + size;
var list = _ranges;
List<Range> list = _ranges;
if (list == null)
{
baseData.CopyTo(result);
@@ -244,7 +244,7 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int i = 0; i < list.Count; i++)
{
var range = list[i];
Range range = list[i];
int rangeEnd = range.Offset + range.Size;
+2 -1
View File
@@ -1,4 +1,5 @@
using System;
using Buffer = Silk.NET.Vulkan.Buffer;
namespace Ryujinx.Graphics.Vulkan
{
@@ -23,7 +24,7 @@ namespace Ryujinx.Graphics.Vulkan
{
if (_buffer != null)
{
var buffer = _buffer.Get(cbs, _offset, _size, true).Value;
Buffer buffer = _buffer.Get(cbs, _offset, _size, true).Value;
ulong offset = (ulong)_offset;
ulong size = (ulong)_size;
@@ -37,7 +37,7 @@ namespace Ryujinx.Graphics.Vulkan
public void Initialize(Vk api, Device device, CommandPool pool)
{
var allocateInfo = new CommandBufferAllocateInfo
CommandBufferAllocateInfo allocateInfo = new()
{
SType = StructureType.CommandBufferAllocateInfo,
CommandBufferCount = 1,
@@ -75,7 +75,7 @@ namespace Ryujinx.Graphics.Vulkan
_concurrentFenceWaitUnsupported = concurrentFenceWaitUnsupported;
_owner = Thread.CurrentThread;
var commandPoolCreateInfo = new CommandPoolCreateInfo
CommandPoolCreateInfo commandPoolCreateInfo = new()
{
SType = StructureType.CommandPoolCreateInfo,
QueueFamilyIndex = queueFamilyIndex,
@@ -114,7 +114,7 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int i = 0; i < _totalCommandBuffers; i++)
{
ref var entry = ref _commandBuffers[i];
ref ReservedCommandBuffer entry = ref _commandBuffers[i];
if (entry.InConsumption)
{
@@ -130,7 +130,7 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int i = 0; i < _totalCommandBuffers; i++)
{
ref var entry = ref _commandBuffers[i];
ref ReservedCommandBuffer entry = ref _commandBuffers[i];
if (entry.InUse)
{
@@ -142,7 +142,7 @@ namespace Ryujinx.Graphics.Vulkan
public void AddWaitable(int cbIndex, MultiFenceHolder waitable)
{
ref var entry = ref _commandBuffers[cbIndex];
ref ReservedCommandBuffer entry = ref _commandBuffers[cbIndex];
if (waitable.AddFence(cbIndex, entry.Fence))
{
entry.Waitables.Add(waitable);
@@ -155,7 +155,7 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int i = 0; i < _totalCommandBuffers; i++)
{
ref var entry = ref _commandBuffers[i];
ref ReservedCommandBuffer entry = ref _commandBuffers[i];
if (entry.InUse &&
waitable.HasFence(i) &&
@@ -175,7 +175,7 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int i = 0; i < _totalCommandBuffers; i++)
{
ref var entry = ref _commandBuffers[i];
ref ReservedCommandBuffer entry = ref _commandBuffers[i];
if (entry.InUse && entry.Fence == fence)
{
@@ -205,7 +205,7 @@ namespace Ryujinx.Graphics.Vulkan
{
int index = _queuedIndexes[_queuedIndexesPtr];
ref var entry = ref _commandBuffers[index];
ref ReservedCommandBuffer entry = ref _commandBuffers[index];
if (wait || !entry.InConsumption || entry.Fence.IsSignaled())
{
@@ -240,7 +240,7 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < _totalCommandBuffers; i++)
{
ref var entry = ref _commandBuffers[cursor];
ref ReservedCommandBuffer entry = ref _commandBuffers[cursor];
if (!entry.InUse && !entry.InConsumption)
{
@@ -248,7 +248,7 @@ namespace Ryujinx.Graphics.Vulkan
_inUseCount++;
var commandBufferBeginInfo = new CommandBufferBeginInfo
CommandBufferBeginInfo commandBufferBeginInfo = new()
{
SType = StructureType.CommandBufferBeginInfo,
};
@@ -280,7 +280,7 @@ namespace Ryujinx.Graphics.Vulkan
{
int cbIndex = cbs.CommandBufferIndex;
ref var entry = ref _commandBuffers[cbIndex];
ref ReservedCommandBuffer entry = ref _commandBuffers[cbIndex];
Debug.Assert(entry.InUse);
Debug.Assert(entry.CommandBuffer.Handle == cbs.CommandBuffer.Handle);
@@ -289,7 +289,7 @@ namespace Ryujinx.Graphics.Vulkan
entry.SubmissionCount++;
_inUseCount--;
var commandBuffer = entry.CommandBuffer;
CommandBuffer commandBuffer = entry.CommandBuffer;
_api.EndCommandBuffer(commandBuffer).ThrowOnError();
@@ -324,7 +324,7 @@ namespace Ryujinx.Graphics.Vulkan
private void WaitAndDecrementRef(int cbIndex, bool refreshFence = true)
{
ref var entry = ref _commandBuffers[cbIndex];
ref ReservedCommandBuffer entry = ref _commandBuffers[cbIndex];
if (entry.InConsumption)
{
@@ -332,12 +332,12 @@ namespace Ryujinx.Graphics.Vulkan
entry.InConsumption = false;
}
foreach (var dependant in entry.Dependants)
foreach (IAuto dependant in entry.Dependants)
{
dependant.DecrementReferenceCount(cbIndex);
}
foreach (var waitable in entry.Waitables)
foreach (MultiFenceHolder waitable in entry.Waitables)
{
waitable.RemoveFence(cbIndex);
waitable.RemoveBufferUses(cbIndex);
@@ -33,7 +33,7 @@ namespace Ryujinx.Graphics.Vulkan
{
if (bufferInfo.Buffer.Handle != 0UL)
{
var writeDescriptorSet = new WriteDescriptorSet
WriteDescriptorSet writeDescriptorSet = new()
{
SType = StructureType.WriteDescriptorSet,
DstSet = _descriptorSets[setIndex],
@@ -56,7 +56,7 @@ namespace Ryujinx.Graphics.Vulkan
fixed (DescriptorBufferInfo* pBufferInfo = bufferInfo)
{
var writeDescriptorSet = new WriteDescriptorSet
WriteDescriptorSet writeDescriptorSet = new()
{
SType = StructureType.WriteDescriptorSet,
DstSet = _descriptorSets[setIndex],
@@ -74,7 +74,7 @@ namespace Ryujinx.Graphics.Vulkan
{
if (imageInfo.ImageView.Handle != 0UL)
{
var writeDescriptorSet = new WriteDescriptorSet
WriteDescriptorSet writeDescriptorSet = new()
{
SType = StructureType.WriteDescriptorSet,
DstSet = _descriptorSets[setIndex],
@@ -97,7 +97,7 @@ namespace Ryujinx.Graphics.Vulkan
fixed (DescriptorImageInfo* pImageInfo = imageInfo)
{
var writeDescriptorSet = new WriteDescriptorSet
WriteDescriptorSet writeDescriptorSet = new()
{
SType = StructureType.WriteDescriptorSet,
DstSet = _descriptorSets[setIndex],
@@ -134,7 +134,7 @@ namespace Ryujinx.Graphics.Vulkan
count++;
}
var writeDescriptorSet = new WriteDescriptorSet
WriteDescriptorSet writeDescriptorSet = new()
{
SType = StructureType.WriteDescriptorSet,
DstSet = _descriptorSets[setIndex],
@@ -156,7 +156,7 @@ namespace Ryujinx.Graphics.Vulkan
{
if (texelBufferView.Handle != 0UL)
{
var writeDescriptorSet = new WriteDescriptorSet
WriteDescriptorSet writeDescriptorSet = new()
{
SType = StructureType.WriteDescriptorSet,
DstSet = _descriptorSets[setIndex],
@@ -190,7 +190,7 @@ namespace Ryujinx.Graphics.Vulkan
count++;
}
var writeDescriptorSet = new WriteDescriptorSet
WriteDescriptorSet writeDescriptorSet = new()
{
SType = StructureType.WriteDescriptorSet,
DstSet = _descriptorSets[setIndex],
@@ -24,14 +24,14 @@ namespace Ryujinx.Graphics.Vulkan
Api = api;
Device = device;
foreach (var poolSize in poolSizes)
foreach (DescriptorPoolSize poolSize in poolSizes)
{
_freeDescriptors += (int)poolSize.DescriptorCount;
}
fixed (DescriptorPoolSize* pPoolsSize = poolSizes)
{
var descriptorPoolCreateInfo = new DescriptorPoolCreateInfo
DescriptorPoolCreateInfo descriptorPoolCreateInfo = new()
{
SType = StructureType.DescriptorPoolCreateInfo,
Flags = updateAfterBind ? DescriptorPoolCreateFlags.UpdateAfterBindBit : DescriptorPoolCreateFlags.None,
@@ -46,7 +46,7 @@ namespace Ryujinx.Graphics.Vulkan
public unsafe DescriptorSetCollection AllocateDescriptorSets(ReadOnlySpan<DescriptorSetLayout> layouts, int consumedDescriptors)
{
TryAllocateDescriptorSets(layouts, consumedDescriptors, isTry: false, out var dsc);
TryAllocateDescriptorSets(layouts, consumedDescriptors, isTry: false, out DescriptorSetCollection dsc);
return dsc;
}
@@ -69,7 +69,7 @@ namespace Ryujinx.Graphics.Vulkan
{
fixed (DescriptorSetLayout* pLayouts = layouts)
{
var descriptorSetAllocateInfo = new DescriptorSetAllocateInfo
DescriptorSetAllocateInfo descriptorSetAllocateInfo = new()
{
SType = StructureType.DescriptorSetAllocateInfo,
DescriptorPool = _pool,
@@ -77,7 +77,7 @@ namespace Ryujinx.Graphics.Vulkan
PSetLayouts = pLayouts,
};
var result = Api.AllocateDescriptorSets(Device, &descriptorSetAllocateInfo, pDescriptorSets);
Result result = Api.AllocateDescriptorSets(Device, &descriptorSetAllocateInfo, pDescriptorSets);
if (isTry && result == Result.ErrorOutOfPoolMemory)
{
_totalSets = (int)MaxSets;
@@ -182,8 +182,8 @@ namespace Ryujinx.Graphics.Vulkan
{
// If we fail the first time, just create a new pool and try again.
var pool = GetPool(api, poolSizes, poolIndex, layouts.Length, consumedDescriptors, updateAfterBind);
if (!pool.TryAllocateDescriptorSets(layouts, consumedDescriptors, out var dsc))
DescriptorPoolHolder pool = GetPool(api, poolSizes, poolIndex, layouts.Length, consumedDescriptors, updateAfterBind);
if (!pool.TryAllocateDescriptorSets(layouts, consumedDescriptors, out DescriptorSetCollection dsc))
{
pool = GetPool(api, poolSizes, poolIndex, layouts.Length, consumedDescriptors, updateAfterBind);
dsc = pool.AllocateDescriptorSets(layouts, consumedDescriptors);
@@ -86,7 +86,7 @@ namespace Ryujinx.Graphics.Vulkan
Size = (int)structureOffset;
var info = new DescriptorUpdateTemplateCreateInfo()
DescriptorUpdateTemplateCreateInfo info = new()
{
SType = StructureType.DescriptorUpdateTemplateCreateInfo,
DescriptorUpdateEntryCount = (uint)segments.Length,
@@ -173,7 +173,7 @@ namespace Ryujinx.Graphics.Vulkan
Size = (int)structureOffset;
var info = new DescriptorUpdateTemplateCreateInfo()
DescriptorUpdateTemplateCreateInfo info = new()
{
SType = StructureType.DescriptorUpdateTemplateCreateInfo,
DescriptorUpdateEntryCount = (uint)entry,
@@ -6,6 +6,7 @@ using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Buffer = Silk.NET.Vulkan.Buffer;
using CompareOp = Ryujinx.Graphics.GAL.CompareOp;
using Format = Ryujinx.Graphics.GAL.Format;
using SamplerCreateInfo = Ryujinx.Graphics.GAL.SamplerCreateInfo;
@@ -155,7 +156,7 @@ namespace Ryujinx.Graphics.Vulkan
_uniformSetPd = new int[Constants.MaxUniformBufferBindings];
var initialImageInfo = new DescriptorImageInfo
DescriptorImageInfo initialImageInfo = new()
{
ImageLayout = ImageLayout.General,
};
@@ -300,13 +301,13 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int i = 0; i < segment.Count; i++)
{
ref var texture = ref _textureRefs[segment.Binding + i];
ref TextureRef texture = ref _textureRefs[segment.Binding + i];
texture.View?.PrepareForUsage(cbs, texture.Stage.ConvertToPipelineStageFlags(), FeedbackLoopHazards);
}
}
else
{
ref var arrayRef = ref _textureArrayRefs[segment.Binding];
ref ArrayRef<TextureArray> arrayRef = ref _textureArrayRefs[segment.Binding];
PipelineStageFlags stageFlags = arrayRef.Stage.ConvertToPipelineStageFlags();
arrayRef.Array?.QueueWriteToReadBarriers(cbs, stageFlags);
}
@@ -321,13 +322,13 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int i = 0; i < segment.Count; i++)
{
ref var image = ref _imageRefs[segment.Binding + i];
ref ImageRef image = ref _imageRefs[segment.Binding + i];
image.View?.PrepareForUsage(cbs, image.Stage.ConvertToPipelineStageFlags(), FeedbackLoopHazards);
}
}
else
{
ref var arrayRef = ref _imageArrayRefs[segment.Binding];
ref ArrayRef<ImageArray> arrayRef = ref _imageArrayRefs[segment.Binding];
PipelineStageFlags stageFlags = arrayRef.Stage.ConvertToPipelineStageFlags();
arrayRef.Array?.QueueWriteToReadBarriers(cbs, stageFlags);
}
@@ -336,7 +337,7 @@ namespace Ryujinx.Graphics.Vulkan
for (int setIndex = PipelineBase.DescriptorSetLayouts; setIndex < _program.BindingSegments.Length; setIndex++)
{
var bindingSegments = _program.BindingSegments[setIndex];
ResourceBindingSegment[] bindingSegments = _program.BindingSegments[setIndex];
if (bindingSegments.Length == 0)
{
@@ -352,13 +353,13 @@ namespace Ryujinx.Graphics.Vulkan
or ResourceType.TextureAndSampler
or ResourceType.BufferTexture)
{
ref var arrayRef = ref _textureArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts];
ref ArrayRef<TextureArray> arrayRef = ref _textureArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts];
PipelineStageFlags stageFlags = arrayRef.Stage.ConvertToPipelineStageFlags();
arrayRef.Array?.QueueWriteToReadBarriers(cbs, stageFlags);
}
else if (segment.Type is ResourceType.Image or ResourceType.BufferImage)
{
ref var arrayRef = ref _imageArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts];
ref ArrayRef<ImageArray> arrayRef = ref _imageArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts];
PipelineStageFlags stageFlags = arrayRef.Stage.ConvertToPipelineStageFlags();
arrayRef.Array?.QueueWriteToReadBarriers(cbs, stageFlags);
}
@@ -423,8 +424,8 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int i = 0; i < buffers.Length; i++)
{
var assignment = buffers[i];
var buffer = assignment.Range;
BufferAssignment assignment = buffers[i];
BufferRange buffer = assignment.Range;
int index = assignment.Binding;
Auto<DisposableBuffer> vkBuffer = buffer.Handle == BufferHandle.Null
@@ -439,7 +440,7 @@ namespace Ryujinx.Graphics.Vulkan
Range = (ulong)buffer.Size,
};
var newRef = new BufferRef(vkBuffer, ref buffer);
BufferRef newRef = new(vkBuffer, ref buffer);
ref DescriptorBufferInfo currentInfo = ref _storageBuffers[index];
@@ -459,7 +460,7 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int i = 0; i < buffers.Length; i++)
{
var vkBuffer = buffers[i];
Auto<DisposableBuffer> vkBuffer = buffers[i];
int index = first + i;
ref BufferRef currentBufferRef = ref _storageBufferRefs[index];
@@ -632,8 +633,8 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int i = 0; i < buffers.Length; i++)
{
var assignment = buffers[i];
var buffer = assignment.Range;
BufferAssignment assignment = buffers[i];
BufferRange buffer = assignment.Range;
int index = assignment.Binding;
Auto<DisposableBuffer> vkBuffer = buffer.Handle == BufferHandle.Null
@@ -677,7 +678,7 @@ namespace Ryujinx.Graphics.Vulkan
return;
}
var program = _program;
ShaderCollection program = _program;
if ((_dirty & DirtyFlags.Uniform) == DirtyFlags.Uniform)
{
@@ -759,14 +760,14 @@ namespace Ryujinx.Graphics.Vulkan
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void UpdateAndBind(CommandBufferScoped cbs, ShaderCollection program, int setIndex, PipelineBindPoint pbp)
{
var bindingSegments = program.BindingSegments[setIndex];
ResourceBindingSegment[] bindingSegments = program.BindingSegments[setIndex];
if (bindingSegments.Length == 0)
{
return;
}
var dummyBuffer = _dummyBuffer?.GetBuffer();
Auto<DisposableBuffer> dummyBuffer = _dummyBuffer?.GetBuffer();
if (_updateDescriptorCacheCbIndex)
{
@@ -774,7 +775,7 @@ namespace Ryujinx.Graphics.Vulkan
program.UpdateDescriptorCacheCommandBufferIndex(cbs.CommandBufferIndex);
}
var dsc = program.GetNewDescriptorSetCollection(setIndex, out var isNew).Get(cbs);
DescriptorSetCollection dsc = program.GetNewDescriptorSetCollection(setIndex, out bool isNew).Get(cbs);
if (!program.HasMinimalLayout)
{
@@ -823,7 +824,7 @@ namespace Ryujinx.Graphics.Vulkan
if (_storageSet.Set(index))
{
ref var info = ref _storageBuffers[index];
ref DescriptorBufferInfo info = ref _storageBuffers[index];
bool mirrored = UpdateBuffer(cbs,
ref info,
@@ -849,8 +850,8 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < count; i++)
{
ref var texture = ref textures[i];
ref var refs = ref _textureRefs[binding + i];
ref DescriptorImageInfo texture = ref textures[i];
ref TextureRef refs = ref _textureRefs[binding + i];
texture.ImageView = refs.ImageView?.Get(cbs).Value ?? default;
texture.Sampler = refs.Sampler?.Get(cbs).Value ?? default;
@@ -933,7 +934,7 @@ namespace Ryujinx.Graphics.Vulkan
}
}
var sets = dsc.GetSets();
DescriptorSet[] sets = dsc.GetSets();
_templateUpdater.Commit(_gd, _device, sets[0]);
_gd.Api.CmdBindDescriptorSets(cbs.CommandBuffer, pbp, _program.PipelineLayout, (uint)setIndex, 1, sets, 0, ReadOnlySpan<uint>.Empty);
@@ -942,7 +943,7 @@ namespace Ryujinx.Graphics.Vulkan
private void UpdateAndBindTexturesWithoutTemplate(CommandBufferScoped cbs, ShaderCollection program, PipelineBindPoint pbp)
{
int setIndex = PipelineBase.TextureSetIndex;
var bindingSegments = program.BindingSegments[setIndex];
ResourceBindingSegment[] bindingSegments = program.BindingSegments[setIndex];
if (bindingSegments.Length == 0)
{
@@ -955,7 +956,7 @@ namespace Ryujinx.Graphics.Vulkan
program.UpdateDescriptorCacheCommandBufferIndex(cbs.CommandBufferIndex);
}
var dsc = program.GetNewDescriptorSetCollection(setIndex, out _).Get(cbs);
DescriptorSetCollection dsc = program.GetNewDescriptorSetCollection(setIndex, out _).Get(cbs);
foreach (ResourceBindingSegment segment in bindingSegments)
{
@@ -970,8 +971,8 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < count; i++)
{
ref var texture = ref textures[i];
ref var refs = ref _textureRefs[binding + i];
ref DescriptorImageInfo texture = ref textures[i];
ref TextureRef refs = ref _textureRefs[binding + i];
texture.ImageView = refs.ImageView?.Get(cbs).Value ?? default;
texture.Sampler = refs.Sampler?.Get(cbs).Value ?? default;
@@ -1014,7 +1015,7 @@ namespace Ryujinx.Graphics.Vulkan
}
}
var sets = dsc.GetSets();
DescriptorSet[] sets = dsc.GetSets();
_gd.Api.CmdBindDescriptorSets(cbs.CommandBuffer, pbp, _program.PipelineLayout, (uint)setIndex, 1, sets, 0, ReadOnlySpan<uint>.Empty);
}
@@ -1023,8 +1024,8 @@ namespace Ryujinx.Graphics.Vulkan
private void UpdateAndBindUniformBufferPd(CommandBufferScoped cbs)
{
int sequence = _pdSequence;
var bindingSegments = _program.BindingSegments[PipelineBase.UniformSetIndex];
var dummyBuffer = _dummyBuffer?.GetBuffer();
ResourceBindingSegment[] bindingSegments = _program.BindingSegments[PipelineBase.UniformSetIndex];
Auto<DisposableBuffer> dummyBuffer = _dummyBuffer?.GetBuffer();
long updatedBindings = 0;
DescriptorSetTemplateWriter writer = _templateUpdater.Begin(32 * Unsafe.SizeOf<DescriptorBufferInfo>());
@@ -1076,7 +1077,7 @@ namespace Ryujinx.Graphics.Vulkan
return;
}
var dummyBuffer = _dummyBuffer?.GetBuffer().Get(cbs).Value ?? default;
Buffer dummyBuffer = _dummyBuffer?.GetBuffer().Get(cbs).Value ?? default;
foreach (ResourceBindingSegment segment in _program.ClearSegments[setIndex])
{
@@ -1088,7 +1089,7 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int setIndex = PipelineBase.DescriptorSetLayouts; setIndex < program.BindingSegments.Length; setIndex++)
{
var bindingSegments = program.BindingSegments[setIndex];
ResourceBindingSegment[] bindingSegments = program.BindingSegments[setIndex];
if (bindingSegments.Length == 0)
{
@@ -41,9 +41,9 @@ namespace Ryujinx.Graphics.Vulkan.Effects
_pipeline.Initialize();
var scalingShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/AreaScaling.spv");
byte[] scalingShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/AreaScaling.spv");
var scalingResourceLayout = new ResourceLayoutBuilder()
ResourceLayout scalingResourceLayout = new ResourceLayoutBuilder()
.Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2)
.Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 1)
.Add(ResourceStages.Compute, ResourceType.Image, 0, true).Build();
@@ -82,7 +82,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
];
int rangeSize = dimensionsBuffer.Length * sizeof(float);
using var buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize);
using ScopedTemporaryBuffer buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize);
buffer.Holder.SetDataUnchecked(buffer.Offset, dimensionsBuffer);
int threadGroupWorkRegionDim = 16;
@@ -53,15 +53,15 @@ namespace Ryujinx.Graphics.Vulkan.Effects
_pipeline.Initialize();
var scalingShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/FsrScaling.spv");
var sharpeningShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/FsrSharpening.spv");
byte[] scalingShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/FsrScaling.spv");
byte[] sharpeningShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/FsrSharpening.spv");
var scalingResourceLayout = new ResourceLayoutBuilder()
ResourceLayout scalingResourceLayout = new ResourceLayoutBuilder()
.Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2)
.Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 1)
.Add(ResourceStages.Compute, ResourceType.Image, 0, true).Build();
var sharpeningResourceLayout = new ResourceLayoutBuilder()
ResourceLayout sharpeningResourceLayout = new ResourceLayoutBuilder()
.Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2)
.Add(ResourceStages.Compute, ResourceType.UniformBuffer, 3)
.Add(ResourceStages.Compute, ResourceType.UniformBuffer, 4)
@@ -94,9 +94,9 @@ namespace Ryujinx.Graphics.Vulkan.Effects
|| _intermediaryTexture.Info.Height != height
|| !_intermediaryTexture.Info.Equals(view.Info))
{
var originalInfo = view.Info;
TextureCreateInfo originalInfo = view.Info;
var info = new TextureCreateInfo(
TextureCreateInfo info = new(
width,
height,
originalInfo.Depth,
@@ -140,11 +140,11 @@ namespace Ryujinx.Graphics.Vulkan.Effects
];
int rangeSize = dimensionsBuffer.Length * sizeof(float);
using var buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize);
using ScopedTemporaryBuffer buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize);
buffer.Holder.SetDataUnchecked(buffer.Offset, dimensionsBuffer);
ReadOnlySpan<float> sharpeningBufferData = [1.5f - (Level * 0.01f * 1.5f)];
using var sharpeningBuffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, sizeof(float));
using ScopedTemporaryBuffer sharpeningBuffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, sizeof(float));
sharpeningBuffer.Holder.SetDataUnchecked(sharpeningBuffer.Offset, sharpeningBufferData);
int threadGroupWorkRegionDim = 16;
@@ -37,9 +37,9 @@ namespace Ryujinx.Graphics.Vulkan.Effects
{
_pipeline.Initialize();
var shader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/Fxaa.spv");
byte[] shader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/Fxaa.spv");
var resourceLayout = new ResourceLayoutBuilder()
ResourceLayout resourceLayout = new ResourceLayoutBuilder()
.Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2)
.Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 1)
.Add(ResourceStages.Compute, ResourceType.Image, 0, true).Build();
@@ -65,14 +65,14 @@ namespace Ryujinx.Graphics.Vulkan.Effects
ReadOnlySpan<float> resolutionBuffer = [view.Width, view.Height];
int rangeSize = resolutionBuffer.Length * sizeof(float);
using var buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize);
using ScopedTemporaryBuffer buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize);
buffer.Holder.SetDataUnchecked(buffer.Offset, resolutionBuffer);
_pipeline.SetUniformBuffers([new BufferAssignment(2, buffer.Range)]);
var dispatchX = BitUtils.DivRoundUp(view.Width, IPostProcessingEffect.LocalGroupSize);
var dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize);
int dispatchX = BitUtils.DivRoundUp(view.Width, IPostProcessingEffect.LocalGroupSize);
int dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize);
_pipeline.SetImage(ShaderStage.Compute, 0, _texture?.GetView(FormatTable.ConvertRgba8SrgbToUnorm(view.Info.Format)));
_pipeline.DispatchCompute(dispatchX, dispatchY, 1);
@@ -1,4 +1,5 @@
using Ryujinx.Common;
using Ryujinx.Common.Memory;
using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.Shader;
using Ryujinx.Graphics.Shader.Translation;
@@ -74,23 +75,23 @@ namespace Ryujinx.Graphics.Vulkan.Effects
_pipeline.Initialize();
var edgeShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaEdge.spv");
var blendShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaBlend.spv");
var neighbourShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaNeighbour.spv");
byte[] edgeShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaEdge.spv");
byte[] blendShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaBlend.spv");
byte[] neighbourShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaNeighbour.spv");
var edgeResourceLayout = new ResourceLayoutBuilder()
ResourceLayout edgeResourceLayout = new ResourceLayoutBuilder()
.Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2)
.Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 1)
.Add(ResourceStages.Compute, ResourceType.Image, 0, true).Build();
var blendResourceLayout = new ResourceLayoutBuilder()
ResourceLayout blendResourceLayout = new ResourceLayoutBuilder()
.Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2)
.Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 1)
.Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 3)
.Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 4)
.Add(ResourceStages.Compute, ResourceType.Image, 0, true).Build();
var neighbourResourceLayout = new ResourceLayoutBuilder()
ResourceLayout neighbourResourceLayout = new ResourceLayoutBuilder()
.Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2)
.Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 1)
.Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 3)
@@ -108,7 +109,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
QualityUltra = Quality == 3 ? 1 : 0,
};
var specInfo = new SpecDescription(
SpecDescription specInfo = new(
(0, SpecConstType.Int32),
(1, SpecConstType.Int32),
(2, SpecConstType.Int32),
@@ -139,7 +140,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
private void Initialize()
{
var areaInfo = new TextureCreateInfo(AreaWidth,
TextureCreateInfo areaInfo = new(AreaWidth,
AreaHeight,
1,
1,
@@ -155,7 +156,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
SwizzleComponent.Blue,
SwizzleComponent.Alpha);
var searchInfo = new TextureCreateInfo(SearchWidth,
TextureCreateInfo searchInfo = new(SearchWidth,
SearchHeight,
1,
1,
@@ -171,8 +172,8 @@ namespace Ryujinx.Graphics.Vulkan.Effects
SwizzleComponent.Blue,
SwizzleComponent.Alpha);
var areaTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.Vulkan/Effects/Textures/SmaaAreaTexture.bin");
var searchTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.Vulkan/Effects/Textures/SmaaSearchTexture.bin");
MemoryOwner<byte> areaTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.Vulkan/Effects/Textures/SmaaAreaTexture.bin");
MemoryOwner<byte> searchTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.Vulkan/Effects/Textures/SmaaSearchTexture.bin");
_areaTexture = _renderer.CreateTexture(areaInfo) as TextureView;
_searchTexture = _renderer.CreateTexture(searchInfo) as TextureView;
@@ -202,8 +203,8 @@ namespace Ryujinx.Graphics.Vulkan.Effects
_renderer.Pipeline.TextureBarrier();
var dispatchX = BitUtils.DivRoundUp(view.Width, IPostProcessingEffect.LocalGroupSize);
var dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize);
int dispatchX = BitUtils.DivRoundUp(view.Width, IPostProcessingEffect.LocalGroupSize);
int dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize);
// Edge pass
_pipeline.SetProgram(_edgeProgram);
@@ -212,7 +213,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects
ReadOnlySpan<float> resolutionBuffer = [view.Width, view.Height];
int rangeSize = resolutionBuffer.Length * sizeof(float);
using var buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize);
using ScopedTemporaryBuffer buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize);
buffer.Holder.SetDataUnchecked(buffer.Offset, resolutionBuffer);
_pipeline.SetUniformBuffers([new BufferAssignment(2, buffer.Range)]);
+1 -1
View File
@@ -20,7 +20,7 @@ namespace Ryujinx.Graphics.Vulkan
_device = device;
_concurrentWaitUnsupported = concurrentWaitUnsupported;
var fenceCreateInfo = new FenceCreateInfo
FenceCreateInfo fenceCreateInfo = new()
{
SType = StructureType.FenceCreateInfo,
};
@@ -98,11 +98,11 @@ namespace Ryujinx.Graphics.Vulkan
public bool BufferFormatSupports(FormatFeatureFlags flags, Format format)
{
var formatFeatureFlags = _bufferTable[(int)format];
FormatFeatureFlags formatFeatureFlags = _bufferTable[(int)format];
if (formatFeatureFlags == 0)
{
_api.GetPhysicalDeviceFormatProperties(_physicalDevice, FormatTable.GetFormat(format), out var fp);
_api.GetPhysicalDeviceFormatProperties(_physicalDevice, FormatTable.GetFormat(format), out FormatProperties fp);
formatFeatureFlags = fp.BufferFeatures;
_bufferTable[(int)format] = formatFeatureFlags;
}
@@ -131,18 +131,18 @@ namespace Ryujinx.Graphics.Vulkan
public bool BufferFormatSupports(FormatFeatureFlags flags, VkFormat format)
{
_api.GetPhysicalDeviceFormatProperties(_physicalDevice, format, out var fp);
_api.GetPhysicalDeviceFormatProperties(_physicalDevice, format, out FormatProperties fp);
return (fp.BufferFeatures & flags) == flags;
}
public bool OptimalFormatSupports(FormatFeatureFlags flags, Format format)
{
var formatFeatureFlags = _optimalTable[(int)format];
FormatFeatureFlags formatFeatureFlags = _optimalTable[(int)format];
if (formatFeatureFlags == 0)
{
_api.GetPhysicalDeviceFormatProperties(_physicalDevice, FormatTable.GetFormat(format), out var fp);
_api.GetPhysicalDeviceFormatProperties(_physicalDevice, FormatTable.GetFormat(format), out FormatProperties fp);
formatFeatureFlags = fp.OptimalTilingFeatures;
_optimalTable[(int)format] = formatFeatureFlags;
}
@@ -152,11 +152,11 @@ namespace Ryujinx.Graphics.Vulkan
public VkFormat ConvertToVkFormat(Format srcFormat, bool storageFeatureFlagRequired)
{
var format = FormatTable.GetFormat(srcFormat);
VkFormat format = FormatTable.GetFormat(srcFormat);
var requiredFeatures = FormatFeatureFlags.SampledImageBit |
FormatFeatureFlags.TransferSrcBit |
FormatFeatureFlags.TransferDstBit;
FormatFeatureFlags requiredFeatures = FormatFeatureFlags.SampledImageBit |
FormatFeatureFlags.TransferSrcBit |
FormatFeatureFlags.TransferDstBit;
if (srcFormat.IsDepthOrStencil())
{
@@ -194,7 +194,7 @@ namespace Ryujinx.Graphics.Vulkan
public VkFormat ConvertToVertexVkFormat(Format srcFormat)
{
var format = FormatTable.GetFormat(srcFormat);
VkFormat format = FormatTable.GetFormat(srcFormat);
if (!BufferFormatSupports(FormatFeatureFlags.VertexBufferBit, srcFormat) ||
(IsRGB16IntFloat(srcFormat) && VulkanConfiguration.ForceRGB16IntFloatUnsupported))
@@ -34,7 +34,7 @@ namespace Ryujinx.Graphics.Vulkan
public FramebufferParams(Device device, TextureView view, uint width, uint height)
{
var format = view.Info.Format;
Format format = view.Info.Format;
bool isDepthStencil = format.IsDepthOrStencil();
@@ -112,7 +112,7 @@ namespace Ryujinx.Graphics.Vulkan
{
if (IsValidTextureView(color))
{
var texture = (TextureView)color;
TextureView texture = (TextureView)color;
_attachments[index] = texture.GetImageViewForAttachment();
_colors[index] = texture;
@@ -123,7 +123,7 @@ namespace Ryujinx.Graphics.Vulkan
AttachmentFormats[index] = texture.VkFormat;
AttachmentIndices[index] = bindIndex;
var format = texture.Info.Format;
Format format = texture.Info.Format;
if (format.IsInteger())
{
@@ -348,7 +348,7 @@ namespace Ryujinx.Graphics.Vulkan
{
if (_colors != null && (uint)index < ColorAttachmentsCount)
{
var format = _colors[index].Info.Format;
Format format = _colors[index].Info.Format;
if (format.IsSint())
{
@@ -403,7 +403,7 @@ namespace Ryujinx.Graphics.Vulkan
attachments[i] = _attachments[i].Get(cbs).Value;
}
var framebufferCreateInfo = new FramebufferCreateInfo
FramebufferCreateInfo framebufferCreateInfo = new()
{
SType = StructureType.FramebufferCreateInfo,
RenderPass = renderPass.Get(cbs).Value,
@@ -414,13 +414,13 @@ namespace Ryujinx.Graphics.Vulkan
Layers = Layers,
};
api.CreateFramebuffer(_device, in framebufferCreateInfo, null, out var framebuffer).ThrowOnError();
api.CreateFramebuffer(_device, in framebufferCreateInfo, null, out Framebuffer framebuffer).ThrowOnError();
return new Auto<DisposableFramebuffer>(new DisposableFramebuffer(api, _device, framebuffer), null, _attachments[..AttachmentsCount]);
}
public TextureView[] GetAttachmentViews()
{
var result = new TextureView[AttachmentsCount];
TextureView[] result = new TextureView[AttachmentsCount];
_colors?.AsSpan(..ColorAttachmentsCount).CopyTo(result.AsSpan());
if (_depthStencil != null)
+7 -7
View File
@@ -65,7 +65,7 @@ namespace Ryujinx.Graphics.Vulkan
public void Add(ref TKey key, TValue value)
{
var entry = new Entry
Entry entry = new()
{
Hash = key.GetHashCode(),
Key = key,
@@ -75,7 +75,7 @@ namespace Ryujinx.Graphics.Vulkan
int hashCode = key.GetHashCode();
int bucketIndex = hashCode & TotalBucketsMask;
ref var bucket = ref _hashTable[bucketIndex];
ref Bucket bucket = ref _hashTable[bucketIndex];
if (bucket.Entries != null)
{
int index = bucket.Length;
@@ -102,11 +102,11 @@ namespace Ryujinx.Graphics.Vulkan
{
int hashCode = key.GetHashCode();
ref var bucket = ref _hashTable[hashCode & TotalBucketsMask];
var entries = bucket.AsSpan();
ref Bucket bucket = ref _hashTable[hashCode & TotalBucketsMask];
Span<Entry> entries = bucket.AsSpan();
for (int i = 0; i < entries.Length; i++)
{
ref var entry = ref entries[i];
ref Entry entry = ref entries[i];
if (entry.Hash == hashCode && entry.Key.Equals(ref key))
{
@@ -124,10 +124,10 @@ namespace Ryujinx.Graphics.Vulkan
{
int hashCode = key.GetHashCode();
var entries = _hashTable[hashCode & TotalBucketsMask].AsSpan();
Span<Entry> entries = _hashTable[hashCode & TotalBucketsMask].AsSpan();
for (int i = 0; i < entries.Length; i++)
{
ref var entry = ref entries[i];
ref Entry entry = ref entries[i];
if (entry.Hash == hashCode && entry.Key.Equals(ref key))
{
+79 -78
View File
@@ -5,6 +5,7 @@ using Ryujinx.Graphics.Shader.Translation;
using Silk.NET.Vulkan;
using System;
using System.Numerics;
using Buffer = Silk.NET.Vulkan.Buffer;
using CompareOp = Ryujinx.Graphics.GAL.CompareOp;
using Format = Ryujinx.Graphics.GAL.Format;
using PrimitiveTopology = Ryujinx.Graphics.GAL.PrimitiveTopology;
@@ -63,7 +64,7 @@ namespace Ryujinx.Graphics.Vulkan
_samplerLinear = gd.CreateSampler(SamplerCreateInfo.Create(MinFilter.Linear, MagFilter.Linear));
_samplerNearest = gd.CreateSampler(SamplerCreateInfo.Create(MinFilter.Nearest, MagFilter.Nearest));
var blitResourceLayout = new ResourceLayoutBuilder()
ResourceLayout blitResourceLayout = new ResourceLayoutBuilder()
.Add(ResourceStages.Vertex, ResourceType.UniformBuffer, 1)
.Add(ResourceStages.Fragment, ResourceType.TextureAndSampler, 0).Build();
@@ -82,7 +83,7 @@ namespace Ryujinx.Graphics.Vulkan
new ShaderSource(ReadSpirv("ColorBlitClearAlphaFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv)
], blitResourceLayout);
var colorClearResourceLayout = new ResourceLayoutBuilder().Add(ResourceStages.Vertex, ResourceType.UniformBuffer, 1).Build();
ResourceLayout colorClearResourceLayout = new ResourceLayoutBuilder().Add(ResourceStages.Vertex, ResourceType.UniformBuffer, 1).Build();
_programColorClearF = gd.CreateProgramWithMinimalLayout([
new ShaderSource(ReadSpirv("ColorClearVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv),
@@ -104,7 +105,7 @@ namespace Ryujinx.Graphics.Vulkan
new ShaderSource(ReadSpirv("DepthStencilClearFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv)
], colorClearResourceLayout);
var strideChangeResourceLayout = new ResourceLayoutBuilder()
ResourceLayout strideChangeResourceLayout = new ResourceLayoutBuilder()
.Add(ResourceStages.Compute, ResourceType.UniformBuffer, 0)
.Add(ResourceStages.Compute, ResourceType.StorageBuffer, 1)
.Add(ResourceStages.Compute, ResourceType.StorageBuffer, 2, true).Build();
@@ -113,7 +114,7 @@ namespace Ryujinx.Graphics.Vulkan
new ShaderSource(ReadSpirv("ChangeBufferStride.spv"), ShaderStage.Compute, TargetLanguage.Spirv)
], strideChangeResourceLayout);
var colorCopyResourceLayout = new ResourceLayoutBuilder()
ResourceLayout colorCopyResourceLayout = new ResourceLayoutBuilder()
.Add(ResourceStages.Compute, ResourceType.UniformBuffer, 0)
.Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 0)
.Add(ResourceStages.Compute, ResourceType.Image, 0, true).Build();
@@ -130,7 +131,7 @@ namespace Ryujinx.Graphics.Vulkan
new ShaderSource(ReadSpirv("ColorCopyWideningCompute.spv"), ShaderStage.Compute, TargetLanguage.Spirv)
], colorCopyResourceLayout);
var colorDrawToMsResourceLayout = new ResourceLayoutBuilder()
ResourceLayout colorDrawToMsResourceLayout = new ResourceLayoutBuilder()
.Add(ResourceStages.Fragment, ResourceType.UniformBuffer, 0)
.Add(ResourceStages.Fragment, ResourceType.TextureAndSampler, 0).Build();
@@ -139,7 +140,7 @@ namespace Ryujinx.Graphics.Vulkan
new ShaderSource(ReadSpirv("ColorDrawToMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv)
], colorDrawToMsResourceLayout);
var convertD32S8ToD24S8ResourceLayout = new ResourceLayoutBuilder()
ResourceLayout convertD32S8ToD24S8ResourceLayout = new ResourceLayoutBuilder()
.Add(ResourceStages.Compute, ResourceType.UniformBuffer, 0)
.Add(ResourceStages.Compute, ResourceType.StorageBuffer, 1)
.Add(ResourceStages.Compute, ResourceType.StorageBuffer, 2, true).Build();
@@ -148,7 +149,7 @@ namespace Ryujinx.Graphics.Vulkan
new ShaderSource(ReadSpirv("ConvertD32S8ToD24S8.spv"), ShaderStage.Compute, TargetLanguage.Spirv)
], convertD32S8ToD24S8ResourceLayout);
var convertIndexBufferResourceLayout = new ResourceLayoutBuilder()
ResourceLayout convertIndexBufferResourceLayout = new ResourceLayoutBuilder()
.Add(ResourceStages.Compute, ResourceType.UniformBuffer, 0)
.Add(ResourceStages.Compute, ResourceType.StorageBuffer, 1)
.Add(ResourceStages.Compute, ResourceType.StorageBuffer, 2, true).Build();
@@ -157,7 +158,7 @@ namespace Ryujinx.Graphics.Vulkan
new ShaderSource(ReadSpirv("ConvertIndexBuffer.spv"), ShaderStage.Compute, TargetLanguage.Spirv)
], convertIndexBufferResourceLayout);
var convertIndirectDataResourceLayout = new ResourceLayoutBuilder()
ResourceLayout convertIndirectDataResourceLayout = new ResourceLayoutBuilder()
.Add(ResourceStages.Compute, ResourceType.UniformBuffer, 0)
.Add(ResourceStages.Compute, ResourceType.StorageBuffer, 1)
.Add(ResourceStages.Compute, ResourceType.StorageBuffer, 2, true)
@@ -230,17 +231,17 @@ namespace Ryujinx.Graphics.Vulkan
{
gd.FlushAllCommands();
using var cbs = gd.CommandBufferPool.Rent();
using CommandBufferScoped cbs = gd.CommandBufferPool.Rent();
for (int l = 0; l < levels; l++)
{
var mipSrcRegion = new Extents2D(
Extents2D mipSrcRegion = new(
srcRegion.X1 >> l,
srcRegion.Y1 >> l,
srcRegion.X2 >> l,
srcRegion.Y2 >> l);
var mipDstRegion = new Extents2D(
Extents2D mipDstRegion = new(
dstRegion.X1 >> l,
dstRegion.Y1 >> l,
dstRegion.X2 >> l,
@@ -248,8 +249,8 @@ namespace Ryujinx.Graphics.Vulkan
for (int z = 0; z < layers; z++)
{
var srcView = Create2DLayerView(src, z, l);
var dstView = Create2DLayerView(dst, z, l);
TextureView srcView = Create2DLayerView(src, z, l);
TextureView dstView = Create2DLayerView(dst, z, l);
if (isDepthOrStencil)
{
@@ -310,7 +311,7 @@ namespace Ryujinx.Graphics.Vulkan
int dstWidth = Math.Max(1, dst.Width >> mipDstLevel);
int dstHeight = Math.Max(1, dst.Height >> mipDstLevel);
var extents = new Extents2D(
Extents2D extents = new(
0,
0,
Math.Min(srcWidth, dstWidth),
@@ -318,8 +319,8 @@ namespace Ryujinx.Graphics.Vulkan
for (int z = 0; z < depth; z++)
{
var srcView = Create2DLayerView(src, srcLayer + z, mipSrcLevel);
var dstView = Create2DLayerView(dst, dstLayer + z, mipDstLevel);
TextureView srcView = Create2DLayerView(src, srcLayer + z, mipSrcLevel);
TextureView dstView = Create2DLayerView(dst, dstLayer + z, mipDstLevel);
BlitColor(
gd,
@@ -357,7 +358,7 @@ namespace Ryujinx.Graphics.Vulkan
const int RegionBufferSize = 16;
var sampler = linearFilter ? _samplerLinear : _samplerNearest;
ISampler sampler = linearFilter ? _samplerLinear : _samplerNearest;
_pipeline.SetTextureAndSamplerIdentitySwizzle(ShaderStage.Fragment, 0, src, sampler);
@@ -378,7 +379,7 @@ namespace Ryujinx.Graphics.Vulkan
(region[2], region[3]) = (region[3], region[2]);
}
using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, RegionBufferSize);
using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, RegionBufferSize);
buffer.Holder.SetDataUnchecked<float>(buffer.Offset, region);
@@ -386,7 +387,7 @@ namespace Ryujinx.Graphics.Vulkan
Span<Viewport> viewports = stackalloc Viewport[1];
var rect = new Rectangle<float>(
Rectangle<float> rect = new(
MathF.Min(dstRegion.X1, dstRegion.X2),
MathF.Min(dstRegion.Y1, dstRegion.Y2),
MathF.Abs(dstRegion.X2 - dstRegion.X1),
@@ -474,7 +475,7 @@ namespace Ryujinx.Graphics.Vulkan
(region[2], region[3]) = (region[3], region[2]);
}
using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, RegionBufferSize);
using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, RegionBufferSize);
buffer.Holder.SetDataUnchecked<float>(buffer.Offset, region);
@@ -482,7 +483,7 @@ namespace Ryujinx.Graphics.Vulkan
Span<Viewport> viewports = stackalloc Viewport[1];
var rect = new Rectangle<float>(
Rectangle<float> rect = new(
MathF.Min(dstRegion.X1, dstRegion.X2),
MathF.Min(dstRegion.Y1, dstRegion.Y2),
MathF.Abs(dstRegion.X2 - dstRegion.X1),
@@ -505,11 +506,11 @@ namespace Ryujinx.Graphics.Vulkan
_pipeline.SetViewports(viewports);
_pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip);
var aspectFlags = src.Info.Format.ConvertAspectFlags();
ImageAspectFlags aspectFlags = src.Info.Format.ConvertAspectFlags();
if (aspectFlags.HasFlag(ImageAspectFlags.DepthBit))
{
var depthTexture = CreateDepthOrStencilView(src, DepthStencilMode.Depth);
TextureView depthTexture = CreateDepthOrStencilView(src, DepthStencilMode.Depth);
BlitDepthStencilDraw(depthTexture, isDepth: true);
@@ -521,7 +522,7 @@ namespace Ryujinx.Graphics.Vulkan
if (aspectFlags.HasFlag(ImageAspectFlags.StencilBit) && _programStencilBlit != null)
{
var stencilTexture = CreateDepthOrStencilView(src, DepthStencilMode.Stencil);
TextureView stencilTexture = CreateDepthOrStencilView(src, DepthStencilMode.Stencil);
BlitDepthStencilDraw(stencilTexture, isDepth: false);
@@ -624,11 +625,11 @@ namespace Ryujinx.Graphics.Vulkan
gd.FlushAllCommands();
using var cbs = gd.CommandBufferPool.Rent();
using CommandBufferScoped cbs = gd.CommandBufferPool.Rent();
_pipeline.SetCommandBuffer(cbs);
using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ClearColorBufferSize);
using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ClearColorBufferSize);
buffer.Holder.SetDataUnchecked(buffer.Offset, clearColor);
@@ -686,11 +687,11 @@ namespace Ryujinx.Graphics.Vulkan
gd.FlushAllCommands();
using var cbs = gd.CommandBufferPool.Rent();
using CommandBufferScoped cbs = gd.CommandBufferPool.Rent();
_pipeline.SetCommandBuffer(cbs);
using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ClearColorBufferSize);
using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ClearColorBufferSize);
buffer.Holder.SetDataUnchecked<float>(buffer.Offset, [depthValue]);
@@ -747,7 +748,7 @@ namespace Ryujinx.Graphics.Vulkan
(region[2], region[3]) = (region[3], region[2]);
}
var bufferHandle = gd.BufferManager.CreateWithHandle(gd, RegionBufferSize);
BufferHandle bufferHandle = gd.BufferManager.CreateWithHandle(gd, RegionBufferSize);
gd.BufferManager.SetData<float>(bufferHandle, 0, region);
@@ -755,7 +756,7 @@ namespace Ryujinx.Graphics.Vulkan
Span<Viewport> viewports = stackalloc Viewport[1];
var rect = new Rectangle<float>(
Rectangle<float> rect = new(
MathF.Min(dstRegion.X1, dstRegion.X2),
MathF.Min(dstRegion.Y1, dstRegion.Y2),
MathF.Abs(dstRegion.X2 - dstRegion.X1),
@@ -790,14 +791,14 @@ namespace Ryujinx.Graphics.Vulkan
int elems = size / stride;
int newSize = elems * newStride;
var srcBufferAuto = src.GetBuffer();
var dstBufferAuto = dst.GetBuffer();
Auto<DisposableBuffer> srcBufferAuto = src.GetBuffer();
Auto<DisposableBuffer> dstBufferAuto = dst.GetBuffer();
var srcBuffer = srcBufferAuto.Get(cbs, srcOffset, size).Value;
var dstBuffer = dstBufferAuto.Get(cbs, 0, newSize).Value;
Buffer srcBuffer = srcBufferAuto.Get(cbs, srcOffset, size).Value;
Buffer dstBuffer = dstBufferAuto.Get(cbs, 0, newSize).Value;
var access = supportsUint8 ? AccessFlags.ShaderWriteBit : AccessFlags.TransferWriteBit;
var stage = supportsUint8 ? PipelineStageFlags.ComputeShaderBit : PipelineStageFlags.TransferBit;
AccessFlags access = supportsUint8 ? AccessFlags.ShaderWriteBit : AccessFlags.TransferWriteBit;
PipelineStageFlags stage = supportsUint8 ? PipelineStageFlags.ComputeShaderBit : PipelineStageFlags.TransferBit;
BufferHolder.InsertBufferBarrier(
gd,
@@ -821,7 +822,7 @@ namespace Ryujinx.Graphics.Vulkan
shaderParams[2] = size;
shaderParams[3] = srcOffset;
using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize);
using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize);
buffer.Holder.SetDataUnchecked<int>(buffer.Offset, shaderParams);
@@ -845,7 +846,7 @@ namespace Ryujinx.Graphics.Vulkan
{
gd.Api.CmdFillBuffer(cbs.CommandBuffer, dstBuffer, 0, Vk.WholeSize, 0);
var bufferCopy = new BufferCopy[elems];
BufferCopy[] bufferCopy = new BufferCopy[elems];
for (ulong i = 0; i < (ulong)elems; i++)
{
@@ -885,7 +886,7 @@ namespace Ryujinx.Graphics.Vulkan
int convertedCount = pattern.GetConvertedCount(indexCount);
int outputIndexSize = 4;
var dstBuffer = dstIndexBuffer.GetBuffer().Get(cbs, 0, convertedCount * outputIndexSize).Value;
Buffer dstBuffer = dstIndexBuffer.GetBuffer().Get(cbs, 0, convertedCount * outputIndexSize).Value;
const int ParamsBufferSize = 16 * sizeof(int);
@@ -902,8 +903,8 @@ namespace Ryujinx.Graphics.Vulkan
pattern.OffsetIndex.CopyTo(shaderParams[..pattern.OffsetIndex.Length]);
using var patternScoped = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize);
var patternBuffer = patternScoped.Holder;
using ScopedTemporaryBuffer patternScoped = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize);
BufferHolder patternBuffer = patternScoped.Holder;
patternBuffer.SetDataUnchecked<int>(patternScoped.Offset, shaderParams);
@@ -963,7 +964,7 @@ namespace Ryujinx.Graphics.Vulkan
shaderParams[0] = BitOperations.Log2((uint)ratio);
using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize);
using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize);
buffer.Holder.SetDataUnchecked<int>(buffer.Offset, shaderParams);
@@ -990,8 +991,8 @@ namespace Ryujinx.Graphics.Vulkan
// - Maximum component size is 4 (R32).
int componentSize = Math.Min(Math.Min(srcBpp, dstBpp), 4);
var srcFormat = GetFormat(componentSize, srcBpp / componentSize);
var dstFormat = GetFormat(componentSize, dstBpp / componentSize);
Format srcFormat = GetFormat(componentSize, srcBpp / componentSize);
Format dstFormat = GetFormat(componentSize, dstBpp / componentSize);
_pipeline.SetUniformBuffers([new BufferAssignment(0, buffer.Range)]);
@@ -999,8 +1000,8 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int z = 0; z < depth; z++)
{
var srcView = Create2DLayerView(src, srcLayer + z, srcLevel + l, srcFormat);
var dstView = Create2DLayerView(dst, dstLayer + z, dstLevel + l);
TextureView srcView = Create2DLayerView(src, srcLayer + z, srcLevel + l, srcFormat);
TextureView dstView = Create2DLayerView(dst, dstLayer + z, dstLevel + l);
_pipeline.SetTextureAndSamplerIdentitySwizzle(ShaderStage.Compute, 0, srcView, null);
_pipeline.SetImage(ShaderStage.Compute, 0, dstView.GetView(dstFormat));
@@ -1047,7 +1048,7 @@ namespace Ryujinx.Graphics.Vulkan
int samples = src.Info.Samples;
bool isDepthOrStencil = src.Info.Format.IsDepthOrStencil();
var aspectFlags = src.Info.Format.ConvertAspectFlags();
ImageAspectFlags aspectFlags = src.Info.Format.ConvertAspectFlags();
// X and Y are the expected texture samples.
// Z and W are the actual texture samples used.
@@ -1055,7 +1056,7 @@ namespace Ryujinx.Graphics.Vulkan
(shaderParams[0], shaderParams[1]) = GetSampleCountXYLog2(samples);
(shaderParams[2], shaderParams[3]) = GetSampleCountXYLog2((int)TextureStorage.ConvertToSampleCountFlags(gd.Capabilities.SupportedSampleCounts, (uint)samples));
using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize);
using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize);
buffer.Holder.SetDataUnchecked<int>(buffer.Offset, shaderParams);
@@ -1082,7 +1083,7 @@ namespace Ryujinx.Graphics.Vulkan
Span<Viewport> viewports = stackalloc Viewport[1];
var rect = new Rectangle<float>(0, 0, dst.Width, dst.Height);
Rectangle<float> rect = new(0, 0, dst.Width, dst.Height);
viewports[0] = new Viewport(
rect,
@@ -1099,8 +1100,8 @@ namespace Ryujinx.Graphics.Vulkan
for (int z = 0; z < depth; z++)
{
var srcView = Create2DLayerView(src, srcLayer + z, 0);
var dstView = Create2DLayerView(dst, dstLayer + z, 0);
TextureView srcView = Create2DLayerView(src, srcLayer + z, 0);
TextureView dstView = Create2DLayerView(dst, dstLayer + z, 0);
_pipeline.SetRenderTarget(dstView, (uint)dst.Width, (uint)dst.Height);
@@ -1119,7 +1120,7 @@ namespace Ryujinx.Graphics.Vulkan
}
else
{
var format = GetFormat(src.Info.BytesPerPixel);
Format format = GetFormat(src.Info.BytesPerPixel);
int dispatchX = (dst.Info.Width + 31) / 32;
int dispatchY = (dst.Info.Height + 31) / 32;
@@ -1128,8 +1129,8 @@ namespace Ryujinx.Graphics.Vulkan
for (int z = 0; z < depth; z++)
{
var srcView = Create2DLayerView(src, srcLayer + z, 0, format);
var dstView = Create2DLayerView(dst, dstLayer + z, 0);
TextureView srcView = Create2DLayerView(src, srcLayer + z, 0, format);
TextureView dstView = Create2DLayerView(dst, dstLayer + z, 0);
_pipeline.SetTextureAndSamplerIdentitySwizzle(ShaderStage.Compute, 0, srcView, null);
_pipeline.SetImage(ShaderStage.Compute, 0, dstView.GetView(format));
@@ -1173,7 +1174,7 @@ namespace Ryujinx.Graphics.Vulkan
int samples = dst.Info.Samples;
bool isDepthOrStencil = src.Info.Format.IsDepthOrStencil();
var aspectFlags = src.Info.Format.ConvertAspectFlags();
ImageAspectFlags aspectFlags = src.Info.Format.ConvertAspectFlags();
// X and Y are the expected texture samples.
// Z and W are the actual texture samples used.
@@ -1181,7 +1182,7 @@ namespace Ryujinx.Graphics.Vulkan
(shaderParams[0], shaderParams[1]) = GetSampleCountXYLog2(samples);
(shaderParams[2], shaderParams[3]) = GetSampleCountXYLog2((int)TextureStorage.ConvertToSampleCountFlags(gd.Capabilities.SupportedSampleCounts, (uint)samples));
using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize);
using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize);
buffer.Holder.SetDataUnchecked<int>(buffer.Offset, shaderParams);
@@ -1203,7 +1204,7 @@ namespace Ryujinx.Graphics.Vulkan
Span<Viewport> viewports = stackalloc Viewport[1];
var rect = new Rectangle<float>(0, 0, dst.Width, dst.Height);
Rectangle<float> rect = new(0, 0, dst.Width, dst.Height);
viewports[0] = new Viewport(
rect,
@@ -1225,8 +1226,8 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int z = 0; z < depth; z++)
{
var srcView = Create2DLayerView(src, srcLayer + z, 0);
var dstView = Create2DLayerView(dst, dstLayer + z, 0);
TextureView srcView = Create2DLayerView(src, srcLayer + z, 0);
TextureView dstView = Create2DLayerView(dst, dstLayer + z, 0);
_pipeline.SetRenderTarget(dstView, (uint)dst.Width, (uint)dst.Height);
@@ -1247,13 +1248,13 @@ namespace Ryujinx.Graphics.Vulkan
{
_pipeline.SetProgram(_programColorDrawToMs);
var format = GetFormat(src.Info.BytesPerPixel);
var vkFormat = FormatTable.GetFormat(format);
Format format = GetFormat(src.Info.BytesPerPixel);
VkFormat vkFormat = FormatTable.GetFormat(format);
for (int z = 0; z < depth; z++)
{
var srcView = Create2DLayerView(src, srcLayer + z, 0, format);
var dstView = Create2DLayerView(dst, dstLayer + z, 0);
TextureView srcView = Create2DLayerView(src, srcLayer + z, 0, format);
TextureView dstView = Create2DLayerView(dst, dstLayer + z, 0);
_pipeline.SetTextureAndSamplerIdentitySwizzle(ShaderStage.Fragment, 0, srcView, null);
_pipeline.SetRenderTarget(dstView.GetView(format), (uint)dst.Width, (uint)dst.Height);
@@ -1293,7 +1294,7 @@ namespace Ryujinx.Graphics.Vulkan
{
if (aspectFlags.HasFlag(ImageAspectFlags.DepthBit))
{
var depthTexture = CreateDepthOrStencilView(src, DepthStencilMode.Depth);
TextureView depthTexture = CreateDepthOrStencilView(src, DepthStencilMode.Depth);
CopyMSAspectDraw(depthTexture, fromMS, isDepth: true);
@@ -1305,7 +1306,7 @@ namespace Ryujinx.Graphics.Vulkan
if (aspectFlags.HasFlag(ImageAspectFlags.StencilBit) && _programStencilDrawToMs != null)
{
var stencilTexture = CreateDepthOrStencilView(src, DepthStencilMode.Stencil);
TextureView stencilTexture = CreateDepthOrStencilView(src, DepthStencilMode.Stencil);
CopyMSAspectDraw(stencilTexture, fromMS, isDepth: false);
@@ -1385,14 +1386,14 @@ namespace Ryujinx.Graphics.Vulkan
return from;
}
var target = from.Info.Target switch
Target target = from.Info.Target switch
{
Target.Texture1DArray => Target.Texture1D,
Target.Texture2DMultisampleArray => Target.Texture2DMultisample,
_ => Target.Texture2D,
};
var info = new TextureCreateInfo(
TextureCreateInfo info = new(
Math.Max(1, from.Info.Width >> level),
Math.Max(1, from.Info.Height >> level),
1,
@@ -1494,8 +1495,8 @@ namespace Ryujinx.Graphics.Vulkan
int convertedCount = pattern.GetConvertedCount(indexCount);
int outputIndexSize = 4;
var srcBuffer = srcIndexBuffer.GetBuffer().Get(cbs, srcIndexBufferOffset, indexCount * indexSize).Value;
var dstBuffer = dstIndexBuffer.GetBuffer().Get(cbs, 0, convertedCount * outputIndexSize).Value;
Buffer srcBuffer = srcIndexBuffer.GetBuffer().Get(cbs, srcIndexBufferOffset, indexCount * indexSize).Value;
Buffer dstBuffer = dstIndexBuffer.GetBuffer().Get(cbs, 0, convertedCount * outputIndexSize).Value;
const int ParamsBufferSize = 24 * sizeof(int);
const int ParamsIndirectDispatchOffset = 16 * sizeof(int);
@@ -1522,9 +1523,9 @@ namespace Ryujinx.Graphics.Vulkan
pattern.OffsetIndex.CopyTo(shaderParams[..pattern.OffsetIndex.Length]);
using var patternScoped = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize);
var patternBuffer = patternScoped.Holder;
var patternBufferAuto = patternBuffer.GetBuffer();
using ScopedTemporaryBuffer patternScoped = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize);
BufferHolder patternBuffer = patternScoped.Holder;
Auto<DisposableBuffer> patternBufferAuto = patternBuffer.GetBuffer();
patternBuffer.SetDataUnchecked<int>(patternScoped.Offset, shaderParams);
@@ -1596,13 +1597,13 @@ namespace Ryujinx.Graphics.Vulkan
int inSize = pixelCount * 2 * sizeof(int);
int outSize = pixelCount * sizeof(int);
var srcBufferAuto = src.GetBuffer();
Auto<DisposableBuffer> srcBufferAuto = src.GetBuffer();
var srcBuffer = srcBufferAuto.Get(cbs, 0, inSize).Value;
var dstBuffer = dstBufferAuto.Get(cbs, dstOffset, outSize).Value;
Buffer srcBuffer = srcBufferAuto.Get(cbs, 0, inSize).Value;
Buffer dstBuffer = dstBufferAuto.Get(cbs, dstOffset, outSize).Value;
var access = AccessFlags.ShaderWriteBit;
var stage = PipelineStageFlags.ComputeShaderBit;
AccessFlags access = AccessFlags.ShaderWriteBit;
PipelineStageFlags stage = PipelineStageFlags.ComputeShaderBit;
BufferHolder.InsertBufferBarrier(
gd,
@@ -1633,7 +1634,7 @@ namespace Ryujinx.Graphics.Vulkan
shaderParams[0] = pixelCount;
shaderParams[1] = dstOffset;
using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize);
using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize);
buffer.Holder.SetDataUnchecked<int>(buffer.Offset, shaderParams);
@@ -57,7 +57,7 @@ namespace Ryujinx.Graphics.Vulkan
lock (_lock)
{
// Does a compatible allocation exist in the tree?
var allocations = new HostMemoryAllocation[10];
HostMemoryAllocation[] allocations = new HostMemoryAllocation[10];
ulong start = (ulong)pointer;
ulong end = start + size;
@@ -115,7 +115,7 @@ namespace Ryujinx.Graphics.Vulkan
PNext = &importInfo,
};
var memoryAllocateInfo = new MemoryAllocateInfo
MemoryAllocateInfo memoryAllocateInfo = new()
{
SType = StructureType.MemoryAllocateInfo,
AllocationSize = pageAlignedSize,
@@ -123,7 +123,7 @@ namespace Ryujinx.Graphics.Vulkan
PNext = &priorityInfo,
};
Result result = _api.AllocateMemory(_device, in memoryAllocateInfo, null, out var deviceMemory);
Result result = _api.AllocateMemory(_device, in memoryAllocateInfo, null, out DeviceMemory deviceMemory);
if (result < Result.Success)
{
@@ -131,9 +131,9 @@ namespace Ryujinx.Graphics.Vulkan
return false;
}
var allocation = new MemoryAllocation(this, deviceMemory, pageAlignedPointer, 0, pageAlignedSize);
var allocAuto = new Auto<MemoryAllocation>(allocation);
var hostAlloc = new HostMemoryAllocation(allocAuto, pageAlignedPointer, pageAlignedSize);
MemoryAllocation allocation = new(this, deviceMemory, pageAlignedPointer, 0, pageAlignedSize);
Auto<MemoryAllocation> allocAuto = new(allocation);
HostMemoryAllocation hostAlloc = new(allocAuto, pageAlignedPointer, pageAlignedSize);
allocAuto.IncrementReferenceCount();
allocAuto.Dispose(); // Kept alive by ref count only.
@@ -152,7 +152,7 @@ namespace Ryujinx.Graphics.Vulkan
lock (_lock)
{
// Does a compatible allocation exist in the tree?
var allocations = new HostMemoryAllocation[10];
HostMemoryAllocation[] allocations = new HostMemoryAllocation[10];
ulong start = (ulong)pointer;
ulong end = start + size;
+2 -2
View File
@@ -128,8 +128,8 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < textures.Length; i++)
{
ref var texture = ref textures[i];
ref var refs = ref _textureRefs[i];
ref DescriptorImageInfo texture = ref textures[i];
ref TextureRef refs = ref _textureRefs[i];
if (i > 0 && _textureRefs[i - 1].View == refs.View)
{
@@ -115,7 +115,7 @@ namespace Ryujinx.Graphics.Vulkan
// Convert the index buffer using the given pattern.
int indexSize = GetIndexSize();
(var indexBufferAuto, var indirectBufferAuto) = gd.BufferManager.GetBufferTopologyConversionIndirect(
(Auto<DisposableBuffer> indexBufferAuto, Auto<DisposableBuffer> indirectBufferAuto) = gd.BufferManager.GetBufferTopologyConversionIndirect(
gd,
cbs,
new BufferRange(_handle, _offset, _size),
@@ -49,7 +49,7 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int i = 0; i < _blockLists.Count; i++)
{
var bl = _blockLists[i];
MemoryAllocatorBlockList bl = _blockLists[i];
if (bl.MemoryTypeIndex == memoryTypeIndex && bl.ForBuffer == isBuffer)
{
return bl.Allocate(size, alignment, map);
@@ -65,7 +65,7 @@ namespace Ryujinx.Graphics.Vulkan
try
{
var newBl = new MemoryAllocatorBlockList(_api, _device, memoryTypeIndex, _blockAlignment, isBuffer);
MemoryAllocatorBlockList newBl = new(_api, _device, memoryTypeIndex, _blockAlignment, isBuffer);
_blockLists.Add(newBl);
return newBl.Allocate(size, alignment, map);
@@ -80,7 +80,7 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int i = 0; i < _physicalDevice.PhysicalDeviceMemoryProperties.MemoryTypeCount; i++)
{
var type = _physicalDevice.PhysicalDeviceMemoryProperties.MemoryTypes[i];
MemoryType type = _physicalDevice.PhysicalDeviceMemoryProperties.MemoryTypes[i];
if ((memoryTypeBits & (1 << i)) != 0)
{
@@ -52,7 +52,7 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int i = 0; i < _freeRanges.Count; i++)
{
var range = _freeRanges[i];
Range range = _freeRanges[i];
ulong alignedOffset = BitUtils.AlignUp(range.Offset, alignment);
ulong sizeDelta = alignedOffset - range.Offset;
@@ -88,7 +88,7 @@ namespace Ryujinx.Graphics.Vulkan
private void InsertFreeRange(ulong offset, ulong size)
{
var range = new Range(offset, size);
Range range = new(offset, size);
int index = _freeRanges.BinarySearch(range);
if (index < 0)
{
@@ -101,7 +101,7 @@ namespace Ryujinx.Graphics.Vulkan
private void InsertFreeRangeComingled(ulong offset, ulong size)
{
ulong endOffset = offset + size;
var range = new Range(offset, size);
Range range = new(offset, size);
int index = _freeRanges.BinarySearch(range);
if (index < 0)
{
@@ -194,7 +194,7 @@ namespace Ryujinx.Graphics.Vulkan
{
for (int i = 0; i < _blocks.Count; i++)
{
var block = _blocks[i];
Block block = _blocks[i];
if (block.Mapped == map && block.Size >= size)
{
@@ -213,14 +213,14 @@ namespace Ryujinx.Graphics.Vulkan
ulong blockAlignedSize = BitUtils.AlignUp(size, (ulong)_blockAlignment);
var memoryAllocateInfo = new MemoryAllocateInfo
MemoryAllocateInfo memoryAllocateInfo = new()
{
SType = StructureType.MemoryAllocateInfo,
AllocationSize = blockAlignedSize,
MemoryTypeIndex = (uint)MemoryTypeIndex,
};
_api.AllocateMemory(_device, in memoryAllocateInfo, null, out var deviceMemory).ThrowOnError();
_api.AllocateMemory(_device, in memoryAllocateInfo, null, out DeviceMemory deviceMemory).ThrowOnError();
nint hostPointer = nint.Zero;
@@ -231,7 +231,7 @@ namespace Ryujinx.Graphics.Vulkan
hostPointer = (nint)pointer;
}
var newBlock = new Block(deviceMemory, hostPointer, blockAlignedSize);
Block newBlock = new(deviceMemory, hostPointer, blockAlignedSize);
InsertBlock(newBlock);
@@ -1,5 +1,6 @@
using Silk.NET.Core.Loader;
using Silk.NET.Vulkan;
using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
@@ -18,7 +19,7 @@ namespace Ryujinx.Graphics.Vulkan.MoltenVK
public static void Initialize()
{
var configSize = (nint)Marshal.SizeOf<MVKConfiguration>();
IntPtr configSize = (nint)Marshal.SizeOf<MVKConfiguration>();
vkGetMoltenVKConfigurationMVK(nint.Zero, out MVKConfiguration config, configSize);
@@ -232,7 +232,7 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < Fences.Length; i++)
{
var fence = Fences[i];
FenceHolder fence = Fences[i];
if (fence != null)
{
@@ -256,7 +256,7 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < Fences.Length; i++)
{
var fence = Fences[i];
FenceHolder fence = Fences[i];
if (fence != null && _bufferUsageBitmap.OverlapsWith(i, offset, size))
{
@@ -1,5 +1,7 @@
using Ryujinx.Graphics.GAL;
using Silk.NET.Vulkan;
using System;
using Buffer = Silk.NET.Vulkan.Buffer;
namespace Ryujinx.Graphics.Vulkan
{
@@ -16,7 +18,7 @@ namespace Ryujinx.Graphics.Vulkan
private BufferHolder ResizeIfNeeded(int size)
{
var flushStorage = _flushStorage;
BufferHolder flushStorage = _flushStorage;
if (flushStorage == null || size > _flushStorage.Size)
{
@@ -31,13 +33,13 @@ namespace Ryujinx.Graphics.Vulkan
public Span<byte> GetBufferData(CommandBufferPool cbp, BufferHolder buffer, int offset, int size)
{
var flushStorage = ResizeIfNeeded(size);
BufferHolder flushStorage = ResizeIfNeeded(size);
Auto<DisposableBuffer> srcBuffer;
using (var cbs = cbp.Rent())
using (CommandBufferScoped cbs = cbp.Rent())
{
srcBuffer = buffer.GetBuffer(cbs.CommandBuffer);
var dstBuffer = flushStorage.GetBuffer(cbs.CommandBuffer);
Auto<DisposableBuffer> dstBuffer = flushStorage.GetBuffer(cbs.CommandBuffer);
if (srcBuffer.TryIncrementReferenceCount())
{
@@ -59,12 +61,12 @@ namespace Ryujinx.Graphics.Vulkan
{
TextureCreateInfo info = view.Info;
var flushStorage = ResizeIfNeeded(size);
BufferHolder flushStorage = ResizeIfNeeded(size);
using (var cbs = cbp.Rent())
using (CommandBufferScoped cbs = cbp.Rent())
{
var buffer = flushStorage.GetBuffer(cbs.CommandBuffer).Get(cbs).Value;
var image = view.GetImage().Get(cbs).Value;
Buffer buffer = flushStorage.GetBuffer(cbs.CommandBuffer).Get(cbs).Value;
Image image = view.GetImage().Get(cbs).Value;
view.CopyFromOrToBuffer(cbs.CommandBuffer, buffer, image, size, true, 0, 0, info.GetLayers(), info.Levels, singleSlice: false);
}
@@ -75,12 +77,12 @@ namespace Ryujinx.Graphics.Vulkan
public Span<byte> GetTextureData(CommandBufferPool cbp, TextureView view, int size, int layer, int level)
{
var flushStorage = ResizeIfNeeded(size);
BufferHolder flushStorage = ResizeIfNeeded(size);
using (var cbs = cbp.Rent())
using (CommandBufferScoped cbs = cbp.Rent())
{
var buffer = flushStorage.GetBuffer(cbs.CommandBuffer).Get(cbs).Value;
var image = view.GetImage().Get(cbs).Value;
Buffer buffer = flushStorage.GetBuffer(cbs.CommandBuffer).Get(cbs).Value;
Image image = view.GetImage().Get(cbs).Value;
view.CopyFromOrToBuffer(cbs.CommandBuffer, buffer, image, size, true, layer, level, 1, 1, singleSlice: true);
}
+60 -56
View File
@@ -1,3 +1,4 @@
using Ryujinx.Common.Memory;
using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.Shader;
using Silk.NET.Vulkan;
@@ -6,7 +7,10 @@ using System.Collections.Generic;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using BlendOp = Silk.NET.Vulkan.BlendOp;
using Buffer = Silk.NET.Vulkan.Buffer;
using CompareOp = Ryujinx.Graphics.GAL.CompareOp;
using Format = Silk.NET.Vulkan.Format;
using FrontFace = Ryujinx.Graphics.GAL.FrontFace;
using IndexType = Ryujinx.Graphics.GAL.IndexType;
using PolygonMode = Ryujinx.Graphics.GAL.PolygonMode;
@@ -100,7 +104,7 @@ namespace Ryujinx.Graphics.Vulkan
AutoFlush = new AutoFlushCounter(gd);
EndRenderPassDelegate = EndRenderPass;
var pipelineCacheCreateInfo = new PipelineCacheCreateInfo
PipelineCacheCreateInfo pipelineCacheCreateInfo = new()
{
SType = StructureType.PipelineCacheCreateInfo,
};
@@ -115,7 +119,7 @@ namespace Ryujinx.Graphics.Vulkan
const int EmptyVbSize = 16;
using var emptyVb = gd.BufferManager.Create(gd, EmptyVbSize);
using BufferHolder emptyVb = gd.BufferManager.Create(gd, EmptyVbSize);
emptyVb.SetData(0, new byte[EmptyVbSize]);
_vertexBuffers[0] = new VertexBufferState(emptyVb.GetBuffer(), 0, 0, EmptyVbSize);
_vertexBuffersDirty = ulong.MaxValue >> (64 - _vertexBuffers.Length);
@@ -172,7 +176,7 @@ namespace Ryujinx.Graphics.Vulkan
{
EndRenderPass();
var dst = Gd.BufferManager.GetBuffer(CommandBuffer, destination, offset, size, true).Get(Cbs, offset, size, true).Value;
Buffer dst = Gd.BufferManager.GetBuffer(CommandBuffer, destination, offset, size, true).Get(Cbs, offset, size, true).Value;
BufferHolder.InsertBufferBarrier(
Gd,
@@ -215,9 +219,9 @@ namespace Ryujinx.Graphics.Vulkan
BeginRenderPass();
var clearValue = new ClearValue(new ClearColorValue(color.Red, color.Green, color.Blue, color.Alpha));
var attachment = new ClearAttachment(ImageAspectFlags.ColorBit, (uint)index, clearValue);
var clearRect = FramebufferParams.GetClearRect(ClearScissor, layer, layerCount);
ClearValue clearValue = new(new ClearColorValue(color.Red, color.Green, color.Blue, color.Alpha));
ClearAttachment attachment = new(ImageAspectFlags.ColorBit, (uint)index, clearValue);
ClearRect clearRect = FramebufferParams.GetClearRect(ClearScissor, layer, layerCount);
Gd.Api.CmdClearAttachments(CommandBuffer, 1, &attachment, 1, &clearRect);
}
@@ -229,8 +233,8 @@ namespace Ryujinx.Graphics.Vulkan
return;
}
var clearValue = new ClearValue(null, new ClearDepthStencilValue(depthValue, (uint)stencilValue));
var flags = depthMask ? ImageAspectFlags.DepthBit : 0;
ClearValue clearValue = new(null, new ClearDepthStencilValue(depthValue, (uint)stencilValue));
ImageAspectFlags flags = depthMask ? ImageAspectFlags.DepthBit : 0;
if (stencilMask)
{
@@ -253,8 +257,8 @@ namespace Ryujinx.Graphics.Vulkan
BeginRenderPass();
var attachment = new ClearAttachment(flags, 0, clearValue);
var clearRect = FramebufferParams.GetClearRect(ClearScissor, layer, layerCount);
ClearAttachment attachment = new(flags, 0, clearValue);
ClearRect clearRect = FramebufferParams.GetClearRect(ClearScissor, layer, layerCount);
Gd.Api.CmdClearAttachments(CommandBuffer, 1, &attachment, 1, &clearRect);
}
@@ -268,8 +272,8 @@ namespace Ryujinx.Graphics.Vulkan
{
EndRenderPass();
var src = Gd.BufferManager.GetBuffer(CommandBuffer, source, srcOffset, size, false);
var dst = Gd.BufferManager.GetBuffer(CommandBuffer, destination, dstOffset, size, true);
Auto<DisposableBuffer> src = Gd.BufferManager.GetBuffer(CommandBuffer, source, srcOffset, size, false);
Auto<DisposableBuffer> dst = Gd.BufferManager.GetBuffer(CommandBuffer, destination, dstOffset, size, true);
BufferHolder.Copy(Gd, Cbs, src, dst, srcOffset, dstOffset, size);
}
@@ -348,7 +352,7 @@ namespace Ryujinx.Graphics.Vulkan
};
BufferHandle handle = pattern.GetRepeatingBuffer(vertexCount, out int indexCount);
var buffer = Gd.BufferManager.GetBuffer(CommandBuffer, handle, false);
Auto<DisposableBuffer> buffer = Gd.BufferManager.GetBuffer(CommandBuffer, handle, false);
Gd.Api.CmdBindIndexBuffer(CommandBuffer, buffer.Get(Cbs, 0, indexCount * sizeof(int)).Value, 0, Silk.NET.Vulkan.IndexType.Uint32);
@@ -433,7 +437,7 @@ namespace Ryujinx.Graphics.Vulkan
public void DrawIndexedIndirect(BufferRange indirectBuffer)
{
var buffer = Gd.BufferManager
Buffer buffer = Gd.BufferManager
.GetBuffer(CommandBuffer, indirectBuffer.Handle, indirectBuffer.Offset, indirectBuffer.Size, false)
.Get(Cbs, indirectBuffer.Offset, indirectBuffer.Size).Value;
@@ -479,11 +483,11 @@ namespace Ryujinx.Graphics.Vulkan
public void DrawIndexedIndirectCount(BufferRange indirectBuffer, BufferRange parameterBuffer, int maxDrawCount, int stride)
{
var countBuffer = Gd.BufferManager
Buffer countBuffer = Gd.BufferManager
.GetBuffer(CommandBuffer, parameterBuffer.Handle, parameterBuffer.Offset, parameterBuffer.Size, false)
.Get(Cbs, parameterBuffer.Offset, parameterBuffer.Size).Value;
var buffer = Gd.BufferManager
Buffer buffer = Gd.BufferManager
.GetBuffer(CommandBuffer, indirectBuffer.Handle, indirectBuffer.Offset, indirectBuffer.Size, false)
.Get(Cbs, indirectBuffer.Offset, indirectBuffer.Size).Value;
@@ -573,7 +577,7 @@ namespace Ryujinx.Graphics.Vulkan
{
// TODO: Support quads and other unsupported topologies.
var buffer = Gd.BufferManager
Buffer buffer = Gd.BufferManager
.GetBuffer(CommandBuffer, indirectBuffer.Handle, indirectBuffer.Offset, indirectBuffer.Size, false)
.Get(Cbs, indirectBuffer.Offset, indirectBuffer.Size, false).Value;
@@ -597,11 +601,11 @@ namespace Ryujinx.Graphics.Vulkan
throw new NotSupportedException();
}
var buffer = Gd.BufferManager
Buffer buffer = Gd.BufferManager
.GetBuffer(CommandBuffer, indirectBuffer.Handle, indirectBuffer.Offset, indirectBuffer.Size, false)
.Get(Cbs, indirectBuffer.Offset, indirectBuffer.Size, false).Value;
var countBuffer = Gd.BufferManager
Buffer countBuffer = Gd.BufferManager
.GetBuffer(CommandBuffer, parameterBuffer.Handle, parameterBuffer.Offset, parameterBuffer.Size, false)
.Get(Cbs, parameterBuffer.Offset, parameterBuffer.Size, false).Value;
@@ -630,13 +634,13 @@ namespace Ryujinx.Graphics.Vulkan
{
if (texture is TextureView srcTexture)
{
var oldCullMode = _newState.CullMode;
var oldStencilTestEnable = _newState.StencilTestEnable;
var oldDepthTestEnable = _newState.DepthTestEnable;
var oldDepthWriteEnable = _newState.DepthWriteEnable;
var oldViewports = DynamicState.Viewports;
var oldViewportsCount = _newState.ViewportsCount;
var oldTopology = _topology;
CullModeFlags oldCullMode = _newState.CullMode;
bool oldStencilTestEnable = _newState.StencilTestEnable;
bool oldDepthTestEnable = _newState.DepthTestEnable;
bool oldDepthWriteEnable = _newState.DepthWriteEnable;
Array16<Silk.NET.Vulkan.Viewport> oldViewports = DynamicState.Viewports;
uint oldViewportsCount = _newState.ViewportsCount;
PrimitiveTopology oldTopology = _topology;
_newState.CullMode = CullModeFlags.None;
_newState.StencilTestEnable = false;
@@ -710,11 +714,11 @@ namespace Ryujinx.Graphics.Vulkan
for (int index = 0; index < Constants.MaxRenderTargets; index++)
{
ref var vkBlend = ref colorBlendAttachmentStateSpan[index];
ref PipelineColorBlendAttachmentState vkBlend = ref colorBlendAttachmentStateSpan[index];
if (index == 0)
{
var blendOp = blend.Op.Convert();
BlendOp blendOp = blend.Op.Convert();
vkBlend = new PipelineColorBlendAttachmentState(
blendEnable: true,
@@ -751,7 +755,7 @@ namespace Ryujinx.Graphics.Vulkan
public void SetBlendState(int index, BlendDescriptor blend)
{
ref var vkBlend = ref _newState.Internal.ColorBlendAttachmentState[index];
ref PipelineColorBlendAttachmentState vkBlend = ref _newState.Internal.ColorBlendAttachmentState[index];
if (blend.Enable)
{
@@ -919,7 +923,7 @@ namespace Ryujinx.Graphics.Vulkan
{
_topology = topology;
var vkTopology = Gd.TopologyRemap(topology).Convert();
Silk.NET.Vulkan.PrimitiveTopology vkTopology = Gd.TopologyRemap(topology).Convert();
_newState.Topology = vkTopology;
@@ -928,8 +932,8 @@ namespace Ryujinx.Graphics.Vulkan
public void SetProgram(IProgram program)
{
var internalProgram = (ShaderCollection)program;
var stages = internalProgram.GetInfos();
ShaderCollection internalProgram = (ShaderCollection)program;
PipelineShaderStageCreateInfo[] stages = internalProgram.GetInfos();
_program = internalProgram;
@@ -952,7 +956,7 @@ namespace Ryujinx.Graphics.Vulkan
public void Specialize<T>(in T data) where T : unmanaged
{
var dataSpan = MemoryMarshal.AsBytes(MemoryMarshal.CreateReadOnlySpan(ref Unsafe.AsRef(in data), 1));
ReadOnlySpan<byte> dataSpan = MemoryMarshal.AsBytes(MemoryMarshal.CreateReadOnlySpan(ref Unsafe.AsRef(in data), 1));
if (!dataSpan.SequenceEqual(_newState.SpecializationData.Span))
{
@@ -988,8 +992,8 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < count; i++)
{
ref var vkBlend = ref colorBlendAttachmentStateSpan[i];
var newMask = (ColorComponentFlags)componentMask[i];
ref PipelineColorBlendAttachmentState vkBlend = ref colorBlendAttachmentStateSpan[i];
ColorComponentFlags newMask = (ColorComponentFlags)componentMask[i];
// When color write mask is 0, remove all blend state to help the pipeline cache.
// Restore it when the mask becomes non-zero.
@@ -1056,9 +1060,9 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < count; i++)
{
var region = regions[i];
var offset = new Offset2D(region.X, region.Y);
var extent = new Extent2D((uint)region.Width, (uint)region.Height);
Rectangle<int> region = regions[i];
Offset2D offset = new(region.X, region.Y);
Extent2D extent = new((uint)region.Width, (uint)region.Height);
DynamicState.SetScissor(i, new Rect2D(offset, extent));
}
@@ -1131,7 +1135,7 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < count; i++)
{
var range = buffers[i];
BufferRange range = buffers[i];
_transformFeedbackBuffers[i].Dispose();
@@ -1160,7 +1164,7 @@ namespace Ryujinx.Graphics.Vulkan
public void SetVertexAttribs(ReadOnlySpan<VertexAttribDescriptor> vertexAttribs)
{
var formatCapabilities = Gd.FormatCapabilities;
FormatCapabilities formatCapabilities = Gd.FormatCapabilities;
Span<int> newVbScalarSizes = stackalloc int[Constants.MaxVertexBuffers];
@@ -1171,9 +1175,9 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < count; i++)
{
var attribute = vertexAttribs[i];
var rawIndex = attribute.BufferIndex;
var bufferIndex = attribute.IsZero ? 0 : rawIndex + 1;
VertexAttribDescriptor attribute = vertexAttribs[i];
int rawIndex = attribute.BufferIndex;
int bufferIndex = attribute.IsZero ? 0 : rawIndex + 1;
if (!attribute.IsZero)
{
@@ -1192,7 +1196,7 @@ namespace Ryujinx.Graphics.Vulkan
{
int dirtyBit = BitOperations.TrailingZeroCount(dirtyVbSizes);
ref var buffer = ref _vertexBuffers[dirtyBit + 1];
ref VertexBufferState buffer = ref _vertexBuffers[dirtyBit + 1];
if (buffer.AttributeScalarAlignment != newVbScalarSizes[dirtyBit])
{
@@ -1220,10 +1224,10 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < count; i++)
{
var vertexBuffer = vertexBuffers[i];
VertexBufferDescriptor vertexBuffer = vertexBuffers[i];
// TODO: Support divisor > 1
var inputRate = vertexBuffer.Divisor != 0 ? VertexInputRate.Instance : VertexInputRate.Vertex;
VertexInputRate inputRate = vertexBuffer.Divisor != 0 ? VertexInputRate.Instance : VertexInputRate.Vertex;
if (vertexBuffer.Buffer.Handle != BufferHandle.Null)
{
@@ -1257,7 +1261,7 @@ namespace Ryujinx.Graphics.Vulkan
}
}
ref var buffer = ref _vertexBuffers[binding];
ref VertexBufferState buffer = ref _vertexBuffers[binding];
int oldScalarAlign = buffer.AttributeScalarAlignment;
if (Gd.Capabilities.VertexBufferAlignment < 2 &&
@@ -1318,7 +1322,7 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < count; i++)
{
var viewport = viewports[i];
Viewport viewport = viewports[i];
DynamicState.SetViewport(i, new Silk.NET.Vulkan.Viewport(
viewport.Region.X,
@@ -1417,7 +1421,7 @@ namespace Ryujinx.Graphics.Vulkan
continue;
}
ref var vkBlend = ref colorBlendAttachmentStateSpan[i];
ref PipelineColorBlendAttachmentState vkBlend = ref colorBlendAttachmentStateSpan[i];
for (int j = 0; j < i; j++)
{
@@ -1426,7 +1430,7 @@ namespace Ryujinx.Graphics.Vulkan
if (colors[i] == colors[j])
{
// Prefer the binding with no write mask.
ref var vkBlend2 = ref colorBlendAttachmentStateSpan[j];
ref PipelineColorBlendAttachmentState vkBlend2 = ref colorBlendAttachmentStateSpan[j];
if (vkBlend.ColorWriteMask == 0)
{
colors[i] = null;
@@ -1464,7 +1468,7 @@ namespace Ryujinx.Graphics.Vulkan
protected void UpdatePipelineAttachmentFormats()
{
var dstAttachmentFormats = _newState.Internal.AttachmentFormats.AsSpan();
Span<Format> dstAttachmentFormats = _newState.Internal.AttachmentFormats.AsSpan();
FramebufferParams.AttachmentFormats.AsSpan(..FramebufferParams.AttachmentsCount).CopyTo(dstAttachmentFormats);
_newState.Internal.AttachmentIntegerFormatMask = FramebufferParams.AttachmentIntegerFormatMask;
_newState.Internal.LogicOpsAllowed = FramebufferParams.LogicOpsAllowed;
@@ -1481,7 +1485,7 @@ namespace Ryujinx.Graphics.Vulkan
protected unsafe void CreateRenderPass()
{
var hasFramebuffer = FramebufferParams != null;
bool hasFramebuffer = FramebufferParams != null;
EndRenderPass();
@@ -1686,7 +1690,7 @@ namespace Ryujinx.Graphics.Vulkan
return false;
}
var pipeline = pbp == PipelineBindPoint.Compute
Auto<DisposablePipeline> pipeline = pbp == PipelineBindPoint.Compute
? _newState.CreateComputePipeline(Gd, Device, _program, PipelineCache)
: _newState.CreateGraphicsPipeline(Gd, Device, _program, PipelineCache, _renderPass!.Get(Cbs).Value);
@@ -1718,10 +1722,10 @@ namespace Ryujinx.Graphics.Vulkan
{
FramebufferParams.InsertLoadOpBarriers(Gd, Cbs);
var renderArea = new Rect2D(null, new Extent2D(FramebufferParams.Width, FramebufferParams.Height));
var clearValue = new ClearValue();
Rect2D renderArea = new(null, new Extent2D(FramebufferParams.Width, FramebufferParams.Height));
ClearValue clearValue = new();
var renderPassBeginInfo = new RenderPassBeginInfo
RenderPassBeginInfo renderPassBeginInfo = new()
{
SType = StructureType.RenderPassBeginInfo,
RenderPass = _renderPass.Get(Cbs).Value,
@@ -16,7 +16,7 @@ namespace Ryujinx.Graphics.Vulkan
AttachmentDescription[] attachmentDescs = null;
var subpass = new SubpassDescription
SubpassDescription subpass = new()
{
PipelineBindPoint = PipelineBindPoint.Graphics,
};
@@ -111,11 +111,11 @@ namespace Ryujinx.Graphics.Vulkan
}
}
var subpassDependency = CreateSubpassDependency(gd);
SubpassDependency subpassDependency = CreateSubpassDependency(gd);
fixed (AttachmentDescription* pAttachmentDescs = attachmentDescs)
{
var renderPassCreateInfo = new RenderPassCreateInfo
RenderPassCreateInfo renderPassCreateInfo = new()
{
SType = StructureType.RenderPassCreateInfo,
PAttachments = pAttachmentDescs,
@@ -126,7 +126,7 @@ namespace Ryujinx.Graphics.Vulkan
DependencyCount = 1,
};
gd.Api.CreateRenderPass(device, in renderPassCreateInfo, null, out var renderPass).ThrowOnError();
gd.Api.CreateRenderPass(device, in renderPassCreateInfo, null, out RenderPass renderPass).ThrowOnError();
return new DisposableRenderPass(gd.Api, device, renderPass);
}
@@ -134,7 +134,7 @@ namespace Ryujinx.Graphics.Vulkan
public static SubpassDependency CreateSubpassDependency(VulkanRenderer gd)
{
var (access, stages) = BarrierBatch.GetSubpassAccessSuperset(gd);
(AccessFlags access, PipelineStageFlags stages) = BarrierBatch.GetSubpassAccessSuperset(gd);
return new SubpassDependency(
0,
@@ -148,7 +148,7 @@ namespace Ryujinx.Graphics.Vulkan
public unsafe static SubpassDependency2 CreateSubpassDependency2(VulkanRenderer gd)
{
var (access, stages) = BarrierBatch.GetSubpassAccessSuperset(gd);
(AccessFlags access, PipelineStageFlags stages) = BarrierBatch.GetSubpassAccessSuperset(gd);
return new SubpassDependency2(
StructureType.SubpassDependency2,
@@ -231,8 +231,8 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < vaCount; i++)
{
var attribute = vertexAttribsSpan[i];
var bufferIndex = attribute.IsZero ? 0 : attribute.BufferIndex + 1;
VertexAttribDescriptor attribute = vertexAttribsSpan[i];
int bufferIndex = attribute.IsZero ? 0 : attribute.BufferIndex + 1;
vertexAttributeDescriptionsSpan[i] = new VertexInputAttributeDescription(
(uint)i,
@@ -254,11 +254,11 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < vbCount; i++)
{
var vertexBuffer = vertexBuffersSpan[i];
BufferPipelineDescriptor vertexBuffer = vertexBuffersSpan[i];
if (vertexBuffer.Enable)
{
var inputRate = vertexBuffer.Divisor != 0 ? VertexInputRate.Instance : VertexInputRate.Vertex;
VertexInputRate inputRate = vertexBuffer.Divisor != 0 ? VertexInputRate.Instance : VertexInputRate.Vertex;
int alignedStride = vertexBuffer.Stride;
@@ -285,7 +285,7 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < Constants.MaxRenderTargets; i++)
{
var blend = blendDescriptorsSpan[i];
BlendDescriptor blend = blendDescriptorsSpan[i];
if (blend.Enable && colorWriteMaskSpan[i] != 0)
{
+5 -5
View File
@@ -34,7 +34,7 @@ namespace Ryujinx.Graphics.Vulkan
private void CopyPendingQuery()
{
foreach (var query in _pendingQueryCopies)
foreach (BufferedQuery query in _pendingQueryCopies)
{
query.PoolCopy(Cbs);
}
@@ -54,7 +54,7 @@ namespace Ryujinx.Graphics.Vulkan
// We can't use CmdClearAttachments if not writing all components,
// because on Vulkan, the pipeline state does not affect clears.
// On proprietary Adreno drivers, CmdClearAttachments appears to execute out of order, so it's better to not use it at all.
var dstTexture = FramebufferParams.GetColorView(index);
TextureView dstTexture = FramebufferParams.GetColorView(index);
if (dstTexture == null)
{
return;
@@ -95,7 +95,7 @@ namespace Ryujinx.Graphics.Vulkan
// We can't use CmdClearAttachments if not clearing all (mask is all ones, 0xFF) or none (mask is 0) of the stencil bits,
// because on Vulkan, the pipeline state does not affect clears.
// On proprietary Adreno drivers, CmdClearAttachments appears to execute out of order, so it's better to not use it at all.
var dstTexture = FramebufferParams.GetDepthStencilView();
TextureView dstTexture = FramebufferParams.GetDepthStencilView();
if (dstTexture == null)
{
return;
@@ -246,7 +246,7 @@ namespace Ryujinx.Graphics.Vulkan
AutoFlush.RegisterFlush(DrawCount);
EndRenderPass();
foreach ((var queryPool, _) in _activeQueries)
foreach ((QueryPool queryPool, _) in _activeQueries)
{
Gd.Api.CmdEndQuery(CommandBuffer, queryPool, 0);
}
@@ -271,7 +271,7 @@ namespace Ryujinx.Graphics.Vulkan
_activeBufferMirrors.Clear();
foreach ((var queryPool, var isOcclusion) in _activeQueries)
foreach ((QueryPool queryPool, bool isOcclusion) in _activeQueries)
{
bool isPrecise = Gd.Capabilities.SupportsPreciseOcclusionQueries && isOcclusion;
@@ -25,7 +25,7 @@ namespace Ryujinx.Graphics.Vulkan
if (SetDescriptors != null)
{
foreach (var setDescriptor in SetDescriptors)
foreach (ResourceDescriptorCollection setDescriptor in SetDescriptors)
{
hasher.Add(setDescriptor);
}
@@ -81,7 +81,7 @@ namespace Ryujinx.Graphics.Vulkan
ReadOnlyCollection<ResourceDescriptorCollection> setDescriptors,
bool usePushDescriptors)
{
var key = new PlceKey(setDescriptors, usePushDescriptors);
PlceKey key = new(setDescriptors, usePushDescriptors);
return _plces.GetOrAdd(key, _ => new PipelineLayoutCacheEntry(gd, device, setDescriptors, usePushDescriptors));
}
@@ -90,7 +90,7 @@ namespace Ryujinx.Graphics.Vulkan
{
if (disposing)
{
foreach (var plce in _plces.Values)
foreach (PipelineLayoutCacheEntry plce in _plces.Values)
{
plce.Dispose();
}
@@ -114,7 +114,7 @@ namespace Ryujinx.Graphics.Vulkan
{
int count = 0;
foreach (var descriptor in setDescriptors[setIndex].Descriptors)
foreach (ResourceDescriptor descriptor in setDescriptors[setIndex].Descriptors)
{
count += descriptor.Count;
}
@@ -148,11 +148,11 @@ namespace Ryujinx.Graphics.Vulkan
public Auto<DescriptorSetCollection> GetNewDescriptorSetCollection(int setIndex, out bool isNew)
{
var list = _currentDsCache[setIndex];
List<Auto<DescriptorSetCollection>> list = _currentDsCache[setIndex];
int index = _dsCacheCursor[setIndex]++;
if (index == list.Count)
{
var dsc = _descriptorSetManager.AllocateDescriptorSet(
Auto<DescriptorSetCollection> dsc = _descriptorSetManager.AllocateDescriptorSet(
_gd.Api,
DescriptorSetLayouts[setIndex],
_poolSizes[setIndex],
@@ -173,8 +173,8 @@ namespace Ryujinx.Graphics.Vulkan
{
FreeCompletedManualDescriptorSets();
var list = _manualDsCache[setIndex] ??= [];
var span = CollectionsMarshal.AsSpan(list);
List<ManualDescriptorSetEntry> list = _manualDsCache[setIndex] ??= [];
Span<ManualDescriptorSetEntry> span = CollectionsMarshal.AsSpan(list);
Queue<int> freeQueue = _freeManualDsCacheEntries[setIndex];
@@ -195,7 +195,7 @@ namespace Ryujinx.Graphics.Vulkan
}
// Otherwise create a new descriptor set, and add to our pending queue for command buffer consumption tracking.
var dsc = _descriptorSetManager.AllocateDescriptorSet(
Auto<DescriptorSetCollection> dsc = _descriptorSetManager.AllocateDescriptorSet(
_gd.Api,
DescriptorSetLayouts[setIndex],
_poolSizes[setIndex],
@@ -214,9 +214,9 @@ namespace Ryujinx.Graphics.Vulkan
{
FreeCompletedManualDescriptorSets();
var list = _manualDsCache[setIndex];
var span = CollectionsMarshal.AsSpan(list);
ref var entry = ref span[cacheIndex];
List<ManualDescriptorSetEntry> list = _manualDsCache[setIndex];
Span<ManualDescriptorSetEntry> span = CollectionsMarshal.AsSpan(list);
ref ManualDescriptorSetEntry entry = ref span[cacheIndex];
uint cbMask = 1u << cbs.CommandBufferIndex;
@@ -231,15 +231,15 @@ namespace Ryujinx.Graphics.Vulkan
private void FreeCompletedManualDescriptorSets()
{
FenceHolder signalledFence = null;
while (_pendingManualDsConsumptions.TryPeek(out var pds) && pds.Fence != null && (pds.Fence == signalledFence || pds.Fence.IsSignaled()))
while (_pendingManualDsConsumptions.TryPeek(out PendingManualDsConsumption pds) && pds.Fence != null && (pds.Fence == signalledFence || pds.Fence.IsSignaled()))
{
signalledFence = pds.Fence; // Already checked - don't need to do it again.
var dequeued = _pendingManualDsConsumptions.Dequeue();
PendingManualDsConsumption dequeued = _pendingManualDsConsumptions.Dequeue();
Debug.Assert(dequeued.Fence == pds.Fence);
pds.Fence.Put();
var span = CollectionsMarshal.AsSpan(_manualDsCache[dequeued.SetIndex]);
ref var entry = ref span[dequeued.CacheIndex];
Span<ManualDescriptorSetEntry> span = CollectionsMarshal.AsSpan(_manualDsCache[dequeued.SetIndex]);
ref ManualDescriptorSetEntry entry = ref span[dequeued.CacheIndex];
entry.CbRefMask &= ~(1u << dequeued.CommandBufferIndex);
if (!entry.InUse && entry.CbRefMask == 0)
@@ -252,8 +252,8 @@ namespace Ryujinx.Graphics.Vulkan
public void ReleaseManualDescriptorSetCollection(int setIndex, int cacheIndex)
{
var list = _manualDsCache[setIndex];
var span = CollectionsMarshal.AsSpan(list);
List<ManualDescriptorSetEntry> list = _manualDsCache[setIndex];
Span<ManualDescriptorSetEntry> span = CollectionsMarshal.AsSpan(list);
span[cacheIndex].InUse = false;
@@ -366,7 +366,7 @@ namespace Ryujinx.Graphics.Vulkan
_gd.Api.DestroyDescriptorSetLayout(_device, DescriptorSetLayouts[i], null);
}
while (_pendingManualDsConsumptions.TryDequeue(out var pds))
while (_pendingManualDsConsumptions.TryDequeue(out PendingManualDsConsumption pds))
{
pds.Fence.Put();
}
@@ -62,7 +62,7 @@ namespace Ryujinx.Graphics.Vulkan
updateAfterBindFlags[setIndex] = true;
}
var descriptorSetLayoutCreateInfo = new DescriptorSetLayoutCreateInfo
DescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo = new()
{
SType = StructureType.DescriptorSetLayoutCreateInfo,
PBindings = pLayoutBindings,
@@ -78,7 +78,7 @@ namespace Ryujinx.Graphics.Vulkan
fixed (DescriptorSetLayout* pLayouts = layouts)
{
var pipelineLayoutCreateInfo = new PipelineLayoutCreateInfo
PipelineLayoutCreateInfo pipelineLayoutCreateInfo = new()
{
SType = StructureType.PipelineLayoutCreateInfo,
PSetLayouts = pLayouts,
+19 -19
View File
@@ -332,12 +332,12 @@ namespace Ryujinx.Graphics.Vulkan
ShaderCollection program,
PipelineCache cache)
{
if (program.TryGetComputePipeline(ref SpecializationData, out var pipeline))
if (program.TryGetComputePipeline(ref SpecializationData, out Auto<DisposablePipeline> pipeline))
{
return pipeline;
}
var pipelineCreateInfo = new ComputePipelineCreateInfo
ComputePipelineCreateInfo pipelineCreateInfo = new()
{
SType = StructureType.ComputePipelineCreateInfo,
Stage = Stages[0],
@@ -349,7 +349,7 @@ namespace Ryujinx.Graphics.Vulkan
bool hasSpec = program.SpecDescriptions != null;
var desc = hasSpec ? program.SpecDescriptions[0] : SpecDescription.Empty;
SpecDescription desc = hasSpec ? program.SpecDescriptions[0] : SpecDescription.Empty;
if (hasSpec && SpecializationData.Length < (int)desc.Info.DataSize)
{
@@ -385,7 +385,7 @@ namespace Ryujinx.Graphics.Vulkan
RenderPass renderPass,
bool throwOnError = false)
{
if (program.TryGetGraphicsPipeline(ref Internal, out var pipeline))
if (program.TryGetGraphicsPipeline(ref Internal, out Auto<DisposablePipeline> pipeline))
{
return pipeline;
}
@@ -404,7 +404,7 @@ namespace Ryujinx.Graphics.Vulkan
fixed (VertexInputBindingDescription* pVertexBindingDescriptions = &Internal.VertexBindingDescriptions[0])
fixed (PipelineColorBlendAttachmentState* pColorBlendAttachmentState = &Internal.ColorBlendAttachmentState[0])
{
var vertexInputState = new PipelineVertexInputStateCreateInfo
PipelineVertexInputStateCreateInfo vertexInputState = new()
{
SType = StructureType.PipelineVertexInputStateCreateInfo,
VertexAttributeDescriptionCount = VertexAttributeDescriptionsCount,
@@ -441,20 +441,20 @@ namespace Ryujinx.Graphics.Vulkan
primitiveRestartEnable &= topologySupportsRestart;
var inputAssemblyState = new PipelineInputAssemblyStateCreateInfo
PipelineInputAssemblyStateCreateInfo inputAssemblyState = new()
{
SType = StructureType.PipelineInputAssemblyStateCreateInfo,
PrimitiveRestartEnable = primitiveRestartEnable,
Topology = HasTessellationControlShader ? PrimitiveTopology.PatchList : Topology,
};
var tessellationState = new PipelineTessellationStateCreateInfo
PipelineTessellationStateCreateInfo tessellationState = new()
{
SType = StructureType.PipelineTessellationStateCreateInfo,
PatchControlPoints = PatchControlPoints,
};
var rasterizationState = new PipelineRasterizationStateCreateInfo
PipelineRasterizationStateCreateInfo rasterizationState = new()
{
SType = StructureType.PipelineRasterizationStateCreateInfo,
DepthClampEnable = DepthClampEnable,
@@ -466,7 +466,7 @@ namespace Ryujinx.Graphics.Vulkan
DepthBiasEnable = DepthBiasEnable,
};
var viewportState = new PipelineViewportStateCreateInfo
PipelineViewportStateCreateInfo viewportState = new()
{
SType = StructureType.PipelineViewportStateCreateInfo,
ViewportCount = ViewportsCount,
@@ -475,7 +475,7 @@ namespace Ryujinx.Graphics.Vulkan
if (gd.Capabilities.SupportsDepthClipControl)
{
var viewportDepthClipControlState = new PipelineViewportDepthClipControlCreateInfoEXT
PipelineViewportDepthClipControlCreateInfoEXT viewportDepthClipControlState = new()
{
SType = StructureType.PipelineViewportDepthClipControlCreateInfoExt,
NegativeOneToOne = DepthMode,
@@ -484,7 +484,7 @@ namespace Ryujinx.Graphics.Vulkan
viewportState.PNext = &viewportDepthClipControlState;
}
var multisampleState = new PipelineMultisampleStateCreateInfo
PipelineMultisampleStateCreateInfo multisampleState = new()
{
SType = StructureType.PipelineMultisampleStateCreateInfo,
SampleShadingEnable = false,
@@ -494,19 +494,19 @@ namespace Ryujinx.Graphics.Vulkan
AlphaToOneEnable = AlphaToOneEnable,
};
var stencilFront = new StencilOpState(
StencilOpState stencilFront = new(
StencilFrontFailOp,
StencilFrontPassOp,
StencilFrontDepthFailOp,
StencilFrontCompareOp);
var stencilBack = new StencilOpState(
StencilOpState stencilBack = new(
StencilBackFailOp,
StencilBackPassOp,
StencilBackDepthFailOp,
StencilBackCompareOp);
var depthStencilState = new PipelineDepthStencilStateCreateInfo
PipelineDepthStencilStateCreateInfo depthStencilState = new()
{
SType = StructureType.PipelineDepthStencilStateCreateInfo,
DepthTestEnable = DepthTestEnable,
@@ -543,7 +543,7 @@ namespace Ryujinx.Graphics.Vulkan
// so we need to force disable them here.
bool logicOpEnable = LogicOpEnable && (gd.Vendor == Vendor.Nvidia || Internal.LogicOpsAllowed);
var colorBlendState = new PipelineColorBlendStateCreateInfo
PipelineColorBlendStateCreateInfo colorBlendState = new()
{
SType = StructureType.PipelineColorBlendStateCreateInfo,
LogicOpEnable = logicOpEnable,
@@ -594,7 +594,7 @@ namespace Ryujinx.Graphics.Vulkan
dynamicStates[dynamicStatesCount++] = DynamicState.AttachmentFeedbackLoopEnableExt;
}
var pipelineDynamicStateCreateInfo = new PipelineDynamicStateCreateInfo
PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo = new()
{
SType = StructureType.PipelineDynamicStateCreateInfo,
DynamicStateCount = (uint)dynamicStatesCount,
@@ -618,7 +618,7 @@ namespace Ryujinx.Graphics.Vulkan
}
}
var pipelineCreateInfo = new GraphicsPipelineCreateInfo
GraphicsPipelineCreateInfo pipelineCreateInfo = new()
{
SType = StructureType.GraphicsPipelineCreateInfo,
Flags = flags,
@@ -683,12 +683,12 @@ namespace Ryujinx.Graphics.Vulkan
for (int index = 0; index < VertexAttributeDescriptionsCount; index++)
{
var attribute = vertexAttributeDescriptionsSpan[index];
VertexInputAttributeDescription attribute = vertexAttributeDescriptionsSpan[index];
int vbIndex = GetVertexBufferIndex(attribute.Binding);
if (vbIndex >= 0)
{
ref var vb = ref vertexBindingDescriptionsSpan[vbIndex];
ref VertexInputBindingDescription vb = ref vertexBindingDescriptionsSpan[vbIndex];
Format format = attribute.Format;
@@ -4,6 +4,7 @@ using Silk.NET.Vulkan;
using System;
using System.Runtime.InteropServices;
using System.Threading;
using Buffer = Silk.NET.Vulkan.Buffer;
namespace Ryujinx.Graphics.Vulkan.Queries
{
@@ -44,7 +45,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries
QueryPipelineStatisticFlags flags = type == CounterType.PrimitivesGenerated ?
QueryPipelineStatisticFlags.GeometryShaderPrimitivesBit : 0;
var queryPoolCreateInfo = new QueryPoolCreateInfo
QueryPoolCreateInfo queryPoolCreateInfo = new()
{
SType = StructureType.QueryPoolCreateInfo,
QueryCount = 1,
@@ -55,7 +56,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries
gd.Api.CreateQueryPool(device, in queryPoolCreateInfo, null, out _queryPool).ThrowOnError();
}
var buffer = gd.BufferManager.Create(gd, sizeof(long), forConditionalRendering: true);
BufferHolder buffer = gd.BufferManager.Create(gd, sizeof(long), forConditionalRendering: true);
_bufferMap = buffer.Map(0, sizeof(long));
_defaultValue = result32Bit ? DefaultValueInt : DefaultValue;
@@ -183,7 +184,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries
public void PoolCopy(CommandBufferScoped cbs)
{
var buffer = _buffer.GetBuffer(cbs.CommandBuffer, true).Get(cbs, 0, sizeof(long), true).Value;
Buffer buffer = _buffer.GetBuffer(cbs.CommandBuffer, true).Get(cbs, 0, sizeof(long), true).Value;
QueryResultFlags flags = QueryResultFlags.ResultWaitBit;
@@ -26,7 +26,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries
public void ResetCounterPool()
{
foreach (var queue in _counterQueues)
foreach (CounterQueue queue in _counterQueues)
{
queue.ResetCounterPool();
}
@@ -49,7 +49,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries
public void Update()
{
foreach (var queue in _counterQueues)
foreach (CounterQueue queue in _counterQueues)
{
queue.Flush(false);
}
@@ -62,7 +62,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries
public void Dispose()
{
foreach (var queue in _counterQueues)
foreach (CounterQueue queue in _counterQueues)
{
queue.Dispose();
}
@@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Vulkan
if (_colors != null)
{
foreach (var color in _colors)
foreach (TextureView color in _colors)
{
hc.Add(color);
}
+10 -10
View File
@@ -47,14 +47,14 @@ namespace Ryujinx.Graphics.Vulkan
AttachmentDescription[] attachmentDescs = null;
var subpass = new SubpassDescription
SubpassDescription subpass = new()
{
PipelineBindPoint = PipelineBindPoint.Graphics,
};
AttachmentReference* attachmentReferences = stackalloc AttachmentReference[MaxAttachments];
var hasFramebuffer = fb != null;
bool hasFramebuffer = fb != null;
if (hasFramebuffer && fb.AttachmentsCount != 0)
{
@@ -110,11 +110,11 @@ namespace Ryujinx.Graphics.Vulkan
}
}
var subpassDependency = PipelineConverter.CreateSubpassDependency(gd);
SubpassDependency subpassDependency = PipelineConverter.CreateSubpassDependency(gd);
fixed (AttachmentDescription* pAttachmentDescs = attachmentDescs)
{
var renderPassCreateInfo = new RenderPassCreateInfo
RenderPassCreateInfo renderPassCreateInfo = new()
{
SType = StructureType.RenderPassCreateInfo,
PAttachments = pAttachmentDescs,
@@ -125,7 +125,7 @@ namespace Ryujinx.Graphics.Vulkan
DependencyCount = 1,
};
gd.Api.CreateRenderPass(device, in renderPassCreateInfo, null, out var renderPass).ThrowOnError();
gd.Api.CreateRenderPass(device, in renderPassCreateInfo, null, out RenderPass renderPass).ThrowOnError();
_renderPass = new Auto<DisposableRenderPass>(new DisposableRenderPass(gd.Api, device, renderPass));
}
@@ -136,9 +136,9 @@ namespace Ryujinx.Graphics.Vulkan
if (hasFramebuffer)
{
var textures = fb.GetAttachmentViews();
TextureView[] textures = fb.GetAttachmentViews();
foreach (var texture in textures)
foreach (TextureView texture in textures)
{
texture.AddRenderPass(key, this);
}
@@ -153,7 +153,7 @@ namespace Ryujinx.Graphics.Vulkan
public Auto<DisposableFramebuffer> GetFramebuffer(VulkanRenderer gd, CommandBufferScoped cbs, FramebufferParams fb)
{
var key = new FramebufferCacheKey(fb.Width, fb.Height, fb.Layers);
FramebufferCacheKey key = new(fb.Width, fb.Height, fb.Layers);
if (!_framebuffers.TryGetValue(ref key, out Auto<DisposableFramebuffer> result))
{
@@ -204,14 +204,14 @@ namespace Ryujinx.Graphics.Vulkan
{
// Dispose all framebuffers.
foreach (var fb in _framebuffers.Values)
foreach (Auto<DisposableFramebuffer> fb in _framebuffers.Values)
{
fb.Dispose();
}
// Notify all texture views that this render pass has been disposed.
foreach (var texture in _textures)
foreach (TextureView texture in _textures)
{
texture.RemoveRenderPass(_key);
}
+1 -1
View File
@@ -42,7 +42,7 @@ namespace Ryujinx.Graphics.Vulkan
return true;
}
var dsc = program.GetNewManualDescriptorSetCollection(cbs, setIndex, out _cachedDscIndex).Get(cbs);
DescriptorSetCollection dsc = program.GetNewManualDescriptorSetCollection(cbs, setIndex, out _cachedDscIndex).Get(cbs);
sets = dsc.GetSets();
@@ -42,8 +42,8 @@ namespace Ryujinx.Graphics.Vulkan
public ResourceLayout Build()
{
var descriptors = new ResourceDescriptorCollection[TotalSets];
var usages = new ResourceUsageCollection[TotalSets];
ResourceDescriptorCollection[] descriptors = new ResourceDescriptorCollection[TotalSets];
ResourceUsageCollection[] usages = new ResourceUsageCollection[TotalSets];
for (int index = 0; index < TotalSets; index++)
{
+4 -4
View File
@@ -26,9 +26,9 @@ namespace Ryujinx.Graphics.Vulkan
maxLod = 0.25f;
}
var borderColor = GetConstrainedBorderColor(info.BorderColor, out var cantConstrain);
BorderColor borderColor = GetConstrainedBorderColor(info.BorderColor, out bool cantConstrain);
var samplerCreateInfo = new Silk.NET.Vulkan.SamplerCreateInfo
Silk.NET.Vulkan.SamplerCreateInfo samplerCreateInfo = new()
{
SType = StructureType.SamplerCreateInfo,
MagFilter = info.MagFilter.Convert(),
@@ -52,7 +52,7 @@ namespace Ryujinx.Graphics.Vulkan
if (cantConstrain && gd.Capabilities.SupportsCustomBorderColor)
{
var color = new ClearColorValue(
ClearColorValue color = new(
info.BorderColor.Red,
info.BorderColor.Green,
info.BorderColor.Blue,
@@ -68,7 +68,7 @@ namespace Ryujinx.Graphics.Vulkan
samplerCreateInfo.BorderColor = BorderColor.FloatCustomExt;
}
gd.Api.CreateSampler(device, in samplerCreateInfo, null, out var sampler).ThrowOnError();
gd.Api.CreateSampler(device, in samplerCreateInfo, null, out Sampler sampler).ThrowOnError();
_sampler = new Auto<DisposableSampler>(new DisposableSampler(gd.Api, device, sampler));
}
+2 -2
View File
@@ -54,7 +54,7 @@ namespace Ryujinx.Graphics.Vulkan
fixed (byte* pCode = spirv)
{
var shaderModuleCreateInfo = new ShaderModuleCreateInfo
ShaderModuleCreateInfo shaderModuleCreateInfo = new()
{
SType = StructureType.ShaderModuleCreateInfo,
CodeSize = (uint)spirv.Length,
@@ -89,7 +89,7 @@ namespace Ryujinx.Graphics.Vulkan
return null;
}
var spirvBytes = new Span<byte>(api.ResultGetBytes(scr), (int)api.ResultGetLength(scr));
Span<byte> spirvBytes = new(api.ResultGetBytes(scr), (int)api.ResultGetLength(scr));
byte[] code = new byte[(spirvBytes.Length + 3) & ~3];
+11 -11
View File
@@ -81,7 +81,7 @@ namespace Ryujinx.Graphics.Vulkan
gd.Shaders.Add(this);
var internalShaders = new Shader[shaders.Length];
Shader[] internalShaders = new Shader[shaders.Length];
_infos = new PipelineShaderStageCreateInfo[shaders.Length];
@@ -93,7 +93,7 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < shaders.Length; i++)
{
var shader = new Shader(gd.Api, device, shaders[i]);
Shader shader = new(gd.Api, device, shaders[i]);
stages |= 1u << shader.StageFlags switch
{
@@ -173,7 +173,7 @@ namespace Ryujinx.Graphics.Vulkan
// Can't use any of the reserved usages.
for (int i = 0; i < uniformUsage.Count; i++)
{
var binding = uniformUsage[i].Binding;
int binding = uniformUsage[i].Binding;
if (reserved.Contains(binding) ||
binding >= Constants.MaxPushDescriptorBinding ||
@@ -203,7 +203,7 @@ namespace Ryujinx.Graphics.Vulkan
// The reserved bindings were selected when determining if push descriptors could be used.
int[] reserved = gd.GetPushDescriptorReservedBindings(false);
var result = new ResourceDescriptorCollection[sets.Count];
ResourceDescriptorCollection[] result = new ResourceDescriptorCollection[sets.Count];
for (int i = 0; i < sets.Count; i++)
{
@@ -212,7 +212,7 @@ namespace Ryujinx.Graphics.Vulkan
// Push descriptors apply here. Remove reserved bindings.
ResourceDescriptorCollection original = sets[i];
var pdUniforms = new ResourceDescriptor[original.Descriptors.Count];
ResourceDescriptor[] pdUniforms = new ResourceDescriptor[original.Descriptors.Count];
int j = 0;
foreach (ResourceDescriptor descriptor in original.Descriptors)
@@ -364,7 +364,7 @@ namespace Ryujinx.Graphics.Vulkan
private DescriptorSetTemplate[] BuildTemplates(bool usePushDescriptors)
{
var templates = new DescriptorSetTemplate[BindingSegments.Length];
DescriptorSetTemplate[] templates = new DescriptorSetTemplate[BindingSegments.Length];
for (int setIndex = 0; setIndex < BindingSegments.Length; setIndex++)
{
@@ -433,9 +433,9 @@ namespace Ryujinx.Graphics.Vulkan
PipelineStageFlags buffer = PipelineStageFlags.None;
PipelineStageFlags texture = PipelineStageFlags.None;
foreach (var set in setUsages)
foreach (ResourceUsageCollection set in setUsages)
{
foreach (var range in set.Usages)
foreach (ResourceUsage range in set.Usages)
{
if (range.Write)
{
@@ -498,7 +498,7 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < _shaders.Length; i++)
{
var shader = _shaders[i];
Shader shader = _shaders[i];
if (shader.CompileStatus != ProgramLinkStatus.Success)
{
@@ -557,12 +557,12 @@ namespace Ryujinx.Graphics.Vulkan
// First, we need to create a render pass object compatible with the one that will be used at runtime.
// The active attachment formats have been provided by the abstraction layer.
var renderPass = CreateDummyRenderPass();
DisposableRenderPass renderPass = CreateDummyRenderPass();
PipelineState pipeline = _state.ToVulkanPipelineState(_gd);
// Copy the shader stage info to the pipeline.
var stages = pipeline.Stages.AsSpan();
Span<PipelineShaderStageCreateInfo> stages = pipeline.Stages.AsSpan();
for (int i = 0; i < _shaders.Length; i++)
{
+2 -2
View File
@@ -29,7 +29,7 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < Map.Length; ++i)
{
var typeSize = SizeOf(description[i].Type);
uint typeSize = SizeOf(description[i].Type);
Map[i] = new SpecializationMapEntry(description[i].Id, structSize, typeSize);
structSize += typeSize;
}
@@ -89,7 +89,7 @@ namespace Ryujinx.Graphics.Vulkan
_data = new byte[data.Length];
data.CopyTo(_data);
var hc = new HashCode();
HashCode hc = new();
hc.AddBytes(data);
_hash = hc.ToHashCode();
}
+7 -7
View File
@@ -107,8 +107,8 @@ namespace Ryujinx.Graphics.Vulkan
private void PushDataImpl(CommandBufferScoped cbs, BufferHolder dst, int dstOffset, ReadOnlySpan<byte> data)
{
var srcBuffer = _buffer.GetBuffer();
var dstBuffer = dst.GetBuffer(cbs.CommandBuffer, dstOffset, data.Length, true);
Auto<DisposableBuffer> srcBuffer = _buffer.GetBuffer();
Auto<DisposableBuffer> dstBuffer = dst.GetBuffer(cbs.CommandBuffer, dstOffset, data.Length, true);
int offset = _freeOffset;
int capacity = BufferSize - offset;
@@ -242,7 +242,7 @@ namespace Ryujinx.Graphics.Vulkan
private bool WaitFreeCompleted(CommandBufferPool cbp)
{
if (_pendingCopies.TryPeek(out var pc))
if (_pendingCopies.TryPeek(out PendingCopy pc))
{
if (!pc.Fence.IsSignaled())
{
@@ -254,7 +254,7 @@ namespace Ryujinx.Graphics.Vulkan
pc.Fence.Wait();
}
var dequeued = _pendingCopies.Dequeue();
PendingCopy dequeued = _pendingCopies.Dequeue();
Debug.Assert(dequeued.Fence == pc.Fence);
_freeSize += pc.Size;
pc.Fence.Put();
@@ -266,10 +266,10 @@ namespace Ryujinx.Graphics.Vulkan
public void FreeCompleted()
{
FenceHolder signalledFence = null;
while (_pendingCopies.TryPeek(out var pc) && pc.Fence != null && (pc.Fence == signalledFence || pc.Fence.IsSignaled()))
while (_pendingCopies.TryPeek(out PendingCopy pc) && pc.Fence != null && (pc.Fence == signalledFence || pc.Fence.IsSignaled()))
{
signalledFence = pc.Fence; // Already checked - don't need to do it again.
var dequeued = _pendingCopies.Dequeue();
PendingCopy dequeued = _pendingCopies.Dequeue();
Debug.Assert(dequeued.Fence == pc.Fence);
_freeSize += pc.Size;
pc.Fence.Put();
@@ -282,7 +282,7 @@ namespace Ryujinx.Graphics.Vulkan
{
_gd.BufferManager.Delete(Handle);
while (_pendingCopies.TryDequeue(out var pc))
while (_pendingCopies.TryDequeue(out PendingCopy pc))
{
pc.Fence.Put();
}
+2 -2
View File
@@ -148,8 +148,8 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < textures.Length; i++)
{
ref var texture = ref textures[i];
ref var refs = ref _textureRefs[i];
ref DescriptorImageInfo texture = ref textures[i];
ref TextureRef refs = ref _textureRefs[i];
if (i > 0 && _textureRefs[i - 1].View == refs.View && _textureRefs[i - 1].Sampler == refs.Sampler)
{
+29 -29
View File
@@ -36,8 +36,8 @@ namespace Ryujinx.Graphics.Vulkan
return Math.Clamp(value, 0, max);
}
var xy1 = new Offset3D(Clamp(extents.X1, width) >> level, Clamp(extents.Y1, height) >> level, 0);
var xy2 = new Offset3D(Clamp(extents.X2, width) >> level, Clamp(extents.Y2, height) >> level, 1);
Offset3D xy1 = new(Clamp(extents.X1, width) >> level, Clamp(extents.Y1, height) >> level, 0);
Offset3D xy2 = new(Clamp(extents.X2, width) >> level, Clamp(extents.Y2, height) >> level, 1);
return (xy1, xy2);
}
@@ -59,10 +59,10 @@ namespace Ryujinx.Graphics.Vulkan
dstAspectFlags = dstInfo.Format.ConvertAspectFlags();
}
var srcOffsets = new ImageBlit.SrcOffsetsBuffer();
var dstOffsets = new ImageBlit.DstOffsetsBuffer();
ImageBlit.SrcOffsetsBuffer srcOffsets = new();
ImageBlit.DstOffsetsBuffer dstOffsets = new();
var filter = linearFilter && !dstInfo.Format.IsDepthOrStencil() ? Filter.Linear : Filter.Nearest;
Filter filter = linearFilter && !dstInfo.Format.IsDepthOrStencil() ? Filter.Linear : Filter.Nearest;
TextureView.InsertImageBarrier(
api,
@@ -83,8 +83,8 @@ namespace Ryujinx.Graphics.Vulkan
for (int level = 0; level < levels; level++)
{
var srcSl = new ImageSubresourceLayers(srcAspectFlags, copySrcLevel, (uint)srcLayer, (uint)layers);
var dstSl = new ImageSubresourceLayers(dstAspectFlags, copyDstLevel, (uint)dstLayer, (uint)layers);
ImageSubresourceLayers srcSl = new(srcAspectFlags, copySrcLevel, (uint)srcLayer, (uint)layers);
ImageSubresourceLayers dstSl = new(dstAspectFlags, copyDstLevel, (uint)dstLayer, (uint)layers);
(srcOffsets.Element0, srcOffsets.Element1) = ExtentsToOffset3D(srcRegion, srcInfo.Width, srcInfo.Height, level);
(dstOffsets.Element0, dstOffsets.Element1) = ExtentsToOffset3D(dstRegion, dstInfo.Width, dstInfo.Height, level);
@@ -97,7 +97,7 @@ namespace Ryujinx.Graphics.Vulkan
(srcOffsets.Element0, srcOffsets.Element1) = ClampOffsetsToMip(srcOffsets.Element0, srcOffsets.Element1, srcMipW, srcMipH);
(dstOffsets.Element0, dstOffsets.Element1) = ClampOffsetsToMip(dstOffsets.Element0, dstOffsets.Element1, dstMipW, dstMipH);
var region = new ImageBlit
ImageBlit region = new()
{
SrcSubresource = srcSl,
SrcOffsets = srcOffsets,
@@ -322,13 +322,13 @@ namespace Ryujinx.Graphics.Vulkan
break;
}
var srcSl = new ImageSubresourceLayers(
ImageSubresourceLayers srcSl = new(
srcAspect,
(uint)(srcViewLevel + srcLevel + level),
(uint)(srcViewLayer + srcLayer),
(uint)srcLayers);
var dstSl = new ImageSubresourceLayers(
ImageSubresourceLayers dstSl = new(
dstAspect,
(uint)(dstViewLevel + dstLevel + level),
(uint)(dstViewLayer + dstLayer),
@@ -345,17 +345,17 @@ namespace Ryujinx.Graphics.Vulkan
copyWidth = Math.Min(copyWidth, Math.Min(srcMipW, dstMipW));
copyHeight = Math.Min(copyHeight, Math.Min(srcMipH, dstMipH));
var extent = new Extent3D((uint)copyWidth, (uint)copyHeight, (uint)srcDepth);
Extent3D extent = new((uint)copyWidth, (uint)copyHeight, (uint)srcDepth);
if (srcInfo.Samples > 1 && srcInfo.Samples != dstInfo.Samples)
{
var region = new ImageResolve(srcSl, new Offset3D(0, 0, srcZ), dstSl, new Offset3D(0, 0, dstZ), extent);
ImageResolve region = new(srcSl, new Offset3D(0, 0, srcZ), dstSl, new Offset3D(0, 0, dstZ), extent);
api.CmdResolveImage(commandBuffer, srcImage, ImageLayout.General, dstImage, ImageLayout.General, 1, in region);
}
else
{
var region = new ImageCopy(srcSl, new Offset3D(0, 0, srcZ), dstSl, new Offset3D(0, 0, dstZ), extent);
ImageCopy region = new(srcSl, new Offset3D(0, 0, srcZ), dstSl, new Offset3D(0, 0, dstZ), extent);
api.CmdCopyImage(commandBuffer, srcImage, ImageLayout.General, dstImage, ImageLayout.General, 1, in region);
}
@@ -391,10 +391,10 @@ namespace Ryujinx.Graphics.Vulkan
TextureView src,
TextureView dst)
{
var dsAttachmentReference = new AttachmentReference2(StructureType.AttachmentReference2, null, 0, ImageLayout.General);
var dsResolveAttachmentReference = new AttachmentReference2(StructureType.AttachmentReference2, null, 1, ImageLayout.General);
AttachmentReference2 dsAttachmentReference = new(StructureType.AttachmentReference2, null, 0, ImageLayout.General);
AttachmentReference2 dsResolveAttachmentReference = new(StructureType.AttachmentReference2, null, 1, ImageLayout.General);
var subpassDsResolve = new SubpassDescriptionDepthStencilResolve
SubpassDescriptionDepthStencilResolve subpassDsResolve = new()
{
SType = StructureType.SubpassDescriptionDepthStencilResolve,
PDepthStencilResolveAttachment = &dsResolveAttachmentReference,
@@ -402,7 +402,7 @@ namespace Ryujinx.Graphics.Vulkan
StencilResolveMode = ResolveModeFlags.SampleZeroBit,
};
var subpass = new SubpassDescription2
SubpassDescription2 subpass = new()
{
SType = StructureType.SubpassDescription2,
PipelineBindPoint = PipelineBindPoint.Graphics,
@@ -438,11 +438,11 @@ namespace Ryujinx.Graphics.Vulkan
ImageLayout.General,
ImageLayout.General);
var subpassDependency = PipelineConverter.CreateSubpassDependency2(gd);
SubpassDependency2 subpassDependency = PipelineConverter.CreateSubpassDependency2(gd);
fixed (AttachmentDescription2* pAttachmentDescs = attachmentDescs)
{
var renderPassCreateInfo = new RenderPassCreateInfo2
RenderPassCreateInfo2 renderPassCreateInfo = new()
{
SType = StructureType.RenderPassCreateInfo2,
PAttachments = pAttachmentDescs,
@@ -453,19 +453,19 @@ namespace Ryujinx.Graphics.Vulkan
DependencyCount = 1,
};
gd.Api.CreateRenderPass2(device, in renderPassCreateInfo, null, out var renderPass).ThrowOnError();
gd.Api.CreateRenderPass2(device, in renderPassCreateInfo, null, out RenderPass renderPass).ThrowOnError();
using var rp = new Auto<DisposableRenderPass>(new DisposableRenderPass(gd.Api, device, renderPass));
using Auto<DisposableRenderPass> rp = new(new DisposableRenderPass(gd.Api, device, renderPass));
ImageView* attachments = stackalloc ImageView[2];
var srcView = src.GetImageViewForAttachment();
var dstView = dst.GetImageViewForAttachment();
Auto<DisposableImageView> srcView = src.GetImageViewForAttachment();
Auto<DisposableImageView> dstView = dst.GetImageViewForAttachment();
attachments[0] = srcView.Get(cbs).Value;
attachments[1] = dstView.Get(cbs).Value;
var framebufferCreateInfo = new FramebufferCreateInfo
FramebufferCreateInfo framebufferCreateInfo = new()
{
SType = StructureType.FramebufferCreateInfo,
RenderPass = rp.Get(cbs).Value,
@@ -476,13 +476,13 @@ namespace Ryujinx.Graphics.Vulkan
Layers = (uint)src.Layers,
};
gd.Api.CreateFramebuffer(device, in framebufferCreateInfo, null, out var framebuffer).ThrowOnError();
using var fb = new Auto<DisposableFramebuffer>(new DisposableFramebuffer(gd.Api, device, framebuffer), null, srcView, dstView);
gd.Api.CreateFramebuffer(device, in framebufferCreateInfo, null, out Framebuffer framebuffer).ThrowOnError();
using Auto<DisposableFramebuffer> fb = new(new DisposableFramebuffer(gd.Api, device, framebuffer), null, srcView, dstView);
var renderArea = new Rect2D(null, new Extent2D((uint)src.Info.Width, (uint)src.Info.Height));
var clearValue = new ClearValue();
Rect2D renderArea = new(null, new Extent2D((uint)src.Info.Width, (uint)src.Info.Height));
ClearValue clearValue = new();
var renderPassBeginInfo = new RenderPassBeginInfo
RenderPassBeginInfo renderPassBeginInfo = new()
{
SType = StructureType.RenderPassBeginInfo,
RenderPass = rp.Get(cbs).Value,
+23 -23
View File
@@ -81,24 +81,24 @@ namespace Ryujinx.Graphics.Vulkan
bool isMsImageStorageSupported = gd.Capabilities.SupportsShaderStorageImageMultisample || !info.Target.IsMultisample();
var format = _gd.FormatCapabilities.ConvertToVkFormat(info.Format, isMsImageStorageSupported);
var levels = (uint)info.Levels;
var layers = (uint)info.GetLayers();
var depth = (uint)(info.Target == Target.Texture3D ? info.Depth : 1);
VkFormat format = _gd.FormatCapabilities.ConvertToVkFormat(info.Format, isMsImageStorageSupported);
uint levels = (uint)info.Levels;
uint layers = (uint)info.GetLayers();
uint depth = (uint)(info.Target == Target.Texture3D ? info.Depth : 1);
VkFormat = format;
_depthOrLayers = info.GetDepthOrLayers();
var type = info.Target.Convert();
ImageType type = info.Target.Convert();
var extent = new Extent3D((uint)info.Width, (uint)info.Height, depth);
Extent3D extent = new((uint)info.Width, (uint)info.Height, depth);
var sampleCountFlags = ConvertToSampleCountFlags(gd.Capabilities.SupportedSampleCounts, (uint)info.Samples);
SampleCountFlags sampleCountFlags = ConvertToSampleCountFlags(gd.Capabilities.SupportedSampleCounts, (uint)info.Samples);
ImageUsageFlags usage = GetImageUsage(info.Format, info.Target, gd.Capabilities, isMsImageStorageSupported);
UsageFlags = usage;
var flags = ImageCreateFlags.CreateMutableFormatBit | ImageCreateFlags.CreateExtendedUsageBit;
ImageCreateFlags flags = ImageCreateFlags.CreateMutableFormatBit | ImageCreateFlags.CreateExtendedUsageBit;
// This flag causes mipmapped texture arrays to break on AMD GCN, so for that copy dependencies are forced for aliasing as cube.
bool isCube = info.Target is Target.Cubemap or Target.CubemapArray;
@@ -114,7 +114,7 @@ namespace Ryujinx.Graphics.Vulkan
flags |= ImageCreateFlags.Create2DArrayCompatibleBit;
}
var imageCreateInfo = new ImageCreateInfo
ImageCreateInfo imageCreateInfo = new()
{
SType = StructureType.ImageCreateInfo,
ImageType = type,
@@ -134,8 +134,8 @@ namespace Ryujinx.Graphics.Vulkan
if (foreignAllocation == null)
{
gd.Api.GetImageMemoryRequirements(device, _image, out var requirements);
var allocation = gd.MemoryAllocator.AllocateDeviceMemory(requirements, DefaultImageMemoryFlags);
gd.Api.GetImageMemoryRequirements(device, _image, out MemoryRequirements requirements);
MemoryAllocation allocation = gd.MemoryAllocator.AllocateDeviceMemory(requirements, DefaultImageMemoryFlags);
if (allocation.Memory.Handle == 0UL)
{
@@ -156,7 +156,7 @@ namespace Ryujinx.Graphics.Vulkan
{
_foreignAllocationAuto = foreignAllocation;
foreignAllocation.IncrementReferenceCount();
var allocation = foreignAllocation.GetUnsafe();
MemoryAllocation allocation = foreignAllocation.GetUnsafe();
gd.Api.BindImageMemory(device, _image, allocation.Memory, allocation.Offset).ThrowOnError();
@@ -170,7 +170,7 @@ namespace Ryujinx.Graphics.Vulkan
public TextureStorage CreateAliasedColorForDepthStorageUnsafe(Format format)
{
var colorFormat = format switch
Format colorFormat = format switch
{
Format.S8Uint => Format.R8Unorm,
Format.D16Unorm => Format.R16Unorm,
@@ -185,11 +185,11 @@ namespace Ryujinx.Graphics.Vulkan
public TextureStorage CreateAliasedStorageUnsafe(Format format)
{
if (_aliasedStorages == null || !_aliasedStorages.TryGetValue(format, out var storage))
if (_aliasedStorages == null || !_aliasedStorages.TryGetValue(format, out TextureStorage storage))
{
_aliasedStorages ??= new Dictionary<Format, TextureStorage>();
var info = NewCreateInfoWith(ref _info, format, _info.BytesPerPixel);
TextureCreateInfo info = NewCreateInfoWith(ref _info, format, _info.BytesPerPixel);
storage = new TextureStorage(_gd, _device, info, _allocationAuto);
@@ -275,11 +275,11 @@ namespace Ryujinx.Graphics.Vulkan
}
}
var aspectFlags = _info.Format.ConvertAspectFlags();
ImageAspectFlags aspectFlags = _info.Format.ConvertAspectFlags();
var subresourceRange = new ImageSubresourceRange(aspectFlags, 0, (uint)_info.Levels, 0, (uint)_info.GetLayers());
ImageSubresourceRange subresourceRange = new(aspectFlags, 0, (uint)_info.Levels, 0, (uint)_info.GetLayers());
var barrier = new ImageMemoryBarrier
ImageMemoryBarrier barrier = new()
{
SType = StructureType.ImageMemoryBarrier,
SrcAccessMask = 0,
@@ -312,7 +312,7 @@ namespace Ryujinx.Graphics.Vulkan
public static ImageUsageFlags GetImageUsage(Format format, Target target, in HardwareCapabilities capabilities, bool isMsImageStorageSupported)
{
var usage = DefaultUsageFlags;
ImageUsageFlags usage = DefaultUsageFlags;
if (format.IsDepthOrStencil())
{
@@ -405,17 +405,17 @@ namespace Ryujinx.Graphics.Vulkan
int rowLength = (Info.GetMipStride(level) / Info.BytesPerPixel) * Info.BlockWidth;
var sl = new ImageSubresourceLayers(
ImageSubresourceLayers sl = new(
aspectFlags,
(uint)(dstLevel + level),
(uint)layer,
(uint)layers);
var extent = new Extent3D((uint)width, (uint)height, (uint)depth);
Extent3D extent = new((uint)width, (uint)height, (uint)depth);
int z = is3D ? dstLayer : 0;
var region = new BufferImageCopy(
BufferImageCopy region = new(
(ulong)offset,
(uint)BitUtils.AlignUp(rowLength, Info.BlockWidth),
(uint)BitUtils.AlignUp(height, Info.BlockHeight),
@@ -604,7 +604,7 @@ namespace Ryujinx.Graphics.Vulkan
if (_aliasedStorages != null)
{
foreach (var storage in _aliasedStorages.Values)
foreach (TextureStorage storage in _aliasedStorages.Values)
{
storage.Dispose();
}
+60 -60
View File
@@ -63,20 +63,20 @@ namespace Ryujinx.Graphics.Vulkan
bool isMsImageStorageSupported = gd.Capabilities.SupportsShaderStorageImageMultisample || !info.Target.IsMultisample();
var format = _gd.FormatCapabilities.ConvertToVkFormat(info.Format, isMsImageStorageSupported);
var usage = TextureStorage.GetImageUsage(info.Format, info.Target, gd.Capabilities, isMsImageStorageSupported) & storage.UsageFlags;
VkFormat format = _gd.FormatCapabilities.ConvertToVkFormat(info.Format, isMsImageStorageSupported);
ImageUsageFlags usage = TextureStorage.GetImageUsage(info.Format, info.Target, gd.Capabilities, isMsImageStorageSupported) & storage.UsageFlags;
var levels = (uint)info.Levels;
var layers = (uint)info.GetLayers();
uint levels = (uint)info.Levels;
uint layers = (uint)info.GetLayers();
VkFormat = format;
var type = info.Target.ConvertView();
ImageViewType type = info.Target.ConvertView();
var swizzleR = info.SwizzleR.Convert();
var swizzleG = info.SwizzleG.Convert();
var swizzleB = info.SwizzleB.Convert();
var swizzleA = info.SwizzleA.Convert();
ComponentSwizzle swizzleR = info.SwizzleR.Convert();
ComponentSwizzle swizzleG = info.SwizzleG.Convert();
ComponentSwizzle swizzleB = info.SwizzleB.Convert();
ComponentSwizzle swizzleA = info.SwizzleA.Convert();
if (info.Format is Format.R5G5B5A1Unorm or Format.R5G5B5X1Unorm or Format.R5G6B5Unorm)
{
@@ -84,8 +84,8 @@ namespace Ryujinx.Graphics.Vulkan
}
else if (VkFormat == VkFormat.R4G4B4A4UnormPack16 || info.Format == Format.A1B5G5R5Unorm)
{
var tempB = swizzleB;
var tempA = swizzleA;
ComponentSwizzle tempB = swizzleB;
ComponentSwizzle tempA = swizzleA;
swizzleB = swizzleG;
swizzleA = swizzleR;
@@ -93,23 +93,23 @@ namespace Ryujinx.Graphics.Vulkan
swizzleG = tempB;
}
var componentMapping = new ComponentMapping(swizzleR, swizzleG, swizzleB, swizzleA);
ComponentMapping componentMapping = new(swizzleR, swizzleG, swizzleB, swizzleA);
var aspectFlags = info.Format.ConvertAspectFlags(info.DepthStencilMode);
var aspectFlagsDepth = info.Format.ConvertAspectFlags();
ImageAspectFlags aspectFlags = info.Format.ConvertAspectFlags(info.DepthStencilMode);
ImageAspectFlags aspectFlagsDepth = info.Format.ConvertAspectFlags();
var subresourceRange = new ImageSubresourceRange(aspectFlags, (uint)firstLevel, levels, (uint)firstLayer, layers);
var subresourceRangeDepth = new ImageSubresourceRange(aspectFlagsDepth, (uint)firstLevel, levels, (uint)firstLayer, layers);
ImageSubresourceRange subresourceRange = new(aspectFlags, (uint)firstLevel, levels, (uint)firstLayer, layers);
ImageSubresourceRange subresourceRangeDepth = new(aspectFlagsDepth, (uint)firstLevel, levels, (uint)firstLayer, layers);
unsafe Auto<DisposableImageView> CreateImageView(ComponentMapping cm, ImageSubresourceRange sr, ImageViewType viewType, ImageUsageFlags usageFlags)
{
var imageViewUsage = new ImageViewUsageCreateInfo
ImageViewUsageCreateInfo imageViewUsage = new()
{
SType = StructureType.ImageViewUsageCreateInfo,
Usage = usageFlags,
};
var imageCreateInfo = new ImageViewCreateInfo
ImageViewCreateInfo imageCreateInfo = new()
{
SType = StructureType.ImageViewCreateInfo,
Image = storage.GetImageForViewCreation(),
@@ -120,7 +120,7 @@ namespace Ryujinx.Graphics.Vulkan
PNext = &imageViewUsage,
};
gd.Api.CreateImageView(device, in imageCreateInfo, null, out var imageView).ThrowOnError();
gd.Api.CreateImageView(device, in imageCreateInfo, null, out ImageView imageView).ThrowOnError();
return new Auto<DisposableImageView>(new DisposableImageView(gd.Api, device, imageView), null, storage.GetImage());
}
@@ -136,7 +136,7 @@ namespace Ryujinx.Graphics.Vulkan
_imageView = CreateImageView(componentMapping, subresourceRange, type, shaderUsage);
// Framebuffer attachments and storage images requires a identity component mapping.
var identityComponentMapping = new ComponentMapping(
ComponentMapping identityComponentMapping = new(
ComponentSwizzle.R,
ComponentSwizzle.G,
ComponentSwizzle.B,
@@ -210,8 +210,8 @@ namespace Ryujinx.Graphics.Vulkan
public void CopyTo(ITexture destination, int firstLayer, int firstLevel)
{
var src = this;
var dst = (TextureView)destination;
TextureView src = this;
TextureView dst = (TextureView)destination;
if (!Valid || !dst.Valid)
{
@@ -220,10 +220,10 @@ namespace Ryujinx.Graphics.Vulkan
_gd.PipelineInternal.EndRenderPass();
var cbs = _gd.PipelineInternal.CurrentCommandBuffer;
CommandBufferScoped cbs = _gd.PipelineInternal.CurrentCommandBuffer;
var srcImage = src.GetImage().Get(cbs).Value;
var dstImage = dst.GetImage().Get(cbs).Value;
Image srcImage = src.GetImage().Get(cbs).Value;
Image dstImage = dst.GetImage().Get(cbs).Value;
if (!dst.Info.Target.IsMultisample() && Info.Target.IsMultisample())
{
@@ -272,8 +272,8 @@ namespace Ryujinx.Graphics.Vulkan
public void CopyTo(ITexture destination, int srcLayer, int dstLayer, int srcLevel, int dstLevel)
{
var src = this;
var dst = (TextureView)destination;
TextureView src = this;
TextureView dst = (TextureView)destination;
if (!Valid || !dst.Valid)
{
@@ -282,10 +282,10 @@ namespace Ryujinx.Graphics.Vulkan
_gd.PipelineInternal.EndRenderPass();
var cbs = _gd.PipelineInternal.CurrentCommandBuffer;
CommandBufferScoped cbs = _gd.PipelineInternal.CurrentCommandBuffer;
var srcImage = src.GetImage().Get(cbs).Value;
var dstImage = dst.GetImage().Get(cbs).Value;
Image srcImage = src.GetImage().Get(cbs).Value;
Image dstImage = dst.GetImage().Get(cbs).Value;
if (!dst.Info.Target.IsMultisample() && Info.Target.IsMultisample())
{
@@ -329,21 +329,21 @@ namespace Ryujinx.Graphics.Vulkan
public void CopyTo(ITexture destination, Extents2D srcRegion, Extents2D dstRegion, bool linearFilter)
{
var dst = (TextureView)destination;
TextureView dst = (TextureView)destination;
if (_gd.CommandBufferPool.OwnedByCurrentThread)
{
_gd.PipelineInternal.EndRenderPass();
var cbs = _gd.PipelineInternal.CurrentCommandBuffer;
CommandBufferScoped cbs = _gd.PipelineInternal.CurrentCommandBuffer;
CopyToImpl(cbs, dst, srcRegion, dstRegion, linearFilter);
}
else
{
var cbp = _gd.BackgroundResources.Get().GetPool();
CommandBufferPool cbp = _gd.BackgroundResources.Get().GetPool();
using var cbs = cbp.Rent();
using CommandBufferScoped cbs = cbp.Rent();
CopyToImpl(cbs, dst, srcRegion, dstRegion, linearFilter);
}
@@ -351,10 +351,10 @@ namespace Ryujinx.Graphics.Vulkan
private void CopyToImpl(CommandBufferScoped cbs, TextureView dst, Extents2D srcRegion, Extents2D dstRegion, bool linearFilter)
{
var src = this;
TextureView src = this;
var srcFormat = GetCompatibleGalFormat(src.Info.Format);
var dstFormat = GetCompatibleGalFormat(dst.Info.Format);
Format srcFormat = GetCompatibleGalFormat(src.Info.Format);
Format dstFormat = GetCompatibleGalFormat(dst.Info.Format);
bool srcUsesStorageFormat = src.VkFormat == src.Storage.VkFormat;
bool dstUsesStorageFormat = dst.VkFormat == dst.Storage.VkFormat;
@@ -582,7 +582,7 @@ namespace Ryujinx.Graphics.Vulkan
return this;
}
if (_selfManagedViews != null && _selfManagedViews.TryGetValue(format, out var view))
if (_selfManagedViews != null && _selfManagedViews.TryGetValue(format, out TextureView view))
{
return view;
}
@@ -622,12 +622,12 @@ namespace Ryujinx.Graphics.Vulkan
public byte[] GetData(int x, int y, int width, int height)
{
int size = width * height * Info.BytesPerPixel;
using var bufferHolder = _gd.BufferManager.Create(_gd, size);
using BufferHolder bufferHolder = _gd.BufferManager.Create(_gd, size);
using (var cbs = _gd.CommandBufferPool.Rent())
using (CommandBufferScoped cbs = _gd.CommandBufferPool.Rent())
{
var buffer = bufferHolder.GetBuffer(cbs.CommandBuffer).Get(cbs).Value;
var image = GetImage().Get(cbs).Value;
VkBuffer buffer = bufferHolder.GetBuffer(cbs.CommandBuffer).Get(cbs).Value;
Image image = GetImage().Get(cbs).Value;
CopyFromOrToBuffer(cbs.CommandBuffer, buffer, image, size, true, 0, 0, x, y, width, height);
}
@@ -669,12 +669,12 @@ namespace Ryujinx.Graphics.Vulkan
public void CopyTo(BufferRange range, int layer, int level, int stride)
{
_gd.PipelineInternal.EndRenderPass();
var cbs = _gd.PipelineInternal.CurrentCommandBuffer;
CommandBufferScoped cbs = _gd.PipelineInternal.CurrentCommandBuffer;
int outSize = Info.GetMipSize(level);
int hostSize = GetBufferDataLength(outSize);
var image = GetImage().Get(cbs).Value;
Image image = GetImage().Get(cbs).Value;
int offset = range.Offset;
Auto<DisposableBuffer> autoBuffer = _gd.BufferManager.GetBuffer(cbs.CommandBuffer, range.Handle, true);
@@ -783,7 +783,7 @@ namespace Ryujinx.Graphics.Vulkan
{
int bufferDataLength = GetBufferDataLength(data.Length);
using var bufferHolder = _gd.BufferManager.Create(_gd, bufferDataLength);
using BufferHolder bufferHolder = _gd.BufferManager.Create(_gd, bufferDataLength);
Auto<DisposableImage> imageAuto = GetImage();
@@ -791,7 +791,7 @@ namespace Ryujinx.Graphics.Vulkan
bool loadInline = Storage.HasCommandBufferDependency(_gd.PipelineInternal.CurrentCommandBuffer);
var cbs = loadInline ? _gd.PipelineInternal.CurrentCommandBuffer : _gd.PipelineInternal.GetPreloadCommandBuffer();
CommandBufferScoped cbs = loadInline ? _gd.PipelineInternal.CurrentCommandBuffer : _gd.PipelineInternal.GetPreloadCommandBuffer();
if (loadInline)
{
@@ -800,8 +800,8 @@ namespace Ryujinx.Graphics.Vulkan
CopyDataToBuffer(bufferHolder.GetDataStorage(0, bufferDataLength), data);
var buffer = bufferHolder.GetBuffer(cbs.CommandBuffer).Get(cbs).Value;
var image = imageAuto.Get(cbs).Value;
VkBuffer buffer = bufferHolder.GetBuffer(cbs.CommandBuffer).Get(cbs).Value;
Image image = imageAuto.Get(cbs).Value;
if (region.HasValue)
{
@@ -937,24 +937,24 @@ namespace Ryujinx.Graphics.Vulkan
int rowLength = ((stride == 0 ? Info.GetMipStride(dstLevel + level) : stride) / Info.BytesPerPixel) * Info.BlockWidth;
var aspectFlags = Info.Format.ConvertAspectFlags();
ImageAspectFlags aspectFlags = Info.Format.ConvertAspectFlags();
if (aspectFlags == (ImageAspectFlags.DepthBit | ImageAspectFlags.StencilBit))
{
aspectFlags = ImageAspectFlags.DepthBit;
}
var sl = new ImageSubresourceLayers(
ImageSubresourceLayers sl = new(
aspectFlags,
(uint)(FirstLevel + dstLevel + level),
(uint)(FirstLayer + layer),
(uint)layers);
var extent = new Extent3D((uint)width, (uint)height, (uint)depth);
Extent3D extent = new((uint)width, (uint)height, (uint)depth);
int z = is3D ? dstLayer : 0;
var region = new BufferImageCopy(
BufferImageCopy region = new(
(ulong)offset,
(uint)AlignUpNpot(rowLength, Info.BlockWidth),
(uint)AlignUpNpot(height, Info.BlockHeight),
@@ -996,16 +996,16 @@ namespace Ryujinx.Graphics.Vulkan
int width,
int height)
{
var aspectFlags = Info.Format.ConvertAspectFlags();
ImageAspectFlags aspectFlags = Info.Format.ConvertAspectFlags();
if (aspectFlags == (ImageAspectFlags.DepthBit | ImageAspectFlags.StencilBit))
{
aspectFlags = ImageAspectFlags.DepthBit;
}
var sl = new ImageSubresourceLayers(aspectFlags, (uint)(FirstLevel + dstLevel), (uint)(FirstLayer + dstLayer), 1);
ImageSubresourceLayers sl = new(aspectFlags, (uint)(FirstLevel + dstLevel), (uint)(FirstLayer + dstLayer), 1);
var extent = new Extent3D((uint)width, (uint)height, 1);
Extent3D extent = new((uint)width, (uint)height, 1);
int rowLengthAlignment = Info.BlockWidth;
@@ -1015,7 +1015,7 @@ namespace Ryujinx.Graphics.Vulkan
rowLengthAlignment = 4 / Info.BytesPerPixel;
}
var region = new BufferImageCopy(
BufferImageCopy region = new(
0,
(uint)AlignUpNpot(width, rowLengthAlignment),
(uint)AlignUpNpot(height, Info.BlockHeight),
@@ -1083,7 +1083,7 @@ namespace Ryujinx.Graphics.Vulkan
CommandBufferScoped cbs,
FramebufferParams fb)
{
var key = fb.GetRenderPassCacheKey();
RenderPassCacheKey key = fb.GetRenderPassCacheKey();
if (_renderPasses == null || !_renderPasses.TryGetValue(ref key, out RenderPassHolder rpHolder))
{
@@ -1131,9 +1131,9 @@ namespace Ryujinx.Graphics.Vulkan
if (_renderPasses != null)
{
var renderPasses = _renderPasses.Values.ToArray();
RenderPassHolder[] renderPasses = _renderPasses.Values.ToArray();
foreach (var pass in renderPasses)
foreach (RenderPassHolder pass in renderPasses)
{
pass.Dispose();
}
@@ -1141,7 +1141,7 @@ namespace Ryujinx.Graphics.Vulkan
if (_selfManagedViews != null)
{
foreach (var view in _selfManagedViews.Values)
foreach (TextureView view in _selfManagedViews.Values)
{
view.Dispose();
}
@@ -50,7 +50,7 @@ namespace Ryujinx.Graphics.Vulkan
public void BindVertexBuffer(VulkanRenderer gd, CommandBufferScoped cbs, uint binding, ref PipelineState state, VertexBufferUpdater updater)
{
var autoBuffer = _buffer;
Auto<DisposableBuffer> autoBuffer = _buffer;
if (_handle != BufferHandle.Null)
{
@@ -39,7 +39,7 @@ namespace Ryujinx.Graphics.Vulkan
if (_debugUtils != null && _logLevel != GraphicsDebugLevel.None)
{
var messageType = _logLevel switch
DebugUtilsMessageTypeFlagsEXT messageType = _logLevel switch
{
GraphicsDebugLevel.Error => DebugUtilsMessageTypeFlagsEXT.ValidationBitExt,
GraphicsDebugLevel.Slowdowns => DebugUtilsMessageTypeFlagsEXT.ValidationBitExt |
@@ -50,7 +50,7 @@ namespace Ryujinx.Graphics.Vulkan
_ => throw new ArgumentException($"Invalid log level \"{_logLevel}\"."),
};
var messageSeverity = _logLevel switch
DebugUtilsMessageSeverityFlagsEXT messageSeverity = _logLevel switch
{
GraphicsDebugLevel.Error => DebugUtilsMessageSeverityFlagsEXT.ErrorBitExt,
GraphicsDebugLevel.Slowdowns => DebugUtilsMessageSeverityFlagsEXT.ErrorBitExt |
@@ -62,7 +62,7 @@ namespace Ryujinx.Graphics.Vulkan
_ => throw new ArgumentException($"Invalid log level \"{_logLevel}\"."),
};
var debugUtilsMessengerCreateInfo = new DebugUtilsMessengerCreateInfoEXT
DebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCreateInfo = new()
{
SType = StructureType.DebugUtilsMessengerCreateInfoExt,
MessageType = messageType,
@@ -95,7 +95,7 @@ namespace Ryujinx.Graphics.Vulkan
DebugUtilsMessengerCallbackDataEXT* pCallbackData,
void* pUserData)
{
var msg = Marshal.PtrToStringAnsi((nint)pCallbackData->PMessage);
string msg = Marshal.PtrToStringAnsi((nint)pCallbackData->PMessage);
if (messageSeverity.HasFlag(DebugUtilsMessageSeverityFlagsEXT.ErrorBitExt))
{
@@ -1,9 +1,11 @@
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.GAL;
using Silk.NET.Core;
using Silk.NET.Vulkan;
using Silk.NET.Vulkan.Extensions.EXT;
using Silk.NET.Vulkan.Extensions.KHR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
@@ -57,10 +59,10 @@ namespace Ryujinx.Graphics.Vulkan
internal static VulkanInstance CreateInstance(Vk api, GraphicsDebugLevel logLevel, string[] requiredExtensions)
{
var enabledLayers = new List<string>();
List<string> enabledLayers = new();
var instanceExtensions = VulkanInstance.GetInstanceExtensions(api);
var instanceLayers = VulkanInstance.GetInstanceLayers(api);
IReadOnlySet<string> instanceExtensions = VulkanInstance.GetInstanceExtensions(api);
IReadOnlySet<string> instanceLayers = VulkanInstance.GetInstanceLayers(api);
void AddAvailableLayer(string layerName)
{
@@ -79,16 +81,16 @@ namespace Ryujinx.Graphics.Vulkan
AddAvailableLayer("VK_LAYER_KHRONOS_validation");
}
var enabledExtensions = requiredExtensions;
string[] enabledExtensions = requiredExtensions;
if (instanceExtensions.Contains("VK_EXT_debug_utils"))
{
enabledExtensions = enabledExtensions.Append(ExtDebugUtils.ExtensionName).ToArray();
}
var appName = Marshal.StringToHGlobalAnsi(AppName);
IntPtr appName = Marshal.StringToHGlobalAnsi(AppName);
var applicationInfo = new ApplicationInfo
ApplicationInfo applicationInfo = new()
{
PApplicationName = (byte*)appName,
ApplicationVersion = 1,
@@ -110,7 +112,7 @@ namespace Ryujinx.Graphics.Vulkan
ppEnabledLayers[i] = Marshal.StringToHGlobalAnsi(enabledLayers[i]);
}
var instanceCreateInfo = new InstanceCreateInfo
InstanceCreateInfo instanceCreateInfo = new()
{
SType = StructureType.InstanceCreateInfo,
PApplicationInfo = &applicationInfo,
@@ -120,7 +122,7 @@ namespace Ryujinx.Graphics.Vulkan
EnabledLayerCount = (uint)enabledLayers.Count,
};
Result result = VulkanInstance.Create(api, ref instanceCreateInfo, out var instance);
Result result = VulkanInstance.Create(api, ref instanceCreateInfo, out VulkanInstance instance);
Marshal.FreeHGlobal(appName);
@@ -141,7 +143,7 @@ namespace Ryujinx.Graphics.Vulkan
internal static VulkanPhysicalDevice FindSuitablePhysicalDevice(Vk api, VulkanInstance instance, SurfaceKHR surface, string preferredGpuId)
{
instance.EnumeratePhysicalDevices(out var physicalDevices).ThrowOnError();
instance.EnumeratePhysicalDevices(out VulkanPhysicalDevice[] physicalDevices).ThrowOnError();
// First we try to pick the user preferred GPU.
for (int i = 0; i < physicalDevices.Length; i++)
@@ -166,9 +168,9 @@ namespace Ryujinx.Graphics.Vulkan
internal static DeviceInfo[] GetSuitablePhysicalDevices(Vk api)
{
var appName = Marshal.StringToHGlobalAnsi(AppName);
IntPtr appName = Marshal.StringToHGlobalAnsi(AppName);
var applicationInfo = new ApplicationInfo
ApplicationInfo applicationInfo = new()
{
PApplicationName = (byte*)appName,
ApplicationVersion = 1,
@@ -177,7 +179,7 @@ namespace Ryujinx.Graphics.Vulkan
ApiVersion = _maximumVulkanVersion,
};
var instanceCreateInfo = new InstanceCreateInfo
InstanceCreateInfo instanceCreateInfo = new()
{
SType = StructureType.InstanceCreateInfo,
PApplicationInfo = &applicationInfo,
@@ -187,7 +189,7 @@ namespace Ryujinx.Graphics.Vulkan
EnabledLayerCount = 0,
};
Result result = VulkanInstance.Create(api, ref instanceCreateInfo, out var rawInstance);
Result result = VulkanInstance.Create(api, ref instanceCreateInfo, out VulkanInstance rawInstance);
Marshal.FreeHGlobal(appName);
@@ -248,13 +250,13 @@ namespace Ryujinx.Graphics.Vulkan
{
const QueueFlags RequiredFlags = QueueFlags.GraphicsBit | QueueFlags.ComputeBit;
var khrSurface = new KhrSurface(api.Context);
KhrSurface khrSurface = new(api.Context);
for (uint index = 0; index < physicalDevice.QueueFamilyProperties.Length; index++)
{
ref QueueFamilyProperties property = ref physicalDevice.QueueFamilyProperties[index];
khrSurface.GetPhysicalDeviceSurfaceSupport(physicalDevice.PhysicalDevice, index, surface, out var surfaceSupported).ThrowOnError();
khrSurface.GetPhysicalDeviceSurfaceSupport(physicalDevice.PhysicalDevice, index, surface, out Bool32 surfaceSupported).ThrowOnError();
if (property.QueueFlags.HasFlag(RequiredFlags) && surfaceSupported)
{
@@ -283,7 +285,7 @@ namespace Ryujinx.Graphics.Vulkan
queuePriorities[i] = 1f;
}
var queueCreateInfo = new DeviceQueueCreateInfo
DeviceQueueCreateInfo queueCreateInfo = new()
{
SType = StructureType.DeviceQueueCreateInfo,
QueueFamilyIndex = queueFamilyIndex,
@@ -416,9 +418,9 @@ namespace Ryujinx.Graphics.Vulkan
api.GetPhysicalDeviceFeatures2(physicalDevice.PhysicalDevice, &features2);
var supportedFeatures = features2.Features;
PhysicalDeviceFeatures supportedFeatures = features2.Features;
var features = new PhysicalDeviceFeatures
PhysicalDeviceFeatures features = new()
{
DepthBiasClamp = supportedFeatures.DepthBiasClamp,
DepthClamp = supportedFeatures.DepthClamp,
@@ -449,7 +451,7 @@ namespace Ryujinx.Graphics.Vulkan
if (physicalDevice.IsDeviceExtensionPresent(ExtTransformFeedback.ExtensionName))
{
PhysicalDeviceTransformFeedbackFeaturesEXT featuresTransformFeedback = new PhysicalDeviceTransformFeedbackFeaturesEXT
PhysicalDeviceTransformFeedbackFeaturesEXT featuresTransformFeedback = new()
{
SType = StructureType.PhysicalDeviceTransformFeedbackFeaturesExt,
PNext = pExtendedFeatures,
@@ -461,7 +463,7 @@ namespace Ryujinx.Graphics.Vulkan
if (physicalDevice.IsDeviceExtensionPresent("VK_EXT_primitive_topology_list_restart"))
{
PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT featuresPrimitiveTopologyListRestart = new PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT
PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT featuresPrimitiveTopologyListRestart = new()
{
SType = StructureType.PhysicalDevicePrimitiveTopologyListRestartFeaturesExt,
PNext = pExtendedFeatures,
@@ -474,7 +476,7 @@ namespace Ryujinx.Graphics.Vulkan
if (physicalDevice.IsDeviceExtensionPresent("VK_EXT_robustness2"))
{
PhysicalDeviceRobustness2FeaturesEXT featuresRobustness2 = new PhysicalDeviceRobustness2FeaturesEXT
PhysicalDeviceRobustness2FeaturesEXT featuresRobustness2 = new()
{
SType = StructureType.PhysicalDeviceRobustness2FeaturesExt,
PNext = pExtendedFeatures,
@@ -484,7 +486,7 @@ namespace Ryujinx.Graphics.Vulkan
pExtendedFeatures = &featuresRobustness2;
}
var featuresExtendedDynamicState = new PhysicalDeviceExtendedDynamicStateFeaturesEXT
PhysicalDeviceExtendedDynamicStateFeaturesEXT featuresExtendedDynamicState = new()
{
SType = StructureType.PhysicalDeviceExtendedDynamicStateFeaturesExt,
PNext = pExtendedFeatures,
@@ -493,7 +495,7 @@ namespace Ryujinx.Graphics.Vulkan
pExtendedFeatures = &featuresExtendedDynamicState;
var featuresVk11 = new PhysicalDeviceVulkan11Features
PhysicalDeviceVulkan11Features featuresVk11 = new()
{
SType = StructureType.PhysicalDeviceVulkan11Features,
PNext = pExtendedFeatures,
@@ -502,7 +504,7 @@ namespace Ryujinx.Graphics.Vulkan
pExtendedFeatures = &featuresVk11;
var featuresVk12 = new PhysicalDeviceVulkan12Features
PhysicalDeviceVulkan12Features featuresVk12 = new()
{
SType = StructureType.PhysicalDeviceVulkan12Features,
PNext = pExtendedFeatures,
@@ -519,7 +521,7 @@ namespace Ryujinx.Graphics.Vulkan
if (physicalDevice.IsDeviceExtensionPresent("VK_EXT_index_type_uint8"))
{
PhysicalDeviceIndexTypeUint8FeaturesEXT featuresIndexU8 = new PhysicalDeviceIndexTypeUint8FeaturesEXT
PhysicalDeviceIndexTypeUint8FeaturesEXT featuresIndexU8 = new()
{
SType = StructureType.PhysicalDeviceIndexTypeUint8FeaturesExt,
PNext = pExtendedFeatures,
@@ -531,7 +533,7 @@ namespace Ryujinx.Graphics.Vulkan
if (physicalDevice.IsDeviceExtensionPresent("VK_EXT_fragment_shader_interlock"))
{
PhysicalDeviceFragmentShaderInterlockFeaturesEXT featuresFragmentShaderInterlock = new PhysicalDeviceFragmentShaderInterlockFeaturesEXT
PhysicalDeviceFragmentShaderInterlockFeaturesEXT featuresFragmentShaderInterlock = new()
{
SType = StructureType.PhysicalDeviceFragmentShaderInterlockFeaturesExt,
PNext = pExtendedFeatures,
@@ -545,7 +547,7 @@ namespace Ryujinx.Graphics.Vulkan
supportedFeaturesCustomBorderColor.CustomBorderColors &&
supportedFeaturesCustomBorderColor.CustomBorderColorWithoutFormat)
{
PhysicalDeviceCustomBorderColorFeaturesEXT featuresCustomBorderColor = new PhysicalDeviceCustomBorderColorFeaturesEXT
PhysicalDeviceCustomBorderColorFeaturesEXT featuresCustomBorderColor = new()
{
SType = StructureType.PhysicalDeviceCustomBorderColorFeaturesExt,
PNext = pExtendedFeatures,
@@ -559,7 +561,7 @@ namespace Ryujinx.Graphics.Vulkan
if (physicalDevice.IsDeviceExtensionPresent("VK_EXT_depth_clip_control") &&
supportedFeaturesDepthClipControl.DepthClipControl)
{
PhysicalDeviceDepthClipControlFeaturesEXT featuresDepthClipControl = new PhysicalDeviceDepthClipControlFeaturesEXT
PhysicalDeviceDepthClipControlFeaturesEXT featuresDepthClipControl = new()
{
SType = StructureType.PhysicalDeviceDepthClipControlFeaturesExt,
PNext = pExtendedFeatures,
@@ -621,7 +623,7 @@ namespace Ryujinx.Graphics.Vulkan
pExtendedFeatures = &featuresDeviceMemoryPriority;
}
var enabledExtensions = _requiredExtensions.Union(_desirableExtensions.Intersect(physicalDevice.DeviceExtensions)).ToArray();
string[] enabledExtensions = _requiredExtensions.Union(_desirableExtensions.Intersect(physicalDevice.DeviceExtensions)).ToArray();
nint* ppEnabledExtensions = stackalloc nint[enabledExtensions.Length];
@@ -630,7 +632,7 @@ namespace Ryujinx.Graphics.Vulkan
ppEnabledExtensions[i] = Marshal.StringToHGlobalAnsi(enabledExtensions[i]);
}
var deviceCreateInfo = new DeviceCreateInfo
DeviceCreateInfo deviceCreateInfo = new()
{
SType = StructureType.DeviceCreateInfo,
PNext = pExtendedFeatures,
@@ -641,7 +643,7 @@ namespace Ryujinx.Graphics.Vulkan
PEnabledFeatures = &features,
};
api.CreateDevice(physicalDevice.PhysicalDevice, in deviceCreateInfo, null, out var device).ThrowOnError();
api.CreateDevice(physicalDevice.PhysicalDevice, in deviceCreateInfo, null, out Device device).ThrowOnError();
for (int i = 0; i < enabledExtensions.Length; i++)
{
@@ -24,7 +24,7 @@ namespace Ryujinx.Graphics.Vulkan
PhysicalDevice = physicalDevice;
PhysicalDeviceFeatures = api.GetPhysicalDeviceFeature(PhysicalDevice);
api.GetPhysicalDeviceProperties(PhysicalDevice, out var physicalDeviceProperties);
api.GetPhysicalDeviceProperties(PhysicalDevice, out PhysicalDeviceProperties physicalDeviceProperties);
PhysicalDeviceProperties = physicalDeviceProperties;
api.GetPhysicalDeviceMemoryProperties(PhysicalDevice, out PhysicalDeviceMemoryProperties);
+15 -14
View File
@@ -11,6 +11,7 @@ using Silk.NET.Vulkan.Extensions.KHR;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Threading;
using Format = Ryujinx.Graphics.GAL.Format;
using PrimitiveTopology = Ryujinx.Graphics.GAL.PrimitiveTopology;
@@ -166,7 +167,7 @@ namespace Ryujinx.Graphics.Vulkan
if (maxQueueCount >= 2)
{
Api.GetDeviceQueue(_device, queueFamilyIndex, 1, out var backgroundQueue);
Api.GetDeviceQueue(_device, queueFamilyIndex, 1, out Queue backgroundQueue);
BackgroundQueue = backgroundQueue;
BackgroundQueueLock = new();
}
@@ -334,7 +335,7 @@ namespace Ryujinx.Graphics.Vulkan
Api.GetPhysicalDeviceProperties2(_physicalDevice.PhysicalDevice, &properties2);
Api.GetPhysicalDeviceFeatures2(_physicalDevice.PhysicalDevice, &features2);
var portabilityFlags = PortabilitySubsetFlags.None;
PortabilitySubsetFlags portabilityFlags = PortabilitySubsetFlags.None;
uint vertexBufferAlignment = 1;
if (usePortability)
@@ -351,9 +352,9 @@ namespace Ryujinx.Graphics.Vulkan
featuresCustomBorderColor.CustomBorderColors &&
featuresCustomBorderColor.CustomBorderColorWithoutFormat;
ref var properties = ref properties2.Properties;
ref PhysicalDeviceProperties properties = ref properties2.Properties;
var hasDriverProperties = _physicalDevice.TryGetPhysicalDeviceDriverPropertiesKHR(Api, out var driverProperties);
bool hasDriverProperties = _physicalDevice.TryGetPhysicalDeviceDriverPropertiesKHR(Api, out PhysicalDeviceDriverPropertiesKHR driverProperties);
Vendor = VendorUtils.FromId(properties.VendorID);
@@ -384,7 +385,7 @@ namespace Ryujinx.Graphics.Vulkan
if (Vendor == Vendor.Nvidia)
{
var match = VendorUtils.NvidiaConsumerClassRegex().Match(GpuRenderer);
Match match = VendorUtils.NvidiaConsumerClassRegex().Match(GpuRenderer);
if (match != null && int.TryParse(match.Groups[2].Value, out int gpuNumber))
{
@@ -494,7 +495,7 @@ namespace Ryujinx.Graphics.Vulkan
_surface = _getSurface(_instance.Instance, Api);
_physicalDevice = VulkanInitialization.FindSuitablePhysicalDevice(Api, _instance, _surface, _preferredGpuId);
var queueFamilyIndex = VulkanInitialization.FindSuitableQueueFamily(Api, _physicalDevice, _surface, out uint maxQueueCount);
uint queueFamilyIndex = VulkanInitialization.FindSuitableQueueFamily(Api, _physicalDevice, _surface, out uint maxQueueCount);
_device = VulkanInitialization.CreateDevice(Api, _physicalDevice, queueFamilyIndex, maxQueueCount);
@@ -503,7 +504,7 @@ namespace Ryujinx.Graphics.Vulkan
SwapchainApi = swapchainApi;
}
Api.GetDeviceQueue(_device, queueFamilyIndex, 0, out var queue);
Api.GetDeviceQueue(_device, queueFamilyIndex, 0, out Queue queue);
Queue = queue;
QueueLock = new();
@@ -597,7 +598,7 @@ namespace Ryujinx.Graphics.Vulkan
internal TextureView CreateTextureView(TextureCreateInfo info)
{
// This should be disposed when all views are destroyed.
var storage = CreateTextureStorage(info);
TextureStorage storage = CreateTextureStorage(info);
return storage.CreateView(info, 0, 0);
}
@@ -720,8 +721,8 @@ namespace Ryujinx.Graphics.Vulkan
Api.GetPhysicalDeviceFeatures2(_physicalDevice.PhysicalDevice, &features2);
var limits = _physicalDevice.PhysicalDeviceProperties.Limits;
var mainQueueProperties = _physicalDevice.QueueFamilyProperties[QueueFamilyIndex];
PhysicalDeviceLimits limits = _physicalDevice.PhysicalDeviceProperties.Limits;
QueueFamilyProperties mainQueueProperties = _physicalDevice.QueueFamilyProperties[QueueFamilyIndex];
SystemMemoryType memoryType;
@@ -811,7 +812,7 @@ namespace Ryujinx.Graphics.Vulkan
for (int i = 0; i < memoryProperties.MemoryHeapCount; i++)
{
var heap = memoryProperties.MemoryHeaps[i];
MemoryHeap heap = memoryProperties.MemoryHeaps[i];
if ((heap.Flags & MemoryHeapFlags.DeviceLocalBit) == MemoryHeapFlags.DeviceLocalBit)
{
totalMemory += heap.Size;
@@ -1035,17 +1036,17 @@ namespace Ryujinx.Graphics.Vulkan
MemoryAllocator.Dispose();
foreach (var shader in Shaders)
foreach (ShaderCollection shader in Shaders)
{
shader.Dispose();
}
foreach (var texture in Textures)
foreach (ITexture texture in Textures)
{
texture.Release();
}
foreach (var sampler in Samplers)
foreach (SamplerHolder sampler in Samplers)
{
sampler.Dispose();
}
+28 -28
View File
@@ -54,7 +54,7 @@ namespace Ryujinx.Graphics.Vulkan
private void RecreateSwapchain()
{
var oldSwapchain = _swapchain;
SwapchainKHR oldSwapchain = _swapchain;
_swapchainIsDirty = false;
for (int i = 0; i < _swapchainImageViews.Length; i++)
@@ -86,13 +86,13 @@ namespace Ryujinx.Graphics.Vulkan
private unsafe void CreateSwapchain()
{
_gd.SurfaceApi.GetPhysicalDeviceSurfaceCapabilities(_physicalDevice, _surface, out var capabilities);
_gd.SurfaceApi.GetPhysicalDeviceSurfaceCapabilities(_physicalDevice, _surface, out SurfaceCapabilitiesKHR capabilities);
uint surfaceFormatsCount;
_gd.SurfaceApi.GetPhysicalDeviceSurfaceFormats(_physicalDevice, _surface, &surfaceFormatsCount, null);
var surfaceFormats = new SurfaceFormatKHR[surfaceFormatsCount];
SurfaceFormatKHR[] surfaceFormats = new SurfaceFormatKHR[surfaceFormatsCount];
fixed (SurfaceFormatKHR* pSurfaceFormats = surfaceFormats)
{
@@ -103,7 +103,7 @@ namespace Ryujinx.Graphics.Vulkan
_gd.SurfaceApi.GetPhysicalDeviceSurfacePresentModes(_physicalDevice, _surface, &presentModesCount, null);
var presentModes = new PresentModeKHR[presentModesCount];
PresentModeKHR[] presentModes = new PresentModeKHR[presentModesCount];
fixed (PresentModeKHR* pPresentModes = presentModes)
{
@@ -116,17 +116,17 @@ namespace Ryujinx.Graphics.Vulkan
imageCount = capabilities.MaxImageCount;
}
var surfaceFormat = ChooseSwapSurfaceFormat(surfaceFormats, _colorSpacePassthroughEnabled);
SurfaceFormatKHR surfaceFormat = ChooseSwapSurfaceFormat(surfaceFormats, _colorSpacePassthroughEnabled);
var extent = ChooseSwapExtent(capabilities);
Extent2D extent = ChooseSwapExtent(capabilities);
_width = (int)extent.Width;
_height = (int)extent.Height;
_format = surfaceFormat.Format;
var oldSwapchain = _swapchain;
SwapchainKHR oldSwapchain = _swapchain;
var swapchainCreateInfo = new SwapchainCreateInfoKHR
SwapchainCreateInfoKHR swapchainCreateInfo = new()
{
SType = StructureType.SwapchainCreateInfoKhr,
Surface = _surface,
@@ -143,7 +143,7 @@ namespace Ryujinx.Graphics.Vulkan
Clipped = true,
};
var textureCreateInfo = new TextureCreateInfo(
TextureCreateInfo textureCreateInfo = new(
_width,
_height,
1,
@@ -178,7 +178,7 @@ namespace Ryujinx.Graphics.Vulkan
_swapchainImageViews[i] = CreateSwapchainImageView(_swapchainImages[i], surfaceFormat.Format, textureCreateInfo);
}
var semaphoreCreateInfo = new SemaphoreCreateInfo
SemaphoreCreateInfo semaphoreCreateInfo = new()
{
SType = StructureType.SemaphoreCreateInfo,
};
@@ -200,17 +200,17 @@ namespace Ryujinx.Graphics.Vulkan
private unsafe TextureView CreateSwapchainImageView(Image swapchainImage, VkFormat format, TextureCreateInfo info)
{
var componentMapping = new ComponentMapping(
ComponentMapping componentMapping = new(
ComponentSwizzle.R,
ComponentSwizzle.G,
ComponentSwizzle.B,
ComponentSwizzle.A);
var aspectFlags = ImageAspectFlags.ColorBit;
ImageAspectFlags aspectFlags = ImageAspectFlags.ColorBit;
var subresourceRange = new ImageSubresourceRange(aspectFlags, 0, 1, 0, 1);
ImageSubresourceRange subresourceRange = new(aspectFlags, 0, 1, 0, 1);
var imageCreateInfo = new ImageViewCreateInfo
ImageViewCreateInfo imageCreateInfo = new()
{
SType = StructureType.ImageViewCreateInfo,
Image = swapchainImage,
@@ -220,7 +220,7 @@ namespace Ryujinx.Graphics.Vulkan
SubresourceRange = subresourceRange,
};
_gd.Api.CreateImageView(_device, in imageCreateInfo, null, out var imageView).ThrowOnError();
_gd.Api.CreateImageView(_device, in imageCreateInfo, null, out ImageView imageView).ThrowOnError();
return new TextureView(_gd, _device, new DisposableImageView(_gd.Api, _device, imageView), info, format);
}
@@ -232,10 +232,10 @@ namespace Ryujinx.Graphics.Vulkan
return new SurfaceFormatKHR(VkFormat.B8G8R8A8Unorm, ColorSpaceKHR.PaceSrgbNonlinearKhr);
}
var formatToReturn = availableFormats[0];
SurfaceFormatKHR formatToReturn = availableFormats[0];
if (colorSpacePassthroughEnabled)
{
foreach (var format in availableFormats)
foreach (SurfaceFormatKHR format in availableFormats)
{
if (format.Format == VkFormat.B8G8R8A8Unorm && format.ColorSpace == ColorSpaceKHR.SpacePassThroughExt)
{
@@ -250,7 +250,7 @@ namespace Ryujinx.Graphics.Vulkan
}
else
{
foreach (var format in availableFormats)
foreach (SurfaceFormatKHR format in availableFormats)
{
if (format.Format == VkFormat.B8G8R8A8Unorm && format.ColorSpace == ColorSpaceKHR.PaceSrgbNonlinearKhr)
{
@@ -317,7 +317,7 @@ namespace Ryujinx.Graphics.Vulkan
while (true)
{
var acquireResult = _gd.SwapchainApi.AcquireNextImage(
Result acquireResult = _gd.SwapchainApi.AcquireNextImage(
_device,
_swapchain,
ulong.MaxValue,
@@ -339,11 +339,11 @@ namespace Ryujinx.Graphics.Vulkan
}
}
var swapchainImage = _swapchainImages[nextImage];
Image swapchainImage = _swapchainImages[nextImage];
_gd.FlushAllCommands();
var cbs = _gd.CommandBufferPool.Rent();
CommandBufferScoped cbs = _gd.CommandBufferPool.Rent();
Transition(
cbs.CommandBuffer,
@@ -353,7 +353,7 @@ namespace Ryujinx.Graphics.Vulkan
ImageLayout.Undefined,
ImageLayout.General);
var view = (TextureView)texture;
TextureView view = (TextureView)texture;
UpdateEffect();
@@ -463,12 +463,12 @@ namespace Ryujinx.Graphics.Vulkan
[_renderFinishedSemaphores[semaphoreIndex]]);
// TODO: Present queue.
var semaphore = _renderFinishedSemaphores[semaphoreIndex];
var swapchain = _swapchain;
Semaphore semaphore = _renderFinishedSemaphores[semaphoreIndex];
SwapchainKHR swapchain = _swapchain;
Result result;
var presentInfo = new PresentInfoKHR
PresentInfoKHR presentInfo = new()
{
SType = StructureType.PresentInfoKhr,
WaitSemaphoreCount = 1,
@@ -535,7 +535,7 @@ namespace Ryujinx.Graphics.Vulkan
case AntiAliasing.SmaaMedium:
case AntiAliasing.SmaaHigh:
case AntiAliasing.SmaaUltra:
var quality = _currentAntiAliasing - AntiAliasing.SmaaLow;
int quality = _currentAntiAliasing - AntiAliasing.SmaaLow;
if (_effect is SmaaPostProcessingEffect smaa)
{
smaa.Quality = quality;
@@ -595,9 +595,9 @@ namespace Ryujinx.Graphics.Vulkan
ImageLayout srcLayout,
ImageLayout dstLayout)
{
var subresourceRange = new ImageSubresourceRange(ImageAspectFlags.ColorBit, 0, 1, 0, 1);
ImageSubresourceRange subresourceRange = new(ImageAspectFlags.ColorBit, 0, 1, 0, 1);
var barrier = new ImageMemoryBarrier
ImageMemoryBarrier barrier = new()
{
SType = StructureType.ImageMemoryBarrier,
SrcAccessMask = srcAccess,