From 311c2661b858f6efd86d6d17603845e6778f7b2e Mon Sep 17 00:00:00 2001
From: mageven <62494521+mageven@users.noreply.github.com>
Date: Sun, 28 Aug 2022 07:26:26 +0530
Subject: [PATCH] Replace image format magic numbers with enums (#3631)

* Replace magic constants with enums

* Extra formatting

* Lower case ASTC dimensions

* Use uint for VertexAttributeFormat
---
 Ryujinx.Graphics.Gpu/Image/FormatTable.cs | 721 ++++++++++++++++------
 1 file changed, 534 insertions(+), 187 deletions(-)

diff --git a/Ryujinx.Graphics.Gpu/Image/FormatTable.cs b/Ryujinx.Graphics.Gpu/Image/FormatTable.cs
index e5a4badc..c76e1fca 100644
--- a/Ryujinx.Graphics.Gpu/Image/FormatTable.cs
+++ b/Ryujinx.Graphics.Gpu/Image/FormatTable.cs
@@ -8,195 +8,542 @@ namespace Ryujinx.Graphics.Gpu.Image
     /// </summary>
     static class FormatTable
     {
-        private static Dictionary<uint, FormatInfo> _textureFormats = new Dictionary<uint, FormatInfo>()
+        private enum TextureFormat : uint
         {
-            { 0x2491d, new FormatInfo(Format.R8Unorm,           1,  1,  1,  1) },
-            { 0x1249d, new FormatInfo(Format.R8Snorm,           1,  1,  1,  1) },
-            { 0x4921d, new FormatInfo(Format.R8Uint,            1,  1,  1,  1) },
-            { 0x36d9d, new FormatInfo(Format.R8Sint,            1,  1,  1,  1) },
-            { 0x7ff9b, new FormatInfo(Format.R16Float,          1,  1,  2,  1) },
-            { 0x2491b, new FormatInfo(Format.R16Unorm,          1,  1,  2,  1) },
-            { 0x1249b, new FormatInfo(Format.R16Snorm,          1,  1,  2,  1) },
-            { 0x4921b, new FormatInfo(Format.R16Uint,           1,  1,  2,  1) },
-            { 0x36d9b, new FormatInfo(Format.R16Sint,           1,  1,  2,  1) },
-            { 0x7ff8f, new FormatInfo(Format.R32Float,          1,  1,  4,  1) },
-            { 0x4920f, new FormatInfo(Format.R32Uint,           1,  1,  4,  1) },
-            { 0x36d8f, new FormatInfo(Format.R32Sint,           1,  1,  4,  1) },
-            { 0x24918, new FormatInfo(Format.R8G8Unorm,         1,  1,  2,  2) },
-            { 0x12498, new FormatInfo(Format.R8G8Snorm,         1,  1,  2,  2) },
-            { 0x49218, new FormatInfo(Format.R8G8Uint,          1,  1,  2,  2) },
-            { 0x36d98, new FormatInfo(Format.R8G8Sint,          1,  1,  2,  2) },
-            { 0x7ff8c, new FormatInfo(Format.R16G16Float,       1,  1,  4,  2) },
-            { 0x2490c, new FormatInfo(Format.R16G16Unorm,       1,  1,  4,  2) },
-            { 0x1248c, new FormatInfo(Format.R16G16Snorm,       1,  1,  4,  2) },
-            { 0x4920c, new FormatInfo(Format.R16G16Uint,        1,  1,  4,  2) },
-            { 0x36d8c, new FormatInfo(Format.R16G16Sint,        1,  1,  4,  2) },
-            { 0x7ff84, new FormatInfo(Format.R32G32Float,       1,  1,  8,  2) },
-            { 0x49204, new FormatInfo(Format.R32G32Uint,        1,  1,  8,  2) },
-            { 0x36d84, new FormatInfo(Format.R32G32Sint,        1,  1,  8,  2) },
-            { 0x7ff82, new FormatInfo(Format.R32G32B32Float,    1,  1,  12, 3) },
-            { 0x49202, new FormatInfo(Format.R32G32B32Uint,     1,  1,  12, 3) },
-            { 0x36d82, new FormatInfo(Format.R32G32B32Sint,     1,  1,  12, 3) },
-            { 0x24908, new FormatInfo(Format.R8G8B8A8Unorm,     1,  1,  4,  4) },
-            { 0x12488, new FormatInfo(Format.R8G8B8A8Snorm,     1,  1,  4,  4) },
-            { 0x49208, new FormatInfo(Format.R8G8B8A8Uint,      1,  1,  4,  4) },
-            { 0x36d88, new FormatInfo(Format.R8G8B8A8Sint,      1,  1,  4,  4) },
-            { 0x7ff83, new FormatInfo(Format.R16G16B16A16Float, 1,  1,  8,  4) },
-            { 0x24903, new FormatInfo(Format.R16G16B16A16Unorm, 1,  1,  8,  4) },
-            { 0x12483, new FormatInfo(Format.R16G16B16A16Snorm, 1,  1,  8,  4) },
-            { 0x49203, new FormatInfo(Format.R16G16B16A16Uint,  1,  1,  8,  4) },
-            { 0x36d83, new FormatInfo(Format.R16G16B16A16Sint,  1,  1,  8,  4) },
-            { 0x7ff81, new FormatInfo(Format.R32G32B32A32Float, 1,  1,  16, 4) },
-            { 0x49201, new FormatInfo(Format.R32G32B32A32Uint,  1,  1,  16, 4) },
-            { 0x36d81, new FormatInfo(Format.R32G32B32A32Sint,  1,  1,  16, 4) },
-            { 0x2493a, new FormatInfo(Format.D16Unorm,          1,  1,  2,  1) },
-            { 0x493af, new FormatInfo(Format.D32Float,          1,  1,  4,  1) },
-            { 0x7ffaf, new FormatInfo(Format.D32Float,          1,  1,  4,  1) },
-            { 0x24a0e, new FormatInfo(Format.D24UnormS8Uint,    1,  1,  4,  2) },
-            { 0x24a29, new FormatInfo(Format.D24UnormS8Uint,    1,  1,  4,  2) },
-            { 0x48a29, new FormatInfo(Format.D24UnormS8Uint,    1,  1,  4,  2) },
-            { 0x4912b, new FormatInfo(Format.S8UintD24Unorm,    1,  1,  4,  2) },
-            { 0x25385, new FormatInfo(Format.D32FloatS8Uint,    1,  1,  8,  2) },
-            { 0x253b0, new FormatInfo(Format.D32FloatS8Uint,    1,  1,  8,  2) },
-            { 0xa4908, new FormatInfo(Format.R8G8B8A8Srgb,      1,  1,  4,  4) },
-            { 0x2491e, new FormatInfo(Format.R4G4Unorm,         1,  1,  1,  2) },
-            { 0x24912, new FormatInfo(Format.R4G4B4A4Unorm,     1,  1,  2,  4) },
-            { 0x24914, new FormatInfo(Format.R5G5B5A1Unorm,     1,  1,  2,  4) },
-            { 0x24915, new FormatInfo(Format.R5G6B5Unorm,       1,  1,  2,  3) },
-            { 0x24909, new FormatInfo(Format.R10G10B10A2Unorm,  1,  1,  4,  4) },
-            { 0x49209, new FormatInfo(Format.R10G10B10A2Uint,   1,  1,  4,  4) },
-            { 0x7ffa1, new FormatInfo(Format.R11G11B10Float,    1,  1,  4,  3) },
-            { 0x7ffa0, new FormatInfo(Format.R9G9B9E5Float,     1,  1,  4,  4) },
-            { 0x24924, new FormatInfo(Format.Bc1RgbaUnorm,      4,  4,  8,  4) },
-            { 0x24925, new FormatInfo(Format.Bc2Unorm,          4,  4,  16, 4) },
-            { 0x24926, new FormatInfo(Format.Bc3Unorm,          4,  4,  16, 4) },
-            { 0xa4924, new FormatInfo(Format.Bc1RgbaSrgb,       4,  4,  8,  4) },
-            { 0xa4925, new FormatInfo(Format.Bc2Srgb,           4,  4,  16, 4) },
-            { 0xa4926, new FormatInfo(Format.Bc3Srgb,           4,  4,  16, 4) },
-            { 0x24927, new FormatInfo(Format.Bc4Unorm,          4,  4,  8,  1) },
-            { 0x124a7, new FormatInfo(Format.Bc4Snorm,          4,  4,  8,  1) },
-            { 0x24928, new FormatInfo(Format.Bc5Unorm,          4,  4,  16, 2) },
-            { 0x124a8, new FormatInfo(Format.Bc5Snorm,          4,  4,  16, 2) },
-            { 0x24917, new FormatInfo(Format.Bc7Unorm,          4,  4,  16, 4) },
-            { 0xa4917, new FormatInfo(Format.Bc7Srgb,           4,  4,  16, 4) },
-            { 0x7ff90, new FormatInfo(Format.Bc6HSfloat,        4,  4,  16, 4) },
-            { 0x7ff91, new FormatInfo(Format.Bc6HUfloat,        4,  4,  16, 4) },
-            { 0x24906, new FormatInfo(Format.Etc2RgbUnorm,      4,  4,  8,  3) },
-            { 0x2490b, new FormatInfo(Format.Etc2RgbaUnorm,     4,  4,  16, 4) },
-            { 0xa4906, new FormatInfo(Format.Etc2RgbSrgb,       4,  4,  8,  3) },
-            { 0xa490b, new FormatInfo(Format.Etc2RgbaSrgb,      4,  4,  16, 4) },
-            { 0x24940, new FormatInfo(Format.Astc4x4Unorm,      4,  4,  16, 4) },
-            { 0x24950, new FormatInfo(Format.Astc5x4Unorm,      5,  4,  16, 4) },
-            { 0x24941, new FormatInfo(Format.Astc5x5Unorm,      5,  5,  16, 4) },
-            { 0x24951, new FormatInfo(Format.Astc6x5Unorm,      6,  5,  16, 4) },
-            { 0x24942, new FormatInfo(Format.Astc6x6Unorm,      6,  6,  16, 4) },
-            { 0x24955, new FormatInfo(Format.Astc8x5Unorm,      8,  5,  16, 4) },
-            { 0x24952, new FormatInfo(Format.Astc8x6Unorm,      8,  6,  16, 4) },
-            { 0x24944, new FormatInfo(Format.Astc8x8Unorm,      8,  8,  16, 4) },
-            { 0x24956, new FormatInfo(Format.Astc10x5Unorm,     10, 5,  16, 4) },
-            { 0x24957, new FormatInfo(Format.Astc10x6Unorm,     10, 6,  16, 4) },
-            { 0x24953, new FormatInfo(Format.Astc10x8Unorm,     10, 8,  16, 4) },
-            { 0x24945, new FormatInfo(Format.Astc10x10Unorm,    10, 10, 16, 4) },
-            { 0x24954, new FormatInfo(Format.Astc12x10Unorm,    12, 10, 16, 4) },
-            { 0x24946, new FormatInfo(Format.Astc12x12Unorm,    12, 12, 16, 4) },
-            { 0xa4940, new FormatInfo(Format.Astc4x4Srgb,       4,  4,  16, 4) },
-            { 0xa4950, new FormatInfo(Format.Astc5x4Srgb,       5,  4,  16, 4) },
-            { 0xa4941, new FormatInfo(Format.Astc5x5Srgb,       5,  5,  16, 4) },
-            { 0xa4951, new FormatInfo(Format.Astc6x5Srgb,       6,  5,  16, 4) },
-            { 0xa4942, new FormatInfo(Format.Astc6x6Srgb,       6,  6,  16, 4) },
-            { 0xa4955, new FormatInfo(Format.Astc8x5Srgb,       8,  5,  16, 4) },
-            { 0xa4952, new FormatInfo(Format.Astc8x6Srgb,       8,  6,  16, 4) },
-            { 0xa4944, new FormatInfo(Format.Astc8x8Srgb,       8,  8,  16, 4) },
-            { 0xa4956, new FormatInfo(Format.Astc10x5Srgb,      10, 5,  16, 4) },
-            { 0xa4957, new FormatInfo(Format.Astc10x6Srgb,      10, 6,  16, 4) },
-            { 0xa4953, new FormatInfo(Format.Astc10x8Srgb,      10, 8,  16, 4) },
-            { 0xa4945, new FormatInfo(Format.Astc10x10Srgb,     10, 10, 16, 4) },
-            { 0xa4954, new FormatInfo(Format.Astc12x10Srgb,     12, 10, 16, 4) },
-            { 0xa4946, new FormatInfo(Format.Astc12x12Srgb,     12, 12, 16, 4) },
-            { 0x24913, new FormatInfo(Format.A1B5G5R5Unorm,     1,  1,  2,  4) }
+            // Formats
+            R32G32B32A32 = 0x01,
+            R32G32B32 = 0x02,
+            R16G16B16A16 = 0x03,
+            R32G32 = 0x04,
+            R32B24G8 = 0x05,
+            X8B8G8R8 = 0x07,
+            A8B8G8R8 = 0x08,
+            A2B10G10R10 = 0x09,
+            R16G16 = 0x0c,
+            G8R24 = 0x0d,
+            G24R8 = 0x0e,
+            R32 = 0x0f,
+            A4B4G4R4 = 0x12,
+            A5B5G5R1 = 0x13,
+            A1B5G5R5 = 0x14,
+            B5G6R5 = 0x15,
+            B6G5R5 = 0x16,
+            G8R8 = 0x18,
+            R16 = 0x1b,
+            Y8Video = 0x1c,
+            R8 = 0x1d,
+            G4R4 = 0x1e,
+            R1 = 0x1f,
+            E5B9G9R9SharedExp = 0x20,
+            Bf10Gf11Rf11 = 0x21,
+            G8B8G8R8 = 0x22,
+            B8G8R8G8 = 0x23,
+            Bc1 = 0x24,
+            Bc2 = 0x25,
+            Bc3 = 0x26,
+            Bc4 = 0x27,
+            Bc5 = 0x28,
+            Bc6HSf16 = 0x10,
+            Bc6HUf16 = 0x11,
+            Bc7U = 0x17,
+            Etc2Rgb = 0x06,
+            Etc2RgbPta = 0x0a,
+            Etc2Rgba = 0x0b,
+            Eac = 0x19,
+            Eacx2 = 0x1a,
+            Z24S8 = 0x29,
+            X8Z24 = 0x2a,
+            S8Z24 = 0x2b,
+            X4V4Z24Cov4R4V = 0x2c,
+            X4V4Z24Cov8R8V = 0x2d,
+            V8Z24Cov4R12V = 0x2e,
+            Zf32 = 0x2f,
+            Zf32X24S8 = 0x30,
+            X8Z24X20V4S8Cov4R4V = 0x31,
+            X8Z24X20V4S8Cov8R8V = 0x32,
+            Zf32X20V4X8Cov4R4V = 0x33,
+            Zf32X20V4X8Cov8R8V = 0x34,
+            Zf32X20V4S8Cov4R4V = 0x35,
+            Zf32X20V4S8Cov8R8V = 0x36,
+            X8Z24X16V8S8Cov4R12V = 0x37,
+            Zf32X16V8X8Cov4R12V = 0x38,
+            Zf32X16V8S8Cov4R12V = 0x39,
+            Z16 = 0x3a,
+            V8Z24Cov8R24V = 0x3b,
+            X8Z24X16V8S8Cov8R24V = 0x3c,
+            Zf32X16V8X8Cov8R24V = 0x3d,
+            Zf32X16V8S8Cov8R24V = 0x3e,
+            Astc2D4x4 = 0x40,
+            Astc2D5x4 = 0x50,
+            Astc2D5x5 = 0x41,
+            Astc2D6x5 = 0x51,
+            Astc2D6x6 = 0x42,
+            Astc2D8x5 = 0x55,
+            Astc2D8x6 = 0x52,
+            Astc2D8x8 = 0x44,
+            Astc2D10x5 = 0x56,
+            Astc2D10x6 = 0x57,
+            Astc2D10x8 = 0x53,
+            Astc2D10x10 = 0x45,
+            Astc2D12x10 = 0x54,
+            Astc2D12x12 = 0x46,
+
+            // Types
+            Snorm = 0x1,
+            Unorm = 0x2,
+            Sint = 0x3,
+            Uint = 0x4,
+            SnormForceFp16 = 0x5,
+            UnormForceFp16 = 0x6,
+            Float = 0x7,
+
+            // Component Types
+            RSnorm = Snorm << 7,
+            GSnorm = Snorm << 10,
+            BSnorm = Snorm << 13,
+            ASnorm = Snorm << 16,
+
+            RUnorm = Unorm << 7,
+            GUnorm = Unorm << 10,
+            BUnorm = Unorm << 13,
+            AUnorm = Unorm << 16,
+
+            RSint = Sint << 7,
+            GSint = Sint << 10,
+            BSint = Sint << 13,
+            ASint = Sint << 16,
+
+            RUint = Uint << 7,
+            GUint = Uint << 10,
+            BUint = Uint << 13,
+            AUint = Uint << 16,
+
+            RSnormForceFp16 = SnormForceFp16 << 7,
+            GSnormForceFp16 = SnormForceFp16 << 10,
+            BSnormForceFp16 = SnormForceFp16 << 13,
+            ASnormForceFp16 = SnormForceFp16 << 16,
+
+            RUnormForceFp16 = UnormForceFp16 << 7,
+            GUnormForceFp16 = UnormForceFp16 << 10,
+            BUnormForceFp16 = UnormForceFp16 << 13,
+            AUnormForceFp16 = UnormForceFp16 << 16,
+
+            RFloat = Float << 7,
+            GFloat = Float << 10,
+            BFloat = Float << 13,
+            AFloat = Float << 16,
+
+            Srgb = 0x1 << 19, // Custom encoding
+
+            // Combinations
+            R8Unorm                          = R8                | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x2491d
+            R8Snorm                          = R8                | RSnorm | GSnorm | BSnorm | ASnorm,        // 0x1249d
+            R8Uint                           = R8                | RUint  | GUint  | BUint  | AUint,         // 0x4921d
+            R8Sint                           = R8                | RSint  | GSint  | BSint  | ASint,         // 0x36d9d
+            R16Float                         = R16               | RFloat | GFloat | BFloat | AFloat,        // 0x7ff9b
+            R16Unorm                         = R16               | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x2491b
+            R16Snorm                         = R16               | RSnorm | GSnorm | BSnorm | ASnorm,        // 0x1249b
+            R16Uint                          = R16               | RUint  | GUint  | BUint  | AUint,         // 0x4921b
+            R16Sint                          = R16               | RSint  | GSint  | BSint  | ASint,         // 0x36d9b
+            R32Float                         = R32               | RFloat | GFloat | BFloat | AFloat,        // 0x7ff8f
+            R32Uint                          = R32               | RUint  | GUint  | BUint  | AUint,         // 0x4920f
+            R32Sint                          = R32               | RSint  | GSint  | BSint  | ASint,         // 0x36d8f
+            G8R8Unorm                        = G8R8              | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24918
+            G8R8Snorm                        = G8R8              | RSnorm | GSnorm | BSnorm | ASnorm,        // 0x12498
+            G8R8Uint                         = G8R8              | RUint  | GUint  | BUint  | AUint,         // 0x49218
+            G8R8Sint                         = G8R8              | RSint  | GSint  | BSint  | ASint,         // 0x36d98
+            R16G16Float                      = R16G16            | RFloat | GFloat | BFloat | AFloat,        // 0x7ff8c
+            R16G16Unorm                      = R16G16            | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x2490c
+            R16G16Snorm                      = R16G16            | RSnorm | GSnorm | BSnorm | ASnorm,        // 0x1248c
+            R16G16Uint                       = R16G16            | RUint  | GUint  | BUint  | AUint,         // 0x4920c
+            R16G16Sint                       = R16G16            | RSint  | GSint  | BSint  | ASint,         // 0x36d8c
+            R32G32Float                      = R32G32            | RFloat | GFloat | BFloat | AFloat,        // 0x7ff84
+            R32G32Uint                       = R32G32            | RUint  | GUint  | BUint  | AUint,         // 0x49204
+            R32G32Sint                       = R32G32            | RSint  | GSint  | BSint  | ASint,         // 0x36d84
+            R32G32B32Float                   = R32G32B32         | RFloat | GFloat | BFloat | AFloat,        // 0x7ff82
+            R32G32B32Uint                    = R32G32B32         | RUint  | GUint  | BUint  | AUint,         // 0x49202
+            R32G32B32Sint                    = R32G32B32         | RSint  | GSint  | BSint  | ASint,         // 0x36d82
+            A8B8G8R8Unorm                    = A8B8G8R8          | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24908
+            A8B8G8R8Snorm                    = A8B8G8R8          | RSnorm | GSnorm | BSnorm | ASnorm,        // 0x12488
+            A8B8G8R8Uint                     = A8B8G8R8          | RUint  | GUint  | BUint  | AUint,         // 0x49208
+            A8B8G8R8Sint                     = A8B8G8R8          | RSint  | GSint  | BSint  | ASint,         // 0x36d88
+            R16G16B16A16Float                = R16G16B16A16      | RFloat | GFloat | BFloat | AFloat,        // 0x7ff83
+            R16G16B16A16Unorm                = R16G16B16A16      | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24903
+            R16G16B16A16Snorm                = R16G16B16A16      | RSnorm | GSnorm | BSnorm | ASnorm,        // 0x12483
+            R16G16B16A16Uint                 = R16G16B16A16      | RUint  | GUint  | BUint  | AUint,         // 0x49203
+            R16G16B16A16Sint                 = R16G16B16A16      | RSint  | GSint  | BSint  | ASint,         // 0x36d83
+            R32G32B32A32Float                = R32G32B32A32      | RFloat | GFloat | BFloat | AFloat,        // 0x7ff81
+            R32G32B32A32Uint                 = R32G32B32A32      | RUint  | GUint  | BUint  | AUint,         // 0x49201
+            R32G32B32A32Sint                 = R32G32B32A32      | RSint  | GSint  | BSint  | ASint,         // 0x36d81
+            Z16Unorm                         = Z16               | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x2493a
+            Zf32RFloatGUintBUintAUint        = Zf32              | RFloat | GUint  | BUint  | AUint,         // 0x493af
+            Zf32Float                        = Zf32              | RFloat | GFloat | BFloat | AFloat,        // 0x7ffaf
+            G24R8RUintGUnormBUnormAUnorm     = G24R8             | RUint  | GUnorm | BUnorm | AUnorm,        // 0x24a0e
+            Z24S8RUintGUnormBUnormAUnorm     = Z24S8             | RUint  | GUnorm | BUnorm | AUnorm,        // 0x24a29
+            Z24S8RUintGUnormBUintAUint       = Z24S8             | RUint  | GUnorm | BUint  | AUint,         // 0x48a29
+            S8Z24RUnormGUintBUintAUint       = S8Z24             | RUnorm | GUint  | BUint  | AUint,         // 0x4912b
+            R32B24G8RFloatGUintBUnormAUnorm  = R32B24G8          | RFloat | GUint  | BUnorm | AUnorm,        // 0x25385
+            Zf32X24S8RFloatGUintBUnormAUnorm = Zf32X24S8         | RFloat | GUint  | BUnorm | AUnorm,        // 0x253b0
+            A8B8G8R8UnormSrgb                = A8B8G8R8          | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4908
+            G4R4Unorm                        = G4R4              | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x2491e
+            A4B4G4R4Unorm                    = A4B4G4R4          | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24912
+            A1B5G5R5Unorm                    = A1B5G5R5          | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24914
+            B5G6R5Unorm                      = B5G6R5            | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24915
+            A2B10G10R10Unorm                 = A2B10G10R10       | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24909
+            A2B10G10R10Uint                  = A2B10G10R10       | RUint  | GUint  | BUint  | AUint,         // 0x49209
+            Bf10Gf11Rf11Float                = Bf10Gf11Rf11      | RFloat | GFloat | BFloat | AFloat,        // 0x7ffa1
+            E5B9G9R9SharedExpFloat           = E5B9G9R9SharedExp | RFloat | GFloat | BFloat | AFloat,        // 0x7ffa0
+            Bc1Unorm                         = Bc1               | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24924
+            Bc2Unorm                         = Bc2               | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24925
+            Bc3Unorm                         = Bc3               | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24926
+            Bc1UnormSrgb                     = Bc1               | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4924
+            Bc2UnormSrgb                     = Bc2               | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4925
+            Bc3UnormSrgb                     = Bc3               | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4926
+            Bc4Unorm                         = Bc4               | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24927
+            Bc4Snorm                         = Bc4               | RSnorm | GSnorm | BSnorm | ASnorm,        // 0x124a7
+            Bc5Unorm                         = Bc5               | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24928
+            Bc5Snorm                         = Bc5               | RSnorm | GSnorm | BSnorm | ASnorm,        // 0x124a8
+            Bc7UUnorm                        = Bc7U              | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24917
+            Bc7UUnormSrgb                    = Bc7U              | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4917
+            Bc6HSf16Float                    = Bc6HSf16          | RFloat | GFloat | BFloat | AFloat,        // 0x7ff90
+            Bc6HUf16Float                    = Bc6HUf16          | RFloat | GFloat | BFloat | AFloat,        // 0x7ff91
+            Etc2RgbUnorm                     = Etc2Rgb           | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24906
+            Etc2RgbaUnorm                    = Etc2Rgba          | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x2490b
+            Etc2RgbUnormSrgb                 = Etc2Rgb           | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4906
+            Etc2RgbaUnormSrgb                = Etc2Rgba          | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa490b
+            Astc2D4x4Unorm                   = Astc2D4x4         | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24940
+            Astc2D5x4Unorm                   = Astc2D5x4         | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24950
+            Astc2D5x5Unorm                   = Astc2D5x5         | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24941
+            Astc2D6x5Unorm                   = Astc2D6x5         | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24951
+            Astc2D6x6Unorm                   = Astc2D6x6         | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24942
+            Astc2D8x5Unorm                   = Astc2D8x5         | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24955
+            Astc2D8x6Unorm                   = Astc2D8x6         | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24952
+            Astc2D8x8Unorm                   = Astc2D8x8         | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24944
+            Astc2D10x5Unorm                  = Astc2D10x5        | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24956
+            Astc2D10x6Unorm                  = Astc2D10x6        | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24957
+            Astc2D10x8Unorm                  = Astc2D10x8        | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24953
+            Astc2D10x10Unorm                 = Astc2D10x10       | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24945
+            Astc2D12x10Unorm                 = Astc2D12x10       | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24954
+            Astc2D12x12Unorm                 = Astc2D12x12       | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24946
+            Astc2D4x4UnormSrgb               = Astc2D4x4         | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4940
+            Astc2D5x4UnormSrgb               = Astc2D5x4         | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4950
+            Astc2D5x5UnormSrgb               = Astc2D5x5         | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4941
+            Astc2D6x5UnormSrgb               = Astc2D6x5         | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4951
+            Astc2D6x6UnormSrgb               = Astc2D6x6         | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4942
+            Astc2D8x5UnormSrgb               = Astc2D8x5         | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4955
+            Astc2D8x6UnormSrgb               = Astc2D8x6         | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4952
+            Astc2D8x8UnormSrgb               = Astc2D8x8         | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4944
+            Astc2D10x5UnormSrgb              = Astc2D10x5        | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4956
+            Astc2D10x6UnormSrgb              = Astc2D10x6        | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4957
+            Astc2D10x8UnormSrgb              = Astc2D10x8        | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4953
+            Astc2D10x10UnormSrgb             = Astc2D10x10       | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4945
+            Astc2D12x10UnormSrgb             = Astc2D12x10       | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4954
+            Astc2D12x12UnormSrgb             = Astc2D12x12       | RUnorm | GUnorm | BUnorm | AUnorm | Srgb, // 0xa4946
+            A5B5G5R1Unorm                    = A5B5G5R1          | RUnorm | GUnorm | BUnorm | AUnorm,        // 0x24913
+        }
+
+        private enum VertexAttributeFormat : uint
+        {
+            // Width
+            R32G32B32A32 = 0x01,
+            R32G32B32 = 0x02,
+            R16G16B16A16 = 0x03,
+            R32G32 = 0x04,
+            R16G16B16 = 0x05,
+            A8B8G8R8 = 0x2f,
+            R8G8B8A8 = 0x0a,
+            X8B8G8R8 = 0x33,
+            A2B10G10R10 = 0x30,
+            B10G11R11 = 0x31,
+            R16G16 = 0x0f,
+            R32 = 0x12,
+            R8G8B8 = 0x13,
+            G8R8 = 0x32,
+            R8G8 = 0x18,
+            R16 = 0x1b,
+            R8 = 0x1d,
+            A8 = 0x34,
+
+            // Type
+            Snorm = 0x01,
+            Unorm = 0x02,
+            Sint = 0x03,
+            Uint = 0x04,
+            Uscaled = 0x05,
+            Sscaled = 0x06,
+            Float = 0x07,
+
+            // Combinations
+            R8Unorm             = (R8 << 21)           | (Unorm << 27),   // 0x13a00000
+            R8Snorm             = (R8 << 21)           | (Snorm << 27),   // 0x0ba00000
+            R8Uint              = (R8 << 21)           | (Uint << 27),    // 0x23a00000
+            R8Sint              = (R8 << 21)           | (Sint << 27),    // 0x1ba00000
+            R16Float            = (R16 << 21)          | (Float << 27),   // 0x3b600000
+            R16Unorm            = (R16 << 21)          | (Unorm << 27),   // 0x13600000
+            R16Snorm            = (R16 << 21)          | (Snorm << 27),   // 0x0b600000
+            R16Uint             = (R16 << 21)          | (Uint << 27),    // 0x23600000
+            R16Sint             = (R16 << 21)          | (Sint << 27),    // 0x1b600000
+            R32Float            = (R32 << 21)          | (Float << 27),   // 0x3a400000
+            R32Uint             = (R32 << 21)          | (Uint << 27),    // 0x22400000
+            R32Sint             = (R32 << 21)          | (Sint << 27),    // 0x1a400000
+            R8G8Unorm           = (R8G8 << 21)         | (Unorm << 27),   // 0x13000000
+            R8G8Snorm           = (R8G8 << 21)         | (Snorm << 27),   // 0x0b000000
+            R8G8Uint            = (R8G8 << 21)         | (Uint << 27),    // 0x23000000
+            R8G8Sint            = (R8G8 << 21)         | (Sint << 27),    // 0x1b000000
+            R16G16Float         = (R16G16 << 21)       | (Float << 27),   // 0x39e00000
+            R16G16Unorm         = (R16G16 << 21)       | (Unorm << 27),   // 0x11e00000
+            R16G16Snorm         = (R16G16 << 21)       | (Snorm << 27),   // 0x09e00000
+            R16G16Uint          = (R16G16 << 21)       | (Uint << 27),    // 0x21e00000
+            R16G16Sint          = (R16G16 << 21)       | (Sint << 27),    // 0x19e00000
+            R32G32Float         = (R32G32 << 21)       | (Float << 27),   // 0x38800000
+            R32G32Uint          = (R32G32 << 21)       | (Uint << 27),    // 0x20800000
+            R32G32Sint          = (R32G32 << 21)       | (Sint << 27),    // 0x18800000
+            R8G8B8Unorm         = (R8G8B8 << 21)       | (Unorm << 27),   // 0x12600000
+            R8G8B8Snorm         = (R8G8B8 << 21)       | (Snorm << 27),   // 0x0a600000
+            R8G8B8Uint          = (R8G8B8 << 21)       | (Uint << 27),    // 0x22600000
+            R8G8B8Sint          = (R8G8B8 << 21)       | (Sint << 27),    // 0x1a600000
+            R16G16B16Float      = (R16G16B16 << 21)    | (Float << 27),   // 0x38a00000
+            R16G16B16Unorm      = (R16G16B16 << 21)    | (Unorm << 27),   // 0x10a00000
+            R16G16B16Snorm      = (R16G16B16 << 21)    | (Snorm << 27),   // 0x08a00000
+            R16G16B16Uint       = (R16G16B16 << 21)    | (Uint << 27),    // 0x20a00000
+            R16G16B16Sint       = (R16G16B16 << 21)    | (Sint << 27),    // 0x18a00000
+            R32G32B32Float      = (R32G32B32 << 21)    | (Float << 27),   // 0x38400000
+            R32G32B32Uint       = (R32G32B32 << 21)    | (Uint << 27),    // 0x20400000
+            R32G32B32Sint       = (R32G32B32 << 21)    | (Sint << 27),    // 0x18400000
+            R8G8B8A8Unorm       = (R8G8B8A8 << 21)     | (Unorm << 27),   // 0x11400000
+            R8G8B8A8Snorm       = (R8G8B8A8 << 21)     | (Snorm << 27),   // 0x09400000
+            R8G8B8A8Uint        = (R8G8B8A8 << 21)     | (Uint << 27),    // 0x21400000
+            R8G8B8A8Sint        = (R8G8B8A8 << 21)     | (Sint << 27),    // 0x19400000
+            R16G16B16A16Float   = (R16G16B16A16 << 21) | (Float << 27),   // 0x38600000
+            R16G16B16A16Unorm   = (R16G16B16A16 << 21) | (Unorm << 27),   // 0x10600000
+            R16G16B16A16Snorm   = (R16G16B16A16 << 21) | (Snorm << 27),   // 0x08600000
+            R16G16B16A16Uint    = (R16G16B16A16 << 21) | (Uint << 27),    // 0x20600000
+            R16G16B16A16Sint    = (R16G16B16A16 << 21) | (Sint << 27),    // 0x18600000
+            R32G32B32A32Float   = (R32G32B32A32 << 21) | (Float << 27),   // 0x38200000
+            R32G32B32A32Uint    = (R32G32B32A32 << 21) | (Uint << 27),    // 0x20200000
+            R32G32B32A32Sint    = (R32G32B32A32 << 21) | (Sint << 27),    // 0x18200000
+            A2B10G10R10Unorm    = (A2B10G10R10 << 21)  | (Unorm << 27),   // 0x16000000
+            A2B10G10R10Uint     = (A2B10G10R10 << 21)  | (Uint << 27),    // 0x26000000
+            B10G11R11Float      = (B10G11R11 << 21)    | (Float << 27),   // 0x3e200000
+            R8Uscaled           = (R8 << 21)           | (Uscaled << 27), // 0x2ba00000
+            R8Sscaled           = (R8 << 21)           | (Sscaled << 27), // 0x33a00000
+            R16Uscaled          = (R16 << 21)          | (Uscaled << 27), // 0x2b600000
+            R16Sscaled          = (R16 << 21)          | (Sscaled << 27), // 0x33600000
+            R32Uscaled          = (R32 << 21)          | (Uscaled << 27), // 0x2a400000
+            R32Sscaled          = (R32 << 21)          | (Sscaled << 27), // 0x32400000
+            R8G8Uscaled         = (R8G8 << 21)         | (Uscaled << 27), // 0x2b000000
+            R8G8Sscaled         = (R8G8 << 21)         | (Sscaled << 27), // 0x33000000
+            R16G16Uscaled       = (R16G16 << 21)       | (Uscaled << 27), // 0x29e00000
+            R16G16Sscaled       = (R16G16 << 21)       | (Sscaled << 27), // 0x31e00000
+            R32G32Uscaled       = (R32G32 << 21)       | (Uscaled << 27), // 0x28800000
+            R32G32Sscaled       = (R32G32 << 21)       | (Sscaled << 27), // 0x30800000
+            R8G8B8Uscaled       = (R8G8B8 << 21)       | (Uscaled << 27), // 0x2a600000
+            R8G8B8Sscaled       = (R8G8B8 << 21)       | (Sscaled << 27), // 0x32600000
+            R16G16B16Uscaled    = (R16G16B16 << 21)    | (Uscaled << 27), // 0x28a00000
+            R16G16B16Sscaled    = (R16G16B16 << 21)    | (Sscaled << 27), // 0x30a00000
+            R32G32B32Uscaled    = (R32G32B32 << 21)    | (Uscaled << 27), // 0x28400000
+            R32G32B32Sscaled    = (R32G32B32 << 21)    | (Sscaled << 27), // 0x30400000
+            R8G8B8A8Uscaled     = (R8G8B8A8 << 21)     | (Uscaled << 27), // 0x29400000
+            R8G8B8A8Sscaled     = (R8G8B8A8 << 21)     | (Sscaled << 27), // 0x31400000
+            R16G16B16A16Uscaled = (R16G16B16A16 << 21) | (Uscaled << 27), // 0x28600000
+            R16G16B16A16Sscaled = (R16G16B16A16 << 21) | (Sscaled << 27), // 0x30600000
+            R32G32B32A32Uscaled = (R32G32B32A32 << 21) | (Uscaled << 27), // 0x28200000
+            R32G32B32A32Sscaled = (R32G32B32A32 << 21) | (Sscaled << 27), // 0x30200000
+            A2B10G10R10Snorm    = (A2B10G10R10 << 21)  | (Snorm << 27),   // 0x0e000000
+            A2B10G10R10Sint     = (A2B10G10R10 << 21)  | (Sint << 27),    // 0x1e000000
+            A2B10G10R10Uscaled  = (A2B10G10R10 << 21)  | (Uscaled << 27), // 0x2e000000
+            A2B10G10R10Sscaled  = (A2B10G10R10 << 21)  | (Sscaled << 27), // 0x36000000
+        }
+
+        private static readonly Dictionary<TextureFormat, FormatInfo> _textureFormats = new Dictionary<TextureFormat, FormatInfo>()
+        {
+            { TextureFormat.R8Unorm,                          new FormatInfo(Format.R8Unorm,           1,  1,  1,  1) },
+            { TextureFormat.R8Snorm,                          new FormatInfo(Format.R8Snorm,           1,  1,  1,  1) },
+            { TextureFormat.R8Uint,                           new FormatInfo(Format.R8Uint,            1,  1,  1,  1) },
+            { TextureFormat.R8Sint,                           new FormatInfo(Format.R8Sint,            1,  1,  1,  1) },
+            { TextureFormat.R16Float,                         new FormatInfo(Format.R16Float,          1,  1,  2,  1) },
+            { TextureFormat.R16Unorm,                         new FormatInfo(Format.R16Unorm,          1,  1,  2,  1) },
+            { TextureFormat.R16Snorm,                         new FormatInfo(Format.R16Snorm,          1,  1,  2,  1) },
+            { TextureFormat.R16Uint,                          new FormatInfo(Format.R16Uint,           1,  1,  2,  1) },
+            { TextureFormat.R16Sint,                          new FormatInfo(Format.R16Sint,           1,  1,  2,  1) },
+            { TextureFormat.R32Float,                         new FormatInfo(Format.R32Float,          1,  1,  4,  1) },
+            { TextureFormat.R32Uint,                          new FormatInfo(Format.R32Uint,           1,  1,  4,  1) },
+            { TextureFormat.R32Sint,                          new FormatInfo(Format.R32Sint,           1,  1,  4,  1) },
+            { TextureFormat.G8R8Unorm,                        new FormatInfo(Format.R8G8Unorm,         1,  1,  2,  2) },
+            { TextureFormat.G8R8Snorm,                        new FormatInfo(Format.R8G8Snorm,         1,  1,  2,  2) },
+            { TextureFormat.G8R8Uint,                         new FormatInfo(Format.R8G8Uint,          1,  1,  2,  2) },
+            { TextureFormat.G8R8Sint,                         new FormatInfo(Format.R8G8Sint,          1,  1,  2,  2) },
+            { TextureFormat.R16G16Float,                      new FormatInfo(Format.R16G16Float,       1,  1,  4,  2) },
+            { TextureFormat.R16G16Unorm,                      new FormatInfo(Format.R16G16Unorm,       1,  1,  4,  2) },
+            { TextureFormat.R16G16Snorm,                      new FormatInfo(Format.R16G16Snorm,       1,  1,  4,  2) },
+            { TextureFormat.R16G16Uint,                       new FormatInfo(Format.R16G16Uint,        1,  1,  4,  2) },
+            { TextureFormat.R16G16Sint,                       new FormatInfo(Format.R16G16Sint,        1,  1,  4,  2) },
+            { TextureFormat.R32G32Float,                      new FormatInfo(Format.R32G32Float,       1,  1,  8,  2) },
+            { TextureFormat.R32G32Uint,                       new FormatInfo(Format.R32G32Uint,        1,  1,  8,  2) },
+            { TextureFormat.R32G32Sint,                       new FormatInfo(Format.R32G32Sint,        1,  1,  8,  2) },
+            { TextureFormat.R32G32B32Float,                   new FormatInfo(Format.R32G32B32Float,    1,  1,  12, 3) },
+            { TextureFormat.R32G32B32Uint,                    new FormatInfo(Format.R32G32B32Uint,     1,  1,  12, 3) },
+            { TextureFormat.R32G32B32Sint,                    new FormatInfo(Format.R32G32B32Sint,     1,  1,  12, 3) },
+            { TextureFormat.A8B8G8R8Unorm,                    new FormatInfo(Format.R8G8B8A8Unorm,     1,  1,  4,  4) },
+            { TextureFormat.A8B8G8R8Snorm,                    new FormatInfo(Format.R8G8B8A8Snorm,     1,  1,  4,  4) },
+            { TextureFormat.A8B8G8R8Uint,                     new FormatInfo(Format.R8G8B8A8Uint,      1,  1,  4,  4) },
+            { TextureFormat.A8B8G8R8Sint,                     new FormatInfo(Format.R8G8B8A8Sint,      1,  1,  4,  4) },
+            { TextureFormat.R16G16B16A16Float,                new FormatInfo(Format.R16G16B16A16Float, 1,  1,  8,  4) },
+            { TextureFormat.R16G16B16A16Unorm,                new FormatInfo(Format.R16G16B16A16Unorm, 1,  1,  8,  4) },
+            { TextureFormat.R16G16B16A16Snorm,                new FormatInfo(Format.R16G16B16A16Snorm, 1,  1,  8,  4) },
+            { TextureFormat.R16G16B16A16Uint,                 new FormatInfo(Format.R16G16B16A16Uint,  1,  1,  8,  4) },
+            { TextureFormat.R16G16B16A16Sint,                 new FormatInfo(Format.R16G16B16A16Sint,  1,  1,  8,  4) },
+            { TextureFormat.R32G32B32A32Float,                new FormatInfo(Format.R32G32B32A32Float, 1,  1,  16, 4) },
+            { TextureFormat.R32G32B32A32Uint,                 new FormatInfo(Format.R32G32B32A32Uint,  1,  1,  16, 4) },
+            { TextureFormat.R32G32B32A32Sint,                 new FormatInfo(Format.R32G32B32A32Sint,  1,  1,  16, 4) },
+            { TextureFormat.Z16Unorm,                         new FormatInfo(Format.D16Unorm,          1,  1,  2,  1) },
+            { TextureFormat.Zf32RFloatGUintBUintAUint,        new FormatInfo(Format.D32Float,          1,  1,  4,  1) },
+            { TextureFormat.Zf32Float,                        new FormatInfo(Format.D32Float,          1,  1,  4,  1) },
+            { TextureFormat.G24R8RUintGUnormBUnormAUnorm,     new FormatInfo(Format.D24UnormS8Uint,    1,  1,  4,  2) },
+            { TextureFormat.Z24S8RUintGUnormBUnormAUnorm,     new FormatInfo(Format.D24UnormS8Uint,    1,  1,  4,  2) },
+            { TextureFormat.Z24S8RUintGUnormBUintAUint,       new FormatInfo(Format.D24UnormS8Uint,    1,  1,  4,  2) },
+            { TextureFormat.S8Z24RUnormGUintBUintAUint,       new FormatInfo(Format.S8UintD24Unorm,    1,  1,  4,  2) },
+            { TextureFormat.R32B24G8RFloatGUintBUnormAUnorm,  new FormatInfo(Format.D32FloatS8Uint,    1,  1,  8,  2) },
+            { TextureFormat.Zf32X24S8RFloatGUintBUnormAUnorm, new FormatInfo(Format.D32FloatS8Uint,    1,  1,  8,  2) },
+            { TextureFormat.A8B8G8R8UnormSrgb,                new FormatInfo(Format.R8G8B8A8Srgb,      1,  1,  4,  4) },
+            { TextureFormat.G4R4Unorm,                        new FormatInfo(Format.R4G4Unorm,         1,  1,  1,  2) },
+            { TextureFormat.A4B4G4R4Unorm,                    new FormatInfo(Format.R4G4B4A4Unorm,     1,  1,  2,  4) },
+            { TextureFormat.A1B5G5R5Unorm,                    new FormatInfo(Format.R5G5B5A1Unorm,     1,  1,  2,  4) },
+            { TextureFormat.B5G6R5Unorm,                      new FormatInfo(Format.R5G6B5Unorm,       1,  1,  2,  3) },
+            { TextureFormat.A2B10G10R10Unorm,                 new FormatInfo(Format.R10G10B10A2Unorm,  1,  1,  4,  4) },
+            { TextureFormat.A2B10G10R10Uint,                  new FormatInfo(Format.R10G10B10A2Uint,   1,  1,  4,  4) },
+            { TextureFormat.Bf10Gf11Rf11Float,                new FormatInfo(Format.R11G11B10Float,    1,  1,  4,  3) },
+            { TextureFormat.E5B9G9R9SharedExpFloat,           new FormatInfo(Format.R9G9B9E5Float,     1,  1,  4,  4) },
+            { TextureFormat.Bc1Unorm,                         new FormatInfo(Format.Bc1RgbaUnorm,      4,  4,  8,  4) },
+            { TextureFormat.Bc2Unorm,                         new FormatInfo(Format.Bc2Unorm,          4,  4,  16, 4) },
+            { TextureFormat.Bc3Unorm,                         new FormatInfo(Format.Bc3Unorm,          4,  4,  16, 4) },
+            { TextureFormat.Bc1UnormSrgb,                     new FormatInfo(Format.Bc1RgbaSrgb,       4,  4,  8,  4) },
+            { TextureFormat.Bc2UnormSrgb,                     new FormatInfo(Format.Bc2Srgb,           4,  4,  16, 4) },
+            { TextureFormat.Bc3UnormSrgb,                     new FormatInfo(Format.Bc3Srgb,           4,  4,  16, 4) },
+            { TextureFormat.Bc4Unorm,                         new FormatInfo(Format.Bc4Unorm,          4,  4,  8,  1) },
+            { TextureFormat.Bc4Snorm,                         new FormatInfo(Format.Bc4Snorm,          4,  4,  8,  1) },
+            { TextureFormat.Bc5Unorm,                         new FormatInfo(Format.Bc5Unorm,          4,  4,  16, 2) },
+            { TextureFormat.Bc5Snorm,                         new FormatInfo(Format.Bc5Snorm,          4,  4,  16, 2) },
+            { TextureFormat.Bc7UUnorm,                        new FormatInfo(Format.Bc7Unorm,          4,  4,  16, 4) },
+            { TextureFormat.Bc7UUnormSrgb,                    new FormatInfo(Format.Bc7Srgb,           4,  4,  16, 4) },
+            { TextureFormat.Bc6HSf16Float,                    new FormatInfo(Format.Bc6HSfloat,        4,  4,  16, 4) },
+            { TextureFormat.Bc6HUf16Float,                    new FormatInfo(Format.Bc6HUfloat,        4,  4,  16, 4) },
+            { TextureFormat.Etc2RgbUnorm,                     new FormatInfo(Format.Etc2RgbUnorm,      4,  4,  8,  3) },
+            { TextureFormat.Etc2RgbaUnorm,                    new FormatInfo(Format.Etc2RgbaUnorm,     4,  4,  16, 4) },
+            { TextureFormat.Etc2RgbUnormSrgb,                 new FormatInfo(Format.Etc2RgbSrgb,       4,  4,  8,  3) },
+            { TextureFormat.Etc2RgbaUnormSrgb,                new FormatInfo(Format.Etc2RgbaSrgb,      4,  4,  16, 4) },
+            { TextureFormat.Astc2D4x4Unorm,                   new FormatInfo(Format.Astc4x4Unorm,      4,  4,  16, 4) },
+            { TextureFormat.Astc2D5x4Unorm,                   new FormatInfo(Format.Astc5x4Unorm,      5,  4,  16, 4) },
+            { TextureFormat.Astc2D5x5Unorm,                   new FormatInfo(Format.Astc5x5Unorm,      5,  5,  16, 4) },
+            { TextureFormat.Astc2D6x5Unorm,                   new FormatInfo(Format.Astc6x5Unorm,      6,  5,  16, 4) },
+            { TextureFormat.Astc2D6x6Unorm,                   new FormatInfo(Format.Astc6x6Unorm,      6,  6,  16, 4) },
+            { TextureFormat.Astc2D8x5Unorm,                   new FormatInfo(Format.Astc8x5Unorm,      8,  5,  16, 4) },
+            { TextureFormat.Astc2D8x6Unorm,                   new FormatInfo(Format.Astc8x6Unorm,      8,  6,  16, 4) },
+            { TextureFormat.Astc2D8x8Unorm,                   new FormatInfo(Format.Astc8x8Unorm,      8,  8,  16, 4) },
+            { TextureFormat.Astc2D10x5Unorm,                  new FormatInfo(Format.Astc10x5Unorm,     10, 5,  16, 4) },
+            { TextureFormat.Astc2D10x6Unorm,                  new FormatInfo(Format.Astc10x6Unorm,     10, 6,  16, 4) },
+            { TextureFormat.Astc2D10x8Unorm,                  new FormatInfo(Format.Astc10x8Unorm,     10, 8,  16, 4) },
+            { TextureFormat.Astc2D10x10Unorm,                 new FormatInfo(Format.Astc10x10Unorm,    10, 10, 16, 4) },
+            { TextureFormat.Astc2D12x10Unorm,                 new FormatInfo(Format.Astc12x10Unorm,    12, 10, 16, 4) },
+            { TextureFormat.Astc2D12x12Unorm,                 new FormatInfo(Format.Astc12x12Unorm,    12, 12, 16, 4) },
+            { TextureFormat.Astc2D4x4UnormSrgb,               new FormatInfo(Format.Astc4x4Srgb,       4,  4,  16, 4) },
+            { TextureFormat.Astc2D5x4UnormSrgb,               new FormatInfo(Format.Astc5x4Srgb,       5,  4,  16, 4) },
+            { TextureFormat.Astc2D5x5UnormSrgb,               new FormatInfo(Format.Astc5x5Srgb,       5,  5,  16, 4) },
+            { TextureFormat.Astc2D6x5UnormSrgb,               new FormatInfo(Format.Astc6x5Srgb,       6,  5,  16, 4) },
+            { TextureFormat.Astc2D6x6UnormSrgb,               new FormatInfo(Format.Astc6x6Srgb,       6,  6,  16, 4) },
+            { TextureFormat.Astc2D8x5UnormSrgb,               new FormatInfo(Format.Astc8x5Srgb,       8,  5,  16, 4) },
+            { TextureFormat.Astc2D8x6UnormSrgb,               new FormatInfo(Format.Astc8x6Srgb,       8,  6,  16, 4) },
+            { TextureFormat.Astc2D8x8UnormSrgb,               new FormatInfo(Format.Astc8x8Srgb,       8,  8,  16, 4) },
+            { TextureFormat.Astc2D10x5UnormSrgb,              new FormatInfo(Format.Astc10x5Srgb,      10, 5,  16, 4) },
+            { TextureFormat.Astc2D10x6UnormSrgb,              new FormatInfo(Format.Astc10x6Srgb,      10, 6,  16, 4) },
+            { TextureFormat.Astc2D10x8UnormSrgb,              new FormatInfo(Format.Astc10x8Srgb,      10, 8,  16, 4) },
+            { TextureFormat.Astc2D10x10UnormSrgb,             new FormatInfo(Format.Astc10x10Srgb,     10, 10, 16, 4) },
+            { TextureFormat.Astc2D12x10UnormSrgb,             new FormatInfo(Format.Astc12x10Srgb,     12, 10, 16, 4) },
+            { TextureFormat.Astc2D12x12UnormSrgb,             new FormatInfo(Format.Astc12x12Srgb,     12, 12, 16, 4) },
+            { TextureFormat.A5B5G5R1Unorm,                    new FormatInfo(Format.A1B5G5R5Unorm,     1,  1,  2,  4) }
         };
 
-        private static Dictionary<ulong, Format> _attribFormats = new Dictionary<ulong, Format>()
+        private static readonly Dictionary<VertexAttributeFormat, Format> _attribFormats = new Dictionary<VertexAttributeFormat, Format>()
         {
-            { 0x13a00000, Format.R8Unorm             },
-            { 0x0ba00000, Format.R8Snorm             },
-            { 0x23a00000, Format.R8Uint              },
-            { 0x1ba00000, Format.R8Sint              },
-            { 0x3b600000, Format.R16Float            },
-            { 0x13600000, Format.R16Unorm            },
-            { 0x0b600000, Format.R16Snorm            },
-            { 0x23600000, Format.R16Uint             },
-            { 0x1b600000, Format.R16Sint             },
-            { 0x3a400000, Format.R32Float            },
-            { 0x22400000, Format.R32Uint             },
-            { 0x1a400000, Format.R32Sint             },
-            { 0x13000000, Format.R8G8Unorm           },
-            { 0x0b000000, Format.R8G8Snorm           },
-            { 0x23000000, Format.R8G8Uint            },
-            { 0x1b000000, Format.R8G8Sint            },
-            { 0x39e00000, Format.R16G16Float         },
-            { 0x11e00000, Format.R16G16Unorm         },
-            { 0x09e00000, Format.R16G16Snorm         },
-            { 0x21e00000, Format.R16G16Uint          },
-            { 0x19e00000, Format.R16G16Sint          },
-            { 0x38800000, Format.R32G32Float         },
-            { 0x20800000, Format.R32G32Uint          },
-            { 0x18800000, Format.R32G32Sint          },
-            { 0x12600000, Format.R8G8B8Unorm         },
-            { 0x0a600000, Format.R8G8B8Snorm         },
-            { 0x22600000, Format.R8G8B8Uint          },
-            { 0x1a600000, Format.R8G8B8Sint          },
-            { 0x38a00000, Format.R16G16B16Float      },
-            { 0x10a00000, Format.R16G16B16Unorm      },
-            { 0x08a00000, Format.R16G16B16Snorm      },
-            { 0x20a00000, Format.R16G16B16Uint       },
-            { 0x18a00000, Format.R16G16B16Sint       },
-            { 0x38400000, Format.R32G32B32Float      },
-            { 0x20400000, Format.R32G32B32Uint       },
-            { 0x18400000, Format.R32G32B32Sint       },
-            { 0x11400000, Format.R8G8B8A8Unorm       },
-            { 0x09400000, Format.R8G8B8A8Snorm       },
-            { 0x21400000, Format.R8G8B8A8Uint        },
-            { 0x19400000, Format.R8G8B8A8Sint        },
-            { 0x38600000, Format.R16G16B16A16Float   },
-            { 0x10600000, Format.R16G16B16A16Unorm   },
-            { 0x08600000, Format.R16G16B16A16Snorm   },
-            { 0x20600000, Format.R16G16B16A16Uint    },
-            { 0x18600000, Format.R16G16B16A16Sint    },
-            { 0x38200000, Format.R32G32B32A32Float   },
-            { 0x20200000, Format.R32G32B32A32Uint    },
-            { 0x18200000, Format.R32G32B32A32Sint    },
-            { 0x16000000, Format.R10G10B10A2Unorm    },
-            { 0x26000000, Format.R10G10B10A2Uint     },
-            { 0x3e200000, Format.R11G11B10Float      },
-            { 0x2ba00000, Format.R8Uscaled           },
-            { 0x33a00000, Format.R8Sscaled           },
-            { 0x2b600000, Format.R16Uscaled          },
-            { 0x33600000, Format.R16Sscaled          },
-            { 0x2a400000, Format.R32Uscaled          },
-            { 0x32400000, Format.R32Sscaled          },
-            { 0x2b000000, Format.R8G8Uscaled         },
-            { 0x33000000, Format.R8G8Sscaled         },
-            { 0x29e00000, Format.R16G16Uscaled       },
-            { 0x31e00000, Format.R16G16Sscaled       },
-            { 0x28800000, Format.R32G32Uscaled       },
-            { 0x30800000, Format.R32G32Sscaled       },
-            { 0x2a600000, Format.R8G8B8Uscaled       },
-            { 0x32600000, Format.R8G8B8Sscaled       },
-            { 0x28a00000, Format.R16G16B16Uscaled    },
-            { 0x30a00000, Format.R16G16B16Sscaled    },
-            { 0x28400000, Format.R32G32B32Uscaled    },
-            { 0x30400000, Format.R32G32B32Sscaled    },
-            { 0x29400000, Format.R8G8B8A8Uscaled     },
-            { 0x31400000, Format.R8G8B8A8Sscaled     },
-            { 0x28600000, Format.R16G16B16A16Uscaled },
-            { 0x30600000, Format.R16G16B16A16Sscaled },
-            { 0x28200000, Format.R32G32B32A32Uscaled },
-            { 0x30200000, Format.R32G32B32A32Sscaled },
-            { 0x0e000000, Format.R10G10B10A2Snorm    },
-            { 0x1e000000, Format.R10G10B10A2Sint     },
-            { 0x2e000000, Format.R10G10B10A2Uscaled  },
-            { 0x36000000, Format.R10G10B10A2Sscaled  }
+            { VertexAttributeFormat.R8Unorm,             Format.R8Unorm             },
+            { VertexAttributeFormat.R8Snorm,             Format.R8Snorm             },
+            { VertexAttributeFormat.R8Uint,              Format.R8Uint              },
+            { VertexAttributeFormat.R8Sint,              Format.R8Sint              },
+            { VertexAttributeFormat.R16Float,            Format.R16Float            },
+            { VertexAttributeFormat.R16Unorm,            Format.R16Unorm            },
+            { VertexAttributeFormat.R16Snorm,            Format.R16Snorm            },
+            { VertexAttributeFormat.R16Uint,             Format.R16Uint             },
+            { VertexAttributeFormat.R16Sint,             Format.R16Sint             },
+            { VertexAttributeFormat.R32Float,            Format.R32Float            },
+            { VertexAttributeFormat.R32Uint,             Format.R32Uint             },
+            { VertexAttributeFormat.R32Sint,             Format.R32Sint             },
+            { VertexAttributeFormat.R8G8Unorm,           Format.R8G8Unorm           },
+            { VertexAttributeFormat.R8G8Snorm,           Format.R8G8Snorm           },
+            { VertexAttributeFormat.R8G8Uint,            Format.R8G8Uint            },
+            { VertexAttributeFormat.R8G8Sint,            Format.R8G8Sint            },
+            { VertexAttributeFormat.R16G16Float,         Format.R16G16Float         },
+            { VertexAttributeFormat.R16G16Unorm,         Format.R16G16Unorm         },
+            { VertexAttributeFormat.R16G16Snorm,         Format.R16G16Snorm         },
+            { VertexAttributeFormat.R16G16Uint,          Format.R16G16Uint          },
+            { VertexAttributeFormat.R16G16Sint,          Format.R16G16Sint          },
+            { VertexAttributeFormat.R32G32Float,         Format.R32G32Float         },
+            { VertexAttributeFormat.R32G32Uint,          Format.R32G32Uint          },
+            { VertexAttributeFormat.R32G32Sint,          Format.R32G32Sint          },
+            { VertexAttributeFormat.R8G8B8Unorm,         Format.R8G8B8Unorm         },
+            { VertexAttributeFormat.R8G8B8Snorm,         Format.R8G8B8Snorm         },
+            { VertexAttributeFormat.R8G8B8Uint,          Format.R8G8B8Uint          },
+            { VertexAttributeFormat.R8G8B8Sint,          Format.R8G8B8Sint          },
+            { VertexAttributeFormat.R16G16B16Float,      Format.R16G16B16Float      },
+            { VertexAttributeFormat.R16G16B16Unorm,      Format.R16G16B16Unorm      },
+            { VertexAttributeFormat.R16G16B16Snorm,      Format.R16G16B16Snorm      },
+            { VertexAttributeFormat.R16G16B16Uint,       Format.R16G16B16Uint       },
+            { VertexAttributeFormat.R16G16B16Sint,       Format.R16G16B16Sint       },
+            { VertexAttributeFormat.R32G32B32Float,      Format.R32G32B32Float      },
+            { VertexAttributeFormat.R32G32B32Uint,       Format.R32G32B32Uint       },
+            { VertexAttributeFormat.R32G32B32Sint,       Format.R32G32B32Sint       },
+            { VertexAttributeFormat.R8G8B8A8Unorm,       Format.R8G8B8A8Unorm       },
+            { VertexAttributeFormat.R8G8B8A8Snorm,       Format.R8G8B8A8Snorm       },
+            { VertexAttributeFormat.R8G8B8A8Uint,        Format.R8G8B8A8Uint        },
+            { VertexAttributeFormat.R8G8B8A8Sint,        Format.R8G8B8A8Sint        },
+            { VertexAttributeFormat.R16G16B16A16Float,   Format.R16G16B16A16Float   },
+            { VertexAttributeFormat.R16G16B16A16Unorm,   Format.R16G16B16A16Unorm   },
+            { VertexAttributeFormat.R16G16B16A16Snorm,   Format.R16G16B16A16Snorm   },
+            { VertexAttributeFormat.R16G16B16A16Uint,    Format.R16G16B16A16Uint    },
+            { VertexAttributeFormat.R16G16B16A16Sint,    Format.R16G16B16A16Sint    },
+            { VertexAttributeFormat.R32G32B32A32Float,   Format.R32G32B32A32Float   },
+            { VertexAttributeFormat.R32G32B32A32Uint,    Format.R32G32B32A32Uint    },
+            { VertexAttributeFormat.R32G32B32A32Sint,    Format.R32G32B32A32Sint    },
+            { VertexAttributeFormat.A2B10G10R10Unorm,    Format.R10G10B10A2Unorm    },
+            { VertexAttributeFormat.A2B10G10R10Uint,     Format.R10G10B10A2Uint     },
+            { VertexAttributeFormat.B10G11R11Float,      Format.R11G11B10Float      },
+            { VertexAttributeFormat.R8Uscaled,           Format.R8Uscaled           },
+            { VertexAttributeFormat.R8Sscaled,           Format.R8Sscaled           },
+            { VertexAttributeFormat.R16Uscaled,          Format.R16Uscaled          },
+            { VertexAttributeFormat.R16Sscaled,          Format.R16Sscaled          },
+            { VertexAttributeFormat.R32Uscaled,          Format.R32Uscaled          },
+            { VertexAttributeFormat.R32Sscaled,          Format.R32Sscaled          },
+            { VertexAttributeFormat.R8G8Uscaled,         Format.R8G8Uscaled         },
+            { VertexAttributeFormat.R8G8Sscaled,         Format.R8G8Sscaled         },
+            { VertexAttributeFormat.R16G16Uscaled,       Format.R16G16Uscaled       },
+            { VertexAttributeFormat.R16G16Sscaled,       Format.R16G16Sscaled       },
+            { VertexAttributeFormat.R32G32Uscaled,       Format.R32G32Uscaled       },
+            { VertexAttributeFormat.R32G32Sscaled,       Format.R32G32Sscaled       },
+            { VertexAttributeFormat.R8G8B8Uscaled,       Format.R8G8B8Uscaled       },
+            { VertexAttributeFormat.R8G8B8Sscaled,       Format.R8G8B8Sscaled       },
+            { VertexAttributeFormat.R16G16B16Uscaled,    Format.R16G16B16Uscaled    },
+            { VertexAttributeFormat.R16G16B16Sscaled,    Format.R16G16B16Sscaled    },
+            { VertexAttributeFormat.R32G32B32Uscaled,    Format.R32G32B32Uscaled    },
+            { VertexAttributeFormat.R32G32B32Sscaled,    Format.R32G32B32Sscaled    },
+            { VertexAttributeFormat.R8G8B8A8Uscaled,     Format.R8G8B8A8Uscaled     },
+            { VertexAttributeFormat.R8G8B8A8Sscaled,     Format.R8G8B8A8Sscaled     },
+            { VertexAttributeFormat.R16G16B16A16Uscaled, Format.R16G16B16A16Uscaled },
+            { VertexAttributeFormat.R16G16B16A16Sscaled, Format.R16G16B16A16Sscaled },
+            { VertexAttributeFormat.R32G32B32A32Uscaled, Format.R32G32B32A32Uscaled },
+            { VertexAttributeFormat.R32G32B32A32Sscaled, Format.R32G32B32A32Sscaled },
+            { VertexAttributeFormat.A2B10G10R10Snorm,    Format.R10G10B10A2Snorm    },
+            { VertexAttributeFormat.A2B10G10R10Sint,     Format.R10G10B10A2Sint     },
+            { VertexAttributeFormat.A2B10G10R10Uscaled,  Format.R10G10B10A2Uscaled  },
+            { VertexAttributeFormat.A2B10G10R10Sscaled,  Format.R10G10B10A2Sscaled  }
         };
 
         /// <summary>
@@ -210,7 +557,7 @@ namespace Ryujinx.Graphics.Gpu.Image
         {
             encoded |= (isSrgb ? 1u << 19 : 0u);
 
-            return _textureFormats.TryGetValue(encoded, out format);
+            return _textureFormats.TryGetValue((TextureFormat)encoded, out format);
         }
 
         /// <summary>
@@ -221,7 +568,7 @@ namespace Ryujinx.Graphics.Gpu.Image
         /// <returns>True if the format is valid, false otherwise</returns>
         public static bool TryGetAttribFormat(uint encoded, out Format format)
         {
-            return _attribFormats.TryGetValue(encoded, out format);
+            return _attribFormats.TryGetValue((VertexAttributeFormat)encoded, out format);
         }
     }
 }
\ No newline at end of file