mirror of
https://github.com/ryujinx-mirror/ryujinx.git
synced 2024-11-26 03:55:15 +00:00
801b71a128
* dotnet format style --severity info Some changes were manually reverted. * dotnet format analyzers --serverity info Some changes have been minimally adapted. * Restore a few unused methods and variables * Silence dotnet format IDE0060 warnings * Silence dotnet format IDE0059 warnings * Address dotnet format CA1816 warnings * Fix new dotnet-format issues after rebase * Address most dotnet format whitespace warnings * Apply dotnet format whitespace formatting A few of them have been manually reverted and the corresponding warning was silenced * Format if-blocks correctly * Another rebase, another dotnet format run * Run dotnet format whitespace after rebase * Run dotnet format style after rebase * Run dotnet format analyzers after rebase * Run dotnet format style after rebase * Run dotnet format after rebase and remove unused usings - analyzers - style - whitespace * Disable 'prefer switch expression' rule * Add comments to disabled warnings * Simplify properties and array initialization, Use const when possible, Remove trailing commas * Run dotnet format after rebase * Address IDE0251 warnings * Address a few disabled IDE0060 warnings * Silence IDE0060 in .editorconfig * Revert "Simplify properties and array initialization, Use const when possible, Remove trailing commas" This reverts commit 9462e4136c0a2100dc28b20cf9542e06790aa67e. * dotnet format whitespace after rebase * First dotnet format pass * Fix naming rule violations * Remove redundant code * Rename generics * Address review feedback * Remove SetOrigin
172 lines
5.8 KiB
C#
172 lines
5.8 KiB
C#
using Ryujinx.Common.Logging;
|
|
using Ryujinx.Graphics.GAL;
|
|
using Silk.NET.Vulkan;
|
|
using System;
|
|
using Format = Ryujinx.Graphics.GAL.Format;
|
|
using VkFormat = Silk.NET.Vulkan.Format;
|
|
|
|
namespace Ryujinx.Graphics.Vulkan
|
|
{
|
|
class FormatCapabilities
|
|
{
|
|
private readonly FormatFeatureFlags[] _bufferTable;
|
|
private readonly FormatFeatureFlags[] _optimalTable;
|
|
|
|
private readonly Vk _api;
|
|
private readonly PhysicalDevice _physicalDevice;
|
|
|
|
public FormatCapabilities(Vk api, PhysicalDevice physicalDevice)
|
|
{
|
|
_api = api;
|
|
_physicalDevice = physicalDevice;
|
|
|
|
int totalFormats = Enum.GetNames(typeof(Format)).Length;
|
|
|
|
_bufferTable = new FormatFeatureFlags[totalFormats];
|
|
_optimalTable = new FormatFeatureFlags[totalFormats];
|
|
}
|
|
|
|
public bool BufferFormatsSupport(FormatFeatureFlags flags, params Format[] formats)
|
|
{
|
|
foreach (Format format in formats)
|
|
{
|
|
if (!BufferFormatSupports(flags, format))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public bool OptimalFormatsSupport(FormatFeatureFlags flags, params Format[] formats)
|
|
{
|
|
foreach (Format format in formats)
|
|
{
|
|
if (!OptimalFormatSupports(flags, format))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public bool BufferFormatSupports(FormatFeatureFlags flags, Format format)
|
|
{
|
|
var formatFeatureFlags = _bufferTable[(int)format];
|
|
|
|
if (formatFeatureFlags == 0)
|
|
{
|
|
_api.GetPhysicalDeviceFormatProperties(_physicalDevice, FormatTable.GetFormat(format), out var fp);
|
|
formatFeatureFlags = fp.BufferFeatures;
|
|
_bufferTable[(int)format] = formatFeatureFlags;
|
|
}
|
|
|
|
return (formatFeatureFlags & flags) == flags;
|
|
}
|
|
|
|
public bool BufferFormatSupports(FormatFeatureFlags flags, VkFormat format)
|
|
{
|
|
_api.GetPhysicalDeviceFormatProperties(_physicalDevice, format, out var fp);
|
|
|
|
return (fp.BufferFeatures & flags) == flags;
|
|
}
|
|
|
|
public bool OptimalFormatSupports(FormatFeatureFlags flags, Format format)
|
|
{
|
|
var formatFeatureFlags = _optimalTable[(int)format];
|
|
|
|
if (formatFeatureFlags == 0)
|
|
{
|
|
_api.GetPhysicalDeviceFormatProperties(_physicalDevice, FormatTable.GetFormat(format), out var fp);
|
|
formatFeatureFlags = fp.OptimalTilingFeatures;
|
|
_optimalTable[(int)format] = formatFeatureFlags;
|
|
}
|
|
|
|
return (formatFeatureFlags & flags) == flags;
|
|
}
|
|
|
|
public VkFormat ConvertToVkFormat(Format srcFormat)
|
|
{
|
|
var format = FormatTable.GetFormat(srcFormat);
|
|
|
|
var requiredFeatures = FormatFeatureFlags.SampledImageBit |
|
|
FormatFeatureFlags.TransferSrcBit |
|
|
FormatFeatureFlags.TransferDstBit;
|
|
|
|
if (srcFormat.IsDepthOrStencil())
|
|
{
|
|
requiredFeatures |= FormatFeatureFlags.DepthStencilAttachmentBit;
|
|
}
|
|
else if (srcFormat.IsRtColorCompatible())
|
|
{
|
|
requiredFeatures |= FormatFeatureFlags.ColorAttachmentBit;
|
|
}
|
|
|
|
if (srcFormat.IsImageCompatible())
|
|
{
|
|
requiredFeatures |= FormatFeatureFlags.StorageImageBit;
|
|
}
|
|
|
|
if (!OptimalFormatSupports(requiredFeatures, srcFormat) || (IsD24S8(srcFormat) && VulkanConfiguration.ForceD24S8Unsupported))
|
|
{
|
|
// The format is not supported. Can we convert it to a higher precision format?
|
|
if (IsD24S8(srcFormat))
|
|
{
|
|
format = VkFormat.D32SfloatS8Uint;
|
|
}
|
|
else if (srcFormat == Format.R4G4B4A4Unorm)
|
|
{
|
|
format = VkFormat.R4G4B4A4UnormPack16;
|
|
}
|
|
else
|
|
{
|
|
Logger.Error?.Print(LogClass.Gpu, $"Format {srcFormat} is not supported by the host.");
|
|
}
|
|
}
|
|
|
|
return format;
|
|
}
|
|
|
|
public VkFormat ConvertToVertexVkFormat(Format srcFormat)
|
|
{
|
|
var format = FormatTable.GetFormat(srcFormat);
|
|
|
|
if (!BufferFormatSupports(FormatFeatureFlags.VertexBufferBit, srcFormat) ||
|
|
(IsRGB16IntFloat(srcFormat) && VulkanConfiguration.ForceRGB16IntFloatUnsupported))
|
|
{
|
|
// The format is not supported. Can we convert it to an alternative format?
|
|
switch (srcFormat)
|
|
{
|
|
case Format.R16G16B16Float:
|
|
format = VkFormat.R16G16B16A16Sfloat;
|
|
break;
|
|
case Format.R16G16B16Sint:
|
|
format = VkFormat.R16G16B16A16Sint;
|
|
break;
|
|
case Format.R16G16B16Uint:
|
|
format = VkFormat.R16G16B16A16Uint;
|
|
break;
|
|
default:
|
|
Logger.Error?.Print(LogClass.Gpu, $"Format {srcFormat} is not supported by the host.");
|
|
break;
|
|
}
|
|
}
|
|
|
|
return format;
|
|
}
|
|
|
|
public static bool IsD24S8(Format format)
|
|
{
|
|
return format == Format.D24UnormS8Uint || format == Format.S8UintD24Unorm;
|
|
}
|
|
|
|
private static bool IsRGB16IntFloat(Format format)
|
|
{
|
|
return format == Format.R16G16B16Float ||
|
|
format == Format.R16G16B16Sint ||
|
|
format == Format.R16G16B16Uint;
|
|
}
|
|
}
|
|
}
|