diff --git a/Ryujinx.Graphics/Gal/GalPipelineState.cs b/Ryujinx.Graphics/Gal/GalPipelineState.cs
index 17f52dd6..f50f1032 100644
--- a/Ryujinx.Graphics/Gal/GalPipelineState.cs
+++ b/Ryujinx.Graphics/Gal/GalPipelineState.cs
@@ -37,11 +37,11 @@
 
         public GalFrontFace FrontFace;
 
-        public bool CullFaceEnabled;
+        public bool        CullFaceEnabled;
         public GalCullFace CullFace;
 
-        public bool DepthTestEnabled;
-        public bool DepthWriteEnabled;
+        public bool            DepthTestEnabled;
+        public bool            DepthWriteEnabled;
         public GalComparisonOp DepthFunc;
         public float DepthRangeNear;
         public float DepthRangeFar;
@@ -50,31 +50,31 @@
         public bool StencilTwoSideEnabled;
 
         public GalComparisonOp StencilBackFuncFunc;
-        public int StencilBackFuncRef;
-        public uint StencilBackFuncMask;
-        public GalStencilOp StencilBackOpFail;
-        public GalStencilOp StencilBackOpZFail;
-        public GalStencilOp StencilBackOpZPass;
-        public uint StencilBackMask;
+        public int             StencilBackFuncRef;
+        public uint            StencilBackFuncMask;
+        public GalStencilOp    StencilBackOpFail;
+        public GalStencilOp    StencilBackOpZFail;
+        public GalStencilOp    StencilBackOpZPass;
+        public uint            StencilBackMask;
 
         public GalComparisonOp StencilFrontFuncFunc;
-        public int StencilFrontFuncRef;
-        public uint StencilFrontFuncMask;
-        public GalStencilOp StencilFrontOpFail;
-        public GalStencilOp StencilFrontOpZFail;
-        public GalStencilOp StencilFrontOpZPass;
-        public uint StencilFrontMask;
+        public int             StencilFrontFuncRef;
+        public uint            StencilFrontFuncMask;
+        public GalStencilOp    StencilFrontOpFail;
+        public GalStencilOp    StencilFrontOpZFail;
+        public GalStencilOp    StencilFrontOpZPass;
+        public uint            StencilFrontMask;
 
-        public bool BlendEnabled;
-        public bool BlendSeparateAlpha;
+        public bool             BlendEnabled;
+        public bool             BlendSeparateAlpha;
         public GalBlendEquation BlendEquationRgb;
-        public GalBlendFactor BlendFuncSrcRgb;
-        public GalBlendFactor BlendFuncDstRgb;
+        public GalBlendFactor   BlendFuncSrcRgb;
+        public GalBlendFactor   BlendFuncDstRgb;
         public GalBlendEquation BlendEquationAlpha;
-        public GalBlendFactor BlendFuncSrcAlpha;
-        public GalBlendFactor BlendFuncDstAlpha;
+        public GalBlendFactor   BlendFuncSrcAlpha;
+        public GalBlendFactor   BlendFuncDstAlpha;
 
-        public ColorMaskRgba ColorMask;
+        public bool            ColorMaskCommon;
         public ColorMaskRgba[] ColorMasks;
 
         public bool PrimitiveRestartEnabled;
diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs
index 656d8e8e..6e1cabba 100644
--- a/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs
+++ b/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs
@@ -131,8 +131,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL
                 BlendFuncSrcAlpha  = GalBlendFactor.One,
                 BlendFuncDstAlpha  = GalBlendFactor.Zero,
 
-                ColorMask = ColorMaskRgba.Default,
-
                 PrimitiveRestartEnabled = false,
                 PrimitiveRestartIndex   = 0
             };
@@ -316,16 +314,30 @@ namespace Ryujinx.Graphics.Gal.OpenGL
                 }
             }
 
-            for (int Index = 0; Index < GalPipelineState.RenderTargetsCount; Index++)
+            if (New.ColorMaskCommon)
             {
-                if (!New.ColorMasks[Index].Equals(Old.ColorMasks[Index]))
+                if (New.ColorMaskCommon != Old.ColorMaskCommon || !New.ColorMasks[0].Equals(Old.ColorMasks[0]))
                 {
                     GL.ColorMask(
-                        Index,
-                        New.ColorMasks[Index].Red,
-                        New.ColorMasks[Index].Green,
-                        New.ColorMasks[Index].Blue,
-                        New.ColorMasks[Index].Alpha);
+                        New.ColorMasks[0].Red,
+                        New.ColorMasks[0].Green,
+                        New.ColorMasks[0].Blue,
+                        New.ColorMasks[0].Alpha);
+                }
+            }
+            else
+            {
+                for (int Index = 0; Index < GalPipelineState.RenderTargetsCount; Index++)
+                {
+                    if (!New.ColorMasks[Index].Equals(Old.ColorMasks[Index]))
+                    {
+                        GL.ColorMask(
+                            Index,
+                            New.ColorMasks[Index].Red,
+                            New.ColorMasks[Index].Green,
+                            New.ColorMasks[Index].Blue,
+                            New.ColorMasks[Index].Alpha);
+                    }
                 }
             }
 
