|
|
@@ -9,6 +9,48 @@ namespace Ryujinx.Graphics.Vulkan
|
|
|
{
|
|
|
class FormatCapabilities
|
|
|
{
|
|
|
+ private static readonly GAL.Format[] _scaledFormats = {
|
|
|
+ GAL.Format.R8Uscaled,
|
|
|
+ GAL.Format.R8Sscaled,
|
|
|
+ GAL.Format.R16Uscaled,
|
|
|
+ GAL.Format.R16Sscaled,
|
|
|
+ GAL.Format.R8G8Uscaled,
|
|
|
+ GAL.Format.R8G8Sscaled,
|
|
|
+ GAL.Format.R16G16Uscaled,
|
|
|
+ GAL.Format.R16G16Sscaled,
|
|
|
+ GAL.Format.R8G8B8Uscaled,
|
|
|
+ GAL.Format.R8G8B8Sscaled,
|
|
|
+ GAL.Format.R16G16B16Uscaled,
|
|
|
+ GAL.Format.R16G16B16Sscaled,
|
|
|
+ GAL.Format.R8G8B8A8Uscaled,
|
|
|
+ GAL.Format.R8G8B8A8Sscaled,
|
|
|
+ GAL.Format.R16G16B16A16Uscaled,
|
|
|
+ GAL.Format.R16G16B16A16Sscaled,
|
|
|
+ GAL.Format.R10G10B10A2Uscaled,
|
|
|
+ GAL.Format.R10G10B10A2Sscaled,
|
|
|
+ };
|
|
|
+
|
|
|
+ private static readonly GAL.Format[] _intFormats = {
|
|
|
+ GAL.Format.R8Uint,
|
|
|
+ GAL.Format.R8Sint,
|
|
|
+ GAL.Format.R16Uint,
|
|
|
+ GAL.Format.R16Sint,
|
|
|
+ GAL.Format.R8G8Uint,
|
|
|
+ GAL.Format.R8G8Sint,
|
|
|
+ GAL.Format.R16G16Uint,
|
|
|
+ GAL.Format.R16G16Sint,
|
|
|
+ GAL.Format.R8G8B8Uint,
|
|
|
+ GAL.Format.R8G8B8Sint,
|
|
|
+ GAL.Format.R16G16B16Uint,
|
|
|
+ GAL.Format.R16G16B16Sint,
|
|
|
+ GAL.Format.R8G8B8A8Uint,
|
|
|
+ GAL.Format.R8G8B8A8Sint,
|
|
|
+ GAL.Format.R16G16B16A16Uint,
|
|
|
+ GAL.Format.R16G16B16A16Sint,
|
|
|
+ GAL.Format.R10G10B10A2Uint,
|
|
|
+ GAL.Format.R10G10B10A2Sint,
|
|
|
+ };
|
|
|
+
|
|
|
private readonly FormatFeatureFlags[] _bufferTable;
|
|
|
private readonly FormatFeatureFlags[] _optimalTable;
|
|
|
|
|
|
@@ -66,6 +108,25 @@ namespace Ryujinx.Graphics.Vulkan
|
|
|
return (formatFeatureFlags & flags) == flags;
|
|
|
}
|
|
|
|
|
|
+ public bool SupportsScaledVertexFormats()
|
|
|
+ {
|
|
|
+ // We want to check is all scaled formats are supported,
|
|
|
+ // but if the integer variant is not supported either,
|
|
|
+ // then the format is likely not supported at all,
|
|
|
+ // we ignore formats that are entirely unsupported here.
|
|
|
+
|
|
|
+ for (int i = 0; i < _scaledFormats.Length; i++)
|
|
|
+ {
|
|
|
+ if (!BufferFormatSupports(FormatFeatureFlags.VertexBufferBit, _scaledFormats[i]) &&
|
|
|
+ BufferFormatSupports(FormatFeatureFlags.VertexBufferBit, _intFormats[i]))
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
public bool BufferFormatSupports(FormatFeatureFlags flags, VkFormat format)
|
|
|
{
|
|
|
_api.GetPhysicalDeviceFormatProperties(_physicalDevice, format, out var fp);
|