diff --git a/Ryujinx.Common/StructIOExtension.cs b/Ryujinx.Common/StructIOExtension.cs
new file mode 100644
index 0000000000..8671b1920b
--- /dev/null
+++ b/Ryujinx.Common/StructIOExtension.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace Ryujinx.Common
+{
+    public static class StructIOExtension
+    {
+        public unsafe static T ReadStruct<T>(this BinaryReader reader) where T : struct
+        {
+            int size = Marshal.SizeOf<T>();
+
+            byte[] data = reader.ReadBytes(size);
+
+            fixed (byte* ptr = data)
+            {
+                return Marshal.PtrToStructure<T>((IntPtr)ptr);
+            }
+        }
+
+        public unsafe static void WriteStruct<T>(this BinaryWriter writer, T value) where T : struct
+        {
+            long size = Marshal.SizeOf<T>();
+
+            byte[] data = new byte[size];
+
+            fixed (byte* ptr = data)
+            {
+                Marshal.StructureToPtr<T>(value, (IntPtr)ptr, false);
+            }
+
+            writer.Write(data);
+        }
+    }
+}
diff --git a/Ryujinx.Graphics/Gal/GalImageFormat.cs b/Ryujinx.Graphics/Gal/GalImageFormat.cs
index 83c7f5697b..70998d1113 100644
--- a/Ryujinx.Graphics/Gal/GalImageFormat.cs
+++ b/Ryujinx.Graphics/Gal/GalImageFormat.cs
@@ -24,6 +24,7 @@ namespace Ryujinx.Graphics.Gal
 
         RGBA4,
         RGB565,
+        BGR565,
         BGR5A1,
         RGB5A1,
         R8,
diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs
index 38b00d49ea..f2afe7b556 100644
--- a/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs
+++ b/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs
@@ -157,6 +157,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
                 case GalImageFormat.BGR5A1    | GalImageFormat.Unorm: return (PixelInternalFormat.Rgb5A1,       PixelFormat.Rgba,        PixelType.UnsignedShort5551);
                 case GalImageFormat.RGB5A1    | GalImageFormat.Unorm: return (PixelInternalFormat.Rgb5A1,       PixelFormat.Rgba,        PixelType.UnsignedShort1555Reversed);
                 case GalImageFormat.RGB565    | GalImageFormat.Unorm: return (PixelInternalFormat.Rgba,         PixelFormat.Rgb,         PixelType.UnsignedShort565Reversed);
+                case GalImageFormat.BGR565    | GalImageFormat.Unorm: return (PixelInternalFormat.Rgba,         PixelFormat.Rgb,         PixelType.UnsignedShort565);
                 case GalImageFormat.RG16      | GalImageFormat.Float: return (PixelInternalFormat.Rg16f,        PixelFormat.Rg,          PixelType.HalfFloat);
                 case GalImageFormat.RG16      | GalImageFormat.Sint:  return (PixelInternalFormat.Rg16i,        PixelFormat.RgInteger,   PixelType.Short);
                 case GalImageFormat.RG16      | GalImageFormat.Snorm: return (PixelInternalFormat.Rg16Snorm,    PixelFormat.Rg,          PixelType.Short);
diff --git a/Ryujinx.Graphics/Graphics3d/Texture/ImageUtils.cs b/Ryujinx.Graphics/Graphics3d/Texture/ImageUtils.cs
index 6fff7f7013..f958e1de81 100644
--- a/Ryujinx.Graphics/Graphics3d/Texture/ImageUtils.cs
+++ b/Ryujinx.Graphics/Graphics3d/Texture/ImageUtils.cs
@@ -106,6 +106,7 @@ namespace Ryujinx.Graphics.Texture
             { GalImageFormat.BGR5A1,      new ImageDescriptor(2,  1,  1,  TargetBuffer.Color) },
             { GalImageFormat.RGB5A1,      new ImageDescriptor(2,  1,  1,  TargetBuffer.Color) },
             { GalImageFormat.RGB565,      new ImageDescriptor(2,  1,  1,  TargetBuffer.Color) },
+            { GalImageFormat.BGR565,      new ImageDescriptor(2,  1,  1,  TargetBuffer.Color) },
             { GalImageFormat.BptcUnorm,   new ImageDescriptor(16, 4,  4,  TargetBuffer.Color) },
             { GalImageFormat.RG16,        new ImageDescriptor(4,  1,  1,  TargetBuffer.Color) },
             { GalImageFormat.RG8,         new ImageDescriptor(2,  1,  1,  TargetBuffer.Color) },