@@ -477,7 +489,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
         {
             if (!Dict.TryGetValue(Attrib.Size, out VertexAttribPointerType Type))
             {
-                throw new NotImplementedException("Unsupported size \"" + Attrib.Size + "\" on type \"" + Attrib.Type + "\"!");
+                ThrowUnsupportedAttrib(Attrib);
             }
 
             return Type;
@@ -485,15 +497,10 @@ namespace Ryujinx.Graphics.Gal.OpenGL
 
         private unsafe static void SetConstAttrib(GalVertexAttrib Attrib)
         {
-            void Unsupported()
-            {
-                throw new NotImplementedException("Constant attribute " + Attrib.Size + " not implemented!");
-            }
-
             if (Attrib.Size == GalVertexAttribSize._10_10_10_2 ||
                 Attrib.Size == GalVertexAttribSize._11_11_10)
             {
-                Unsupported();
+                ThrowUnsupportedAttrib(Attrib);
             }
 
             if (Attrib.Type == GalVertexAttribType.Unorm)
@@ -611,11 +618,16 @@ namespace Ryujinx.Graphics.Gal.OpenGL
                         GL.VertexAttrib4(Attrib.Index, (float*)Attrib.Pointer);
                         break;
 
-                    default: Unsupported(); break;
+                    default: ThrowUnsupportedAttrib(Attrib); break;
                 }
             }
         }
 
+        private static void ThrowUnsupportedAttrib(GalVertexAttrib Attrib)
+        {
+            throw new NotImplementedException("Unsupported size \"" + Attrib.Size + "\" on type \"" + Attrib.Type + "\"!");
+        }
+
         private void Enable(EnableCap Cap, bool Enabled)
         {
             if (Enabled)
diff --git a/Ryujinx.Graphics/NvGpuEngine3d.cs b/Ryujinx.Graphics/NvGpuEngine3d.cs
index e8ded889..7d2b2b43 100644
--- a/Ryujinx.Graphics/NvGpuEngine3d.cs
+++ b/Ryujinx.Graphics/NvGpuEngine3d.cs
@@ -64,6 +64,10 @@ namespace Ryujinx.Graphics
             {
                 UploadedKeys[i] = new List<long>();
             }
+
+            //Ensure that all components are enabled by default.
+            //FIXME: Is this correct?
+            WriteRegister(NvGpuEngine3dReg.ColorMaskN, 0x1111);
         }
 
         public void CallMethod(NvGpuVmm Vmm, NvGpuPBEntry PBEntry)
@@ -420,16 +424,13 @@ namespace Ryujinx.Graphics
 
         private void SetColorMask(GalPipelineState State)
         {
-            int ColorMask = ReadRegister(NvGpuEngine3dReg.ColorMask);
+            bool ColorMaskCommon = ReadRegisterBool(NvGpuEngine3dReg.ColorMaskCommon);
 
-            State.ColorMask.Red   = ((ColorMask >> 0)  & 0xf) != 0;
-            State.ColorMask.Green = ((ColorMask >> 4)  & 0xf) != 0;
-            State.ColorMask.Blue  = ((ColorMask >> 8)  & 0xf) != 0;
-            State.ColorMask.Alpha = ((ColorMask >> 12) & 0xf) != 0;
+            State.ColorMaskCommon = ColorMaskCommon;
 
             for (int Index = 0; Index < GalPipelineState.RenderTargetsCount; Index++)
             {
-                ColorMask = ReadRegister(NvGpuEngine3dReg.ColorMaskN + Index);
+                int ColorMask = ReadRegister(NvGpuEngine3dReg.ColorMaskN + (ColorMaskCommon ? 0 : Index));
 
                 State.ColorMasks[Index].Red   = ((ColorMask >> 0)  & 0xf) != 0;
                 State.ColorMasks[Index].Green = ((ColorMask >> 4)  & 0xf) != 0;
diff --git a/Ryujinx.Graphics/NvGpuEngine3dReg.cs b/Ryujinx.Graphics/NvGpuEngine3dReg.cs
index 6ea22654..6c522eac 100644
--- a/Ryujinx.Graphics/NvGpuEngine3dReg.cs
+++ b/Ryujinx.Graphics/NvGpuEngine3dReg.cs
@@ -25,7 +25,7 @@ namespace Ryujinx.Graphics
         StencilBackFuncRef   = 0x3d5,
         StencilBackMask      = 0x3d6,
         StencilBackFuncMask  = 0x3d7,
-        ColorMask            = 0x3e4,
+        ColorMaskCommon      = 0x3e4,
         RTSeparateFragData   = 0x3eb,
         ZetaAddress          = 0x3f8,
         ZetaFormat           = 0x3fa,