diff --git a/Ryujinx.HLE/HOS/Services/Vi/ColorFormat.cs b/Ryujinx.HLE/HOS/Services/Vi/ColorFormat.cs
new file mode 100644
index 0000000000..d4fc6adc10
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Services/Vi/ColorFormat.cs
@@ -0,0 +1,366 @@
+namespace Ryujinx.HLE.HOS.Services.Android
+{
+    class ColorShift
+    {
+        public const int Swizzle   = 16;
+        public const int DataType  = 14;
+        // FIXME: check this one
+        public const int Space     = 32;
+        public const int Component = 8;
+    }
+
+    enum ColorSwizzle
+    {
+        XYZW = 0x688 << ColorShift.Swizzle,
+        ZYXW = 0x60a << ColorShift.Swizzle,
+        WZYX = 0x053 << ColorShift.Swizzle,
+        YZWX = 0x0d1 << ColorShift.Swizzle,
+        XYZ1 = 0xa88 << ColorShift.Swizzle,
+        YZW1 = 0xad1 << ColorShift.Swizzle,
+        XXX1 = 0xa00 << ColorShift.Swizzle,
+        XZY1 = 0xa50 << ColorShift.Swizzle,
+        ZYX1 = 0xa0a << ColorShift.Swizzle,
+        WZY1 = 0xa53 << ColorShift.Swizzle,
+        X000 = 0x920 << ColorShift.Swizzle,
+        Y000 = 0x921 << ColorShift.Swizzle,
+        XY01 = 0xb08 << ColorShift.Swizzle,
+        X001 = 0xb20 << ColorShift.Swizzle,
+        X00X = 0x121 << ColorShift.Swizzle,
+        X00Y = 0x320 << ColorShift.Swizzle,
+       _0YX0 = 0x80c << ColorShift.Swizzle,
+       _0ZY0 = 0x814 << ColorShift.Swizzle,
+       _0XZ0 = 0x884 << ColorShift.Swizzle,
+       _0X00 = 0x904 << ColorShift.Swizzle,
+       _00X0 = 0x824 << ColorShift.Swizzle,
+       _000X = 0x124 << ColorShift.Swizzle,
+       _0XY0 = 0x844 << ColorShift.Swizzle,
+        XXXY = 0x200 << ColorShift.Swizzle,
+        YYYX = 0x049 << ColorShift.Swizzle
+    }
+
+    enum ColorBytePerPixel
+    {
+        Bpp1   = 1,
+        Bpp2   = 2,
+        Bpp4   = 4,
+        Bpp8   = 8,
+        Bpp16  = 16,
+        Bpp24  = 24,
+        Bpp32  = 32,
+        Bpp48  = 48,
+        Bpp64  = 64,
+        Bpp96  = 96,
+        Bpp128 = 128
+    }
+
+    enum ColorComponent : uint
+    {
+        X1           = (0x01 << ColorShift.Component) | ColorBytePerPixel.Bpp1,
+        X2           = (0x02 << ColorShift.Component) | ColorBytePerPixel.Bpp2,
+        X4           = (0x03 << ColorShift.Component) | ColorBytePerPixel.Bpp4,
+        X8           = (0x04 << ColorShift.Component) | ColorBytePerPixel.Bpp8,
+        Y4X4         = (0x05 << ColorShift.Component) | ColorBytePerPixel.Bpp8,
+        X3Y3Z2       = (0x06 << ColorShift.Component) | ColorBytePerPixel.Bpp8,
+        X8Y8         = (0x07 << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        X8Y8X8Z8     = (0x08 << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        Y8X8Z8X8     = (0x09 << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        X16          = (0x0A << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        Y2X14        = (0x0B << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        Y4X12        = (0x0C << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        Y6X10        = (0x0D << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        Y8X8         = (0x0E << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        X10          = (0x0F << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        X12          = (0x10 << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        Z5Y5X6       = (0x11 << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        X5Y6Z5       = (0x12 << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        X6Y5Z5       = (0x13 << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        X1Y5Z5W5     = (0x14 << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        X4Y4Z4W4     = (0x15 << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        X5Y1Z5W5     = (0x16 << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        X5Y5Z1W5     = (0x17 << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        X5Y5Z5W1     = (0x18 << ColorShift.Component) | ColorBytePerPixel.Bpp16,
+        X8Y8Z8       = (0x19 << ColorShift.Component) | ColorBytePerPixel.Bpp24,
+        X24          = (0x1A << ColorShift.Component) | ColorBytePerPixel.Bpp24,
+        X32          = (0x1C << ColorShift.Component) | ColorBytePerPixel.Bpp32,
+        X16Y16       = (0x1D << ColorShift.Component) | ColorBytePerPixel.Bpp32,
+        X11Y11Z10    = (0x1E << ColorShift.Component) | ColorBytePerPixel.Bpp32,
+        X2Y10Z10W10  = (0x20 << ColorShift.Component) | ColorBytePerPixel.Bpp32,
+        X8Y8Z8W8     = (0x21 << ColorShift.Component) | ColorBytePerPixel.Bpp32,
+        Y10X10       = (0x22 << ColorShift.Component) | ColorBytePerPixel.Bpp32,
+        X10Y10Z10W2  = (0x23 << ColorShift.Component) | ColorBytePerPixel.Bpp32,
+        Y12X12       = (0x24 << ColorShift.Component) | ColorBytePerPixel.Bpp32,
+        X20Y20Z20    = (0x26 << ColorShift.Component) | ColorBytePerPixel.Bpp64,
+        X16Y16Z16W16 = (0x27 << ColorShift.Component) | ColorBytePerPixel.Bpp64,
+    }
+
+    enum ColorDataType
+    {
+        Integer = 0x0 << ColorShift.DataType,
+        Float   = 0x1 << ColorShift.DataType,
+        Stencil = 0x2 << ColorShift.DataType
+    }
+
+    enum ColorSpace : ulong
+    {
+        NonColor    = 0x0L << ColorShift.Space,
+        LinearRGBA  = 0x1L << ColorShift.Space,
+        SRGB        = 0x2L << ColorShift.Space,
+
+        Unknown3    = 0x3L << ColorShift.Space,
+        Unknown4    = 0x4L << ColorShift.Space,
+        Unknown5    = 0x5L << ColorShift.Space,
+        Unknown6    = 0x6L << ColorShift.Space,
+        Unknown7    = 0x7L << ColorShift.Space,
+        Unknown8    = 0x8L << ColorShift.Space,
+
+        ColorIndex  = 0x9L << ColorShift.Space,
+        YCbCr601    = 0xAL << ColorShift.Space,
+        YCbCr601_RR = 0xBL << ColorShift.Space,
+
+        UnknownC    = 0xCL << ColorShift.Space,
+
+        YCbCr709    = 0xDL << ColorShift.Space,
+
+        UnknownE    = 0xEL << ColorShift.Space,
+
+        BayerRGGB   = 0x10L << ColorShift.Space,
+        BayerBGGR   = 0x11L << ColorShift.Space,
+        BayerGRBG   = 0x12L << ColorShift.Space,
+        BayerGBRG   = 0x13L << ColorShift.Space,
+
+        Unknown14   = 0x14L << ColorShift.Space,
+    }
+
+    enum ColorFormat : ulong
+    {
+        NonColor8                       = ColorSpace.NonColor    | ColorSwizzle.X000  | ColorComponent.X8           | ColorDataType.Integer,
+        NonColor16                      = ColorSpace.NonColor    | ColorSwizzle.X000  | ColorComponent.X16          | ColorDataType.Integer,
+        NonColor24                      = ColorSpace.NonColor    | ColorSwizzle.X000  | ColorComponent.X24          | ColorDataType.Integer,
+        NonColor32                      = ColorSpace.NonColor    | ColorSwizzle.X000  | ColorComponent.X32          | ColorDataType.Integer,
+        X4C4                            = ColorSpace.NonColor    | ColorSwizzle.Y000  | ColorComponent.Y4X4         | ColorDataType.Integer,
+        A4L4                            = ColorSpace.LinearRGBA  | ColorSwizzle.YYYX  | ColorComponent.Y4X4         | ColorDataType.Integer,
+        A8L8                            = ColorSpace.LinearRGBA  | ColorSwizzle.YYYX  | ColorComponent.Y8X8         | ColorDataType.Integer,
+        Float_A16L16                    = ColorSpace.LinearRGBA  | ColorSwizzle.YYYX  | ColorComponent.X16Y16       | ColorDataType.Float,
+        A1B5G5R5                        = ColorSpace.LinearRGBA  | ColorSwizzle.WZYX  | ColorComponent.X1Y5Z5W5     | ColorDataType.Integer,
+        A4B4G4R4                        = ColorSpace.LinearRGBA  | ColorSwizzle.WZYX  | ColorComponent.X4Y4Z4W4     | ColorDataType.Integer,
+        A5B5G5R1                        = ColorSpace.LinearRGBA  | ColorSwizzle.WZYX  | ColorComponent.X5Y5Z5W1     | ColorDataType.Integer,
+        A2B10G10R10                     = ColorSpace.LinearRGBA  | ColorSwizzle.WZYX  | ColorComponent.X2Y10Z10W10  | ColorDataType.Integer,
+        A8B8G8R8                        = ColorSpace.LinearRGBA  | ColorSwizzle.WZYX  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        A16B16G16R16                    = ColorSpace.LinearRGBA  | ColorSwizzle.WZYX  | ColorComponent.X16Y16Z16W16 | ColorDataType.Integer,
+        Float_A16B16G16R16              = ColorSpace.LinearRGBA  | ColorSwizzle.WZYX  | ColorComponent.X16Y16Z16W16 | ColorDataType.Float,
+        A1R5G5B5                        = ColorSpace.LinearRGBA  | ColorSwizzle.YZWX  | ColorComponent.X1Y5Z5W5     | ColorDataType.Integer,
+        A4R4G4B4                        = ColorSpace.LinearRGBA  | ColorSwizzle.YZWX  | ColorComponent.X4Y4Z4W4     | ColorDataType.Integer,
+        A5R1G5B5                        = ColorSpace.LinearRGBA  | ColorSwizzle.YZWX  | ColorComponent.X5Y1Z5W5     | ColorDataType.Integer,
+        A2R10G10B10                     = ColorSpace.LinearRGBA  | ColorSwizzle.YZWX  | ColorComponent.X2Y10Z10W10  | ColorDataType.Integer,
+        A8R8G8B8                        = ColorSpace.LinearRGBA  | ColorSwizzle.YZWX  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        A1                              = ColorSpace.LinearRGBA  | ColorSwizzle._000X | ColorComponent.X1           | ColorDataType.Integer,
+        A2                              = ColorSpace.LinearRGBA  | ColorSwizzle._000X | ColorComponent.X2           | ColorDataType.Integer,
+        A4                              = ColorSpace.LinearRGBA  | ColorSwizzle._000X | ColorComponent.X4           | ColorDataType.Integer,
+        A8                              = ColorSpace.LinearRGBA  | ColorSwizzle._000X | ColorComponent.X8           | ColorDataType.Integer,
+        A16                             = ColorSpace.LinearRGBA  | ColorSwizzle._000X | ColorComponent.X16          | ColorDataType.Integer,
+        A32                             = ColorSpace.LinearRGBA  | ColorSwizzle._000X | ColorComponent.X32          | ColorDataType.Integer,
+        Float_A16                       = ColorSpace.LinearRGBA  | ColorSwizzle._000X | ColorComponent.X16          | ColorDataType.Float,
+        L4A4                            = ColorSpace.LinearRGBA  | ColorSwizzle.XXXY  | ColorComponent.Y4X4         | ColorDataType.Integer,
+        L8A8                            = ColorSpace.LinearRGBA  | ColorSwizzle.XXXY  | ColorComponent.Y8X8         | ColorDataType.Integer,
+        B4G4R4A4                        = ColorSpace.LinearRGBA  | ColorSwizzle.ZYXW  | ColorComponent.X4Y4Z4W4     | ColorDataType.Integer,
+        B5G5R1A5                        = ColorSpace.LinearRGBA  | ColorSwizzle.ZYXW  | ColorComponent.X5Y5Z1W5     | ColorDataType.Integer,
+        B5G5R5A1                        = ColorSpace.LinearRGBA  | ColorSwizzle.ZYXW  | ColorComponent.X5Y5Z5W1     | ColorDataType.Integer,
+        B8G8R8A8                        = ColorSpace.LinearRGBA  | ColorSwizzle.ZYXW  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        B10G10R10A2                     = ColorSpace.LinearRGBA  | ColorSwizzle.ZYXW  | ColorComponent.X10Y10Z10W2  | ColorDataType.Integer,
+        R1G5B5A5                        = ColorSpace.LinearRGBA  | ColorSwizzle.XYZW  | ColorComponent.X1Y5Z5W5     | ColorDataType.Integer,
+        R4G4B4A4                        = ColorSpace.LinearRGBA  | ColorSwizzle.XYZW  | ColorComponent.X4Y4Z4W4     | ColorDataType.Integer,
+        R5G5B5A1                        = ColorSpace.LinearRGBA  | ColorSwizzle.XYZW  | ColorComponent.X5Y5Z5W1     | ColorDataType.Integer,
+        R8G8B8A8                        = ColorSpace.LinearRGBA  | ColorSwizzle.XYZW  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        R10G10B10A2                     = ColorSpace.LinearRGBA  | ColorSwizzle.XYZW  | ColorComponent.X10Y10Z10W2  | ColorDataType.Integer,
+        L1                              = ColorSpace.LinearRGBA  | ColorSwizzle.XXX1  | ColorComponent.X1           | ColorDataType.Integer,
+        L2                              = ColorSpace.LinearRGBA  | ColorSwizzle.XXX1  | ColorComponent.X2           | ColorDataType.Integer,
+        L4                              = ColorSpace.LinearRGBA  | ColorSwizzle.XXX1  | ColorComponent.X4           | ColorDataType.Integer,
+        L8                              = ColorSpace.LinearRGBA  | ColorSwizzle.XXX1  | ColorComponent.X8           | ColorDataType.Integer,
+        L16                             = ColorSpace.LinearRGBA  | ColorSwizzle.XXX1  | ColorComponent.X16          | ColorDataType.Integer,
+        L32                             = ColorSpace.LinearRGBA  | ColorSwizzle.XXX1  | ColorComponent.X32          | ColorDataType.Integer,
+        Float_L16                       = ColorSpace.LinearRGBA  | ColorSwizzle.XXX1  | ColorComponent.X16          | ColorDataType.Float,
+        B5G6R5                          = ColorSpace.LinearRGBA  | ColorSwizzle.ZYX1  | ColorComponent.X5Y6Z5       | ColorDataType.Integer,
+        B6G5R5                          = ColorSpace.LinearRGBA  | ColorSwizzle.ZYX1  | ColorComponent.X6Y5Z5       | ColorDataType.Integer,
+        B5G5R5X1                        = ColorSpace.LinearRGBA  | ColorSwizzle.ZYX1  | ColorComponent.X5Y5Z5W1     | ColorDataType.Integer,
+        B8_G8_R8                        = ColorSpace.LinearRGBA  | ColorSwizzle.ZYX1  | ColorComponent.X8Y8Z8       | ColorDataType.Integer,
+        B8G8R8X8                        = ColorSpace.LinearRGBA  | ColorSwizzle.ZYX1  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        Float_B10G11R11                 = ColorSpace.LinearRGBA  | ColorSwizzle.ZYX1  | ColorComponent.X11Y11Z10    | ColorDataType.Float,
+        X1B5G5R5                        = ColorSpace.LinearRGBA  | ColorSwizzle.WZY1  | ColorComponent.X1Y5Z5W5     | ColorDataType.Integer,
+        X8B8G8R8                        = ColorSpace.LinearRGBA  | ColorSwizzle.WZY1  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        X16B16G16R16                    = ColorSpace.LinearRGBA  | ColorSwizzle.WZY1  | ColorComponent.X16Y16Z16W16 | ColorDataType.Integer,
+        Float_X16B16G16R16              = ColorSpace.LinearRGBA  | ColorSwizzle.WZY1  | ColorComponent.X16Y16Z16W16 | ColorDataType.Float,
+        R3G3B2                          = ColorSpace.LinearRGBA  | ColorSwizzle.XYZ1  | ColorComponent.X3Y3Z2       | ColorDataType.Integer,
+        R5G5B6                          = ColorSpace.LinearRGBA  | ColorSwizzle.XYZ1  | ColorComponent.Z5Y5X6       | ColorDataType.Integer,
+        R5G6B5                          = ColorSpace.LinearRGBA  | ColorSwizzle.XYZ1  | ColorComponent.X5Y6Z5       | ColorDataType.Integer,
+        R5G5B5X1                        = ColorSpace.LinearRGBA  | ColorSwizzle.XYZ1  | ColorComponent.X5Y5Z5W1     | ColorDataType.Integer,
+        R8_G8_B8                        = ColorSpace.LinearRGBA  | ColorSwizzle.XYZ1  | ColorComponent.X8Y8Z8       | ColorDataType.Integer,
+        R8G8B8X8                        = ColorSpace.LinearRGBA  | ColorSwizzle.XYZ1  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        X1R5G5B5                        = ColorSpace.LinearRGBA  | ColorSwizzle.YZW1  | ColorComponent.X1Y5Z5W5     | ColorDataType.Integer,
+        X8R8G8B8                        = ColorSpace.LinearRGBA  | ColorSwizzle.YZW1  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        RG8                             = ColorSpace.LinearRGBA  | ColorSwizzle.XY01  | ColorComponent.Y8X8         | ColorDataType.Integer,
+        R16G16                          = ColorSpace.LinearRGBA  | ColorSwizzle.XY01  | ColorComponent.X16Y16       | ColorDataType.Integer,
+        Float_R16G16                    = ColorSpace.LinearRGBA  | ColorSwizzle.XY01  | ColorComponent.X16Y16       | ColorDataType.Float,
+        R8                              = ColorSpace.LinearRGBA  | ColorSwizzle.X001  | ColorComponent.X8           | ColorDataType.Integer,
+        R16                             = ColorSpace.LinearRGBA  | ColorSwizzle.X001  | ColorComponent.X16          | ColorDataType.Integer,
+        Float_R16                       = ColorSpace.LinearRGBA  | ColorSwizzle.X001  | ColorComponent.X16          | ColorDataType.Float,
+        A2B10G10R10_sRGB                = ColorSpace.SRGB        | ColorSwizzle.WZYX  | ColorComponent.X2Y10Z10W10  | ColorDataType.Integer,
+        A8B8G8R8_sRGB                   = ColorSpace.SRGB        | ColorSwizzle.WZYX  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        A16B16G16R16_sRGB               = ColorSpace.SRGB        | ColorSwizzle.WZYX  | ColorComponent.X16Y16Z16W16 | ColorDataType.Integer,
+        A2R10G10B10_sRGB                = ColorSpace.SRGB        | ColorSwizzle.YZWX  | ColorComponent.X2Y10Z10W10  | ColorDataType.Integer,
+        B10G10R10A2_sRGB                = ColorSpace.SRGB        | ColorSwizzle.ZYXW  | ColorComponent.X10Y10Z10W2  | ColorDataType.Integer,
+        R10G10B10A2_sRGB                = ColorSpace.SRGB        | ColorSwizzle.XYZW  | ColorComponent.X10Y10Z10W2  | ColorDataType.Integer,
+        X8B8G8R8_sRGB                   = ColorSpace.SRGB        | ColorSwizzle.WZY1  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        X16B16G16R16_sRGB               = ColorSpace.SRGB        | ColorSwizzle.WZY1  | ColorComponent.X16Y16Z16W16 | ColorDataType.Integer,
+        A2B10G10R10_709                 = ColorSpace.Unknown3    | ColorSwizzle.WZYX  | ColorComponent.X2Y10Z10W10  | ColorDataType.Integer,
+        A8B8G8R8_709                    = ColorSpace.Unknown3    | ColorSwizzle.WZYX  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        A16B16G16R16_709                = ColorSpace.Unknown3    | ColorSwizzle.WZYX  | ColorComponent.X16Y16Z16W16 | ColorDataType.Integer,
+        A2R10G10B10_709                 = ColorSpace.Unknown3    | ColorSwizzle.YZWX  | ColorComponent.X2Y10Z10W10  | ColorDataType.Integer,
+        B10G10R10A2_709                 = ColorSpace.Unknown3    | ColorSwizzle.ZYXW  | ColorComponent.X10Y10Z10W2  | ColorDataType.Integer,
+        R10G10B10A2_709                 = ColorSpace.Unknown3    | ColorSwizzle.XYZW  | ColorComponent.X10Y10Z10W2  | ColorDataType.Integer,
+        X8B8G8R8_709                    = ColorSpace.Unknown3    | ColorSwizzle.WZY1  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        X16B16G16R16_709                = ColorSpace.Unknown3    | ColorSwizzle.WZY1  | ColorComponent.X16Y16Z16W16 | ColorDataType.Integer,
+        A2B10G10R10_709_Linear          = ColorSpace.Unknown4    | ColorSwizzle.WZYX  | ColorComponent.X2Y10Z10W10  | ColorDataType.Integer,
+        A8B8G8R8_709_Linear             = ColorSpace.Unknown4    | ColorSwizzle.WZYX  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        A16B16G16R16_709_Linear         = ColorSpace.Unknown4    | ColorSwizzle.WZYX  | ColorComponent.X16Y16Z16W16 | ColorDataType.Integer,
+        A2R10G10B10_709_Linear          = ColorSpace.Unknown4    | ColorSwizzle.YZWX  | ColorComponent.X2Y10Z10W10  | ColorDataType.Integer,
+        B10G10R10A2_709_Linear          = ColorSpace.Unknown4    | ColorSwizzle.ZYXW  | ColorComponent.X10Y10Z10W2  | ColorDataType.Integer,
+        R10G10B10A2_709_Linear          = ColorSpace.Unknown4    | ColorSwizzle.XYZW  | ColorComponent.X10Y10Z10W2  | ColorDataType.Integer,
+        X8B8G8R8_709_Linear             = ColorSpace.Unknown4    | ColorSwizzle.WZY1  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        X16B16G16R16_709_Linear         = ColorSpace.Unknown4    | ColorSwizzle.WZY1  | ColorComponent.X16Y16Z16W16 | ColorDataType.Integer,
+        Float_A16B16G16R16_scRGB_Linear = ColorSpace.Unknown5    | ColorSwizzle.WZYX  | ColorComponent.X16Y16Z16W16 | ColorDataType.Float,
+        A2B10G10R10_2020                = ColorSpace.Unknown6    | ColorSwizzle.WZYX  | ColorComponent.X2Y10Z10W10  | ColorDataType.Integer,
+        A8B8G8R8_2020                   = ColorSpace.Unknown6    | ColorSwizzle.WZYX  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        A16B16G16R16_2020               = ColorSpace.Unknown6    | ColorSwizzle.WZYX  | ColorComponent.X16Y16Z16W16 | ColorDataType.Integer,
+        A2R10G10B10_2020                = ColorSpace.Unknown6    | ColorSwizzle.YZWX  | ColorComponent.X2Y10Z10W10  | ColorDataType.Integer,
+        B10G10R10A2_2020                = ColorSpace.Unknown6    | ColorSwizzle.ZYXW  | ColorComponent.X10Y10Z10W2  | ColorDataType.Integer,
+        R10G10B10A2_2020                = ColorSpace.Unknown6    | ColorSwizzle.XYZW  | ColorComponent.X10Y10Z10W2  | ColorDataType.Integer,
+        X8B8G8R8_2020                   = ColorSpace.Unknown6    | ColorSwizzle.WZY1  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        X16B16G16R16_2020               = ColorSpace.Unknown6    | ColorSwizzle.WZY1  | ColorComponent.X16Y16Z16W16 | ColorDataType.Integer,
+        A2B10G10R10_2020_Linear         = ColorSpace.Unknown7    | ColorSwizzle.WZYX  | ColorComponent.X2Y10Z10W10  | ColorDataType.Integer,
+        A8B8G8R8_2020_Linear            = ColorSpace.Unknown7    | ColorSwizzle.WZYX  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        A16B16G16R16_2020_Linear        = ColorSpace.Unknown7    | ColorSwizzle.WZYX  | ColorComponent.X16Y16Z16W16 | ColorDataType.Integer,
+        Float_A16B16G16R16_2020_Linear  = ColorSpace.Unknown7    | ColorSwizzle.WZYX  | ColorComponent.X16Y16Z16W16 | ColorDataType.Float,
+        A2R10G10B10_2020_Linear         = ColorSpace.Unknown7    | ColorSwizzle.YZWX  | ColorComponent.X2Y10Z10W10  | ColorDataType.Integer,
+        B10G10R10A2_2020_Linear         = ColorSpace.Unknown7    | ColorSwizzle.ZYXW  | ColorComponent.X10Y10Z10W2  | ColorDataType.Integer,
+        R10G10B10A2_2020_Linear         = ColorSpace.Unknown7    | ColorSwizzle.XYZW  | ColorComponent.X10Y10Z10W2  | ColorDataType.Integer,
+        X8B8G8R8_2020_Linear            = ColorSpace.Unknown7    | ColorSwizzle.WZY1  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        X16B16G16R16_2020_Linear        = ColorSpace.Unknown7    | ColorSwizzle.WZY1  | ColorComponent.X16Y16Z16W16 | ColorDataType.Integer,
+        Float_A16B16G16R16_2020_PQ      = ColorSpace.Unknown8    | ColorSwizzle.WZYX  | ColorComponent.X16Y16Z16W16 | ColorDataType.Float,
+        A4I4                            = ColorSpace.ColorIndex  | ColorSwizzle.X00X  | ColorComponent.Y4X4         | ColorDataType.Integer,
+        A8I8                            = ColorSpace.ColorIndex  | ColorSwizzle.X00X  | ColorComponent.Y8X8         | ColorDataType.Integer,
+        I4A4                            = ColorSpace.ColorIndex  | ColorSwizzle.X00Y  | ColorComponent.Y4X4         | ColorDataType.Integer,
+        I8A8                            = ColorSpace.ColorIndex  | ColorSwizzle.X00Y  | ColorComponent.Y8X8         | ColorDataType.Integer,
+        I1                              = ColorSpace.ColorIndex  | ColorSwizzle.X000  | ColorComponent.X1           | ColorDataType.Integer,
+        I2                              = ColorSpace.ColorIndex  | ColorSwizzle.X000  | ColorComponent.X2           | ColorDataType.Integer,
+        I4                              = ColorSpace.ColorIndex  | ColorSwizzle.X000  | ColorComponent.X4           | ColorDataType.Integer,
+        I8                              = ColorSpace.ColorIndex  | ColorSwizzle.X000  | ColorComponent.X8           | ColorDataType.Integer,
+        A8Y8U8V8                        = ColorSpace.YCbCr601    | ColorSwizzle.YZWX  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        A16Y16U16V16                    = ColorSpace.YCbCr601    | ColorSwizzle.YZWX  | ColorComponent.X16Y16Z16W16 | ColorDataType.Integer,
+        Y8U8V8A8                        = ColorSpace.YCbCr601    | ColorSwizzle.XYZW  | ColorComponent.X8Y8Z8W8     | ColorDataType.Integer,
+        V8_U8                           = ColorSpace.YCbCr601    | ColorSwizzle._0YX0 | ColorComponent.X8Y8         | ColorDataType.Integer,
+        V8U8                            = ColorSpace.YCbCr601    | ColorSwizzle._0YX0 | ColorComponent.Y8X8         | ColorDataType.Integer,
+        V10U10                          = ColorSpace.YCbCr601    | ColorSwizzle._0ZY0 | ColorComponent.Y10X10       | ColorDataType.Integer,
+        V12U12                          = ColorSpace.YCbCr601    | ColorSwizzle._0ZY0 | ColorComponent.Y12X12       | ColorDataType.Integer,
+        V8                              = ColorSpace.YCbCr601    | ColorSwizzle._00X0 | ColorComponent.X8           | ColorDataType.Integer,
+        V10                             = ColorSpace.YCbCr601    | ColorSwizzle._00X0 | ColorComponent.X10          | ColorDataType.Integer,
+        V12                             = ColorSpace.YCbCr601    | ColorSwizzle._00X0 | ColorComponent.X12          | ColorDataType.Integer,
+        U8_V8                           = ColorSpace.YCbCr601    | ColorSwizzle._0XY0 | ColorComponent.X8Y8         | ColorDataType.Integer,
+        U8V8                            = ColorSpace.YCbCr601    | ColorSwizzle._0XY0 | ColorComponent.Y8X8         | ColorDataType.Integer,
+        U10V10                          = ColorSpace.YCbCr601    | ColorSwizzle._0XZ0 | ColorComponent.Y10X10       | ColorDataType.Integer,
+        U12V12                          = ColorSpace.YCbCr601    | ColorSwizzle._0XZ0 | ColorComponent.Y12X12       | ColorDataType.Integer,
+        U8                              = ColorSpace.YCbCr601    | ColorSwizzle._0X00 | ColorComponent.X8           | ColorDataType.Integer,
+        U10                             = ColorSpace.YCbCr601    | ColorSwizzle._0X00 | ColorComponent.X10          | ColorDataType.Integer,
+        U12                             = ColorSpace.YCbCr601    | ColorSwizzle._0X00 | ColorComponent.X12          | ColorDataType.Integer,
+        Y8                              = ColorSpace.YCbCr601    | ColorSwizzle.X000  | ColorComponent.X8           | ColorDataType.Integer,
+        Y10                             = ColorSpace.YCbCr601    | ColorSwizzle.X000  | ColorComponent.X10          | ColorDataType.Integer,
+        Y12                             = ColorSpace.YCbCr601    | ColorSwizzle.X000  | ColorComponent.X12          | ColorDataType.Integer,
+        YVYU                            = ColorSpace.YCbCr601    | ColorSwizzle.XZY1  | ColorComponent.X8Y8X8Z8     | ColorDataType.Integer,
+        VYUY                            = ColorSpace.YCbCr601    | ColorSwizzle.XZY1  | ColorComponent.Y8X8Z8X8     | ColorDataType.Integer,
+        UYVY                            = ColorSpace.YCbCr601    | ColorSwizzle.XYZ1  | ColorComponent.Y8X8Z8X8     | ColorDataType.Integer,
+        YUYV                            = ColorSpace.YCbCr601    | ColorSwizzle.XYZ1  | ColorComponent.X8Y8X8Z8     | ColorDataType.Integer,
+        Y8_U8_V8                        = ColorSpace.YCbCr601    | ColorSwizzle.XYZ1  | ColorComponent.X8Y8Z8       | ColorDataType.Integer,
+        V8_U8_RR                        = ColorSpace.YCbCr601_RR | ColorSwizzle._0YX0 | ColorComponent.X8Y8         | ColorDataType.Integer,
+        V8U8_RR                         = ColorSpace.YCbCr601_RR | ColorSwizzle._0YX0 | ColorComponent.Y8X8         | ColorDataType.Integer,
+        V8_RR                           = ColorSpace.YCbCr601_RR | ColorSwizzle._00X0 | ColorComponent.X8           | ColorDataType.Integer,
+        U8_V8_RR                        = ColorSpace.YCbCr601_RR | ColorSwizzle._0XY0 | ColorComponent.X8Y8         | ColorDataType.Integer,
+        U8V8_RR                         = ColorSpace.YCbCr601_RR | ColorSwizzle._0XY0 | ColorComponent.Y8X8         | ColorDataType.Integer,
+        U8_RR                           = ColorSpace.YCbCr601_RR | ColorSwizzle._0X00 | ColorComponent.X8           | ColorDataType.Integer,
+        Y8_RR                           = ColorSpace.YCbCr601_RR | ColorSwizzle.X000  | ColorComponent.X8           | ColorDataType.Integer,
+        V8_U8_ER                        = ColorSpace.UnknownC    | ColorSwizzle._0YX0 | ColorComponent.X8Y8         | ColorDataType.Integer,
+        V8U8_ER                         = ColorSpace.UnknownC    | ColorSwizzle._0YX0 | ColorComponent.Y8X8         | ColorDataType.Integer,
+        V8_ER                           = ColorSpace.UnknownC    | ColorSwizzle._00X0 | ColorComponent.X8           | ColorDataType.Integer,
+        U8_V8_ER                        = ColorSpace.UnknownC    | ColorSwizzle._0XY0 | ColorComponent.X8Y8         | ColorDataType.Integer,
+        U8V8_ER                         = ColorSpace.UnknownC    | ColorSwizzle._0XY0 | ColorComponent.Y8X8         | ColorDataType.Integer,
+        U8_ER                           = ColorSpace.UnknownC    | ColorSwizzle._0X00 | ColorComponent.X8           | ColorDataType.Integer,
+        Y8_ER                           = ColorSpace.UnknownC    | ColorSwizzle.X000  | ColorComponent.X8           | ColorDataType.Integer,
+        V8_U8_709                       = ColorSpace.YCbCr709    | ColorSwizzle._0YX0 | ColorComponent.X8Y8         | ColorDataType.Integer,
+        V8U8_709                        = ColorSpace.YCbCr709    | ColorSwizzle._0YX0 | ColorComponent.Y8X8         | ColorDataType.Integer,
+        V10U10_709                      = ColorSpace.YCbCr709    | ColorSwizzle._0ZY0 | ColorComponent.Y10X10       | ColorDataType.Integer,
+        V12U12_709                      = ColorSpace.YCbCr709    | ColorSwizzle._0ZY0 | ColorComponent.Y12X12       | ColorDataType.Integer,
+        V8_709                          = ColorSpace.YCbCr709    | ColorSwizzle._00X0 | ColorComponent.X8           | ColorDataType.Integer,
+        V10_709                         = ColorSpace.YCbCr709    | ColorSwizzle._00X0 | ColorComponent.X10          | ColorDataType.Integer,
+        V12_709                         = ColorSpace.YCbCr709    | ColorSwizzle._00X0 | ColorComponent.X12          | ColorDataType.Integer,
+        U8_V8_709                       = ColorSpace.YCbCr709    | ColorSwizzle._0XY0 | ColorComponent.X8Y8         | ColorDataType.Integer,
+        U8V8_709                        = ColorSpace.YCbCr709    | ColorSwizzle._0XY0 | ColorComponent.Y8X8         | ColorDataType.Integer,
+        U10V10_709                      = ColorSpace.YCbCr709    | ColorSwizzle._0XZ0 | ColorComponent.Y10X10       | ColorDataType.Integer,
+        U12V12_709                      = ColorSpace.YCbCr709    | ColorSwizzle._0XZ0 | ColorComponent.Y12X12       | ColorDataType.Integer,
+        U8_709                          = ColorSpace.YCbCr709    | ColorSwizzle._0X00 | ColorComponent.X8           | ColorDataType.Integer,
+        U10_709                         = ColorSpace.YCbCr709    | ColorSwizzle._0X00 | ColorComponent.X10          | ColorDataType.Integer,
+        U12_709                         = ColorSpace.YCbCr709    | ColorSwizzle._0X00 | ColorComponent.X12          | ColorDataType.Integer,
+        Y8_709                          = ColorSpace.YCbCr709    | ColorSwizzle.X000  | ColorComponent.X8           | ColorDataType.Integer,
+        Y10_709                         = ColorSpace.YCbCr709    | ColorSwizzle.X000  | ColorComponent.X10          | ColorDataType.Integer,
+        Y12_709                         = ColorSpace.YCbCr709    | ColorSwizzle.X000  | ColorComponent.X12          | ColorDataType.Integer,
+        V8_U8_709_ER                    = ColorSpace.UnknownE    | ColorSwizzle._0YX0 | ColorComponent.X8Y8         | ColorDataType.Integer,
+        V8U8_709_ER                     = ColorSpace.UnknownE    | ColorSwizzle._0YX0 | ColorComponent.Y8X8         | ColorDataType.Integer,
+        V10U10_709_ER                   = ColorSpace.UnknownE    | ColorSwizzle._0ZY0 | ColorComponent.Y10X10       | ColorDataType.Integer,
+        V12U12_709_ER                   = ColorSpace.UnknownE    | ColorSwizzle._0ZY0 | ColorComponent.Y12X12       | ColorDataType.Integer,
+        V8_709_ER                       = ColorSpace.UnknownE    | ColorSwizzle._00X0 | ColorComponent.X8           | ColorDataType.Integer,
+        V10_709_ER                      = ColorSpace.UnknownE    | ColorSwizzle._00X0 | ColorComponent.X10          | ColorDataType.Integer,
+        V12_709_ER                      = ColorSpace.UnknownE    | ColorSwizzle._00X0 | ColorComponent.X12          | ColorDataType.Integer,
+        U8_V8_709_ER                    = ColorSpace.UnknownE    | ColorSwizzle._0XY0 | ColorComponent.X8Y8         | ColorDataType.Integer,
+        U8V8_709_ER                     = ColorSpace.UnknownE    | ColorSwizzle._0XY0 | ColorComponent.Y8X8         | ColorDataType.Integer,
+        U10V10_709_ER                   = ColorSpace.UnknownE    | ColorSwizzle._0XZ0 | ColorComponent.Y10X10       | ColorDataType.Integer,
+        U12V12_709_ER                   = ColorSpace.UnknownE    | ColorSwizzle._0XZ0 | ColorComponent.Y12X12       | ColorDataType.Integer,
+        U8_709_ER                       = ColorSpace.UnknownE    | ColorSwizzle._0X00 | ColorComponent.X8           | ColorDataType.Integer,
+        U10_709_ER                      = ColorSpace.UnknownE    | ColorSwizzle._0X00 | ColorComponent.X10          | ColorDataType.Integer,
+        U12_709_ER                      = ColorSpace.UnknownE    | ColorSwizzle._0X00 | ColorComponent.X12          | ColorDataType.Integer,
+        Y8_709_ER                       = ColorSpace.UnknownE    | ColorSwizzle.X000  | ColorComponent.X8           | ColorDataType.Integer,
+        Y10_709_ER                      = ColorSpace.UnknownE    | ColorSwizzle.X000  | ColorComponent.X10          | ColorDataType.Integer,
+        Y12_709_ER                      = ColorSpace.UnknownE    | ColorSwizzle.X000  | ColorComponent.X12          | ColorDataType.Integer,
+        V10U10_2020                     = ColorSpace.UnknownE    | ColorSwizzle._0ZY0 | ColorComponent.Y10X10       | ColorDataType.Integer,
+        V12U12_2020                     = ColorSpace.UnknownE    | ColorSwizzle._0ZY0 | ColorComponent.Y12X12       | ColorDataType.Integer,
+        V10_2020                        = ColorSpace.UnknownE    | ColorSwizzle._00X0 | ColorComponent.X10          | ColorDataType.Integer,
+        V12_2020                        = ColorSpace.UnknownE    | ColorSwizzle._00X0 | ColorComponent.X12          | ColorDataType.Integer,
+        U10V10_2020                     = ColorSpace.UnknownE    | ColorSwizzle._0XZ0 | ColorComponent.Y10X10       | ColorDataType.Integer,
+        U12V12_2020                     = ColorSpace.UnknownE    | ColorSwizzle._0XZ0 | ColorComponent.Y12X12       | ColorDataType.Integer,
+        U10_2020                        = ColorSpace.UnknownE    | ColorSwizzle._0X00 | ColorComponent.X10          | ColorDataType.Integer,
+        U12_2020                        = ColorSpace.UnknownE    | ColorSwizzle._0X00 | ColorComponent.X12          | ColorDataType.Integer,
+        Y10_2020                        = ColorSpace.UnknownE    | ColorSwizzle.X000  | ColorComponent.X10          | ColorDataType.Integer,
+        Y12_2020                        = ColorSpace.UnknownE    | ColorSwizzle.X000  | ColorComponent.X12          | ColorDataType.Integer,
+        Bayer8RGGB                      = ColorSpace.BayerRGGB   | ColorSwizzle.X000  | ColorComponent.X8           | ColorDataType.Integer,
+        Bayer16RGGB                     = ColorSpace.BayerRGGB   | ColorSwizzle.X000  | ColorComponent.X16          | ColorDataType.Integer,
+        BayerS16RGGB                    = ColorSpace.BayerRGGB   | ColorSwizzle.X000  | ColorComponent.X16          | ColorDataType.Stencil,
+        X2Bayer14RGGB                   = ColorSpace.BayerRGGB   | ColorSwizzle.Y000  | ColorComponent.Y2X14        | ColorDataType.Integer,
+        X4Bayer12RGGB                   = ColorSpace.BayerRGGB   | ColorSwizzle.Y000  | ColorComponent.Y4X12        | ColorDataType.Integer,
+        X6Bayer10RGGB                   = ColorSpace.BayerRGGB   | ColorSwizzle.Y000  | ColorComponent.Y6X10        | ColorDataType.Integer,
+        Bayer8BGGR                      = ColorSpace.BayerBGGR   | ColorSwizzle.X000  | ColorComponent.X8           | ColorDataType.Integer,
+        Bayer16BGGR                     = ColorSpace.BayerBGGR   | ColorSwizzle.X000  | ColorComponent.X16          | ColorDataType.Integer,
+        BayerS16BGGR                    = ColorSpace.BayerBGGR   | ColorSwizzle.X000  | ColorComponent.X16          | ColorDataType.Stencil,
+        X2Bayer14BGGR                   = ColorSpace.BayerBGGR   | ColorSwizzle.Y000  | ColorComponent.Y2X14        | ColorDataType.Integer,
+        X4Bayer12BGGR                   = ColorSpace.BayerBGGR   | ColorSwizzle.Y000  | ColorComponent.Y4X12        | ColorDataType.Integer,
+        X6Bayer10BGGR                   = ColorSpace.BayerBGGR   | ColorSwizzle.Y000  | ColorComponent.Y6X10        | ColorDataType.Integer,
+        Bayer8GRBG                      = ColorSpace.BayerGRBG   | ColorSwizzle.X000  | ColorComponent.X8           | ColorDataType.Integer,
+        Bayer16GRBG                     = ColorSpace.BayerGRBG   | ColorSwizzle.X000  | ColorComponent.X16          | ColorDataType.Integer,
+        BayerS16GRBG                    = ColorSpace.BayerGRBG   | ColorSwizzle.X000  | ColorComponent.X16          | ColorDataType.Stencil,
+        X2Bayer14GRBG                   = ColorSpace.BayerGRBG   | ColorSwizzle.Y000  | ColorComponent.Y2X14        | ColorDataType.Integer,
+        X4Bayer12GRBG                   = ColorSpace.BayerGRBG   | ColorSwizzle.Y000  | ColorComponent.Y4X12        | ColorDataType.Integer,
+        X6Bayer10GRBG                   = ColorSpace.BayerGRBG   | ColorSwizzle.Y000  | ColorComponent.Y6X10        | ColorDataType.Integer,
+        Bayer8GBRG                      = ColorSpace.BayerGBRG   | ColorSwizzle.X000  | ColorComponent.X8           | ColorDataType.Integer,
+        Bayer16GBRG                     = ColorSpace.BayerGBRG   | ColorSwizzle.X000  | ColorComponent.X16          | ColorDataType.Integer,
+        BayerS16GBRG                    = ColorSpace.BayerGBRG   | ColorSwizzle.X000  | ColorComponent.X16          | ColorDataType.Stencil,
+        X2Bayer14GBRG                   = ColorSpace.BayerGBRG   | ColorSwizzle.Y000  | ColorComponent.Y2X14        | ColorDataType.Integer,
+        X4Bayer12GBRG                   = ColorSpace.BayerGBRG   | ColorSwizzle.Y000  | ColorComponent.Y4X12        | ColorDataType.Integer,
+        X6Bayer10GBRG                   = ColorSpace.BayerGBRG   | ColorSwizzle.Y000  | ColorComponent.Y6X10        | ColorDataType.Integer,
+        XYZ                             = ColorSpace.Unknown14   | ColorSwizzle.XYZ1  | ColorComponent.X20Y20Z20    | ColorDataType.Float,
+    }
+}
diff --git a/Ryujinx.HLE/HOS/Services/Vi/GbpBuffer.cs b/Ryujinx.HLE/HOS/Services/Vi/GbpBuffer.cs
index 41cbacf962..eb1adc7759 100644
--- a/Ryujinx.HLE/HOS/Services/Vi/GbpBuffer.cs
+++ b/Ryujinx.HLE/HOS/Services/Vi/GbpBuffer.cs
@@ -1,60 +1,165 @@
+using Ryujinx.Common;
+using System;
 using System.IO;
+using System.Runtime.InteropServices;
 
 namespace Ryujinx.HLE.HOS.Services.Android
 {
+    [StructLayout(LayoutKind.Sequential, Size = 0x28)]
+    struct GraphicBufferHeader
+    {
+        public int Magic;
+        public int Width;
+        public int Height;
+        public int Stride;
+        public int Format;
+        public int Usage;
+
+        public int Pid;
+        public int RefCount;
+
+        public int FdsCount;
+        public int IntsCount;
+    }
+
+    [StructLayout(LayoutKind.Explicit, Size = 0x58)]
+    struct NvGraphicBufferSurface
+    {
+        [FieldOffset(0)]
+        public uint Width;
+
+        [FieldOffset(0x4)]
+        public uint Height;
+
+        [FieldOffset(0x8)]
+        public ColorFormat ColorFormat;
+
+        [FieldOffset(0x10)]
+        public int Layout;
+
+        [FieldOffset(0x14)]
+        public int Pitch;
+
+        [FieldOffset(0x18)]
+        public int NvMapHandle;
+
+        [FieldOffset(0x1C)]
+        public int Offset;
+
+        [FieldOffset(0x20)]
+        public int Kind;
+
+        [FieldOffset(0x24)]
+        public int BlockHeightLog2;
+
+        [FieldOffset(0x28)]
+        public int ScanFormat;
+
+        [FieldOffset(0x30)]
+        public long Flags;
+
+        [FieldOffset(0x38)]
+        public long Size;
+    }
+
+    [StructLayout(LayoutKind.Explicit)]
+    struct NvGraphicBufferSurfaceArray
+    {
+        [FieldOffset(0x0)]
+        private NvGraphicBufferSurface Surface0;
+
+        [FieldOffset(0x58)]
+        private NvGraphicBufferSurface Surface1;
+
+        [FieldOffset(0xb0)]
+        private NvGraphicBufferSurface Surface2;
+
+        public NvGraphicBufferSurface this[int index]
+        {
+            get
+            {
+                if (index == 0)
+                {
+                    return Surface0;
+                }
+                else if (index == 1)
+                {
+                    return Surface1;
+                }
+                else if (index == 2)
+                {
+                    return Surface2;
+                }
+
+                throw new IndexOutOfRangeException();
+            }
+        }
+    }
+
+    [StructLayout(LayoutKind.Explicit, Size = 0x144)]
+    struct NvGraphicBuffer
+    {
+        [FieldOffset(0x4)]
+        public int NvMapId;
+
+        [FieldOffset(0xC)]
+        public int Magic;
+
+        [FieldOffset(0x10)]
+        public int Pid;
+
+        [FieldOffset(0x14)]
+        public int Type;
+
+        [FieldOffset(0x18)]
+        public int Usage;
+
+        [FieldOffset(0x1C)]
+        public int PixelFormat;
+
+        [FieldOffset(0x20)]
+        public int ExternalPixelFormat;
+
+        [FieldOffset(0x24)]
+        public int Stride;
+
+        [FieldOffset(0x28)]
+        public int FrameBufferSize;
+
+        [FieldOffset(0x2C)]
+        public int PlanesCount;
+
+        [FieldOffset(0x34)]
+        public NvGraphicBufferSurfaceArray Surfaces;
+    }
+
     struct GbpBuffer
     {
-        public int Magic  { get; private set; }
-        public int Width  { get; private set; }
-        public int Height { get; private set; }
-        public int Stride { get; private set; }
-        public int Format { get; private set; }
-        public int Usage  { get; private set; }
+        public GraphicBufferHeader Header { get; private set; }
+        public NvGraphicBuffer     Buffer { get; private set; }
 
-        public int Pid      { get; private set; }
-        public int RefCount { get; private set; }
-
-        public int FdsCount  { get; private set; }
-        public int IntsCount { get; private set; }
-
-        public byte[] RawData { get; private set; }
-
-        public int Size => RawData.Length + 10 * 4;
+        public int Size => Marshal.SizeOf<NvGraphicBuffer>() + Marshal.SizeOf<GraphicBufferHeader>();
 
         public GbpBuffer(BinaryReader reader)
         {
-            Magic  = reader.ReadInt32();
-            Width  = reader.ReadInt32();
-            Height = reader.ReadInt32();
-            Stride = reader.ReadInt32();
-            Format = reader.ReadInt32();
-            Usage  = reader.ReadInt32();
+            Header = reader.ReadStruct<GraphicBufferHeader>();
 
-            Pid      = reader.ReadInt32();
-            RefCount = reader.ReadInt32();
+            // ignore fds
+            // TODO: check if that is used in official implementation
+            reader.BaseStream.Position += Header.FdsCount * 4;
 
-            FdsCount  = reader.ReadInt32();
-            IntsCount = reader.ReadInt32();
+            if (Header.IntsCount != 0x51)
+            {
+                throw new System.NotImplementedException($"Unexpected Graphic Buffer ints count (expected 0x51, found 0x{Header.IntsCount:x}");
+            }
 
-            RawData = reader.ReadBytes((FdsCount + IntsCount) * 4);
+            Buffer = reader.ReadStruct<NvGraphicBuffer>();
         }
 
         public void Write(BinaryWriter writer)
         {
-            writer.Write(Magic);
-            writer.Write(Width);
-            writer.Write(Height);
-            writer.Write(Stride);
-            writer.Write(Format);
-            writer.Write(Usage);
-
-            writer.Write(Pid);
-            writer.Write(RefCount);
-
-            writer.Write(FdsCount);
-            writer.Write(IntsCount);
-
-            writer.Write(RawData);
+            writer.WriteStruct(Header);
+            writer.WriteStruct(Buffer);
         }
     }
 }
\ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Vi/IApplicationDisplayService.cs b/Ryujinx.HLE/HOS/Services/Vi/IApplicationDisplayService.cs
index 0b5705b934..039cc81f40 100644
--- a/Ryujinx.HLE/HOS/Services/Vi/IApplicationDisplayService.cs
+++ b/Ryujinx.HLE/HOS/Services/Vi/IApplicationDisplayService.cs
@@ -52,7 +52,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi
 
         public long GetSystemDisplayService(ServiceCtx context)
         {
-            MakeObject(context, new ISystemDisplayService());
+            MakeObject(context, new ISystemDisplayService(this));
 
             return 0;
         }
diff --git a/Ryujinx.HLE/HOS/Services/Vi/ISystemDisplayService.cs b/Ryujinx.HLE/HOS/Services/Vi/ISystemDisplayService.cs
index 5266a2536a..070277ff33 100644
--- a/Ryujinx.HLE/HOS/Services/Vi/ISystemDisplayService.cs
+++ b/Ryujinx.HLE/HOS/Services/Vi/ISystemDisplayService.cs
@@ -10,13 +10,14 @@ namespace Ryujinx.HLE.HOS.Services.Vi
 
         public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => _commands;
 
-        public ISystemDisplayService()
+        public ISystemDisplayService(IApplicationDisplayService applicationDisplayService)
         {
             _commands = new Dictionary<int, ServiceProcessRequest>
             {
-                { 2205, SetLayerZ },
-                { 2207, SetLayerVisibility },
-                { 3200, GetDisplayMode }
+                { 2205, SetLayerZ                                  },
+                { 2207, SetLayerVisibility                         },
+                { 2312, applicationDisplayService.CreateStrayLayer },
+                { 3200, GetDisplayMode                             }
             };
         }
 
diff --git a/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs b/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs
index cce1b2b90e..db04f47cd0 100644
--- a/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs
+++ b/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs
@@ -7,6 +7,7 @@ using Ryujinx.HLE.HOS.Services.Nv.NvMap;
 using System;
 using System.Collections.Generic;
 using System.IO;
+using System.Runtime.InteropServices;
 using System.Text;
 using System.Threading;
 
@@ -30,9 +31,11 @@ namespace Ryujinx.HLE.HOS.Services.Android
         [Flags]
         private enum HalTransform
         {
-            FlipX     = 1 << 0,
-            FlipY     = 1 << 1,
-            Rotate90  = 1 << 2
+            FlipX     = 1,
+            FlipY     = 2,
+            Rotate90  = 4,
+            Rotate180 = FlipX | FlipY,
+            Rotate270 = Rotate90 | Rotate180,
         }
 
         private enum BufferState
@@ -43,6 +46,33 @@ namespace Ryujinx.HLE.HOS.Services.Android
             Acquired
         }
 
+        [StructLayout(LayoutKind.Sequential, Size = 0x8)]
+        private struct Fence
+        {
+            public int id;
+            public int value;
+        }
+
+        [StructLayout(LayoutKind.Explicit, Size = 0x24)]
+        private struct MultiFence
+        {
+            [FieldOffset(0x0)]
+            public int FenceCount;
+
+            [FieldOffset(0x4)]
+            public Fence Fence0;
+
+            [FieldOffset(0xC)]
+            public Fence Fence1;
+
+            [FieldOffset(0x14)]
+            public Fence Fence2;
+
+            [FieldOffset(0x1C)]
+            public Fence Fence3;
+        }
+
+        [StructLayout(LayoutKind.Sequential, Size = 0x10)]
         private struct Rect
         {
             public int Top;
@@ -51,6 +81,37 @@ namespace Ryujinx.HLE.HOS.Services.Android
             public int Bottom;
         }
 
+        [StructLayout(LayoutKind.Explicit)]
+        private struct QueueBufferObject
+        {
+            [FieldOffset(0x0)]
+            public long Timestamp;
+
+            [FieldOffset(0x8)]
+            public int IsAutoTimestamp;
+
+            [FieldOffset(0xC)]
+            public Rect Crop;
+
+            [FieldOffset(0x1C)]
+            public int ScalingMode;
+
+            [FieldOffset(0x20)]
+            public HalTransform Transform;
+
+            [FieldOffset(0x24)]
+            public int StickyTransform;
+
+            [FieldOffset(0x28)]
+            public int Unknown;
+
+            [FieldOffset(0x2C)]
+            public int SwapInterval;
+
+            [FieldOffset(0x30)]
+            public MultiFence Fence;
+        }
+
         private struct BufferEntry
         {
             public BufferState State;
@@ -169,32 +230,15 @@ namespace Ryujinx.HLE.HOS.Services.Android
 
             //TODO: Errors.
             int slot            = parcelReader.ReadInt32();
-            int unknown4        = parcelReader.ReadInt32();
-            int unknown8        = parcelReader.ReadInt32();
-            int unknownC        = parcelReader.ReadInt32();
-            int timestamp       = parcelReader.ReadInt32();
-            int isAutoTimestamp = parcelReader.ReadInt32();
-            int cropTop         = parcelReader.ReadInt32();
-            int cropLeft        = parcelReader.ReadInt32();
-            int cropRight       = parcelReader.ReadInt32();
-            int cropBottom      = parcelReader.ReadInt32();
-            int scalingMode     = parcelReader.ReadInt32();
-            int transform       = parcelReader.ReadInt32();
-            int stickyTransform = parcelReader.ReadInt32();
-            int unknown34       = parcelReader.ReadInt32();
-            int unknown38       = parcelReader.ReadInt32();
-            int isFenceValid    = parcelReader.ReadInt32();
-            int fence0Id        = parcelReader.ReadInt32();
-            int fence0Value     = parcelReader.ReadInt32();
-            int fence1Id        = parcelReader.ReadInt32();
-            int fence1Value     = parcelReader.ReadInt32();
 
-            _bufferQueue[slot].Transform = (HalTransform)transform;
+            long Position = parcelReader.BaseStream.Position;
 
-            _bufferQueue[slot].Crop.Top    = cropTop;
-            _bufferQueue[slot].Crop.Left   = cropLeft;
-            _bufferQueue[slot].Crop.Right  = cropRight;
-            _bufferQueue[slot].Crop.Bottom = cropBottom;
+            QueueBufferObject queueBufferObject = ReadFlattenedObject<QueueBufferObject>(parcelReader);
+
+            parcelReader.BaseStream.Position = Position;
+
+            _bufferQueue[slot].Transform = queueBufferObject.Transform;
+            _bufferQueue[slot].Crop      = queueBufferObject.Crop;
 
             _bufferQueue[slot].State = BufferState.Queued;
 
@@ -218,6 +262,8 @@ namespace Ryujinx.HLE.HOS.Services.Android
             //TODO: Errors.
             int slot = parcelReader.ReadInt32();
 
+            MultiFence fence = ReadFlattenedObject<MultiFence>(parcelReader);
+
             _bufferQueue[slot].State = BufferState.Free;
 
             _waitBufferFree.Set();
@@ -244,20 +290,41 @@ namespace Ryujinx.HLE.HOS.Services.Android
         {
             int slot = parcelReader.ReadInt32();
 
-            int bufferCount = parcelReader.ReadInt32();
+            bool hasInput = parcelReader.ReadInt32() == 1;
 
-            if (bufferCount > 0)
+            if (hasInput)
             {
-                long bufferSize = parcelReader.ReadInt64();
+                byte[] graphicBuffer = ReadFlattenedObject(parcelReader);
 
                 _bufferQueue[slot].State = BufferState.Free;
 
-                _bufferQueue[slot].Data = new GbpBuffer(parcelReader);
+                using (BinaryReader graphicBufferReader = new BinaryReader(new MemoryStream(graphicBuffer)))
+                {
+                    _bufferQueue[slot].Data = new GbpBuffer(graphicBufferReader);
+                }
+
             }
 
             return MakeReplyParcel(context, 0);
         }
 
+        private byte[] ReadFlattenedObject(BinaryReader reader)
+        {
+            long flattenedObjectSize = reader.ReadInt64();
+
+            return reader.ReadBytes((int)flattenedObjectSize);
+        }
+
+        private unsafe T ReadFlattenedObject<T>(BinaryReader reader) where T: struct
+        {
+            byte[] data = ReadFlattenedObject(reader);
+
+            fixed (byte* ptr = data)
+            {
+                return Marshal.PtrToStructure<T>((IntPtr)ptr);
+            }
+        }
+
         private long MakeReplyParcel(ServiceCtx context, params int[] ints)
         {
             using (MemoryStream ms = new MemoryStream())
@@ -284,13 +351,39 @@ namespace Ryujinx.HLE.HOS.Services.Android
             return 0;
         }
 
+        private GalImageFormat ConvertColorFormat(ColorFormat colorFormat)
+        {
+            switch (colorFormat)
+            {
+                case ColorFormat.A8B8G8R8:
+                    return GalImageFormat.RGBA8  | GalImageFormat.Unorm;
+                case ColorFormat.X8B8G8R8:
+                    return GalImageFormat.RGBX8  | GalImageFormat.Unorm;
+                case ColorFormat.R5G6B5:
+                    return GalImageFormat.BGR565 | GalImageFormat.Unorm;
+                case ColorFormat.A8R8G8B8:
+                    return GalImageFormat.BGRA8  | GalImageFormat.Unorm;
+                case ColorFormat.A4B4G4R4:
+                    return GalImageFormat.RGBA4  | GalImageFormat.Unorm;
+                default:
+                    throw new NotImplementedException($"Color Format \"{colorFormat}\" not implemented!");
+            }
+        }
+
+        // TODO: support multi surface
         private void SendFrameBuffer(ServiceCtx context, int slot)
         {
-            int fbWidth  = _bufferQueue[slot].Data.Width;
-            int fbHeight = _bufferQueue[slot].Data.Height;
+            int fbWidth  = _bufferQueue[slot].Data.Header.Width;
+            int fbHeight = _bufferQueue[slot].Data.Header.Height;
 
-            int nvMapHandle  = BitConverter.ToInt32(_bufferQueue[slot].Data.RawData, 0x4c);
-            int bufferOffset = BitConverter.ToInt32(_bufferQueue[slot].Data.RawData, 0x50);
+            int nvMapHandle = _bufferQueue[slot].Data.Buffer.Surfaces[0].NvMapHandle;
+
+            if (nvMapHandle == 0)
+            {
+                nvMapHandle = _bufferQueue[slot].Data.Buffer.NvMapId;
+            }
+
+            int bufferOffset = _bufferQueue[slot].Data.Buffer.Surfaces[0].Offset;
 
             NvMapHandle map = NvMapIoctl.GetNvMap(context, nvMapHandle);
 
@@ -303,6 +396,10 @@ namespace Ryujinx.HLE.HOS.Services.Android
             bool flipX = _bufferQueue[slot].Transform.HasFlag(HalTransform.FlipX);
             bool flipY = _bufferQueue[slot].Transform.HasFlag(HalTransform.FlipY);
 
+            GalImageFormat imageFormat = ConvertColorFormat(_bufferQueue[slot].Data.Buffer.Surfaces[0].ColorFormat);
+
+            int BlockHeight = 1 << _bufferQueue[slot].Data.Buffer.Surfaces[0].BlockHeightLog2;
+
             //Note: Rotation is being ignored.
 
             int top    = crop.Top;
@@ -318,9 +415,9 @@ namespace Ryujinx.HLE.HOS.Services.Android
                 {
                     image = new GalImage(
                         fbWidth,
-                        fbHeight, 1, 16,
+                        fbHeight, 1, BlockHeight,
                         GalMemoryLayout.BlockLinear,
-                        GalImageFormat.RGBA8 | GalImageFormat.Unorm);
+                        imageFormat);
                 }
 
                 context.Device.Gpu.ResourceManager.ClearPbCache();
@@ -378,8 +475,8 @@ namespace Ryujinx.HLE.HOS.Services.Android
 
                     GbpBuffer data = _bufferQueue[slot].Data;
 
-                    if (data.Width  == width &&
-                        data.Height == height)
+                    if (data.Header.Width  == width &&
+                        data.Header.Height == height)
                     {
                         _bufferQueue[slot].State = BufferState.Dequeued;