Vulkan image formats

4 basic things here:
- Set SwiftShader formats to match the equivalent Vulkan format,
  when available
- Removed SwiftShader formats with no exact match in Vulkan formats
- Added all currently unavailable Vulkan formats in comments in the
  list, possibly to be added later, when necessary
- Marked all mandatory sampled formats in the list (in comments)

Bug b/118429780

Change-Id: I7d7b661e64cb4aee9eb724c64664cee8271cc48c
Reviewed-on: https://swiftshader-review.googlesource.com/c/21808
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Device/Blitter.cpp b/src/Device/Blitter.cpp
index c3b7b08..a4be043 100644
--- a/src/Device/Blitter.cpp
+++ b/src/Device/Blitter.cpp
@@ -67,13 +67,6 @@
 			         ((uint16_t)(63 * g + 0.5f) << 5) |
 			         ((uint16_t)(31 * r + 0.5f) << 11);
 			break;
-		case FORMAT_X8B8G8R8:
-			if((rgbaMask & 0x7) != 0x7) return false;
-			packed = ((uint32_t)(255) << 24) |
-			         ((uint32_t)(255 * b + 0.5f) << 16) |
-			         ((uint32_t)(255 * g + 0.5f) << 8) |
-			         ((uint32_t)(255 * r + 0.5f) << 0);
-			break;
 		case FORMAT_A8B8G8R8:
 			if((rgbaMask & 0xF) != 0xF) return false;
 			packed = ((uint32_t)(255 * a + 0.5f) << 24) |
@@ -81,13 +74,6 @@
 			         ((uint32_t)(255 * g + 0.5f) << 8) |
 			         ((uint32_t)(255 * r + 0.5f) << 0);
 			break;
-		case FORMAT_X8R8G8B8:
-			if((rgbaMask & 0x7) != 0x7) return false;
-			packed = ((uint32_t)(255) << 24) |
-			         ((uint32_t)(255 * r + 0.5f) << 16) |
-			         ((uint32_t)(255 * g + 0.5f) << 8) |
-			         ((uint32_t)(255 * b + 0.5f) << 0);
-			break;
 		case FORMAT_A8R8G8B8:
 			if((rgbaMask & 0xF) != 0xF) return false;
 			packed = ((uint32_t)(255 * a + 0.5f) << 24) |
@@ -225,13 +211,6 @@
 
 		switch(state.sourceFormat)
 		{
-		case FORMAT_L8:
-			c.xyz = Float(Int(*Pointer<Byte>(element)));
-			c.w = float(0xFF);
-			break;
-		case FORMAT_A8:
-			c.w = Float(Int(*Pointer<Byte>(element)));
-			break;
 		case FORMAT_R8I:
 		case FORMAT_R8_SNORM:
 			c.x = Float(Int(*Pointer<SByte>(element)));
@@ -270,33 +249,6 @@
 		case FORMAT_SRGB8_A8:
 			c = Float4(*Pointer<Byte4>(element));
 			break;
-		case FORMAT_X8R8G8B8:
-			c = Float4(*Pointer<Byte4>(element)).zyxw;
-			c.w = float(0xFF);
-			break;
-		case FORMAT_R8G8B8:
-			c.z = Float(Int(*Pointer<Byte>(element + 0)));
-			c.y = Float(Int(*Pointer<Byte>(element + 1)));
-			c.x = Float(Int(*Pointer<Byte>(element + 2)));
-			c.w = float(0xFF);
-			break;
-		case FORMAT_B8G8R8:
-			c.x = Float(Int(*Pointer<Byte>(element + 0)));
-			c.y = Float(Int(*Pointer<Byte>(element + 1)));
-			c.z = Float(Int(*Pointer<Byte>(element + 2)));
-			c.w = float(0xFF);
-			break;
-		case FORMAT_X8B8G8R8I:
-		case FORMAT_X8B8G8R8_SNORM:
-			c = Float4(*Pointer<SByte4>(element));
-			c.w = float(0x7F);
-			break;
-		case FORMAT_X8B8G8R8:
-		case FORMAT_X8B8G8R8UI:
-		case FORMAT_SRGB8_X8:
-			c = Float4(*Pointer<Byte4>(element));
-			c.w = float(0xFF);
-			break;
 		case FORMAT_A16B16G16R16I:
 			c = Float4(*Pointer<Short4>(element));
 			break;
@@ -304,28 +256,12 @@
 		case FORMAT_A16B16G16R16UI:
 			c = Float4(*Pointer<UShort4>(element));
 			break;
-		case FORMAT_X16B16G16R16I:
-			c = Float4(*Pointer<Short4>(element));
-			c.w = float(0x7FFF);
-			break;
-		case FORMAT_X16B16G16R16UI:
-			c = Float4(*Pointer<UShort4>(element));
-			c.w = float(0xFFFF);
-			break;
 		case FORMAT_A32B32G32R32I:
 			c = Float4(*Pointer<Int4>(element));
 			break;
 		case FORMAT_A32B32G32R32UI:
 			c = Float4(*Pointer<UInt4>(element));
 			break;
-		case FORMAT_X32B32G32R32I:
-			c = Float4(*Pointer<Int4>(element));
-			c.w = float(0x7FFFFFFF);
-			break;
-		case FORMAT_X32B32G32R32UI:
-			c = Float4(*Pointer<UInt4>(element));
-			c.w = float(0xFFFFFFFF);
-			break;
 		case FORMAT_G8R8I:
 		case FORMAT_G8R8_SNORM:
 			c.x = Float(Int(*Pointer<SByte>(element + 0)));
@@ -362,10 +298,6 @@
 		case FORMAT_A32B32G32R32F:
 			c = *Pointer<Float4>(element);
 			break;
-		case FORMAT_X32B32G32R32F:
-		case FORMAT_X32B32G32R32F_UNSIGNED:
-		case FORMAT_B32G32R32F:
-			c.z = *Pointer<Float>(element + 8);
 		case FORMAT_G32R32F:
 			c.x = *Pointer<Float>(element + 0);
 			c.y = *Pointer<Float>(element + 4);
@@ -392,19 +324,8 @@
 		case FORMAT_D24X8:
 			c.x = Float(Int((*Pointer<UInt>(element) & UInt(0xFFFFFF00)) >> 8));
 			break;
-		case FORMAT_D32:
-			c.x = Float(Int((*Pointer<UInt>(element))));
-			break;
-		case FORMAT_D32F_COMPLEMENTARY:
-		case FORMAT_D32FS8_COMPLEMENTARY:
-			c.x = 1.0f - *Pointer<Float>(element);
-			break;
 		case FORMAT_D32F:
 		case FORMAT_D32FS8:
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32F_SHADOW:
-		case FORMAT_D32FS8_SHADOW:
 			c.x = *Pointer<Float>(element);
 			break;
 		case FORMAT_S8:
@@ -427,12 +348,6 @@
 
 		switch(state.destFormat)
 		{
-		case FORMAT_L8:
-			*Pointer<Byte>(element) = Byte(RoundInt(Float(c.x)));
-			break;
-		case FORMAT_A8:
-			if(writeA) { *Pointer<Byte>(element) = Byte(RoundInt(Float(c.w))); }
-			break;
 		case FORMAT_A8R8G8B8:
 			if(writeRGBA)
 			{
@@ -462,45 +377,6 @@
 				if(writeA) { *Pointer<Byte>(element + 3) = Byte(RoundInt(Float(c.w))); }
 			}
 			break;
-		case FORMAT_X8R8G8B8:
-			if(writeRGBA)
-			{
-				Short4 c0 = RoundShort4(c.zyxw) | Short4(0x0000, 0x0000, 0x0000, 0x00FF);
-				*Pointer<Byte4>(element) = Byte4(PackUnsigned(c0, c0));
-			}
-			else
-			{
-				if(writeB) { *Pointer<Byte>(element + 0) = Byte(RoundInt(Float(c.z))); }
-				if(writeG) { *Pointer<Byte>(element + 1) = Byte(RoundInt(Float(c.y))); }
-				if(writeR) { *Pointer<Byte>(element + 2) = Byte(RoundInt(Float(c.x))); }
-				if(writeA) { *Pointer<Byte>(element + 3) = Byte(0xFF); }
-			}
-			break;
-		case FORMAT_X8B8G8R8:
-		case FORMAT_SRGB8_X8:
-			if(writeRGBA)
-			{
-				Short4 c0 = RoundShort4(c) | Short4(0x0000, 0x0000, 0x0000, 0x00FF);
-				*Pointer<Byte4>(element) = Byte4(PackUnsigned(c0, c0));
-			}
-			else
-			{
-				if(writeR) { *Pointer<Byte>(element + 0) = Byte(RoundInt(Float(c.x))); }
-				if(writeG) { *Pointer<Byte>(element + 1) = Byte(RoundInt(Float(c.y))); }
-				if(writeB) { *Pointer<Byte>(element + 2) = Byte(RoundInt(Float(c.z))); }
-				if(writeA) { *Pointer<Byte>(element + 3) = Byte(0xFF); }
-			}
-			break;
-		case FORMAT_R8G8B8:
-			if(writeR) { *Pointer<Byte>(element + 2) = Byte(RoundInt(Float(c.x))); }
-			if(writeG) { *Pointer<Byte>(element + 1) = Byte(RoundInt(Float(c.y))); }
-			if(writeB) { *Pointer<Byte>(element + 0) = Byte(RoundInt(Float(c.z))); }
-			break;
-		case FORMAT_B8G8R8:
-			if(writeR) { *Pointer<Byte>(element + 0) = Byte(RoundInt(Float(c.x))); }
-			if(writeG) { *Pointer<Byte>(element + 1) = Byte(RoundInt(Float(c.y))); }
-			if(writeB) { *Pointer<Byte>(element + 2) = Byte(RoundInt(Float(c.z))); }
-			break;
 		case FORMAT_A32B32G32R32F:
 			if(writeRGBA)
 			{
@@ -514,14 +390,6 @@
 				if(writeA) { *Pointer<Float>(element + 12) = c.w; }
 			}
 			break;
-		case FORMAT_X32B32G32R32F:
-		case FORMAT_X32B32G32R32F_UNSIGNED:
-			if(writeA) { *Pointer<Float>(element + 12) = 1.0f; }
-		case FORMAT_B32G32R32F:
-			if(writeR) { *Pointer<Float>(element) = c.x; }
-			if(writeG) { *Pointer<Float>(element + 4) = c.y; }
-			if(writeB) { *Pointer<Float>(element + 8) = c.z; }
-			break;
 		case FORMAT_G32R32F:
 			if(writeR && writeG)
 			{
@@ -539,12 +407,6 @@
 		case FORMAT_A8B8G8R8I:
 		case FORMAT_A8B8G8R8_SNORM:
 			if(writeA) { *Pointer<SByte>(element + 3) = SByte(RoundInt(Float(c.w))); }
-		case FORMAT_X8B8G8R8I:
-		case FORMAT_X8B8G8R8_SNORM:
-			if(writeA && (state.destFormat == FORMAT_X8B8G8R8I || state.destFormat == FORMAT_X8B8G8R8_SNORM))
-			{
-				*Pointer<SByte>(element + 3) = SByte(0x7F);
-			}
 			if(writeB) { *Pointer<SByte>(element + 2) = SByte(RoundInt(Float(c.z))); }
 		case FORMAT_G8R8I:
 		case FORMAT_G8R8_SNORM:
@@ -555,11 +417,6 @@
 			break;
 		case FORMAT_A8B8G8R8UI:
 			if(writeA) { *Pointer<Byte>(element + 3) = Byte(RoundInt(Float(c.w))); }
-		case FORMAT_X8B8G8R8UI:
-			if(writeA && (state.destFormat == FORMAT_X8B8G8R8UI))
-			{
-				*Pointer<Byte>(element + 3) = Byte(0xFF);
-			}
 			if(writeB) { *Pointer<Byte>(element + 2) = Byte(RoundInt(Float(c.z))); }
 		case FORMAT_G8R8UI:
 		case FORMAT_G8R8:
@@ -581,19 +438,6 @@
 				if(writeA) { *Pointer<Short>(element + 6) = Short(RoundInt(Float(c.w))); }
 			}
 			break;
-		case FORMAT_X16B16G16R16I:
-			if(writeRGBA)
-			{
-				*Pointer<Short4>(element) = Short4(RoundInt(c));
-			}
-			else
-			{
-				if(writeR) { *Pointer<Short>(element) = Short(RoundInt(Float(c.x))); }
-				if(writeG) { *Pointer<Short>(element + 2) = Short(RoundInt(Float(c.y))); }
-				if(writeB) { *Pointer<Short>(element + 4) = Short(RoundInt(Float(c.z))); }
-			}
-			if(writeA) { *Pointer<Short>(element + 6) = Short(0x7F); }
-			break;
 		case FORMAT_G16R16I:
 			if(writeR && writeG)
 			{
@@ -622,19 +466,6 @@
 				if(writeA) { *Pointer<UShort>(element + 6) = UShort(RoundInt(Float(c.w))); }
 			}
 			break;
-		case FORMAT_X16B16G16R16UI:
-			if(writeRGBA)
-			{
-				*Pointer<UShort4>(element) = UShort4(RoundInt(c));
-			}
-			else
-			{
-				if(writeR) { *Pointer<UShort>(element) = UShort(RoundInt(Float(c.x))); }
-				if(writeG) { *Pointer<UShort>(element + 2) = UShort(RoundInt(Float(c.y))); }
-				if(writeB) { *Pointer<UShort>(element + 4) = UShort(RoundInt(Float(c.z))); }
-			}
-			if(writeA) { *Pointer<UShort>(element + 6) = UShort(0xFF); }
-			break;
 		case FORMAT_G16R16UI:
 		case FORMAT_G16R16:
 			if(writeR && writeG)
@@ -663,19 +494,6 @@
 				if(writeA) { *Pointer<Int>(element + 12) = RoundInt(Float(c.w)); }
 			}
 			break;
-		case FORMAT_X32B32G32R32I:
-			if(writeRGBA)
-			{
-				*Pointer<Int4>(element) = RoundInt(c);
-			}
-			else
-			{
-				if(writeR) { *Pointer<Int>(element) = RoundInt(Float(c.x)); }
-				if(writeG) { *Pointer<Int>(element + 4) = RoundInt(Float(c.y)); }
-				if(writeB) { *Pointer<Int>(element + 8) = RoundInt(Float(c.z)); }
-			}
-			if(writeA) { *Pointer<Int>(element + 12) = Int(0x7FFFFFFF); }
-			break;
 		case FORMAT_G32R32I:
 			if(writeG) { *Pointer<Int>(element + 4) = RoundInt(Float(c.y)); }
 		case FORMAT_R32I:
@@ -694,19 +512,6 @@
 				if(writeA) { *Pointer<UInt>(element + 12) = As<UInt>(RoundInt(Float(c.w))); }
 			}
 			break;
-		case FORMAT_X32B32G32R32UI:
-			if(writeRGBA)
-			{
-				*Pointer<UInt4>(element) = UInt4(RoundInt(c));
-			}
-			else
-			{
-				if(writeR) { *Pointer<UInt>(element) = As<UInt>(RoundInt(Float(c.x))); }
-				if(writeG) { *Pointer<UInt>(element + 4) = As<UInt>(RoundInt(Float(c.y))); }
-				if(writeB) { *Pointer<UInt>(element + 8) = As<UInt>(RoundInt(Float(c.z))); }
-			}
-			if(writeA) { *Pointer<UInt4>(element + 12) = UInt4(0xFFFFFFFF); }
-			break;
 		case FORMAT_G32R32UI:
 			if(writeG) { *Pointer<UInt>(element + 4) = As<UInt>(RoundInt(Float(c.y))); }
 		case FORMAT_R32UI:
@@ -759,19 +564,8 @@
 		case FORMAT_D24X8:
 			*Pointer<UInt>(element) = UInt(RoundInt(Float(c.x)) << 8);
 			break;
-		case FORMAT_D32:
-			*Pointer<UInt>(element) = UInt(RoundInt(Float(c.x)));
-			break;
-		case FORMAT_D32F_COMPLEMENTARY:
-		case FORMAT_D32FS8_COMPLEMENTARY:
-			*Pointer<Float>(element) = 1.0f - c.x;
-			break;
 		case FORMAT_D32F:
 		case FORMAT_D32FS8:
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32F_SHADOW:
-		case FORMAT_D32FS8_SHADOW:
 			*Pointer<Float>(element) = c.x;
 			break;
 		case FORMAT_S8:
@@ -791,8 +585,6 @@
 		{
 		case FORMAT_A8B8G8R8I:
 			c = Insert(c, Int(*Pointer<SByte>(element + 3)), 3);
-		case FORMAT_X8B8G8R8I:
-			c = Insert(c, Int(*Pointer<SByte>(element + 2)), 2);
 		case FORMAT_G8R8I:
 			c = Insert(c, Int(*Pointer<SByte>(element + 1)), 1);
 		case FORMAT_R8I:
@@ -800,8 +592,6 @@
 			break;
 		case FORMAT_A8B8G8R8UI:
 			c = Insert(c, Int(*Pointer<Byte>(element + 3)), 3);
-		case FORMAT_X8B8G8R8UI:
-			c = Insert(c, Int(*Pointer<Byte>(element + 2)), 2);
 		case FORMAT_G8R8UI:
 			c = Insert(c, Int(*Pointer<Byte>(element + 1)), 1);
 		case FORMAT_R8UI:
@@ -809,8 +599,6 @@
 			break;
 		case FORMAT_A16B16G16R16I:
 			c = Insert(c, Int(*Pointer<Short>(element + 6)), 3);
-		case FORMAT_X16B16G16R16I:
-			c = Insert(c, Int(*Pointer<Short>(element + 4)), 2);
 		case FORMAT_G16R16I:
 			c = Insert(c, Int(*Pointer<Short>(element + 2)), 1);
 		case FORMAT_R16I:
@@ -818,8 +606,6 @@
 			break;
 		case FORMAT_A16B16G16R16UI:
 			c = Insert(c, Int(*Pointer<UShort>(element + 6)), 3);
-		case FORMAT_X16B16G16R16UI:
-			c = Insert(c, Int(*Pointer<UShort>(element + 4)), 2);
 		case FORMAT_G16R16UI:
 			c = Insert(c, Int(*Pointer<UShort>(element + 2)), 1);
 		case FORMAT_R16UI:
@@ -829,9 +615,6 @@
 		case FORMAT_A32B32G32R32UI:
 			c = *Pointer<Int4>(element);
 			break;
-		case FORMAT_X32B32G32R32I:
-		case FORMAT_X32B32G32R32UI:
-			c = Insert(c, *Pointer<Int>(element + 8), 2);
 		case FORMAT_G32R32I:
 		case FORMAT_G32R32UI:
 			c = Insert(c, *Pointer<Int>(element + 4), 1);
@@ -858,11 +641,6 @@
 		{
 		case FORMAT_A8B8G8R8I:
 			if(writeA) { *Pointer<SByte>(element + 3) = SByte(Extract(c, 3)); }
-		case FORMAT_X8B8G8R8I:
-			if(writeA && (state.destFormat != FORMAT_A8B8G8R8I))
-			{
-				*Pointer<SByte>(element + 3) = SByte(0x7F);
-			}
 			if(writeB) { *Pointer<SByte>(element + 2) = SByte(Extract(c, 2)); }
 		case FORMAT_G8R8I:
 			if(writeG) { *Pointer<SByte>(element + 1) = SByte(Extract(c, 1)); }
@@ -871,11 +649,6 @@
 			break;
 		case FORMAT_A8B8G8R8UI:
 			if(writeA) { *Pointer<Byte>(element + 3) = Byte(Extract(c, 3)); }
-		case FORMAT_X8B8G8R8UI:
-			if(writeA && (state.destFormat != FORMAT_A8B8G8R8UI))
-			{
-				*Pointer<Byte>(element + 3) = Byte(0xFF);
-			}
 			if(writeB) { *Pointer<Byte>(element + 2) = Byte(Extract(c, 2)); }
 		case FORMAT_G8R8UI:
 			if(writeG) { *Pointer<Byte>(element + 1) = Byte(Extract(c, 1)); }
@@ -884,11 +657,6 @@
 			break;
 		case FORMAT_A16B16G16R16I:
 			if(writeA) { *Pointer<Short>(element + 6) = Short(Extract(c, 3)); }
-		case FORMAT_X16B16G16R16I:
-			if(writeA && (state.destFormat != FORMAT_A16B16G16R16I))
-			{
-				*Pointer<Short>(element + 6) = Short(0x7FFF);
-			}
 			if(writeB) { *Pointer<Short>(element + 4) = Short(Extract(c, 2)); }
 		case FORMAT_G16R16I:
 			if(writeG) { *Pointer<Short>(element + 2) = Short(Extract(c, 1)); }
@@ -897,11 +665,6 @@
 			break;
 		case FORMAT_A16B16G16R16UI:
 			if(writeA) { *Pointer<UShort>(element + 6) = UShort(Extract(c, 3)); }
-		case FORMAT_X16B16G16R16UI:
-			if(writeA && (state.destFormat != FORMAT_A16B16G16R16UI))
-			{
-				*Pointer<UShort>(element + 6) = UShort(0xFFFF);
-			}
 			if(writeB) { *Pointer<UShort>(element + 4) = UShort(Extract(c, 2)); }
 		case FORMAT_G16R16UI:
 			if(writeG) { *Pointer<UShort>(element + 2) = UShort(Extract(c, 1)); }
@@ -921,19 +684,6 @@
 				if(writeA) { *Pointer<Int>(element + 12) = Extract(c, 3); }
 			}
 			break;
-		case FORMAT_X32B32G32R32I:
-			if(writeRGBA)
-			{
-				*Pointer<Int4>(element) = c;
-			}
-			else
-			{
-				if(writeR) { *Pointer<Int>(element) = Extract(c, 0); }
-				if(writeG) { *Pointer<Int>(element + 4) = Extract(c, 1); }
-				if(writeB) { *Pointer<Int>(element + 8) = Extract(c, 2); }
-			}
-			if(writeA) { *Pointer<Int>(element + 12) = Int(0x7FFFFFFF); }
-			break;
 		case FORMAT_G32R32I:
 			if(writeR) { *Pointer<Int>(element) = Extract(c, 0); }
 			if(writeG) { *Pointer<Int>(element + 4) = Extract(c, 1); }
@@ -954,19 +704,6 @@
 				if(writeA) { *Pointer<UInt>(element + 12) = As<UInt>(Extract(c, 3)); }
 			}
 			break;
-		case FORMAT_X32B32G32R32UI:
-			if(writeRGBA)
-			{
-				*Pointer<UInt4>(element) = As<UInt4>(c);
-			}
-			else
-			{
-				if(writeR) { *Pointer<UInt>(element) = As<UInt>(Extract(c, 0)); }
-				if(writeG) { *Pointer<UInt>(element + 4) = As<UInt>(Extract(c, 1)); }
-				if(writeB) { *Pointer<UInt>(element + 8) = As<UInt>(Extract(c, 2)); }
-			}
-			if(writeA) { *Pointer<UInt>(element + 3) = UInt(0xFFFFFFFF); }
-			break;
 		case FORMAT_G32R32UI:
 			if(writeR) { *Pointer<UInt>(element) = As<UInt>(Extract(c, 0)); }
 			if(writeG) { *Pointer<UInt>(element + 4) = As<UInt>(Extract(c, 1)); }
@@ -985,23 +722,15 @@
 	{
 		switch(format)
 		{
-		case FORMAT_L8:
-		case FORMAT_A8:
 		case FORMAT_A8R8G8B8:
-		case FORMAT_X8R8G8B8:
 		case FORMAT_R8:
 		case FORMAT_G8R8:
-		case FORMAT_R8G8B8:
-		case FORMAT_B8G8R8:
-		case FORMAT_X8B8G8R8:
 		case FORMAT_A8B8G8R8:
-		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
 			scale = vector(0xFF, 0xFF, 0xFF, 0xFF);
 			break;
 		case FORMAT_R8_SNORM:
 		case FORMAT_G8R8_SNORM:
-		case FORMAT_X8B8G8R8_SNORM:
 		case FORMAT_A8B8G8R8_SNORM:
 			scale = vector(0x7F, 0x7F, 0x7F, 0x7F);
 			break;
@@ -1012,8 +741,6 @@
 		case FORMAT_R8UI:
 		case FORMAT_G8R8I:
 		case FORMAT_G8R8UI:
-		case FORMAT_X8B8G8R8I:
-		case FORMAT_X8B8G8R8UI:
 		case FORMAT_A8B8G8R8I:
 		case FORMAT_A8B8G8R8UI:
 		case FORMAT_R16I:
@@ -1021,22 +748,15 @@
 		case FORMAT_G16R16:
 		case FORMAT_G16R16I:
 		case FORMAT_G16R16UI:
-		case FORMAT_X16B16G16R16I:
-		case FORMAT_X16B16G16R16UI:
 		case FORMAT_A16B16G16R16I:
 		case FORMAT_A16B16G16R16UI:
 		case FORMAT_R32I:
 		case FORMAT_R32UI:
 		case FORMAT_G32R32I:
 		case FORMAT_G32R32UI:
-		case FORMAT_X32B32G32R32I:
-		case FORMAT_X32B32G32R32UI:
 		case FORMAT_A32B32G32R32I:
 		case FORMAT_A32B32G32R32UI:
 		case FORMAT_A32B32G32R32F:
-		case FORMAT_X32B32G32R32F:
-		case FORMAT_X32B32G32R32F_UNSIGNED:
-		case FORMAT_B32G32R32F:
 		case FORMAT_G32R32F:
 		case FORMAT_R32F:
 		case FORMAT_A2B10G10R10UI:
@@ -1055,17 +775,8 @@
 		case FORMAT_D24X8:
 			scale = vector(0xFFFFFF, 0.0f, 0.0f, 0.0f);
 			break;
-		case FORMAT_D32:
-			scale = vector(static_cast<float>(0xFFFFFFFF), 0.0f, 0.0f, 0.0f);
-			break;
 		case FORMAT_D32F:
 		case FORMAT_D32FS8:
-		case FORMAT_D32F_COMPLEMENTARY:
-		case FORMAT_D32FS8_COMPLEMENTARY:
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32F_SHADOW:
-		case FORMAT_D32FS8_SHADOW:
 		case FORMAT_S8:
 			scale = vector(1.0f, 1.0f, 1.0f, 1.0f);
 			break;
@@ -1122,11 +833,7 @@
 			value *= Float4(scale.x / unscale.x, scale.y / unscale.y, scale.z / unscale.z, scale.w / unscale.w);
 		}
 
-		if(state.destFormat == FORMAT_X32B32G32R32F_UNSIGNED)
-		{
-			value = Max(value, Float4(0.0f));  // TODO: Only necessary if source is signed.
-		}
-		else if(Surface::isFloatFormat(state.sourceFormat) && !Surface::isFloatFormat(state.destFormat))
+		if(Surface::isFloatFormat(state.sourceFormat) && !Surface::isFloatFormat(state.destFormat))
 		{
 			value = Min(value, Float4(scale.x, scale.y, scale.z, scale.w));
 
diff --git a/src/Device/Sampler.cpp b/src/Device/Sampler.cpp
index 2f33684..2fc1bb1 100644
--- a/src/Device/Sampler.cpp
+++ b/src/Device/Sampler.cpp
@@ -494,11 +494,6 @@
 			return COMPARE_BYPASS;
 		}
 
-		if(internalTextureFormat == FORMAT_D32FS8_SHADOW)
-		{
-			return COMPARE_LESSEQUAL;
-		}
-
 		return compare;
 	}
 }
diff --git a/src/Device/Surface.cpp b/src/Device/Surface.cpp
index 15e1c77..ea3f488 100644
--- a/src/Device/Surface.cpp
+++ b/src/Device/Surface.cpp
@@ -39,9 +39,6 @@
 	extern bool complementaryDepthBuffer;
 	extern TranscendentalPrecision logPrecision;
 
-	unsigned int *Surface::palette = 0;
-	unsigned int Surface::paletteID = 0;
-
 	void Surface::Buffer::write(int x, int y, int z, const Color<float> &color)
 	{
 		ASSERT((x >= -border) && (x < (width + border)));
@@ -87,9 +84,6 @@
 
 		switch(format)
 		{
-		case FORMAT_A8:
-			*(unsigned char*)element = unorm<8>(a);
-			break;
 		case FORMAT_R8_SNORM:
 			*(char*)element = snorm<8>(r);
 			break;
@@ -114,18 +108,6 @@
 		case FORMAT_R32UI:
 			*(unsigned int*)element = static_cast<unsigned int>(r);
 			break;
-		case FORMAT_R3G3B2:
-			*(unsigned char*)element = (unorm<3>(r) << 5) | (unorm<3>(g) << 2) | (unorm<2>(b) << 0);
-			break;
-		case FORMAT_A8R3G3B2:
-			*(unsigned short*)element = (unorm<8>(a) << 8) | (unorm<3>(r) << 5) | (unorm<3>(g) << 2) | (unorm<2>(b) << 0);
-			break;
-		case FORMAT_X4R4G4B4:
-			*(unsigned short*)element = 0xF000 | (unorm<4>(r) << 8) | (unorm<4>(g) << 4) | (unorm<4>(b) << 0);
-			break;
-		case FORMAT_A4R4G4B4:
-			*(unsigned short*)element = (unorm<4>(a) << 12) | (unorm<4>(r) << 8) | (unorm<4>(g) << 4) | (unorm<4>(b) << 0);
-			break;
 		case FORMAT_R4G4B4A4:
 			*(unsigned short*)element = (unorm<4>(r) << 12) | (unorm<4>(g) << 8) | (unorm<4>(b) << 4) | (unorm<4>(a) << 0);
 			break;
@@ -138,15 +120,9 @@
 		case FORMAT_R5G5B5A1:
 			*(unsigned short*)element = (unorm<5>(r) << 11) | (unorm<5>(g) << 6) | (unorm<5>(b) << 1) | (unorm<5>(a) << 0);
 			break;
-		case FORMAT_X1R5G5B5:
-			*(unsigned short*)element = 0x8000 | (unorm<5>(r) << 10) | (unorm<5>(g) << 5) | (unorm<5>(b) << 0);
-			break;
 		case FORMAT_A8R8G8B8:
 			*(unsigned int*)element = (unorm<8>(a) << 24) | (unorm<8>(r) << 16) | (unorm<8>(g) << 8) | (unorm<8>(b) << 0);
 			break;
-		case FORMAT_X8R8G8B8:
-			*(unsigned int*)element = 0xFF000000 | (unorm<8>(r) << 16) | (unorm<8>(g) << 8) | (unorm<8>(b) << 0);
-			break;
 		case FORMAT_A8B8G8R8_SNORM:
 			*(unsigned int*)element = (static_cast<unsigned int>(snorm<8>(a)) << 24) |
 			                          (static_cast<unsigned int>(snorm<8>(b)) << 16) |
@@ -166,24 +142,6 @@
 		case FORMAT_A8B8G8R8UI:
 			*(unsigned int*)element = (ucast<8>(a) << 24) | (ucast<8>(b) << 16) | (ucast<8>(g) << 8) | (ucast<8>(r) << 0);
 			break;
-		case FORMAT_X8B8G8R8_SNORM:
-			*(unsigned int*)element = 0x7F000000 |
-			                          (static_cast<unsigned int>(snorm<8>(b)) << 16) |
-			                          (static_cast<unsigned int>(snorm<8>(g)) << 8) |
-			                          (static_cast<unsigned int>(snorm<8>(r)) << 0);
-			break;
-		case FORMAT_X8B8G8R8:
-		case FORMAT_SRGB8_X8:
-			*(unsigned int*)element = 0xFF000000 | (unorm<8>(b) << 16) | (unorm<8>(g) << 8) | (unorm<8>(r) << 0);
-			break;
-		case FORMAT_X8B8G8R8I:
-			*(unsigned int*)element = 0x7F000000 |
-			                          (static_cast<unsigned int>(scast<8>(b)) << 16) |
-			                          (static_cast<unsigned int>(scast<8>(g)) << 8) |
-			                          (static_cast<unsigned int>(scast<8>(r)) << 0);
-		case FORMAT_X8B8G8R8UI:
-			*(unsigned int*)element = 0xFF000000 | (ucast<8>(b) << 16) | (ucast<8>(g) << 8) | (ucast<8>(r) << 0);
-			break;
 		case FORMAT_A2R10G10B10:
 			*(unsigned int*)element = (unorm<2>(a) << 30) | (unorm<10>(r) << 20) | (unorm<10>(g) << 10) | (unorm<10>(b) << 0);
 			break;
@@ -238,16 +196,6 @@
 			((unsigned short*)element)[2] = static_cast<unsigned short>(ucast<16>(b));
 			((unsigned short*)element)[3] = static_cast<unsigned short>(ucast<16>(a));
 			break;
-		case FORMAT_X16B16G16R16I:
-			((unsigned short*)element)[0] = static_cast<unsigned short>(scast<16>(r));
-			((unsigned short*)element)[1] = static_cast<unsigned short>(scast<16>(g));
-			((unsigned short*)element)[2] = static_cast<unsigned short>(scast<16>(b));
-			break;
-		case FORMAT_X16B16G16R16UI:
-			((unsigned short*)element)[0] = static_cast<unsigned short>(ucast<16>(r));
-			((unsigned short*)element)[1] = static_cast<unsigned short>(ucast<16>(g));
-			((unsigned short*)element)[2] = static_cast<unsigned short>(ucast<16>(b));
-			break;
 		case FORMAT_A32B32G32R32I:
 		case FORMAT_A32B32G32R32UI:
 			((unsigned int*)element)[0] = static_cast<unsigned int>(r);
@@ -255,82 +203,19 @@
 			((unsigned int*)element)[2] = static_cast<unsigned int>(b);
 			((unsigned int*)element)[3] = static_cast<unsigned int>(a);
 			break;
-		case FORMAT_X32B32G32R32I:
-		case FORMAT_X32B32G32R32UI:
-			((unsigned int*)element)[0] = static_cast<unsigned int>(r);
-			((unsigned int*)element)[1] = static_cast<unsigned int>(g);
-			((unsigned int*)element)[2] = static_cast<unsigned int>(b);
-			break;
-		case FORMAT_V8U8:
-			*(unsigned short*)element = (snorm<8>(g) << 8) | (snorm<8>(r) << 0);
-			break;
-		case FORMAT_L6V5U5:
-			*(unsigned short*)element = (unorm<6>(b) << 10) | (snorm<5>(g) << 5) | (snorm<5>(r) << 0);
-			break;
-		case FORMAT_Q8W8V8U8:
-			*(unsigned int*)element = (snorm<8>(a) << 24) | (snorm<8>(b) << 16) | (snorm<8>(g) << 8) | (snorm<8>(r) << 0);
-			break;
-		case FORMAT_X8L8V8U8:
-			*(unsigned int*)element = 0xFF000000 | (unorm<8>(b) << 16) | (snorm<8>(g) << 8) | (snorm<8>(r) << 0);
-			break;
-		case FORMAT_V16U16:
-			*(unsigned int*)element = (snorm<16>(g) << 16) | (snorm<16>(r) << 0);
-			break;
-		case FORMAT_A2W10V10U10:
-			*(unsigned int*)element = (unorm<2>(a) << 30) | (snorm<10>(b) << 20) | (snorm<10>(g) << 10) | (snorm<10>(r) << 0);
-			break;
-		case FORMAT_A16W16V16U16:
-			((unsigned short*)element)[0] = snorm<16>(r);
-			((unsigned short*)element)[1] = snorm<16>(g);
-			((unsigned short*)element)[2] = snorm<16>(b);
-			((unsigned short*)element)[3] = unorm<16>(a);
-			break;
-		case FORMAT_Q16W16V16U16:
-			((unsigned short*)element)[0] = snorm<16>(r);
-			((unsigned short*)element)[1] = snorm<16>(g);
-			((unsigned short*)element)[2] = snorm<16>(b);
-			((unsigned short*)element)[3] = snorm<16>(a);
-			break;
-		case FORMAT_R8G8B8:
-			((unsigned char*)element)[0] = unorm<8>(b);
-			((unsigned char*)element)[1] = unorm<8>(g);
-			((unsigned char*)element)[2] = unorm<8>(r);
-			break;
-		case FORMAT_B8G8R8:
-			((unsigned char*)element)[0] = unorm<8>(r);
-			((unsigned char*)element)[1] = unorm<8>(g);
-			((unsigned char*)element)[2] = unorm<8>(b);
-			break;
 		case FORMAT_R16F:
 			*(half*)element = (half)r;
 			break;
-		case FORMAT_A16F:
-			*(half*)element = (half)a;
-			break;
 		case FORMAT_G16R16F:
 			((half*)element)[0] = (half)r;
 			((half*)element)[1] = (half)g;
 			break;
-		case FORMAT_X16B16G16R16F_UNSIGNED:
-			r = max(r, 0.0f); g = max(g, 0.0f); b = max(b, 0.0f);
-			// Fall through to FORMAT_X16B16G16R16F.
-		case FORMAT_X16B16G16R16F:
-			((half*)element)[3] = 1.0f;
-			// Fall through to FORMAT_B16G16R16F.
-		case FORMAT_B16G16R16F:
-			((half*)element)[0] = (half)r;
-			((half*)element)[1] = (half)g;
-			((half*)element)[2] = (half)b;
-			break;
 		case FORMAT_A16B16G16R16F:
 			((half*)element)[0] = (half)r;
 			((half*)element)[1] = (half)g;
 			((half*)element)[2] = (half)b;
 			((half*)element)[3] = (half)a;
 			break;
-		case FORMAT_A32F:
-			*(float*)element = a;
-			break;
 		case FORMAT_R32F:
 			*(float*)element = r;
 			break;
@@ -338,17 +223,6 @@
 			((float*)element)[0] = r;
 			((float*)element)[1] = g;
 			break;
-		case FORMAT_X32B32G32R32F_UNSIGNED:
-			r = max(r, 0.0f); g = max(g, 0.0f); b = max(b, 0.0f);
-			// Fall through to FORMAT_X32B32G32R32F.
-		case FORMAT_X32B32G32R32F:
-			((float*)element)[3] = 1.0f;
-			// Fall through to FORMAT_B32G32R32F.
-		case FORMAT_B32G32R32F:
-			((float*)element)[0] = r;
-			((float*)element)[1] = g;
-			((float*)element)[2] = b;
-			break;
 		case FORMAT_A32B32G32R32F:
 			((float*)element)[0] = r;
 			((float*)element)[1] = g;
@@ -357,45 +231,11 @@
 			break;
 		case FORMAT_D32F:
 		case FORMAT_D32FS8:
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32F_SHADOW:
-		case FORMAT_D32FS8_SHADOW:
 			*((float*)element) = r;
 			break;
-		case FORMAT_D32F_COMPLEMENTARY:
-		case FORMAT_D32FS8_COMPLEMENTARY:
-			*((float*)element) = 1 - r;
-			break;
 		case FORMAT_S8:
 			*((unsigned char*)element) = unorm<8>(r);
 			break;
-		case FORMAT_L8:
-			*(unsigned char*)element = unorm<8>(r);
-			break;
-		case FORMAT_A4L4:
-			*(unsigned char*)element = (unorm<4>(a) << 4) | (unorm<4>(r) << 0);
-			break;
-		case FORMAT_L16:
-			*(unsigned short*)element = unorm<16>(r);
-			break;
-		case FORMAT_A8L8:
-			*(unsigned short*)element = (unorm<8>(a) << 8) | (unorm<8>(r) << 0);
-			break;
-		case FORMAT_L16F:
-			*(half*)element = (half)r;
-			break;
-		case FORMAT_A16L16F:
-			((half*)element)[0] = (half)r;
-			((half*)element)[1] = (half)a;
-			break;
-		case FORMAT_L32F:
-			*(float*)element = r;
-			break;
-		case FORMAT_A32L32F:
-			((float*)element)[0] = r;
-			((float*)element)[1] = a;
-			break;
 		default:
 			ASSERT(false);
 		}
@@ -431,36 +271,6 @@
 
 		switch(format)
 		{
-		case FORMAT_P8:
-			{
-				ASSERT(palette);
-
-				unsigned int abgr = palette[*(unsigned char*)element];
-
-				r = (abgr & 0x000000FF) * (1.0f / 0x000000FF);
-				g = (abgr & 0x0000FF00) * (1.0f / 0x0000FF00);
-				b = (abgr & 0x00FF0000) * (1.0f / 0x00FF0000);
-				a = (abgr & 0xFF000000) * (1.0f / 0xFF000000);
-			}
-			break;
-		case FORMAT_A8P8:
-			{
-				ASSERT(palette);
-
-				unsigned int bgr = palette[((unsigned char*)element)[0]];
-
-				r = (bgr & 0x000000FF) * (1.0f / 0x000000FF);
-				g = (bgr & 0x0000FF00) * (1.0f / 0x0000FF00);
-				b = (bgr & 0x00FF0000) * (1.0f / 0x00FF0000);
-				a = ((unsigned char*)element)[1] * (1.0f / 0xFF);
-			}
-			break;
-		case FORMAT_A8:
-			r = 0;
-			g = 0;
-			b = 0;
-			a = *(unsigned char*)element * (1.0f / 0xFF);
-			break;
 		case FORMAT_R8_SNORM:
 			r = max((*(signed char*)element) * (1.0f / 0x7F), -1.0f);
 			break;
@@ -473,44 +283,6 @@
 		case FORMAT_R8UI:
 			r = *(unsigned char*)element;
 			break;
-		case FORMAT_R3G3B2:
-			{
-				unsigned char rgb = *(unsigned char*)element;
-
-				r = (rgb & 0xE0) * (1.0f / 0xE0);
-				g = (rgb & 0x1C) * (1.0f / 0x1C);
-				b = (rgb & 0x03) * (1.0f / 0x03);
-			}
-			break;
-		case FORMAT_A8R3G3B2:
-			{
-				unsigned short argb = *(unsigned short*)element;
-
-				a = (argb & 0xFF00) * (1.0f / 0xFF00);
-				r = (argb & 0x00E0) * (1.0f / 0x00E0);
-				g = (argb & 0x001C) * (1.0f / 0x001C);
-				b = (argb & 0x0003) * (1.0f / 0x0003);
-			}
-			break;
-		case FORMAT_X4R4G4B4:
-			{
-				unsigned short rgb = *(unsigned short*)element;
-
-				r = (rgb & 0x0F00) * (1.0f / 0x0F00);
-				g = (rgb & 0x00F0) * (1.0f / 0x00F0);
-				b = (rgb & 0x000F) * (1.0f / 0x000F);
-			}
-			break;
-		case FORMAT_A4R4G4B4:
-			{
-				unsigned short argb = *(unsigned short*)element;
-
-				a = (argb & 0xF000) * (1.0f / 0xF000);
-				r = (argb & 0x0F00) * (1.0f / 0x0F00);
-				g = (argb & 0x00F0) * (1.0f / 0x00F0);
-				b = (argb & 0x000F) * (1.0f / 0x000F);
-			}
-			break;
 		case FORMAT_R4G4B4A4:
 			{
 				unsigned short rgba = *(unsigned short*)element;
@@ -550,15 +322,6 @@
 				a = (rgba & 0x0001) * (1.0f / 0x0001);
 			}
 			break;
-		case FORMAT_X1R5G5B5:
-			{
-				unsigned short xrgb = *(unsigned short*)element;
-
-				r = (xrgb & 0x7C00) * (1.0f / 0x7C00);
-				g = (xrgb & 0x03E0) * (1.0f / 0x03E0);
-				b = (xrgb & 0x001F) * (1.0f / 0x001F);
-			}
-			break;
 		case FORMAT_A8R8G8B8:
 			{
 				unsigned int argb = *(unsigned int*)element;
@@ -569,15 +332,6 @@
 				b = (argb & 0x000000FF) * (1.0f / 0x000000FF);
 			}
 			break;
-		case FORMAT_X8R8G8B8:
-			{
-				unsigned int xrgb = *(unsigned int*)element;
-
-				r = (xrgb & 0x00FF0000) * (1.0f / 0x00FF0000);
-				g = (xrgb & 0x0000FF00) * (1.0f / 0x0000FF00);
-				b = (xrgb & 0x000000FF) * (1.0f / 0x000000FF);
-			}
-			break;
 		case FORMAT_A8B8G8R8_SNORM:
 			{
 				signed char* abgr = (signed char*)element;
@@ -619,43 +373,6 @@
 				a = abgr[3];
 			}
 			break;
-		case FORMAT_X8B8G8R8_SNORM:
-			{
-				signed char* bgr = (signed char*)element;
-
-				r = max(bgr[0] * (1.0f / 0x7F), -1.0f);
-				g = max(bgr[1] * (1.0f / 0x7F), -1.0f);
-				b = max(bgr[2] * (1.0f / 0x7F), -1.0f);
-			}
-			break;
-		case FORMAT_X8B8G8R8:
-		case FORMAT_SRGB8_X8:
-			{
-				unsigned int xbgr = *(unsigned int*)element;
-
-				b = (xbgr & 0x00FF0000) * (1.0f / 0x00FF0000);
-				g = (xbgr & 0x0000FF00) * (1.0f / 0x0000FF00);
-				r = (xbgr & 0x000000FF) * (1.0f / 0x000000FF);
-			}
-			break;
-		case FORMAT_X8B8G8R8I:
-			{
-				signed char* bgr = (signed char*)element;
-
-				r = bgr[0];
-				g = bgr[1];
-				b = bgr[2];
-			}
-			break;
-		case FORMAT_X8B8G8R8UI:
-			{
-				unsigned char* bgr = (unsigned char*)element;
-
-				r = bgr[0];
-				g = bgr[1];
-				b = bgr[2];
-			}
-			break;
 		case FORMAT_G8R8_SNORM:
 			{
 				signed char* gr = (signed char*)element;
@@ -774,24 +491,6 @@
 				a = abgr[3];
 			}
 			break;
-		case FORMAT_X16B16G16R16I:
-			{
-				short* bgr = (short*)element;
-
-				r = bgr[0];
-				g = bgr[1];
-				b = bgr[2];
-			}
-			break;
-		case FORMAT_X16B16G16R16UI:
-			{
-				unsigned short* bgr = (unsigned short*)element;
-
-				r = bgr[0];
-				g = bgr[1];
-				b = bgr[2];
-			}
-			break;
 		case FORMAT_A32B32G32R32I:
 			{
 				int* abgr = (int*)element;
@@ -812,24 +511,6 @@
 				a = static_cast<float>(abgr[3]);
 			}
 			break;
-		case FORMAT_X32B32G32R32I:
-			{
-				int* bgr = (int*)element;
-
-				r = static_cast<float>(bgr[0]);
-				g = static_cast<float>(bgr[1]);
-				b = static_cast<float>(bgr[2]);
-			}
-			break;
-		case FORMAT_X32B32G32R32UI:
-			{
-				unsigned int* bgr = (unsigned int*)element;
-
-				r = static_cast<float>(bgr[0]);
-				g = static_cast<float>(bgr[1]);
-				b = static_cast<float>(bgr[2]);
-			}
-			break;
 		case FORMAT_G32R32I:
 			{
 				int* gr = (int*)element;
@@ -852,133 +533,6 @@
 		case FORMAT_R32UI:
 			r = static_cast<float>(*((unsigned int*)element));
 			break;
-		case FORMAT_V8U8:
-			{
-				unsigned short vu = *(unsigned short*)element;
-
-				r = ((int)(vu & 0x00FF) << 24) * (1.0f / 0x7F000000);
-				g = ((int)(vu & 0xFF00) << 16) * (1.0f / 0x7F000000);
-			}
-			break;
-		case FORMAT_L6V5U5:
-			{
-				unsigned short lvu = *(unsigned short*)element;
-
-				r = ((int)(lvu & 0x001F) << 27) * (1.0f / 0x78000000);
-				g = ((int)(lvu & 0x03E0) << 22) * (1.0f / 0x78000000);
-				b = (lvu & 0xFC00) * (1.0f / 0xFC00);
-			}
-			break;
-		case FORMAT_Q8W8V8U8:
-			{
-				unsigned int qwvu = *(unsigned int*)element;
-
-				r = ((int)(qwvu & 0x000000FF) << 24) * (1.0f / 0x7F000000);
-				g = ((int)(qwvu & 0x0000FF00) << 16) * (1.0f / 0x7F000000);
-				b = ((int)(qwvu & 0x00FF0000) << 8)  * (1.0f / 0x7F000000);
-				a = ((int)(qwvu & 0xFF000000) << 0)  * (1.0f / 0x7F000000);
-			}
-			break;
-		case FORMAT_X8L8V8U8:
-			{
-				unsigned int xlvu = *(unsigned int*)element;
-
-				r = ((int)(xlvu & 0x000000FF) << 24) * (1.0f / 0x7F000000);
-				g = ((int)(xlvu & 0x0000FF00) << 16) * (1.0f / 0x7F000000);
-				b = (xlvu & 0x00FF0000) * (1.0f / 0x00FF0000);
-			}
-			break;
-		case FORMAT_R8G8B8:
-			r = ((unsigned char*)element)[2] * (1.0f / 0xFF);
-			g = ((unsigned char*)element)[1] * (1.0f / 0xFF);
-			b = ((unsigned char*)element)[0] * (1.0f / 0xFF);
-			break;
-		case FORMAT_B8G8R8:
-			r = ((unsigned char*)element)[0] * (1.0f / 0xFF);
-			g = ((unsigned char*)element)[1] * (1.0f / 0xFF);
-			b = ((unsigned char*)element)[2] * (1.0f / 0xFF);
-			break;
-		case FORMAT_V16U16:
-			{
-				unsigned int vu = *(unsigned int*)element;
-
-				r = ((int)(vu & 0x0000FFFF) << 16) * (1.0f / 0x7FFF0000);
-				g = ((int)(vu & 0xFFFF0000) << 0)  * (1.0f / 0x7FFF0000);
-			}
-			break;
-		case FORMAT_A2W10V10U10:
-			{
-				unsigned int awvu = *(unsigned int*)element;
-
-				r = ((int)(awvu & 0x000003FF) << 22) * (1.0f / 0x7FC00000);
-				g = ((int)(awvu & 0x000FFC00) << 12) * (1.0f / 0x7FC00000);
-				b = ((int)(awvu & 0x3FF00000) << 2)  * (1.0f / 0x7FC00000);
-				a = (awvu & 0xC0000000) * (1.0f / 0xC0000000);
-			}
-			break;
-		case FORMAT_A16W16V16U16:
-			r = ((signed short*)element)[0] * (1.0f / 0x7FFF);
-			g = ((signed short*)element)[1] * (1.0f / 0x7FFF);
-			b = ((signed short*)element)[2] * (1.0f / 0x7FFF);
-			a = ((unsigned short*)element)[3] * (1.0f / 0xFFFF);
-			break;
-		case FORMAT_Q16W16V16U16:
-			r = ((signed short*)element)[0] * (1.0f / 0x7FFF);
-			g = ((signed short*)element)[1] * (1.0f / 0x7FFF);
-			b = ((signed short*)element)[2] * (1.0f / 0x7FFF);
-			a = ((signed short*)element)[3] * (1.0f / 0x7FFF);
-			break;
-		case FORMAT_L8:
-			r =
-			g =
-			b = *(unsigned char*)element * (1.0f / 0xFF);
-			break;
-		case FORMAT_A4L4:
-			{
-				unsigned char al = *(unsigned char*)element;
-
-				r =
-				g =
-				b = (al & 0x0F) * (1.0f / 0x0F);
-				a = (al & 0xF0) * (1.0f / 0xF0);
-			}
-			break;
-		case FORMAT_L16:
-			r =
-			g =
-			b = *(unsigned short*)element * (1.0f / 0xFFFF);
-			break;
-		case FORMAT_A8L8:
-			r =
-			g =
-			b = ((unsigned char*)element)[0] * (1.0f / 0xFF);
-			a = ((unsigned char*)element)[1] * (1.0f / 0xFF);
-			break;
-		case FORMAT_L16F:
-			r =
-			g =
-			b = *(half*)element;
-			break;
-		case FORMAT_A16L16F:
-			r =
-			g =
-			b = ((half*)element)[0];
-			a = ((half*)element)[1];
-			break;
-		case FORMAT_L32F:
-			r =
-			g =
-			b = *(float*)element;
-			break;
-		case FORMAT_A32L32F:
-			r =
-			g =
-			b = ((float*)element)[0];
-			a = ((float*)element)[1];
-			break;
-		case FORMAT_A16F:
-			a = *(half*)element;
-			break;
 		case FORMAT_R16F:
 			r = *(half*)element;
 			break;
@@ -986,22 +540,12 @@
 			r = ((half*)element)[0];
 			g = ((half*)element)[1];
 			break;
-		case FORMAT_X16B16G16R16F:
-		case FORMAT_X16B16G16R16F_UNSIGNED:
-		case FORMAT_B16G16R16F:
-			r = ((half*)element)[0];
-			g = ((half*)element)[1];
-			b = ((half*)element)[2];
-			break;
 		case FORMAT_A16B16G16R16F:
 			r = ((half*)element)[0];
 			g = ((half*)element)[1];
 			b = ((half*)element)[2];
 			a = ((half*)element)[3];
 			break;
-		case FORMAT_A32F:
-			a = *(float*)element;
-			break;
 		case FORMAT_R32F:
 			r = *(float*)element;
 			break;
@@ -1009,13 +553,6 @@
 			r = ((float*)element)[0];
 			g = ((float*)element)[1];
 			break;
-		case FORMAT_X32B32G32R32F:
-		case FORMAT_X32B32G32R32F_UNSIGNED:
-		case FORMAT_B32G32R32F:
-			r = ((float*)element)[0];
-			g = ((float*)element)[1];
-			b = ((float*)element)[2];
-			break;
 		case FORMAT_A32B32G32R32F:
 			r = ((float*)element)[0];
 			g = ((float*)element)[1];
@@ -1024,22 +561,11 @@
 			break;
 		case FORMAT_D32F:
 		case FORMAT_D32FS8:
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32F_SHADOW:
-		case FORMAT_D32FS8_SHADOW:
 			r = *(float*)element;
 			g = r;
 			b = r;
 			a = r;
 			break;
-		case FORMAT_D32F_COMPLEMENTARY:
-		case FORMAT_D32FS8_COMPLEMENTARY:
-			r = 1.0f - *(float*)element;
-			g = r;
-			b = r;
-			a = r;
-			break;
 		case FORMAT_S8:
 			r = *(unsigned char*)element * (1.0f / 0xFF);
 			break;
@@ -1150,9 +676,6 @@
 
 			switch(format)
 			{
-			case FORMAT_DXT1:
-			case FORMAT_ATI1:
-			case FORMAT_ETC1:
 			case FORMAT_R11_EAC:
 			case FORMAT_SIGNED_R11_EAC:
 			case FORMAT_RGB8_ETC2:
@@ -1206,10 +729,6 @@
 			case FORMAT_RGBA_ASTC_12x12_KHR:
 			case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
 				return (unsigned char*)buffer + 16 * (x / 12) + (y / 12) * pitchB + z * sliceB;
-			case FORMAT_DXT3:
-			case FORMAT_DXT5:
-			case FORMAT_ATI2:
-				return (unsigned char*)buffer + 16 * (x / 4) + (y / 4) * pitchB + z * sliceB;
 			default:
 				return (unsigned char*)buffer + x * bytes + y * pitchB + z * samples * sliceB;
 			}
@@ -1306,7 +825,6 @@
 		stencil.dirty = false;
 
 		dirtyContents = true;
-		paletteUsed = 0;
 	}
 
 	Surface::Surface(Resource *texture, int width, int height, int depth, int border, int samples, Format format, bool lockable, bool renderTarget, int pitchPprovided) : lockable(lockable), renderTarget(renderTarget)
@@ -1363,7 +881,6 @@
 		stencil.dirty = false;
 
 		dirtyContents = true;
-		paletteUsed = 0;
 	}
 
 	Surface::~Surface()
@@ -1471,8 +988,6 @@
 				{
 					switch(external.format)
 					{
-					case FORMAT_R3G3B2:
-					case FORMAT_A8R3G3B2:
 					case FORMAT_A1R5G5B5:
 					case FORMAT_A2R10G10B10:
 					case FORMAT_A2B10G10R10:
@@ -1487,7 +1002,7 @@
 			}
 		}
 
-		if(external.dirty || (isPalette(external.format) && paletteUsed != Surface::paletteID))
+		if(external.dirty)
 		{
 			if(lock != LOCK_DISCARD)
 			{
@@ -1495,7 +1010,6 @@
 			}
 
 			external.dirty = false;
-			paletteUsed = Surface::paletteID;
 		}
 
 		switch(lock)
@@ -1556,44 +1070,26 @@
 		switch(format)
 		{
 		case FORMAT_NULL:				return 0;
-		case FORMAT_P8:					return 1;
-		case FORMAT_A8P8:				return 2;
-		case FORMAT_A8:					return 1;
 		case FORMAT_R8I:				return 1;
 		case FORMAT_R8:					return 1;
-		case FORMAT_R3G3B2:				return 1;
 		case FORMAT_R16I:				return 2;
 		case FORMAT_R16UI:				return 2;
-		case FORMAT_A8R3G3B2:			return 2;
 		case FORMAT_R5G6B5:				return 2;
 		case FORMAT_A1R5G5B5:			return 2;
-		case FORMAT_X1R5G5B5:			return 2;
-		case FORMAT_R5G5B5A1:           return 2;
-		case FORMAT_X4R4G4B4:			return 2;
-		case FORMAT_A4R4G4B4:			return 2;
-		case FORMAT_R4G4B4A4:           return 2;
-		case FORMAT_R8G8B8:				return 3;
-		case FORMAT_B8G8R8:             return 3;
+		case FORMAT_R5G5B5A1:			return 2;
+		case FORMAT_R4G4B4A4:			return 2;
 		case FORMAT_R32I:				return 4;
 		case FORMAT_R32UI:				return 4;
-		case FORMAT_X8R8G8B8:			return 4;
-	//	case FORMAT_X8G8R8B8Q:			return 4;
 		case FORMAT_A8R8G8B8:			return 4;
-	//	case FORMAT_A8G8R8B8Q:			return 4;
-		case FORMAT_X8B8G8R8I:			return 4;
-		case FORMAT_X8B8G8R8:			return 4;
-		case FORMAT_SRGB8_X8:			return 4;
 		case FORMAT_SRGB8_A8:			return 4;
 		case FORMAT_A8B8G8R8I:			return 4;
 		case FORMAT_R8UI:				return 1;
 		case FORMAT_G8R8UI:				return 2;
-		case FORMAT_X8B8G8R8UI:			return 4;
 		case FORMAT_A8B8G8R8UI:			return 4;
 		case FORMAT_A8B8G8R8:			return 4;
 		case FORMAT_R8_SNORM:			return 1;
-		case FORMAT_G8R8_SNORM:		return 2;
-		case FORMAT_X8B8G8R8_SNORM:	return 4;
-		case FORMAT_A8B8G8R8_SNORM:	return 4;
+		case FORMAT_G8R8_SNORM:			return 2;
+		case FORMAT_A8B8G8R8_SNORM:		return 4;
 		case FORMAT_A2R10G10B10:		return 4;
 		case FORMAT_A2B10G10R10:		return 4;
 		case FORMAT_A2B10G10R10UI:		return 4;
@@ -1604,22 +1100,12 @@
 		case FORMAT_G16R16:				return 4;
 		case FORMAT_G32R32I:			return 8;
 		case FORMAT_G32R32UI:			return 8;
-		case FORMAT_X16B16G16R16I:		return 8;
-		case FORMAT_X16B16G16R16UI:		return 8;
 		case FORMAT_A16B16G16R16I:		return 8;
 		case FORMAT_A16B16G16R16UI:		return 8;
 		case FORMAT_A16B16G16R16:		return 8;
-		case FORMAT_X32B32G32R32I:		return 16;
-		case FORMAT_X32B32G32R32UI:		return 16;
 		case FORMAT_A32B32G32R32I:		return 16;
 		case FORMAT_A32B32G32R32UI:		return 16;
 		// Compressed formats
-		case FORMAT_DXT1:				return 2;   // Column of four pixels
-		case FORMAT_DXT3:				return 4;   // Column of four pixels
-		case FORMAT_DXT5:				return 4;   // Column of four pixels
-		case FORMAT_ATI1:				return 2;   // Column of four pixels
-		case FORMAT_ATI2:				return 4;   // Column of four pixels
-		case FORMAT_ETC1:				return 2;   // Column of four pixels
 		case FORMAT_R11_EAC:			return 2;
 		case FORMAT_SIGNED_R11_EAC:		return 2;
 		case FORMAT_RG11_EAC:			return 4;
@@ -1658,56 +1144,19 @@
 		case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
 		case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
 		case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR: return 0; // FIXME
-		// Bumpmap formats
-		case FORMAT_V8U8:				return 2;
-		case FORMAT_L6V5U5:				return 2;
-		case FORMAT_Q8W8V8U8:			return 4;
-		case FORMAT_X8L8V8U8:			return 4;
-		case FORMAT_A2W10V10U10:		return 4;
-		case FORMAT_V16U16:				return 4;
-		case FORMAT_A16W16V16U16:		return 8;
-		case FORMAT_Q16W16V16U16:		return 8;
-		// Luminance formats
-		case FORMAT_L8:					return 1;
-		case FORMAT_A4L4:				return 1;
-		case FORMAT_L16:				return 2;
-		case FORMAT_A8L8:				return 2;
-		case FORMAT_L16F:               return 2;
-		case FORMAT_A16L16F:            return 4;
-		case FORMAT_L32F:               return 4;
-		case FORMAT_A32L32F:            return 8;
 		// Floating-point formats
-		case FORMAT_A16F:				return 2;
 		case FORMAT_R16F:				return 2;
 		case FORMAT_G16R16F:			return 4;
-		case FORMAT_B16G16R16F:			return 6;
-		case FORMAT_X16B16G16R16F:		return 8;
 		case FORMAT_A16B16G16R16F:		return 8;
-		case FORMAT_X16B16G16R16F_UNSIGNED: return 8;
-		case FORMAT_A32F:				return 4;
 		case FORMAT_R32F:				return 4;
 		case FORMAT_G32R32F:			return 8;
-		case FORMAT_B32G32R32F:			return 12;
-		case FORMAT_X32B32G32R32F:		return 16;
 		case FORMAT_A32B32G32R32F:		return 16;
-		case FORMAT_X32B32G32R32F_UNSIGNED: return 16;
 		// Depth/stencil formats
 		case FORMAT_D16:				return 2;
-		case FORMAT_D32:				return 4;
 		case FORMAT_D24X8:				return 4;
 		case FORMAT_D24S8:				return 4;
-		case FORMAT_D24FS8:				return 4;
 		case FORMAT_D32F:				return 4;
 		case FORMAT_D32FS8:				return 4;
-		case FORMAT_D32F_COMPLEMENTARY:	return 4;
-		case FORMAT_D32FS8_COMPLEMENTARY: return 4;
-		case FORMAT_D32F_LOCKABLE:		return 4;
-		case FORMAT_D32FS8_TEXTURE:		return 4;
-		case FORMAT_D32F_SHADOW:		return 4;
-		case FORMAT_D32FS8_SHADOW:		return 4;
-		case FORMAT_DF24S8:				return 4;
-		case FORMAT_DF16S8:				return 2;
-		case FORMAT_INTZ:				return 4;
 		case FORMAT_S8:					return 1;
 		case FORMAT_YV12_BT601:         return 1;   // Y plane only
 		case FORMAT_YV12_BT709:         return 1;   // Y plane only
@@ -1731,8 +1180,6 @@
 
 		switch(format)
 		{
-		case FORMAT_DXT1:
-		case FORMAT_ETC1:
 		case FORMAT_R11_EAC:
 		case FORMAT_SIGNED_R11_EAC:
 		case FORMAT_RGB8_ETC2:
@@ -1778,13 +1225,6 @@
 		case FORMAT_RGBA_ASTC_12x12_KHR:
 		case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
 			return 16 * ((width + 11) / 12);
-		case FORMAT_DXT3:
-		case FORMAT_DXT5:
-			return 16 * ((width + 3) / 4);   // 128 bit per 4x4 block, computed per 4 rows
-		case FORMAT_ATI1:
-			return 2 * ((width + 3) / 4);    // 64 bit per 4x4 block, computed per row
-		case FORMAT_ATI2:
-			return 4 * ((width + 3) / 4);    // 128 bit per 4x4 block, computed per row
 		case FORMAT_YV12_BT601:
 		case FORMAT_YV12_BT709:
 		case FORMAT_YV12_JFIF:
@@ -1813,10 +1253,6 @@
 
 		switch(format)
 		{
-		case FORMAT_DXT1:
-		case FORMAT_DXT3:
-		case FORMAT_DXT5:
-		case FORMAT_ETC1:
 		case FORMAT_R11_EAC:
 		case FORMAT_SIGNED_R11_EAC:
 		case FORMAT_RG11_EAC:
@@ -1861,9 +1297,6 @@
 		case FORMAT_RGBA_ASTC_12x12_KHR:
 		case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
 			return pitchB(width, border, format, target) * ((height + 11) / 12);   // Pitch computed per 12 rows
-		case FORMAT_ATI1:
-		case FORMAT_ATI2:
-			return pitchB(width, border, format, target) * align<4>(height);   // Pitch computed per row
 		default:
 			return pitchB(width, border, format, target) * height;   // Pitch computed per row
 		}
@@ -1887,22 +1320,10 @@
 
 			switch(source.format)
 			{
-			case FORMAT_R8G8B8:		decodeR8G8B8(destination, source);		break;   // FIXME: Check destination format
-			case FORMAT_X1R5G5B5:	decodeX1R5G5B5(destination, source);	break;   // FIXME: Check destination format
-			case FORMAT_A1R5G5B5:	decodeA1R5G5B5(destination, source);	break;   // FIXME: Check destination format
-			case FORMAT_X4R4G4B4:	decodeX4R4G4B4(destination, source);	break;   // FIXME: Check destination format
-			case FORMAT_A4R4G4B4:	decodeA4R4G4B4(destination, source);	break;   // FIXME: Check destination format
-			case FORMAT_P8:			decodeP8(destination, source);			break;   // FIXME: Check destination format
-			case FORMAT_DXT1:		decodeDXT1(destination, source);		break;   // FIXME: Check destination format
-			case FORMAT_DXT3:		decodeDXT3(destination, source);		break;   // FIXME: Check destination format
-			case FORMAT_DXT5:		decodeDXT5(destination, source);		break;   // FIXME: Check destination format
-			case FORMAT_ATI1:		decodeATI1(destination, source);		break;   // FIXME: Check destination format
-			case FORMAT_ATI2:		decodeATI2(destination, source);		break;   // FIXME: Check destination format
 			case FORMAT_R11_EAC:         decodeEAC(destination, source, 1, false); break; // FIXME: Check destination format
 			case FORMAT_SIGNED_R11_EAC:  decodeEAC(destination, source, 1, true);  break; // FIXME: Check destination format
 			case FORMAT_RG11_EAC:        decodeEAC(destination, source, 2, false); break; // FIXME: Check destination format
 			case FORMAT_SIGNED_RG11_EAC: decodeEAC(destination, source, 2, true);  break; // FIXME: Check destination format
-			case FORMAT_ETC1:
 			case FORMAT_RGB8_ETC2:                      decodeETC2(destination, source, 0, false); break; // FIXME: Check destination format
 			case FORMAT_SRGB8_ETC2:                     decodeETC2(destination, source, 0, true);  break; // FIXME: Check destination format
 			case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:  decodeETC2(destination, source, 1, false); break; // FIXME: Check destination format
@@ -1990,277 +1411,6 @@
 		destination.unlockRect();
 	}
 
-	void Surface::decodeR8G8B8(Buffer &destination, Buffer &source)
-	{
-		unsigned char *sourceSlice = (unsigned char*)source.lockRect(0, 0, 0, sw::LOCK_READONLY);
-		unsigned char *destinationSlice = (unsigned char*)destination.lockRect(0, 0, 0, sw::LOCK_UPDATE);
-
-		int depth = min(destination.depth, source.depth);
-		int height = min(destination.height, source.height);
-		int width = min(destination.width, source.width);
-
-		for(int z = 0; z < depth; z++)
-		{
-			unsigned char *sourceRow = sourceSlice;
-			unsigned char *destinationRow = destinationSlice;
-
-			for(int y = 0; y < height; y++)
-			{
-				unsigned char *sourceElement = sourceRow;
-				unsigned char *destinationElement = destinationRow;
-
-				for(int x = 0; x < width; x++)
-				{
-					unsigned int b = sourceElement[0];
-					unsigned int g = sourceElement[1];
-					unsigned int r = sourceElement[2];
-
-					*(unsigned int*)destinationElement = 0xFF000000 | (r << 16) | (g << 8) | (b << 0);
-
-					sourceElement += source.bytes;
-					destinationElement += destination.bytes;
-				}
-
-				sourceRow += source.pitchB;
-				destinationRow += destination.pitchB;
-			}
-
-			sourceSlice += source.sliceB;
-			destinationSlice += destination.sliceB;
-		}
-
-		source.unlockRect();
-		destination.unlockRect();
-	}
-
-	void Surface::decodeX1R5G5B5(Buffer &destination, Buffer &source)
-	{
-		unsigned char *sourceSlice = (unsigned char*)source.lockRect(0, 0, 0, sw::LOCK_READONLY);
-		unsigned char *destinationSlice = (unsigned char*)destination.lockRect(0, 0, 0, sw::LOCK_UPDATE);
-
-		int depth = min(destination.depth, source.depth);
-		int height = min(destination.height, source.height);
-		int width = min(destination.width, source.width);
-
-		for(int z = 0; z < depth; z++)
-		{
-			unsigned char *sourceRow = sourceSlice;
-			unsigned char *destinationRow = destinationSlice;
-
-			for(int y = 0; y < height; y++)
-			{
-				unsigned char *sourceElement = sourceRow;
-				unsigned char *destinationElement = destinationRow;
-
-				for(int x = 0; x < width; x++)
-				{
-					unsigned int xrgb = *(unsigned short*)sourceElement;
-
-					unsigned int r = (((xrgb & 0x7C00) * 134771 + 0x800000) >> 8) & 0x00FF0000;
-					unsigned int g = (((xrgb & 0x03E0) * 16846 + 0x8000) >> 8) & 0x0000FF00;
-					unsigned int b = (((xrgb & 0x001F) * 2106  + 0x80) >> 8);
-
-					*(unsigned int*)destinationElement = 0xFF000000 | r | g | b;
-
-					sourceElement += source.bytes;
-					destinationElement += destination.bytes;
-				}
-
-				sourceRow += source.pitchB;
-				destinationRow += destination.pitchB;
-			}
-
-			sourceSlice += source.sliceB;
-			destinationSlice += destination.sliceB;
-		}
-
-		source.unlockRect();
-		destination.unlockRect();
-	}
-
-	void Surface::decodeA1R5G5B5(Buffer &destination, Buffer &source)
-	{
-		unsigned char *sourceSlice = (unsigned char*)source.lockRect(0, 0, 0, sw::LOCK_READONLY);
-		unsigned char *destinationSlice = (unsigned char*)destination.lockRect(0, 0, 0, sw::LOCK_UPDATE);
-
-		int depth = min(destination.depth, source.depth);
-		int height = min(destination.height, source.height);
-		int width = min(destination.width, source.width);
-
-		for(int z = 0; z < depth; z++)
-		{
-			unsigned char *sourceRow = sourceSlice;
-			unsigned char *destinationRow = destinationSlice;
-
-			for(int y = 0; y < height; y++)
-			{
-				unsigned char *sourceElement = sourceRow;
-				unsigned char *destinationElement = destinationRow;
-
-				for(int x = 0; x < width; x++)
-				{
-					unsigned int argb = *(unsigned short*)sourceElement;
-
-					unsigned int a =   (argb & 0x8000) * 130560;
-					unsigned int r = (((argb & 0x7C00) * 134771 + 0x800000) >> 8) & 0x00FF0000;
-					unsigned int g = (((argb & 0x03E0) * 16846  + 0x8000) >> 8) & 0x0000FF00;
-					unsigned int b = (((argb & 0x001F) * 2106   + 0x80) >> 8);
-
-					*(unsigned int*)destinationElement = a | r | g | b;
-
-					sourceElement += source.bytes;
-					destinationElement += destination.bytes;
-				}
-
-				sourceRow += source.pitchB;
-				destinationRow += destination.pitchB;
-			}
-
-			sourceSlice += source.sliceB;
-			destinationSlice += destination.sliceB;
-		}
-
-		source.unlockRect();
-		destination.unlockRect();
-	}
-
-	void Surface::decodeX4R4G4B4(Buffer &destination, Buffer &source)
-	{
-		unsigned char *sourceSlice = (unsigned char*)source.lockRect(0, 0, 0, sw::LOCK_READONLY);
-		unsigned char *destinationSlice = (unsigned char*)destination.lockRect(0, 0, 0, sw::LOCK_UPDATE);
-
-		int depth = min(destination.depth, source.depth);
-		int height = min(destination.height, source.height);
-		int width = min(destination.width, source.width);
-
-		for(int z = 0; z < depth; z++)
-		{
-			unsigned char *sourceRow = sourceSlice;
-			unsigned char *destinationRow = destinationSlice;
-
-			for(int y = 0; y < height; y++)
-			{
-				unsigned char *sourceElement = sourceRow;
-				unsigned char *destinationElement = destinationRow;
-
-				for(int x = 0; x < width; x++)
-				{
-					unsigned int xrgb = *(unsigned short*)sourceElement;
-
-					unsigned int r = ((xrgb & 0x0F00) * 0x00001100) & 0x00FF0000;
-					unsigned int g = ((xrgb & 0x00F0) * 0x00000110) & 0x0000FF00;
-					unsigned int b =  (xrgb & 0x000F) * 0x00000011;
-
-					*(unsigned int*)destinationElement = 0xFF000000 | r | g | b;
-
-					sourceElement += source.bytes;
-					destinationElement += destination.bytes;
-				}
-
-				sourceRow += source.pitchB;
-				destinationRow += destination.pitchB;
-			}
-
-			sourceSlice += source.sliceB;
-			destinationSlice += destination.sliceB;
-		}
-
-		source.unlockRect();
-		destination.unlockRect();
-	}
-
-	void Surface::decodeA4R4G4B4(Buffer &destination, Buffer &source)
-	{
-		unsigned char *sourceSlice = (unsigned char*)source.lockRect(0, 0, 0, sw::LOCK_READONLY);
-		unsigned char *destinationSlice = (unsigned char*)destination.lockRect(0, 0, 0, sw::LOCK_UPDATE);
-
-		int depth = min(destination.depth, source.depth);
-		int height = min(destination.height, source.height);
-		int width = min(destination.width, source.width);
-
-		for(int z = 0; z < depth; z++)
-		{
-			unsigned char *sourceRow = sourceSlice;
-			unsigned char *destinationRow = destinationSlice;
-
-			for(int y = 0; y < height; y++)
-			{
-				unsigned char *sourceElement = sourceRow;
-				unsigned char *destinationElement = destinationRow;
-
-				for(int x = 0; x < width; x++)
-				{
-					unsigned int argb = *(unsigned short*)sourceElement;
-
-					unsigned int a = ((argb & 0xF000) * 0x00011000) & 0xFF000000;
-					unsigned int r = ((argb & 0x0F00) * 0x00001100) & 0x00FF0000;
-					unsigned int g = ((argb & 0x00F0) * 0x00000110) & 0x0000FF00;
-					unsigned int b =  (argb & 0x000F) * 0x00000011;
-
-					*(unsigned int*)destinationElement = a | r | g | b;
-
-					sourceElement += source.bytes;
-					destinationElement += destination.bytes;
-				}
-
-				sourceRow += source.pitchB;
-				destinationRow += destination.pitchB;
-			}
-
-			sourceSlice += source.sliceB;
-			destinationSlice += destination.sliceB;
-		}
-
-		source.unlockRect();
-		destination.unlockRect();
-	}
-
-	void Surface::decodeP8(Buffer &destination, Buffer &source)
-	{
-		unsigned char *sourceSlice = (unsigned char*)source.lockRect(0, 0, 0, sw::LOCK_READONLY);
-		unsigned char *destinationSlice = (unsigned char*)destination.lockRect(0, 0, 0, sw::LOCK_UPDATE);
-
-		int depth = min(destination.depth, source.depth);
-		int height = min(destination.height, source.height);
-		int width = min(destination.width, source.width);
-
-		for(int z = 0; z < depth; z++)
-		{
-			unsigned char *sourceRow = sourceSlice;
-			unsigned char *destinationRow = destinationSlice;
-
-			for(int y = 0; y < height; y++)
-			{
-				unsigned char *sourceElement = sourceRow;
-				unsigned char *destinationElement = destinationRow;
-
-				for(int x = 0; x < width; x++)
-				{
-					unsigned int abgr = palette[*(unsigned char*)sourceElement];
-
-					unsigned int r = (abgr & 0x000000FF) << 16;
-					unsigned int g = (abgr & 0x0000FF00) << 0;
-					unsigned int b = (abgr & 0x00FF0000) >> 16;
-					unsigned int a = (abgr & 0xFF000000) >> 0;
-
-					*(unsigned int*)destinationElement = a | r | g | b;
-
-					sourceElement += source.bytes;
-					destinationElement += destination.bytes;
-				}
-
-				sourceRow += source.pitchB;
-				destinationRow += destination.pitchB;
-			}
-
-			sourceSlice += source.sliceB;
-			destinationSlice += destination.sliceB;
-		}
-
-		source.unlockRect();
-		destination.unlockRect();
-	}
-
 	void Surface::decodeDXT1(Buffer &internal, Buffer &external)
 	{
 		unsigned int *destSlice = (unsigned int*)internal.lockRect(0, 0, 0, LOCK_UPDATE);
@@ -2670,13 +1820,13 @@
 			{
 				uint64_t size = (uint64_t)sliceB(width, height, border, format, true) * depth * samples;
 
-				// FIXME: Unpacking byte4 to short4 in the sampler currently involves reading 8 bytes,
-				// and stencil operations also read 8 bytes per four 8-bit stencil values,
-				// so we have to allocate 4 extra bytes to avoid buffer overruns.
+								// FIXME: Unpacking byte4 to short4 in the sampler currently involves reading 8 bytes,
+								// and stencil operations also read 8 bytes per four 8-bit stencil values,
+								// so we have to allocate 4 extra bytes to avoid buffer overruns.
 				size += 4;
 
-				// We can only sample buffers smaller than 2 GiB.
-				// Force an out-of-memory if larger, or let the caller report an error.
+							// We can only sample buffers smaller than 2 GiB.
+								// Force an out-of-memory if larger, or let the caller report an error.
 				return size < 0x80000000u ? (size_t)size : std::numeric_limits<size_t>::max();
 			}
 		case FORMAT_YV12_BT601:
@@ -2700,24 +1850,13 @@
 	{
 		switch(format)
 		{
-		case FORMAT_D32:
 		case FORMAT_D16:
 		case FORMAT_D24X8:
 		case FORMAT_D32F:
-		case FORMAT_D32F_COMPLEMENTARY:
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_D32F_SHADOW:
 			return false;
 		case FORMAT_D24S8:
-		case FORMAT_D24FS8:
 		case FORMAT_S8:
-		case FORMAT_DF24S8:
-		case FORMAT_DF16S8:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32FS8_SHADOW:
 		case FORMAT_D32FS8:
-		case FORMAT_D32FS8_COMPLEMENTARY:
-		case FORMAT_INTZ:
 			return true;
 		default:
 			return false;
@@ -2728,22 +1867,11 @@
 	{
 		switch(format)
 		{
-		case FORMAT_D32:
 		case FORMAT_D16:
 		case FORMAT_D24X8:
 		case FORMAT_D24S8:
-		case FORMAT_D24FS8:
 		case FORMAT_D32F:
 		case FORMAT_D32FS8:
-		case FORMAT_D32F_COMPLEMENTARY:
-		case FORMAT_D32FS8_COMPLEMENTARY:
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_DF24S8:
-		case FORMAT_DF16S8:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32F_SHADOW:
-		case FORMAT_D32FS8_SHADOW:
-		case FORMAT_INTZ:
 			return true;
 		case FORMAT_S8:
 			return false;
@@ -2756,26 +1884,13 @@
 	{
 		switch(format)
 		{
-		case FORMAT_D32:
 		case FORMAT_D16:
 		case FORMAT_D24X8:
 		case FORMAT_D24S8:
-		case FORMAT_D24FS8:
 		case FORMAT_D32F:
 		case FORMAT_D32FS8:
-		case FORMAT_D32F_COMPLEMENTARY:
-		case FORMAT_D32FS8_COMPLEMENTARY:
-		case FORMAT_DF24S8:
-		case FORMAT_DF16S8:
-		case FORMAT_INTZ:
 		case FORMAT_S8:
-		case FORMAT_A8G8R8B8Q:
-		case FORMAT_X8G8R8B8Q:
 			return true;
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32F_SHADOW:
-		case FORMAT_D32FS8_SHADOW:
 		default:
 			break;
 		}
@@ -2783,35 +1898,16 @@
 		return false;
 	}
 
-	bool Surface::isPalette(Format format)
-	{
-		switch(format)
-		{
-		case FORMAT_P8:
-		case FORMAT_A8P8:
-			return true;
-		default:
-			return false;
-		}
-	}
-
 	bool Surface::isFloatFormat(Format format)
 	{
 		switch(format)
 		{
 		case FORMAT_R5G6B5:
-		case FORMAT_R8G8B8:
-		case FORMAT_B8G8R8:
-		case FORMAT_X8R8G8B8:
-		case FORMAT_X8B8G8R8I:
-		case FORMAT_X8B8G8R8:
 		case FORMAT_A8R8G8B8:
-		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
 		case FORMAT_A8B8G8R8I:
 		case FORMAT_R8UI:
 		case FORMAT_G8R8UI:
-		case FORMAT_X8B8G8R8UI:
 		case FORMAT_A8B8G8R8UI:
 		case FORMAT_A8B8G8R8:
 		case FORMAT_G8R8I:
@@ -2820,31 +1916,18 @@
 		case FORMAT_A2B10G10R10UI:
 		case FORMAT_R8_SNORM:
 		case FORMAT_G8R8_SNORM:
-		case FORMAT_X8B8G8R8_SNORM:
 		case FORMAT_A8B8G8R8_SNORM:
 		case FORMAT_R16I:
 		case FORMAT_R16UI:
 		case FORMAT_G16R16I:
 		case FORMAT_G16R16UI:
 		case FORMAT_G16R16:
-		case FORMAT_X16B16G16R16I:
-		case FORMAT_X16B16G16R16UI:
 		case FORMAT_A16B16G16R16I:
 		case FORMAT_A16B16G16R16UI:
 		case FORMAT_A16B16G16R16:
-		case FORMAT_V8U8:
-		case FORMAT_Q8W8V8U8:
-		case FORMAT_X8L8V8U8:
-		case FORMAT_V16U16:
-		case FORMAT_A16W16V16U16:
-		case FORMAT_Q16W16V16U16:
-		case FORMAT_A8:
 		case FORMAT_R8I:
 		case FORMAT_R8:
 		case FORMAT_S8:
-		case FORMAT_L8:
-		case FORMAT_L16:
-		case FORMAT_A8L8:
 		case FORMAT_YV12_BT601:
 		case FORMAT_YV12_BT709:
 		case FORMAT_YV12_JFIF:
@@ -2852,35 +1935,17 @@
 		case FORMAT_R32UI:
 		case FORMAT_G32R32I:
 		case FORMAT_G32R32UI:
-		case FORMAT_X32B32G32R32I:
-		case FORMAT_X32B32G32R32UI:
 		case FORMAT_A32B32G32R32I:
 		case FORMAT_A32B32G32R32UI:
 			return false;
 		case FORMAT_R16F:
 		case FORMAT_G16R16F:
-		case FORMAT_B16G16R16F:
-		case FORMAT_X16B16G16R16F:
 		case FORMAT_A16B16G16R16F:
-		case FORMAT_X16B16G16R16F_UNSIGNED:
 		case FORMAT_R32F:
 		case FORMAT_G32R32F:
-		case FORMAT_B32G32R32F:
-		case FORMAT_X32B32G32R32F:
 		case FORMAT_A32B32G32R32F:
-		case FORMAT_X32B32G32R32F_UNSIGNED:
 		case FORMAT_D32F:
 		case FORMAT_D32FS8:
-		case FORMAT_D32F_COMPLEMENTARY:
-		case FORMAT_D32FS8_COMPLEMENTARY:
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32F_SHADOW:
-		case FORMAT_D32FS8_SHADOW:
-		case FORMAT_L16F:
-		case FORMAT_A16L16F:
-		case FORMAT_L32F:
-		case FORMAT_A32L32F:
 			return true;
 		default:
 			ASSERT(false);
@@ -2895,13 +1960,8 @@
 		{
 		case FORMAT_NULL:
 		case FORMAT_R5G6B5:
-		case FORMAT_R8G8B8:
-		case FORMAT_B8G8R8:
-		case FORMAT_X8R8G8B8:
-		case FORMAT_X8B8G8R8:
 		case FORMAT_A8R8G8B8:
 		case FORMAT_A8B8G8R8:
-		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
 		case FORMAT_G8R8:
 		case FORMAT_A2B10G10R10:
@@ -2909,31 +1969,17 @@
 		case FORMAT_R16UI:
 		case FORMAT_G16R16:
 		case FORMAT_G16R16UI:
-		case FORMAT_X16B16G16R16UI:
 		case FORMAT_A16B16G16R16:
 		case FORMAT_A16B16G16R16UI:
 		case FORMAT_R32UI:
 		case FORMAT_G32R32UI:
-		case FORMAT_X32B32G32R32UI:
 		case FORMAT_A32B32G32R32UI:
-		case FORMAT_X32B32G32R32F_UNSIGNED:
 		case FORMAT_R8UI:
 		case FORMAT_G8R8UI:
-		case FORMAT_X8B8G8R8UI:
 		case FORMAT_A8B8G8R8UI:
 		case FORMAT_D32F:
 		case FORMAT_D32FS8:
-		case FORMAT_D32F_COMPLEMENTARY:
-		case FORMAT_D32FS8_COMPLEMENTARY:
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32F_SHADOW:
-		case FORMAT_D32FS8_SHADOW:
-		case FORMAT_A8:
 		case FORMAT_R8:
-		case FORMAT_L8:
-		case FORMAT_L16:
-		case FORMAT_A8L8:
 		case FORMAT_YV12_BT601:
 		case FORMAT_YV12_BT709:
 		case FORMAT_YV12_JFIF:
@@ -2942,8 +1988,6 @@
 		case FORMAT_A16B16G16R16I:
 		case FORMAT_A32B32G32R32I:
 		case FORMAT_A8B8G8R8_SNORM:
-		case FORMAT_Q8W8V8U8:
-		case FORMAT_Q16W16V16U16:
 		case FORMAT_A32B32G32R32F:
 			return false;
 		case FORMAT_R32F:
@@ -2952,23 +1996,12 @@
 		case FORMAT_R32I:
 		case FORMAT_R8_SNORM:
 			return component >= 1;
-		case FORMAT_V8U8:
-		case FORMAT_X8L8V8U8:
-		case FORMAT_V16U16:
 		case FORMAT_G32R32F:
 		case FORMAT_G8R8I:
 		case FORMAT_G16R16I:
 		case FORMAT_G32R32I:
 		case FORMAT_G8R8_SNORM:
 			return component >= 2;
-		case FORMAT_A16W16V16U16:
-		case FORMAT_B32G32R32F:
-		case FORMAT_X32B32G32R32F:
-		case FORMAT_X8B8G8R8I:
-		case FORMAT_X16B16G16R16I:
-		case FORMAT_X32B32G32R32I:
-		case FORMAT_X8B8G8R8_SNORM:
-			return component >= 3;
 		default:
 			ASSERT(false);
 		}
@@ -2981,24 +2014,11 @@
 		// Keep in sync with Capabilities::isSRGBreadable
 		switch(format)
 		{
-		case FORMAT_L8:
-		case FORMAT_A8L8:
-		case FORMAT_R8G8B8:
 		case FORMAT_A8R8G8B8:
-		case FORMAT_X8R8G8B8:
 		case FORMAT_A8B8G8R8:
-		case FORMAT_X8B8G8R8:
-		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
 		case FORMAT_R5G6B5:
-		case FORMAT_X1R5G5B5:
 		case FORMAT_A1R5G5B5:
-		case FORMAT_A4R4G4B4:
-		case FORMAT_DXT1:
-		case FORMAT_DXT3:
-		case FORMAT_DXT5:
-		case FORMAT_ATI1:
-		case FORMAT_ATI2:
 			return true;
 		default:
 			return false;
@@ -3012,10 +2032,7 @@
 		{
 		case FORMAT_NULL:
 		case FORMAT_A8R8G8B8:
-		case FORMAT_X8R8G8B8:
 		case FORMAT_A8B8G8R8:
-		case FORMAT_X8B8G8R8:
-		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
 		case FORMAT_R5G6B5:
 			return true;
@@ -3028,7 +2045,6 @@
 	{
 		switch(format)
 		{
-		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
 			return true;
 		default:
@@ -3040,12 +2056,6 @@
 	{
 		switch(format)
 		{
-		case FORMAT_DXT1:
-		case FORMAT_DXT3:
-		case FORMAT_DXT5:
-		case FORMAT_ATI1:
-		case FORMAT_ATI2:
-		case FORMAT_ETC1:
 		case FORMAT_R11_EAC:
 		case FORMAT_SIGNED_R11_EAC:
 		case FORMAT_RG11_EAC:
@@ -3095,15 +2105,12 @@
 		switch(format)
 		{
 		case FORMAT_A8B8G8R8I:
-		case FORMAT_X8B8G8R8I:
 		case FORMAT_G8R8I:
 		case FORMAT_R8I:
 		case FORMAT_A16B16G16R16I:
-		case FORMAT_X16B16G16R16I:
 		case FORMAT_G16R16I:
 		case FORMAT_R16I:
 		case FORMAT_A32B32G32R32I:
-		case FORMAT_X32B32G32R32I:
 		case FORMAT_G32R32I:
 		case FORMAT_R32I:
 			return true;
@@ -3117,15 +2124,12 @@
 		switch(format)
 		{
 		case FORMAT_A8B8G8R8UI:
-		case FORMAT_X8B8G8R8UI:
 		case FORMAT_G8R8UI:
 		case FORMAT_R8UI:
 		case FORMAT_A16B16G16R16UI:
-		case FORMAT_X16B16G16R16UI:
 		case FORMAT_G16R16UI:
 		case FORMAT_R16UI:
 		case FORMAT_A32B32G32R32UI:
-		case FORMAT_X32B32G32R32UI:
 		case FORMAT_G32R32UI:
 		case FORMAT_R32UI:
 			return true;
@@ -3154,11 +2158,7 @@
 		switch(format)
 		{
 		case FORMAT_R5G6B5:         return 3;
-		case FORMAT_X8R8G8B8:       return 3;
-		case FORMAT_X8B8G8R8I:      return 3;
-		case FORMAT_X8B8G8R8:       return 3;
 		case FORMAT_A8R8G8B8:       return 4;
-		case FORMAT_SRGB8_X8:       return 3;
 		case FORMAT_SRGB8_A8:       return 4;
 		case FORMAT_A8B8G8R8I:      return 4;
 		case FORMAT_A8B8G8R8:       return 4;
@@ -3166,11 +2166,9 @@
 		case FORMAT_G8R8:           return 2;
 		case FORMAT_R8_SNORM:      return 1;
 		case FORMAT_G8R8_SNORM:    return 2;
-		case FORMAT_X8B8G8R8_SNORM:return 3;
 		case FORMAT_A8B8G8R8_SNORM:return 4;
 		case FORMAT_R8UI:           return 1;
 		case FORMAT_G8R8UI:         return 2;
-		case FORMAT_X8B8G8R8UI:     return 3;
 		case FORMAT_A8B8G8R8UI:     return 4;
 		case FORMAT_A2B10G10R10:    return 4;
 		case FORMAT_A2B10G10R10UI:  return 4;
@@ -3179,42 +2177,22 @@
 		case FORMAT_G16R16:         return 2;
 		case FORMAT_G32R32I:        return 2;
 		case FORMAT_G32R32UI:       return 2;
-		case FORMAT_X16B16G16R16I:  return 3;
-		case FORMAT_X16B16G16R16UI: return 3;
 		case FORMAT_A16B16G16R16I:  return 4;
 		case FORMAT_A16B16G16R16UI: return 4;
 		case FORMAT_A16B16G16R16:   return 4;
-		case FORMAT_X32B32G32R32I:  return 3;
-		case FORMAT_X32B32G32R32UI: return 3;
 		case FORMAT_A32B32G32R32I:  return 4;
 		case FORMAT_A32B32G32R32UI: return 4;
-		case FORMAT_V8U8:           return 2;
-		case FORMAT_Q8W8V8U8:       return 4;
-		case FORMAT_X8L8V8U8:       return 3;
-		case FORMAT_V16U16:         return 2;
-		case FORMAT_A16W16V16U16:   return 4;
-		case FORMAT_Q16W16V16U16:   return 4;
 		case FORMAT_R32F:           return 1;
 		case FORMAT_G32R32F:        return 2;
-		case FORMAT_X32B32G32R32F:  return 3;
 		case FORMAT_A32B32G32R32F:  return 4;
-		case FORMAT_X32B32G32R32F_UNSIGNED: return 3;
 		case FORMAT_D32F:           return 1;
 		case FORMAT_D32FS8:         return 1;
-		case FORMAT_D32F_LOCKABLE:  return 1;
-		case FORMAT_D32FS8_TEXTURE: return 1;
-		case FORMAT_D32F_SHADOW:    return 1;
-		case FORMAT_D32FS8_SHADOW:  return 1;
-		case FORMAT_A8:             return 1;
 		case FORMAT_R8I:            return 1;
 		case FORMAT_R8:             return 1;
 		case FORMAT_R16I:           return 1;
 		case FORMAT_R16UI:          return 1;
 		case FORMAT_R32I:           return 1;
 		case FORMAT_R32UI:          return 1;
-		case FORMAT_L8:             return 1;
-		case FORMAT_L16:            return 1;
-		case FORMAT_A8L8:           return 2;
 		case FORMAT_YV12_BT601:     return 3;
 		case FORMAT_YV12_BT709:     return 3;
 		case FORMAT_YV12_JFIF:      return 3;
@@ -3704,11 +2682,6 @@
 		return isDepth(external.format);
 	}
 
-	bool Surface::hasPalette() const
-	{
-		return isPalette(external.format);
-	}
-
 	bool Surface::isRenderTarget() const
 	{
 		return renderTarget;
@@ -3747,14 +2720,8 @@
 		{
 		case FORMAT_NULL:
 			return FORMAT_NULL;
-		case FORMAT_P8:
-		case FORMAT_A8P8:
-		case FORMAT_A4R4G4B4:
 		case FORMAT_A1R5G5B5:
-		case FORMAT_A8R3G3B2:
 			return FORMAT_A8R8G8B8;
-		case FORMAT_A8:
-			return FORMAT_A8;
 		case FORMAT_R8I:
 			return FORMAT_R8I;
 		case FORMAT_R8UI:
@@ -3771,12 +2738,8 @@
 			return FORMAT_R32I;
 		case FORMAT_R32UI:
 			return FORMAT_R32UI;
-		case FORMAT_X16B16G16R16I:
-			return FORMAT_X16B16G16R16I;
 		case FORMAT_A16B16G16R16I:
 			return FORMAT_A16B16G16R16I;
-		case FORMAT_X16B16G16R16UI:
-			return FORMAT_X16B16G16R16UI;
 		case FORMAT_A16B16G16R16UI:
 			return FORMAT_A16B16G16R16UI;
 		case FORMAT_A2R10G10B10:
@@ -3785,12 +2748,8 @@
 			return FORMAT_A16B16G16R16;
 		case FORMAT_A2B10G10R10UI:
 			return FORMAT_A16B16G16R16UI;
-		case FORMAT_X32B32G32R32I:
-			return FORMAT_X32B32G32R32I;
 		case FORMAT_A32B32G32R32I:
 			return FORMAT_A32B32G32R32I;
-		case FORMAT_X32B32G32R32UI:
-			return FORMAT_X32B32G32R32UI;
 		case FORMAT_A32B32G32R32UI:
 			return FORMAT_A32B32G32R32UI;
 		case FORMAT_G8R8I:
@@ -3812,14 +2771,7 @@
 		case FORMAT_G32R32UI:
 			return FORMAT_G32R32UI;
 		case FORMAT_A8R8G8B8:
-			if(lockable || !quadLayoutEnabled)
-			{
-				return FORMAT_A8R8G8B8;
-			}
-			else
-			{
-				return FORMAT_A8G8R8B8Q;
-			}
+			return FORMAT_A8R8G8B8;
 		case FORMAT_A8B8G8R8I:
 			return FORMAT_A8B8G8R8I;
 		case FORMAT_A8B8G8R8UI:
@@ -3832,36 +2784,9 @@
 			return FORMAT_A8B8G8R8;
 		case FORMAT_R5G6B5:
 			return FORMAT_R5G6B5;
-		case FORMAT_R3G3B2:
-		case FORMAT_R8G8B8:
-		case FORMAT_X4R4G4B4:
-		case FORMAT_X1R5G5B5:
-		case FORMAT_X8R8G8B8:
-			if(lockable || !quadLayoutEnabled)
-			{
-				return FORMAT_X8R8G8B8;
-			}
-			else
-			{
-				return FORMAT_X8G8R8B8Q;
-			}
-		case FORMAT_X8B8G8R8I:
-			return FORMAT_X8B8G8R8I;
-		case FORMAT_X8B8G8R8UI:
-			return FORMAT_X8B8G8R8UI;
-		case FORMAT_X8B8G8R8_SNORM:
-			return FORMAT_X8B8G8R8_SNORM;
-		case FORMAT_B8G8R8:
-		case FORMAT_X8B8G8R8:
-			return FORMAT_X8B8G8R8;
-		case FORMAT_SRGB8_X8:
-			return FORMAT_SRGB8_X8;
 		case FORMAT_SRGB8_A8:
 			return FORMAT_SRGB8_A8;
 		// Compressed formats
-		case FORMAT_DXT1:
-		case FORMAT_DXT3:
-		case FORMAT_DXT5:
 		case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
 		case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
 		case FORMAT_RGBA8_ETC2_EAC:
@@ -3897,89 +2822,30 @@
 		case FORMAT_RGBA_ASTC_12x12_KHR:
 			// ASTC supports HDR, so a floating point format is required to represent it properly
 			return FORMAT_A32B32G32R32F; // FIXME: 16FP is probably sufficient, but it's currently unsupported
-		case FORMAT_ATI1:
-			return FORMAT_R8;
 		case FORMAT_R11_EAC:
 		case FORMAT_SIGNED_R11_EAC:
 			return FORMAT_R32F; // FIXME: Signed 8bit format would be sufficient
-		case FORMAT_ATI2:
-			return FORMAT_G8R8;
 		case FORMAT_RG11_EAC:
 		case FORMAT_SIGNED_RG11_EAC:
 			return FORMAT_G32R32F; // FIXME: Signed 8bit format would be sufficient
-		case FORMAT_ETC1:
 		case FORMAT_RGB8_ETC2:
 		case FORMAT_SRGB8_ETC2:
-			return FORMAT_X8R8G8B8;
-		// Bumpmap formats
-		case FORMAT_V8U8:			return FORMAT_V8U8;
-		case FORMAT_L6V5U5:			return FORMAT_X8L8V8U8;
-		case FORMAT_Q8W8V8U8:		return FORMAT_Q8W8V8U8;
-		case FORMAT_X8L8V8U8:		return FORMAT_X8L8V8U8;
-		case FORMAT_V16U16:			return FORMAT_V16U16;
-		case FORMAT_A2W10V10U10:	return FORMAT_A16W16V16U16;
-		case FORMAT_Q16W16V16U16:	return FORMAT_Q16W16V16U16;
+			return FORMAT_A8R8G8B8;
 		// Floating-point formats
-		case FORMAT_A16F:			return FORMAT_A32B32G32R32F;
 		case FORMAT_R16F:			return FORMAT_R32F;
 		case FORMAT_G16R16F:		return FORMAT_G32R32F;
-		case FORMAT_B16G16R16F:     return FORMAT_X32B32G32R32F;
-		case FORMAT_X16B16G16R16F:	return FORMAT_X32B32G32R32F;
 		case FORMAT_A16B16G16R16F:	return FORMAT_A32B32G32R32F;
-		case FORMAT_X16B16G16R16F_UNSIGNED: return FORMAT_X32B32G32R32F_UNSIGNED;
-		case FORMAT_A32F:			return FORMAT_A32B32G32R32F;
 		case FORMAT_R32F:			return FORMAT_R32F;
 		case FORMAT_G32R32F:		return FORMAT_G32R32F;
-		case FORMAT_B32G32R32F:     return FORMAT_X32B32G32R32F;
-		case FORMAT_X32B32G32R32F:  return FORMAT_X32B32G32R32F;
 		case FORMAT_A32B32G32R32F:	return FORMAT_A32B32G32R32F;
-		case FORMAT_X32B32G32R32F_UNSIGNED: return FORMAT_X32B32G32R32F_UNSIGNED;
-		// Luminance formats
-		case FORMAT_L8:				return FORMAT_L8;
-		case FORMAT_A4L4:			return FORMAT_A8L8;
-		case FORMAT_L16:			return FORMAT_L16;
-		case FORMAT_A8L8:			return FORMAT_A8L8;
-		case FORMAT_L16F:           return FORMAT_X32B32G32R32F;
-		case FORMAT_A16L16F:        return FORMAT_A32B32G32R32F;
-		case FORMAT_L32F:           return FORMAT_X32B32G32R32F;
-		case FORMAT_A32L32F:        return FORMAT_A32B32G32R32F;
 		// Depth/stencil formats
 		case FORMAT_D16:
-		case FORMAT_D32:
 		case FORMAT_D24X8:
-			if(hasParent)   // Texture
-			{
-				return FORMAT_D32F_SHADOW;
-			}
-			else if(complementaryDepthBuffer)
-			{
-				return FORMAT_D32F_COMPLEMENTARY;
-			}
-			else
-			{
-				return FORMAT_D32F;
-			}
+			return FORMAT_D32F;
 		case FORMAT_D24S8:
-		case FORMAT_D24FS8:
-			if(hasParent)   // Texture
-			{
-				return FORMAT_D32FS8_SHADOW;
-			}
-			else if(complementaryDepthBuffer)
-			{
-				return FORMAT_D32FS8_COMPLEMENTARY;
-			}
-			else
-			{
-				return FORMAT_D32FS8;
-			}
+			return FORMAT_D32FS8;
 		case FORMAT_D32F:           return FORMAT_D32F;
 		case FORMAT_D32FS8:         return FORMAT_D32FS8;
-		case FORMAT_D32F_LOCKABLE:  return FORMAT_D32F_LOCKABLE;
-		case FORMAT_D32FS8_TEXTURE: return FORMAT_D32FS8_TEXTURE;
-		case FORMAT_INTZ:           return FORMAT_D32FS8_TEXTURE;
-		case FORMAT_DF24S8:         return FORMAT_D32FS8_SHADOW;
-		case FORMAT_DF16S8:         return FORMAT_D32FS8_SHADOW;
 		case FORMAT_S8:             return FORMAT_S8;
 		// YUV formats
 		case FORMAT_YV12_BT601:     return FORMAT_YV12_BT601;
@@ -3992,12 +2858,6 @@
 		return FORMAT_NULL;
 	}
 
-	void Surface::setTexturePalette(unsigned int *palette)
-	{
-		Surface::palette = palette;
-		Surface::paletteID++;
-	}
-
 	void Surface::resolve()
 	{
 		if(internal.samples <= 1 || !internal.dirty || !renderTarget || internal.format == FORMAT_NULL)
@@ -4031,9 +2891,9 @@
 		unsigned char *sourceE = sourceD + slice;
 		unsigned char *sourceF = sourceE + slice;
 
-		if(internal.format == FORMAT_X8R8G8B8 || internal.format == FORMAT_A8R8G8B8 ||
-		   internal.format == FORMAT_X8B8G8R8 || internal.format == FORMAT_A8B8G8R8 ||
-		   internal.format == FORMAT_SRGB8_X8 || internal.format == FORMAT_SRGB8_A8)
+		if(internal.format == FORMAT_A8R8G8B8 ||
+		   internal.format == FORMAT_A8B8G8R8 ||
+		   internal.format == FORMAT_SRGB8_A8)
 		{
 			#if defined(__i386__) || defined(__x86_64__)
 				if(CPUID::supportsSSE2() && (width % 4) == 0)
@@ -5507,9 +4367,7 @@
 				else ASSERT(false);
 			}
 		}
-		else if(internal.format == FORMAT_A32B32G32R32F ||
-		        internal.format == FORMAT_X32B32G32R32F ||
-		        internal.format == FORMAT_X32B32G32R32F_UNSIGNED)
+		else if(internal.format == FORMAT_A32B32G32R32F)
 		{
 			#if defined(__i386__) || defined(__x86_64__)
 				if(CPUID::supportsSSE())
diff --git a/src/Device/Surface.hpp b/src/Device/Surface.hpp
index 5b5ee68..c24c57b 100644
--- a/src/Device/Surface.hpp
+++ b/src/Device/Surface.hpp
@@ -18,6 +18,7 @@
 #include "Color.hpp"
 #include "Device/Config.hpp"
 #include "System/Resource.hpp"
+#include <vulkan/vulkan.h>
 
 namespace sw
 {
@@ -62,167 +63,244 @@
 
 	enum Format : unsigned char
 	{
-		FORMAT_NULL,
+		FORMAT_NULL = VK_FORMAT_UNDEFINED,
+		// VK_FORMAT_R4G4_UNORM_PACK8,
+		// VK_FORMAT_R4G4B4A4_UNORM_PACK16,
+		FORMAT_R4G4B4A4 = VK_FORMAT_B4G4R4A4_UNORM_PACK16, // Mandatory
+		FORMAT_R5G6B5 = VK_FORMAT_R5G6B5_UNORM_PACK16, // Mandatory
+		// VK_FORMAT_B5G6R5_UNORM_PACK16,
+		FORMAT_R5G5B5A1 = VK_FORMAT_R5G5B5A1_UNORM_PACK16,
+		// VK_FORMAT_B5G5R5A1_UNORM_PACK16,
+		FORMAT_A1R5G5B5 = VK_FORMAT_A1R5G5B5_UNORM_PACK16, // Mandatory
+		FORMAT_R8 = VK_FORMAT_R8_UNORM, // Mandatory
+		FORMAT_R8_SNORM = VK_FORMAT_R8_SNORM, // Mandatory
+		// VK_FORMAT_R8_USCALED,
+		// VK_FORMAT_R8_SSCALED,
+		FORMAT_R8UI = VK_FORMAT_R8_UINT, // Mandatory
+		FORMAT_R8I = VK_FORMAT_R8_SINT, // Mandatory
+		// VK_FORMAT_R8_SRGB,
+		FORMAT_G8R8 = VK_FORMAT_R8G8_UNORM, // Mandatory
+		FORMAT_G8R8_SNORM = VK_FORMAT_R8G8_SNORM, // Mandatory
+		// VK_FORMAT_R8G8_USCALED,
+		// VK_FORMAT_R8G8_SSCALED,
+		FORMAT_G8R8UI = VK_FORMAT_R8G8_UINT, // Mandatory
+		FORMAT_G8R8I = VK_FORMAT_R8G8_SINT, // Mandatory
+		// VK_FORMAT_R8G8_SRGB,
+		// VK_FORMAT_R8G8B8_UNORM,
+		// VK_FORMAT_R8G8B8_SNORM,
+		// VK_FORMAT_R8G8B8_USCALED,
+		// VK_FORMAT_R8G8B8_SSCALED,
+		// VK_FORMAT_R8G8B8_UINT,
+		// VK_FORMAT_R8G8B8_SINT,
+		// VK_FORMAT_R8G8B8_SRGB,
+		// VK_FORMAT_B8G8R8_UNORM,
+		// VK_FORMAT_B8G8R8_SNORM,
+		// VK_FORMAT_B8G8R8_USCALED,
+		// VK_FORMAT_B8G8R8_SSCALED,
+		// VK_FORMAT_B8G8R8_UINT,
+		// VK_FORMAT_B8G8R8_SINT,
+		// VK_FORMAT_B8G8R8_SRGB,
+		FORMAT_A8B8G8R8 = VK_FORMAT_R8G8B8A8_UNORM, // Mandatory
+		FORMAT_A8B8G8R8_SNORM = VK_FORMAT_R8G8B8A8_SNORM, // Mandatory
+		// VK_FORMAT_R8G8B8A8_USCALED,
+		// VK_FORMAT_R8G8B8A8_SSCALED,
+		FORMAT_A8B8G8R8UI = VK_FORMAT_R8G8B8A8_UINT, // Mandatory
+		FORMAT_A8B8G8R8I = VK_FORMAT_R8G8B8A8_SINT, // Mandatory
+		FORMAT_SRGB8_A8 = VK_FORMAT_R8G8B8A8_SRGB, // Mandatory
+		FORMAT_A8R8G8B8 = VK_FORMAT_B8G8R8A8_UNORM, // Mandatory
+		// VK_FORMAT_B8G8R8A8_SNORM,
+		// VK_FORMAT_B8G8R8A8_USCALED,
+		// VK_FORMAT_B8G8R8A8_SSCALED,
+		// VK_FORMAT_B8G8R8A8_UINT,
+		// VK_FORMAT_B8G8R8A8_SINT,
+		// VK_FORMAT_B8G8R8A8_SRGB, // TODO: Mandatory
+		// VK_FORMAT_A8B8G8R8_UNORM_PACK32, // TODO: Mandatory
+		// VK_FORMAT_A8B8G8R8_SNORM_PACK32, // TODO: Mandatory
+		// VK_FORMAT_A8B8G8R8_USCALED_PACK32,
+		// VK_FORMAT_A8B8G8R8_SSCALED_PACK32,
+		// VK_FORMAT_A8B8G8R8_UINT_PACK32, // TODO: Mandatory
+		// VK_FORMAT_A8B8G8R8_SINT_PACK32, // TODO: Mandatory
+		// VK_FORMAT_A8B8G8R8_SRGB_PACK32, // TODO: Mandatory
+		FORMAT_A2R10G10B10 = VK_FORMAT_A2R10G10B10_UNORM_PACK32,
+		// VK_FORMAT_A2R10G10B10_SNORM_PACK32,
+		// VK_FORMAT_A2R10G10B10_USCALED_PACK32,
+		// VK_FORMAT_A2R10G10B10_SSCALED_PACK32,
+		// VK_FORMAT_A2R10G10B10_UINT_PACK32,
+		// VK_FORMAT_A2R10G10B10_SINT_PACK32,
+		FORMAT_A2B10G10R10 = VK_FORMAT_A2B10G10R10_UNORM_PACK32, // Mandatory
+		// VK_FORMAT_A2B10G10R10_SNORM_PACK32,
+		// VK_FORMAT_A2B10G10R10_USCALED_PACK32,
+		// VK_FORMAT_A2B10G10R10_SSCALED_PACK32,
+		FORMAT_A2B10G10R10UI = VK_FORMAT_A2B10G10R10_UINT_PACK32, // Mandatory
+		// VK_FORMAT_A2B10G10R10_SINT_PACK32,
+		// VK_FORMAT_R16_UNORM, // Mandatory (Vertex buffer only)
+		// VK_FORMAT_R16_SNORM, // Mandatory (Vertex buffer only)
+		// VK_FORMAT_R16_USCALED,
+		// VK_FORMAT_R16_SSCALED,
+		FORMAT_R16UI = VK_FORMAT_R16_UINT, // Mandatory
+		FORMAT_R16I = VK_FORMAT_R16_SINT, // Mandatory
+		FORMAT_R16F = VK_FORMAT_R16_SFLOAT, // Mandatory
+		FORMAT_G16R16 = VK_FORMAT_R16G16_UNORM, // Mandatory (Vertex buffer only)
+		// VK_FORMAT_R16G16_SNORM, // Mandatory (Vertex buffer only)
+		// VK_FORMAT_R16G16_USCALED,
+		// VK_FORMAT_R16G16_SSCALED,
+		FORMAT_G16R16UI = VK_FORMAT_R16G16_UINT, // Mandatory
+		FORMAT_G16R16I = VK_FORMAT_R16G16_SINT, // Mandatory
+		FORMAT_G16R16F = VK_FORMAT_R16G16_SFLOAT, // Mandatory
+		// VK_FORMAT_R16G16B16_UNORM,
+		// VK_FORMAT_R16G16B16_SNORM,
+		// VK_FORMAT_R16G16B16_USCALED,
+		// VK_FORMAT_R16G16B16_SSCALED,
+		// VK_FORMAT_R16G16B16_UINT,
+		// VK_FORMAT_R16G16B16_SINT,
+		// VK_FORMAT_R16G16B16_SFLOAT,
+		FORMAT_A16B16G16R16 = VK_FORMAT_R16G16B16A16_UNORM, // Mandatory (Vertex buffer only)
+		// VK_FORMAT_R16G16B16A16_SNORM, // Mandatory (Vertex buffer only)
+		// VK_FORMAT_R16G16B16A16_USCALED,
+		// VK_FORMAT_R16G16B16A16_SSCALED,
+		FORMAT_A16B16G16R16UI = VK_FORMAT_R16G16B16A16_UINT, // Mandatory
+		FORMAT_A16B16G16R16I = VK_FORMAT_R16G16B16A16_SINT, // Mandatory
+		FORMAT_A16B16G16R16F = VK_FORMAT_R16G16B16A16_SFLOAT, // Mandatory
+		FORMAT_R32UI = VK_FORMAT_R32_UINT, // Mandatory
+		FORMAT_R32I = VK_FORMAT_R32_SINT, // Mandatory
+		FORMAT_R32F = VK_FORMAT_R32_SFLOAT, // Mandatory
+		FORMAT_G32R32UI = VK_FORMAT_R32G32_UINT, // Mandatory
+		FORMAT_G32R32I = VK_FORMAT_R32G32_SINT, // Mandatory
+		FORMAT_G32R32F = VK_FORMAT_R32G32_SFLOAT, // Mandatory
+		// VK_FORMAT_R32G32B32_UINT, // Mandatory (Vertex buffer only)
+		// VK_FORMAT_R32G32B32_SINT, // Mandatory (Vertex buffer only)
+		// VK_FORMAT_R32G32B32_SFLOAT, // Mandatory (Vertex buffer only)
+		FORMAT_A32B32G32R32UI = VK_FORMAT_R32G32B32A32_UINT, // Mandatory
+		FORMAT_A32B32G32R32I = VK_FORMAT_R32G32B32A32_SINT, // Mandatory
+		FORMAT_A32B32G32R32F = VK_FORMAT_R32G32B32A32_SFLOAT, // Mandatory
+		// VK_FORMAT_R64_UINT,
+		// VK_FORMAT_R64_SINT,
+		// VK_FORMAT_R64_SFLOAT,
+		// VK_FORMAT_R64G64_UINT,
+		// VK_FORMAT_R64G64_SINT,
+		// VK_FORMAT_R64G64_SFLOAT,
+		// VK_FORMAT_R64G64B64_UINT,
+		// VK_FORMAT_R64G64B64_SINT,
+		// VK_FORMAT_R64G64B64_SFLOAT,
+		// VK_FORMAT_R64G64B64A64_UINT,
+		// VK_FORMAT_R64G64B64A64_SINT,
+		// VK_FORMAT_R64G64B64A64_SFLOAT,
+		// VK_FORMAT_B10G11R11_UFLOAT_PACK32, // TODO: Mandatory
+		// VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, // TODO: Mandatory
+		FORMAT_D16 = VK_FORMAT_D16_UNORM, // Mandatory
+		FORMAT_D24X8 = VK_FORMAT_X8_D24_UNORM_PACK32, // Feature specific
+		FORMAT_D32F = VK_FORMAT_D32_SFLOAT, // Mandatory
+		FORMAT_S8 = VK_FORMAT_S8_UINT,
+		// VK_FORMAT_D16_UNORM_S8_UINT,
+		FORMAT_D24S8 = VK_FORMAT_D24_UNORM_S8_UINT, // Feature specific
+		FORMAT_D32FS8 = VK_FORMAT_D32_SFLOAT_S8_UINT, // Feature specific
+		// VK_FORMAT_BC1_RGB_UNORM_BLOCK, // Feature specific
+		// VK_FORMAT_BC1_RGB_SRGB_BLOCK, // Feature specific
+		// VK_FORMAT_BC1_RGBA_UNORM_BLOCK, // Feature specific
+		// VK_FORMAT_BC1_RGBA_SRGB_BLOCK, // Feature specific
+		// VK_FORMAT_BC2_UNORM_BLOCK, // Feature specific
+		// VK_FORMAT_BC2_SRGB_BLOCK, // Feature specific
+		// VK_FORMAT_BC3_UNORM_BLOCK, // Feature specific
+		// VK_FORMAT_BC3_SRGB_BLOCK, // Feature specific
+		// VK_FORMAT_BC4_UNORM_BLOCK, // Feature specific
+		// VK_FORMAT_BC4_SNORM_BLOCK, // Feature specific
+		// VK_FORMAT_BC5_UNORM_BLOCK, // Feature specific
+		// VK_FORMAT_BC5_SNORM_BLOCK, // Feature specific
+		// VK_FORMAT_BC6H_UFLOAT_BLOCK, // Feature specific
+		// VK_FORMAT_BC6H_SFLOAT_BLOCK, // Feature specific
+		// VK_FORMAT_BC7_UNORM_BLOCK, // Feature specific
+		// VK_FORMAT_BC7_SRGB_BLOCK, // Feature specific
+		FORMAT_RGB8_ETC2 = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ETC2 = VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, // Feature specific
+		FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, // Feature specific
+		FORMAT_RGBA8_ETC2_EAC = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ETC2_EAC = VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, // Feature specific
+		FORMAT_R11_EAC = VK_FORMAT_EAC_R11_UNORM_BLOCK, // Feature specific
+		FORMAT_SIGNED_R11_EAC = VK_FORMAT_EAC_R11_SNORM_BLOCK, // Feature specific
+		FORMAT_RG11_EAC = VK_FORMAT_EAC_R11G11_UNORM_BLOCK, // Feature specific
+		FORMAT_SIGNED_RG11_EAC = VK_FORMAT_EAC_R11G11_SNORM_BLOCK, // Feature specific
+		FORMAT_RGBA_ASTC_4x4_KHR = VK_FORMAT_ASTC_4x4_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR = VK_FORMAT_ASTC_4x4_SRGB_BLOCK, // Feature specific
+		FORMAT_RGBA_ASTC_5x4_KHR = VK_FORMAT_ASTC_5x4_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR = VK_FORMAT_ASTC_5x4_SRGB_BLOCK, // Feature specific
+		FORMAT_RGBA_ASTC_5x5_KHR = VK_FORMAT_ASTC_5x5_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR = VK_FORMAT_ASTC_5x5_SRGB_BLOCK, // Feature specific
+		FORMAT_RGBA_ASTC_6x5_KHR = VK_FORMAT_ASTC_6x5_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR = VK_FORMAT_ASTC_6x5_SRGB_BLOCK, // Feature specific
+		FORMAT_RGBA_ASTC_6x6_KHR = VK_FORMAT_ASTC_6x6_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR = VK_FORMAT_ASTC_6x6_SRGB_BLOCK, // Feature specific
+		FORMAT_RGBA_ASTC_8x5_KHR = VK_FORMAT_ASTC_8x5_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR = VK_FORMAT_ASTC_8x5_SRGB_BLOCK, // Feature specific
+		FORMAT_RGBA_ASTC_8x6_KHR = VK_FORMAT_ASTC_8x6_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR = VK_FORMAT_ASTC_8x6_SRGB_BLOCK, // Feature specific
+		FORMAT_RGBA_ASTC_8x8_KHR = VK_FORMAT_ASTC_8x8_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR = VK_FORMAT_ASTC_8x8_SRGB_BLOCK, // Feature specific
+		FORMAT_RGBA_ASTC_10x5_KHR = VK_FORMAT_ASTC_10x5_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR = VK_FORMAT_ASTC_10x5_SRGB_BLOCK, // Feature specific
+		FORMAT_RGBA_ASTC_10x6_KHR = VK_FORMAT_ASTC_10x6_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR = VK_FORMAT_ASTC_10x6_SRGB_BLOCK, // Feature specific
+		FORMAT_RGBA_ASTC_10x8_KHR = VK_FORMAT_ASTC_10x8_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR = VK_FORMAT_ASTC_10x8_SRGB_BLOCK, // Feature specific
+		FORMAT_RGBA_ASTC_10x10_KHR = VK_FORMAT_ASTC_10x10_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR = VK_FORMAT_ASTC_10x10_SRGB_BLOCK, // Feature specific
+		FORMAT_RGBA_ASTC_12x10_KHR = VK_FORMAT_ASTC_12x10_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR = VK_FORMAT_ASTC_12x10_SRGB_BLOCK, // Feature specific
+		FORMAT_RGBA_ASTC_12x12_KHR = VK_FORMAT_ASTC_12x12_UNORM_BLOCK, // Feature specific
+		FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR = VK_FORMAT_ASTC_12x12_SRGB_BLOCK, // Feature specific
 
-		FORMAT_A8,
-		FORMAT_R8I,
-		FORMAT_R8UI,
-		FORMAT_R8_SNORM,
-		FORMAT_R8,
-		FORMAT_R16I,
-		FORMAT_R16UI,
-		FORMAT_R32I,
-		FORMAT_R32UI,
-		FORMAT_R3G3B2,
-		FORMAT_A8R3G3B2,
-		FORMAT_X4R4G4B4,
-		FORMAT_A4R4G4B4,
-		FORMAT_R4G4B4A4,
-		FORMAT_R5G6B5,
-		FORMAT_R8G8B8,
-		FORMAT_B8G8R8,
-		FORMAT_X8R8G8B8,
-		FORMAT_A8R8G8B8,
-		FORMAT_X8B8G8R8I,
-		FORMAT_X8B8G8R8UI,
-		FORMAT_X8B8G8R8_SNORM,
-		FORMAT_X8B8G8R8,
-		FORMAT_A8B8G8R8I,
-		FORMAT_A8B8G8R8UI,
-		FORMAT_A8B8G8R8_SNORM,
-		FORMAT_A8B8G8R8,
-		FORMAT_SRGB8_X8,
-		FORMAT_SRGB8_A8,
-		FORMAT_X1R5G5B5,
-		FORMAT_A1R5G5B5,
-		FORMAT_R5G5B5A1,
-		FORMAT_G8R8I,
-		FORMAT_G8R8UI,
-		FORMAT_G8R8_SNORM,
-		FORMAT_G8R8,
-		FORMAT_G16R16,
-		FORMAT_G16R16I,
-		FORMAT_G16R16UI,
-		FORMAT_G32R32I,
-		FORMAT_G32R32UI,
-		FORMAT_A2R10G10B10,
-		FORMAT_A2B10G10R10,
-		FORMAT_A2B10G10R10UI,
-		FORMAT_A16B16G16R16,
-		FORMAT_X16B16G16R16I,
-		FORMAT_X16B16G16R16UI,
-		FORMAT_A16B16G16R16I,
-		FORMAT_A16B16G16R16UI,
-		FORMAT_X32B32G32R32I,
-		FORMAT_X32B32G32R32UI,
-		FORMAT_A32B32G32R32I,
-		FORMAT_A32B32G32R32UI,
-		// Paletted formats
-		FORMAT_P8,
-		FORMAT_A8P8,
-		// Compressed formats
-		FORMAT_DXT1,
-		FORMAT_DXT3,
-		FORMAT_DXT5,
-		FORMAT_ATI1,
-		FORMAT_ATI2,
-		FORMAT_ETC1,
-		FORMAT_R11_EAC,
-		FORMAT_SIGNED_R11_EAC,
-		FORMAT_RG11_EAC,
-		FORMAT_SIGNED_RG11_EAC,
-		FORMAT_RGB8_ETC2,
-		FORMAT_SRGB8_ETC2,
-		FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
-		FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
-		FORMAT_RGBA8_ETC2_EAC,
-		FORMAT_SRGB8_ALPHA8_ETC2_EAC,
-		FORMAT_RGBA_ASTC_4x4_KHR,
-		FORMAT_RGBA_ASTC_5x4_KHR,
-		FORMAT_RGBA_ASTC_5x5_KHR,
-		FORMAT_RGBA_ASTC_6x5_KHR,
-		FORMAT_RGBA_ASTC_6x6_KHR,
-		FORMAT_RGBA_ASTC_8x5_KHR,
-		FORMAT_RGBA_ASTC_8x6_KHR,
-		FORMAT_RGBA_ASTC_8x8_KHR,
-		FORMAT_RGBA_ASTC_10x5_KHR,
-		FORMAT_RGBA_ASTC_10x6_KHR,
-		FORMAT_RGBA_ASTC_10x8_KHR,
-		FORMAT_RGBA_ASTC_10x10_KHR,
-		FORMAT_RGBA_ASTC_12x10_KHR,
-		FORMAT_RGBA_ASTC_12x12_KHR,
-		FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR,
-		FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR,
-		FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR,
-		FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR,
-		FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR,
-		FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR,
-		FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR,
-		FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR,
-		FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR,
-		FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR,
-		FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR,
-		FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR,
-		FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR,
-		FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR,
-		// Floating-point formats
-		FORMAT_A16F,
-		FORMAT_R16F,
-		FORMAT_G16R16F,
-		FORMAT_B16G16R16F,
-		FORMAT_X16B16G16R16F,
-		FORMAT_A16B16G16R16F,
-		FORMAT_X16B16G16R16F_UNSIGNED,
-		FORMAT_A32F,
-		FORMAT_R32F,
-		FORMAT_G32R32F,
-		FORMAT_B32G32R32F,
-		FORMAT_X32B32G32R32F,
-		FORMAT_A32B32G32R32F,
-		FORMAT_X32B32G32R32F_UNSIGNED,
-		// Bump map formats
-		FORMAT_V8U8,
-		FORMAT_L6V5U5,
-		FORMAT_Q8W8V8U8,
-		FORMAT_X8L8V8U8,
-		FORMAT_A2W10V10U10,
-		FORMAT_V16U16,
-		FORMAT_A16W16V16U16,
-		FORMAT_Q16W16V16U16,
-		// Luminance formats
-		FORMAT_L8,
-		FORMAT_A4L4,
-		FORMAT_L16,
-		FORMAT_A8L8,
-		FORMAT_L16F,
-		FORMAT_A16L16F,
-		FORMAT_L32F,
-		FORMAT_A32L32F,
-		// Depth/stencil formats
-		FORMAT_D16,
-		FORMAT_D32,
-		FORMAT_D24X8,
-		FORMAT_D24S8,
-		FORMAT_D24FS8,
-		FORMAT_D32F,                 // Quad layout
-		FORMAT_D32FS8,               // Quad layout
-		FORMAT_D32F_COMPLEMENTARY,   // Quad layout, 1 - z
-		FORMAT_D32FS8_COMPLEMENTARY, // Quad layout, 1 - z
-		FORMAT_D32F_LOCKABLE,        // Linear layout
-		FORMAT_D32FS8_TEXTURE,       // Linear layout, no PCF
-		FORMAT_D32F_SHADOW,          // Linear layout, PCF
-		FORMAT_D32FS8_SHADOW,        // Linear layout, PCF
-		FORMAT_DF24S8,
-		FORMAT_DF16S8,
-		FORMAT_INTZ,
-		FORMAT_S8,
-		// Quad layout framebuffer
-		FORMAT_X8G8R8B8Q,
-		FORMAT_A8G8R8B8Q,
+		// EXTENSION FORMATS:
+		// IMPORTANT: if any of these formats are added, this enum needs
+		// to go from "unsigned char" to "unsigned int" and FORMAT_LAST
+		// below needs to be updated to take extensions into account.
+
+		// VK_FORMAT_G8B8G8R8_422_UNORM,
+		// VK_FORMAT_B8G8R8G8_422_UNORM,
+		// VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, // TODO: Mandatory
+		// VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, // TODO: Mandatory
+		// VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM,
+		// VK_FORMAT_G8_B8R8_2PLANE_422_UNORM,
+		// VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM,
+		// VK_FORMAT_R10X6_UNORM_PACK16,
+		// VK_FORMAT_R10X6G10X6_UNORM_2PACK16,
+		// VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,
+		// VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,
+		// VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16,
+		// VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16,
+		// VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16,
+		// VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16,
+		// VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16,
+		// VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16,
+		// VK_FORMAT_R12X4_UNORM_PACK16,
+		// VK_FORMAT_R12X4G12X4_UNORM_2PACK16,
+		// VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,
+		// VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,
+		// VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16,
+		// VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16,
+		// VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16,
+		// VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16,
+		// VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16,
+		// VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16,
+		// VK_FORMAT_G16B16G16R16_422_UNORM,
+		// VK_FORMAT_B16G16R16G16_422_UNORM,
+		// VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM,
+		// VK_FORMAT_G16_B16R16_2PLANE_420_UNORM,
+		// VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM,
+		// VK_FORMAT_G16_B16R16_2PLANE_422_UNORM,
+		// VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM,
+		// VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG,
+		// VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,
+		// VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG,
+		// VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG,
+		// VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,
+		// VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,
+		// VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,
+		// VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,
+
 		// YUV formats
-		FORMAT_YV12_BT601,
-		FORMAT_YV12_BT709,
-		FORMAT_YV12_JFIF,    // Full-swing BT.601
+		FORMAT_YV12_BT601 = VK_FORMAT_END_RANGE + 1, // TODO: VK_FORMAT_G8_B8R8_2PLANE_420_UNORM + VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601
+		FORMAT_YV12_BT709,                           // TODO: VK_FORMAT_G8_B8R8_2PLANE_420_UNORM + VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709
+		FORMAT_YV12_JFIF,                            // TODO: VK_FORMAT_G8_B8R8_2PLANE_420_UNORM + VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020
 
 		FORMAT_LAST = FORMAT_YV12_JFIF
 	};
@@ -350,7 +428,6 @@
 
 		bool hasStencil() const;
 		bool hasDepth() const;
-		bool hasPalette() const;
 		bool isRenderTarget() const;
 
 		bool hasDirtyContents() const;
@@ -368,7 +445,6 @@
 		static bool isStencil(Format format);
 		static bool isDepth(Format format);
 		static bool hasQuadLayout(Format format);
-		static bool isPalette(Format format);
 
 		static bool isFloatFormat(Format format);
 		static bool isUnsignedComponent(Format format, int component);
@@ -382,8 +458,6 @@
 		static bool isNormalizedInteger(Format format);
 		static int componentCount(Format format);
 
-		static void setTexturePalette(unsigned int *palette);
-
 	private:
 		sw::Resource *resource;
 
@@ -465,13 +539,6 @@
 			};
 		};
 
-		static void decodeR8G8B8(Buffer &destination, Buffer &source);
-		static void decodeX1R5G5B5(Buffer &destination, Buffer &source);
-		static void decodeA1R5G5B5(Buffer &destination, Buffer &source);
-		static void decodeX4R4G4B4(Buffer &destination, Buffer &source);
-		static void decodeA4R4G4B4(Buffer &destination, Buffer &source);
-		static void decodeP8(Buffer &destination, Buffer &source);
-
 		static void decodeDXT1(Buffer &internal, Buffer &external);
 		static void decodeDXT3(Buffer &internal, Buffer &external);
 		static void decodeDXT5(Buffer &internal, Buffer &external);
@@ -499,10 +566,6 @@
 		const bool renderTarget;
 
 		bool dirtyContents;   // Sibling surfaces need updating (mipmaps / cube borders).
-		unsigned int paletteUsed;
-
-		static unsigned int *palette;   // FIXME: Not multi-device safe
-		static unsigned int paletteID;
 
 		bool hasParent;
 		bool ownExternal;
diff --git a/src/Pipeline/PixelProgram.cpp b/src/Pipeline/PixelProgram.cpp
index 3d9cfe7..7137a7d 100644
--- a/src/Pipeline/PixelProgram.cpp
+++ b/src/Pipeline/PixelProgram.cpp
@@ -630,15 +630,11 @@
 			switch(state.targetFormat[index])
 			{
 			case FORMAT_R5G6B5:
-			case FORMAT_X8R8G8B8:
-			case FORMAT_X8B8G8R8:
 			case FORMAT_A8R8G8B8:
 			case FORMAT_A8B8G8R8:
-			case FORMAT_SRGB8_X8:
 			case FORMAT_SRGB8_A8:
 			case FORMAT_G8R8:
 			case FORMAT_R8:
-			case FORMAT_A8:
 			case FORMAT_G16R16:
 			case FORMAT_A16B16G16R16:
 				for(unsigned int q = 0; q < state.multiSample; q++)
@@ -671,9 +667,7 @@
 				break;
 			case FORMAT_R32F:
 			case FORMAT_G32R32F:
-			case FORMAT_X32B32G32R32F:
 			case FORMAT_A32B32G32R32F:
-			case FORMAT_X32B32G32R32F_UNSIGNED:
 			case FORMAT_R32I:
 			case FORMAT_G32R32I:
 			case FORMAT_A32B32G32R32I:
@@ -776,13 +770,9 @@
 			case FORMAT_R5G6B5:
 			case FORMAT_A8R8G8B8:
 			case FORMAT_A8B8G8R8:
-			case FORMAT_X8R8G8B8:
-			case FORMAT_X8B8G8R8:
-			case FORMAT_SRGB8_X8:
 			case FORMAT_SRGB8_A8:
 			case FORMAT_G8R8:
 			case FORMAT_R8:
-			case FORMAT_A8:
 			case FORMAT_G16R16:
 			case FORMAT_A16B16G16R16:
 				oC[index].x = Max(oC[index].x, Float4(0.0f)); oC[index].x = Min(oC[index].x, Float4(1.0f));
@@ -792,7 +782,6 @@
 				break;
 			case FORMAT_R32F:
 			case FORMAT_G32R32F:
-			case FORMAT_X32B32G32R32F:
 			case FORMAT_A32B32G32R32F:
 			case FORMAT_R32I:
 			case FORMAT_G32R32I:
@@ -813,12 +802,6 @@
 			case FORMAT_G8R8UI:
 			case FORMAT_A8B8G8R8UI:
 				break;
-			case FORMAT_X32B32G32R32F_UNSIGNED:
-				oC[index].x = Max(oC[index].x, Float4(0.0f));
-				oC[index].y = Max(oC[index].y, Float4(0.0f));
-				oC[index].z = Max(oC[index].z, Float4(0.0f));
-				oC[index].w = Max(oC[index].w, Float4(0.0f));
-				break;
 			default:
 				ASSERT(false);
 			}
diff --git a/src/Pipeline/PixelRoutine.cpp b/src/Pipeline/PixelRoutine.cpp
index 0cf82cb..0519735 100644
--- a/src/Pipeline/PixelRoutine.cpp
+++ b/src/Pipeline/PixelRoutine.cpp
@@ -980,16 +980,6 @@
 			pixel.z = UnpackLow(As<Byte8>(pixel.w), As<Byte8>(pixel.w));
 			pixel.w = UnpackHigh(As<Byte8>(pixel.w), As<Byte8>(pixel.w));
 			break;
-		case FORMAT_A8:
-			buffer = cBuffer + 1 * x;
-			pixel.w = Insert(pixel.w, *Pointer<Short>(buffer), 0);
-			buffer += *Pointer<Int>(data + OFFSET(DrawData, colorPitchB[index]));
-			pixel.w = Insert(pixel.w, *Pointer<Short>(buffer), 1);
-			pixel.w = UnpackLow(As<Byte8>(pixel.w), As<Byte8>(pixel.w));
-			pixel.x = Short4(0x0000);
-			pixel.y = Short4(0x0000);
-			pixel.z = Short4(0x0000);
-			break;
 		case FORMAT_R8:
 			buffer = cBuffer + 1 * x;
 			pixel.x = Insert(pixel.x, *Pointer<Short>(buffer), 0);
@@ -1000,24 +990,6 @@
 			pixel.z = Short4(0x0000);
 			pixel.w = Short4(0xFFFFu);
 			break;
-		case FORMAT_X8R8G8B8:
-			buffer = cBuffer + 4 * x;
-			c01 = *Pointer<Short4>(buffer);
-			buffer += *Pointer<Int>(data + OFFSET(DrawData, colorPitchB[index]));
-			c23 = *Pointer<Short4>(buffer);
-			pixel.z = c01;
-			pixel.y = c01;
-			pixel.z = UnpackLow(As<Byte8>(pixel.z), As<Byte8>(c23));
-			pixel.y = UnpackHigh(As<Byte8>(pixel.y), As<Byte8>(c23));
-			pixel.x = pixel.z;
-			pixel.z = UnpackLow(As<Byte8>(pixel.z), As<Byte8>(pixel.y));
-			pixel.x = UnpackHigh(As<Byte8>(pixel.x), As<Byte8>(pixel.y));
-			pixel.y = pixel.z;
-			pixel.x = UnpackLow(As<Byte8>(pixel.x), As<Byte8>(pixel.x));
-			pixel.y = UnpackHigh(As<Byte8>(pixel.y), As<Byte8>(pixel.y));
-			pixel.z = UnpackLow(As<Byte8>(pixel.z), As<Byte8>(pixel.z));
-			pixel.w = Short4(0xFFFFu);
-			break;
 		case FORMAT_G8R8:
 			buffer = cBuffer + 2 * x;
 			c01 = As<Short4>(Insert(As<Int2>(c01), *Pointer<Int>(buffer), 0));
@@ -1028,40 +1000,6 @@
 			pixel.z = Short4(0x0000u);
 			pixel.w = Short4(0xFFFFu);
 			break;
-		case FORMAT_X8B8G8R8:
-		case FORMAT_SRGB8_X8:
-			buffer = cBuffer + 4 * x;
-			c01 = *Pointer<Short4>(buffer);
-			buffer += *Pointer<Int>(data + OFFSET(DrawData, colorPitchB[index]));
-			c23 = *Pointer<Short4>(buffer);
-			pixel.z = c01;
-			pixel.y = c01;
-			pixel.z = UnpackLow(As<Byte8>(pixel.z), As<Byte8>(c23));
-			pixel.y = UnpackHigh(As<Byte8>(pixel.y), As<Byte8>(c23));
-			pixel.x = pixel.z;
-			pixel.z = UnpackLow(As<Byte8>(pixel.z), As<Byte8>(pixel.y));
-			pixel.x = UnpackHigh(As<Byte8>(pixel.x), As<Byte8>(pixel.y));
-			pixel.y = pixel.z;
-			pixel.w = pixel.x;
-			pixel.x = UnpackLow(As<Byte8>(pixel.z), As<Byte8>(pixel.z));
-			pixel.y = UnpackHigh(As<Byte8>(pixel.y), As<Byte8>(pixel.y));
-			pixel.z = UnpackLow(As<Byte8>(pixel.w), As<Byte8>(pixel.w));
-			pixel.w = Short4(0xFFFFu);
-			break;
-		case FORMAT_A8G8R8B8Q:
-			UNIMPLEMENTED();
-		//	pixel.z = UnpackLow(As<Byte8>(pixel.z), *Pointer<Byte8>(cBuffer + 8 * x + 0));
-		//	pixel.x = UnpackHigh(As<Byte8>(pixel.x), *Pointer<Byte8>(cBuffer + 8 * x + 0));
-		//	pixel.y = UnpackLow(As<Byte8>(pixel.y), *Pointer<Byte8>(cBuffer + 8 * x + 8));
-		//	pixel.w = UnpackHigh(As<Byte8>(pixel.w), *Pointer<Byte8>(cBuffer + 8 * x + 8));
-			break;
-		case FORMAT_X8G8R8B8Q:
-			UNIMPLEMENTED();
-		//	pixel.z = UnpackLow(As<Byte8>(pixel.z), *Pointer<Byte8>(cBuffer + 8 * x + 0));
-		//	pixel.x = UnpackHigh(As<Byte8>(pixel.x), *Pointer<Byte8>(cBuffer + 8 * x + 0));
-		//	pixel.y = UnpackLow(As<Byte8>(pixel.y), *Pointer<Byte8>(cBuffer + 8 * x + 8));
-		//	pixel.w = Short4(0xFFFFu);
-			break;
 		case FORMAT_A16B16G16R16:
 			buffer = cBuffer;
 			pixel.x = *Pointer<Short4>(buffer + 8 * x);
@@ -1325,13 +1263,8 @@
 				current.y = AddSat(As<UShort4>(current.y), UShort4(0x0200));
 				current.z = AddSat(As<UShort4>(current.z), UShort4(0x0400));
 				break;
-			case FORMAT_X8G8R8B8Q:
-			case FORMAT_A8G8R8B8Q:
-			case FORMAT_X8R8G8B8:
-			case FORMAT_X8B8G8R8:
 			case FORMAT_A8R8G8B8:
 			case FORMAT_A8B8G8R8:
-			case FORMAT_SRGB8_X8:
 			case FORMAT_SRGB8_A8:
 			case FORMAT_G8R8:
 			case FORMAT_R8:
@@ -1359,28 +1292,8 @@
 				current.x = current.x | current.y | current.z;
 			}
 			break;
-		case FORMAT_X8G8R8B8Q:
-			UNIMPLEMENTED();
-		//	current.x = As<Short4>(As<UShort4>(current.x) >> 8);
-		//	current.y = As<Short4>(As<UShort4>(current.y) >> 8);
-		//	current.z = As<Short4>(As<UShort4>(current.z) >> 8);
-
-		//	current.z = As<Short4>(Pack(As<UShort4>(current.z), As<UShort4>(current.x)));
-		//	current.y = As<Short4>(Pack(As<UShort4>(current.y), As<UShort4>(current.y)));
-			break;
-		case FORMAT_A8G8R8B8Q:
-			UNIMPLEMENTED();
-		//	current.x = As<Short4>(As<UShort4>(current.x) >> 8);
-		//	current.y = As<Short4>(As<UShort4>(current.y) >> 8);
-		//	current.z = As<Short4>(As<UShort4>(current.z) >> 8);
-		//	current.w = As<Short4>(As<UShort4>(current.w) >> 8);
-
-		//	current.z = As<Short4>(Pack(As<UShort4>(current.z), As<UShort4>(current.x)));
-		//	current.y = As<Short4>(Pack(As<UShort4>(current.y), As<UShort4>(current.w)));
-			break;
-		case FORMAT_X8R8G8B8:
 		case FORMAT_A8R8G8B8:
-			if(state.targetFormat[index] == FORMAT_X8R8G8B8 || rgbaWriteMask == 0x7)
+			if(rgbaWriteMask == 0x7)
 			{
 				current.x = As<Short4>(As<UShort4>(current.x) >> 8);
 				current.y = As<Short4>(As<UShort4>(current.y) >> 8);
@@ -1414,11 +1327,9 @@
 				current.y = As<Short4>(UnpackHigh(current.y, current.x));
 			}
 			break;
-		case FORMAT_X8B8G8R8:
 		case FORMAT_A8B8G8R8:
-		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
-			if(state.targetFormat[index] == FORMAT_X8B8G8R8 || state.targetFormat[index] == FORMAT_SRGB8_X8 || rgbaWriteMask == 0x7)
+			if(rgbaWriteMask == 0x7)
 			{
 				current.x = As<Short4>(As<UShort4>(current.x) >> 8);
 				current.y = As<Short4>(As<UShort4>(current.y) >> 8);
@@ -1463,10 +1374,6 @@
 			current.x = As<Short4>(As<UShort4>(current.x) >> 8);
 			current.x = As<Short4>(PackUnsigned(current.x, current.x));
 			break;
-		case FORMAT_A8:
-			current.w = As<Short4>(As<UShort4>(current.w) >> 8);
-			current.w = As<Short4>(PackUnsigned(current.w, current.w));
-			break;
 		case FORMAT_G16R16:
 			current.z = current.x;
 			current.x = As<Short4>(UnpackLow(current.x, current.y));
@@ -1540,52 +1447,12 @@
 				*Pointer<Int>(buffer) = c23;
 			}
 			break;
-		case FORMAT_A8G8R8B8Q:
-		case FORMAT_X8G8R8B8Q:   // FIXME: Don't touch alpha?
-			UNIMPLEMENTED();
-		//	value = *Pointer<Short4>(cBuffer + 8 * x + 0);
-
-		//	if((state.targetFormat[index] == FORMAT_A8G8R8B8Q && bgraWriteMask != 0x0000000F) ||
-		//	   ((state.targetFormat[index] == FORMAT_X8G8R8B8Q && bgraWriteMask != 0x00000007) &&
-		//	    (state.targetFormat[index] == FORMAT_X8G8R8B8Q && bgraWriteMask != 0x0000000F)))   // FIXME: Need for masking when XRGB && Fh?
-		//	{
-		//		Short4 masked = value;
-		//		c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[bgraWriteMask][0]));
-		//		masked &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q[bgraWriteMask][0]));
-		//		c01 |= masked;
-		//	}
-
-		//	c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskD01Q) + xMask * 8);
-		//	value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskD01Q) + xMask * 8);
-		//	c01 |= value;
-		//	*Pointer<Short4>(cBuffer + 8 * x + 0) = c01;
-
-		//	value = *Pointer<Short4>(cBuffer + 8 * x + 8);
-
-		//	if((state.targetFormat[index] == FORMAT_A8G8R8B8Q && bgraWriteMask != 0x0000000F) ||
-		//	   ((state.targetFormat[index] == FORMAT_X8G8R8B8Q && bgraWriteMask != 0x00000007) &&
-		//	    (state.targetFormat[index] == FORMAT_X8G8R8B8Q && bgraWriteMask != 0x0000000F)))   // FIXME: Need for masking when XRGB && Fh?
-		//	{
-		//		Short4 masked = value;
-		//		c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[bgraWriteMask][0]));
-		//		masked &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q[bgraWriteMask][0]));
-		//		c23 |= masked;
-		//	}
-
-		//	c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskD23Q) + xMask * 8);
-		//	value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskD23Q) + xMask * 8);
-		//	c23 |= value;
-		//	*Pointer<Short4>(cBuffer + 8 * x + 8) = c23;
-			break;
 		case FORMAT_A8R8G8B8:
-		case FORMAT_X8R8G8B8:   // FIXME: Don't touch alpha?
 			{
 				Pointer<Byte> buffer = cBuffer + x * 4;
 				Short4 value = *Pointer<Short4>(buffer);
 
-				if((state.targetFormat[index] == FORMAT_A8R8G8B8 && bgraWriteMask != 0x0000000F) ||
-				   ((state.targetFormat[index] == FORMAT_X8R8G8B8 && bgraWriteMask != 0x00000007) &&
-					(state.targetFormat[index] == FORMAT_X8R8G8B8 && bgraWriteMask != 0x0000000F)))   // FIXME: Need for masking when XRGB && Fh?
+				if(state.targetFormat[index] == FORMAT_A8R8G8B8 && bgraWriteMask != 0x0000000F)   // FIXME: Need for masking when XRGB && Fh?
 				{
 					Short4 masked = value;
 					c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[bgraWriteMask][0]));
@@ -1601,9 +1468,7 @@
 				buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
 				value = *Pointer<Short4>(buffer);
 
-				if((state.targetFormat[index] == FORMAT_A8R8G8B8 && bgraWriteMask != 0x0000000F) ||
-				   ((state.targetFormat[index] == FORMAT_X8R8G8B8 && bgraWriteMask != 0x00000007) &&
-					(state.targetFormat[index] == FORMAT_X8R8G8B8 && bgraWriteMask != 0x0000000F)))   // FIXME: Need for masking when XRGB && Fh?
+				if(state.targetFormat[index] == FORMAT_A8R8G8B8 && bgraWriteMask != 0x0000000F)   // FIXME: Need for masking when XRGB && Fh?
 				{
 					Short4 masked = value;
 					c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[bgraWriteMask][0]));
@@ -1618,16 +1483,12 @@
 			}
 			break;
 		case FORMAT_A8B8G8R8:
-		case FORMAT_X8B8G8R8:   // FIXME: Don't touch alpha?
-		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
 			{
 				Pointer<Byte> buffer = cBuffer + x * 4;
 				Short4 value = *Pointer<Short4>(buffer);
 
-				bool masked = (((state.targetFormat[index] == FORMAT_A8B8G8R8 || state.targetFormat[index] == FORMAT_SRGB8_A8) && rgbaWriteMask != 0x0000000F) ||
-				              (((state.targetFormat[index] == FORMAT_X8B8G8R8 || state.targetFormat[index] == FORMAT_SRGB8_X8) && rgbaWriteMask != 0x00000007) &&
-				               ((state.targetFormat[index] == FORMAT_X8B8G8R8 || state.targetFormat[index] == FORMAT_SRGB8_X8) && rgbaWriteMask != 0x0000000F))); // FIXME: Need for masking when XBGR && Fh?
+				bool masked = ((state.targetFormat[index] == FORMAT_A8B8G8R8 || state.targetFormat[index] == FORMAT_SRGB8_A8) && rgbaWriteMask != 0x0000000F); // FIXME: Need for masking when XBGR && Fh?
 
 				if(masked)
 				{
@@ -1701,23 +1562,6 @@
 				*Pointer<Short>(buffer + pitch) = Extract(current.x, 1);
 			}
 			break;
-		case FORMAT_A8:
-			if(rgbaWriteMask & 0x00000008)
-			{
-				Pointer<Byte> buffer = cBuffer + 1 * x;
-				Short4 value;
-				value = Insert(value, *Pointer<Short>(buffer), 0);
-				Int pitch = *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
-				value = Insert(value, *Pointer<Short>(buffer + pitch), 1);
-
-				current.w &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q) + 8 * xMask);
-				value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q) + 8 * xMask);
-				current.w |= value;
-
-				*Pointer<Short>(buffer) = Extract(current.w, 0);
-				*Pointer<Short>(buffer + pitch) = Extract(current.w, 1);
-			}
-			break;
 		case FORMAT_G16R16:
 			{
 				Pointer<Byte> buffer = cBuffer + 4 * x;
@@ -2006,9 +1850,7 @@
 			pixel.y = pixel.z;
 			pixel.z = pixel.w = one;
 			break;
-		case FORMAT_X32B32G32R32F:
 		case FORMAT_A32B32G32R32F:
-		case FORMAT_X32B32G32R32F_UNSIGNED:
 		case FORMAT_A32B32G32R32I:
 		case FORMAT_A32B32G32R32UI:
 			buffer = cBuffer;
@@ -2018,11 +1860,6 @@
 			pixel.z = *Pointer<Float4>(buffer + 16 * x, 16);
 			pixel.w = *Pointer<Float4>(buffer + 16 * x + 16, 16);
 			transpose4x4(pixel.x, pixel.y, pixel.z, pixel.w);
-			if(state.targetFormat[index] == FORMAT_X32B32G32R32F ||
-			   state.targetFormat[index] == FORMAT_X32B32G32R32F_UNSIGNED)
-			{
-				pixel.w = Float4(1.0f);
-			}
 			break;
 		default:
 			ASSERT(false);
@@ -2169,9 +2006,7 @@
 			oC.z = UnpackHigh(oC.z, oC.y);
 			oC.y = oC.z;
 			break;
-		case FORMAT_X32B32G32R32F:
 		case FORMAT_A32B32G32R32F:
-		case FORMAT_X32B32G32R32F_UNSIGNED:
 		case FORMAT_A32B32G32R32I:
 		case FORMAT_A32B32G32R32UI:
 		case FORMAT_A16B16G16R16I:
@@ -2423,9 +2258,7 @@
 				*Pointer<UInt>(buffer) = As<UInt>(Extract(packedCol, 0));
 			}
 			break;
-		case FORMAT_X32B32G32R32F:
 		case FORMAT_A32B32G32R32F:
-		case FORMAT_X32B32G32R32F_UNSIGNED:
 		case FORMAT_A32B32G32R32I:
 		case FORMAT_A32B32G32R32UI:
 			buffer = cBuffer + 16 * x;
diff --git a/src/Pipeline/SamplerCore.cpp b/src/Pipeline/SamplerCore.cpp
index a7acf2b..0b49d4e 100644
--- a/src/Pipeline/SamplerCore.cpp
+++ b/src/Pipeline/SamplerCore.cpp
@@ -166,7 +166,6 @@
 					{
 					case FORMAT_R8_SNORM:
 					case FORMAT_G8R8_SNORM:
-					case FORMAT_X8B8G8R8_SNORM:
 					case FORMAT_A8B8G8R8_SNORM:
 					case FORMAT_R8:
 					case FORMAT_R5G6B5:
@@ -175,8 +174,6 @@
 					case FORMAT_R8UI:
 					case FORMAT_G8R8I:
 					case FORMAT_G8R8UI:
-					case FORMAT_X8B8G8R8I:
-					case FORMAT_X8B8G8R8UI:
 					case FORMAT_A8B8G8R8I:
 					case FORMAT_A8B8G8R8UI:
 					case FORMAT_R16I:
@@ -184,8 +181,6 @@
 					case FORMAT_G16R16:
 					case FORMAT_G16R16I:
 					case FORMAT_G16R16UI:
-					case FORMAT_X16B16G16R16I:
-					case FORMAT_X16B16G16R16UI:
 					case FORMAT_A16B16G16R16:
 					case FORMAT_A16B16G16R16I:
 					case FORMAT_A16B16G16R16UI:
@@ -193,22 +188,11 @@
 					case FORMAT_R32UI:
 					case FORMAT_G32R32I:
 					case FORMAT_G32R32UI:
-					case FORMAT_X32B32G32R32I:
-					case FORMAT_X32B32G32R32UI:
 					case FORMAT_A32B32G32R32I:
 					case FORMAT_A32B32G32R32UI:
-					case FORMAT_X8R8G8B8:
-					case FORMAT_X8B8G8R8:
 					case FORMAT_A8R8G8B8:
 					case FORMAT_A8B8G8R8:
-					case FORMAT_SRGB8_X8:
 					case FORMAT_SRGB8_A8:
-					case FORMAT_V8U8:
-					case FORMAT_Q8W8V8U8:
-					case FORMAT_X8L8V8U8:
-					case FORMAT_V16U16:
-					case FORMAT_A16W16V16U16:
-					case FORMAT_Q16W16V16U16:
 					case FORMAT_YV12_BT601:
 					case FORMAT_YV12_BT709:
 					case FORMAT_YV12_JFIF:
@@ -216,40 +200,13 @@
 						if(componentCount < 3) c.z = Short4(defaultColorValue);
 						if(componentCount < 4) c.w = Short4(0x1000);
 						break;
-					case FORMAT_A8:
-						c.w = c.x;
-						c.x = Short4(0x0000);
-						c.y = Short4(0x0000);
-						c.z = Short4(0x0000);
-						break;
-					case FORMAT_L8:
-					case FORMAT_L16:
-						c.y = c.x;
-						c.z = c.x;
-						c.w = Short4(0x1000);
-						break;
-					case FORMAT_A8L8:
-						c.w = c.y;
-						c.y = c.x;
-						c.z = c.x;
-						break;
 					case FORMAT_R32F:
 						c.y = Short4(defaultColorValue);
 					case FORMAT_G32R32F:
 						c.z = Short4(defaultColorValue);
-					case FORMAT_X32B32G32R32F:
-					case FORMAT_X32B32G32R32F_UNSIGNED:
 						c.w = Short4(0x1000);
 					case FORMAT_A32B32G32R32F:
 						break;
-					case FORMAT_D32F_LOCKABLE:
-					case FORMAT_D32FS8_TEXTURE:
-					case FORMAT_D32F_SHADOW:
-					case FORMAT_D32FS8_SHADOW:
-						c.y = c.x;
-						c.z = c.x;
-						c.w = c.x;
-						break;
 					default:
 						ASSERT(false);
 					}
@@ -402,13 +359,6 @@
 				case FORMAT_G32R32I:
 				case FORMAT_G32R32UI:
 					c.z = As<Float4>(UInt4(0));
-				case FORMAT_X8B8G8R8I:
-				case FORMAT_X8B8G8R8UI:
-				case FORMAT_X16B16G16R16I:
-				case FORMAT_X16B16G16R16UI:
-				case FORMAT_X32B32G32R32I:
-				case FORMAT_X32B32G32R32UI:
-					c.w = As<Float4>(UInt4(1));
 				case FORMAT_A8B8G8R8I:
 				case FORMAT_A8B8G8R8UI:
 				case FORMAT_A16B16G16R16I:
@@ -418,25 +368,15 @@
 					break;
 				case FORMAT_R8_SNORM:
 				case FORMAT_G8R8_SNORM:
-				case FORMAT_X8B8G8R8_SNORM:
 				case FORMAT_A8B8G8R8_SNORM:
 				case FORMAT_R8:
 				case FORMAT_R5G6B5:
 				case FORMAT_G8R8:
 				case FORMAT_G16R16:
 				case FORMAT_A16B16G16R16:
-				case FORMAT_X8R8G8B8:
-				case FORMAT_X8B8G8R8:
 				case FORMAT_A8R8G8B8:
 				case FORMAT_A8B8G8R8:
-				case FORMAT_SRGB8_X8:
 				case FORMAT_SRGB8_A8:
-				case FORMAT_V8U8:
-				case FORMAT_Q8W8V8U8:
-				case FORMAT_X8L8V8U8:
-				case FORMAT_V16U16:
-				case FORMAT_A16W16V16U16:
-				case FORMAT_Q16W16V16U16:
 				case FORMAT_YV12_BT601:
 				case FORMAT_YV12_BT709:
 				case FORMAT_YV12_JFIF:
@@ -444,40 +384,13 @@
 					if(componentCount < 3) c.z = Float4(defaultColorValue);
 					if(componentCount < 4) c.w = Float4(1.0f);
 					break;
-				case FORMAT_A8:
-					c.w = c.x;
-					c.x = Float4(0.0f);
-					c.y = Float4(0.0f);
-					c.z = Float4(0.0f);
-					break;
-				case FORMAT_L8:
-				case FORMAT_L16:
-					c.y = c.x;
-					c.z = c.x;
-					c.w = Float4(1.0f);
-					break;
-				case FORMAT_A8L8:
-					c.w = c.y;
-					c.y = c.x;
-					c.z = c.x;
-					break;
 				case FORMAT_R32F:
 					c.y = Float4(defaultColorValue);
 				case FORMAT_G32R32F:
 					c.z = Float4(defaultColorValue);
-				case FORMAT_X32B32G32R32F:
-				case FORMAT_X32B32G32R32F_UNSIGNED:
 					c.w = Float4(1.0f);
 				case FORMAT_A32B32G32R32F:
 					break;
-				case FORMAT_D32F_LOCKABLE:
-				case FORMAT_D32FS8_TEXTURE:
-				case FORMAT_D32F_SHADOW:
-				case FORMAT_D32FS8_SHADOW:
-					c.y = Float4(0.0f);
-					c.z = Float4(0.0f);
-					c.w = Float4(1.0f);
-					break;
 				default:
 					ASSERT(false);
 				}
@@ -1796,7 +1709,6 @@
 					case FORMAT_A8B8G8R8:
 					case FORMAT_A8B8G8R8I:
 					case FORMAT_A8B8G8R8_SNORM:
-					case FORMAT_Q8W8V8U8:
 					case FORMAT_SRGB8_A8:
 						c.z = As<Short4>(UnpackHigh(c.x, c.y));
 						c.x = As<Short4>(UnpackLow(c.x, c.y));
@@ -1830,57 +1742,6 @@
 					}
 				}
 				break;
-			case 3:
-				{
-					Byte4 c0 = Pointer<Byte4>(buffer[f0])[index[0]];
-					Byte4 c1 = Pointer<Byte4>(buffer[f1])[index[1]];
-					Byte4 c2 = Pointer<Byte4>(buffer[f2])[index[2]];
-					Byte4 c3 = Pointer<Byte4>(buffer[f3])[index[3]];
-					c.x = Unpack(c0, c1);
-					c.y = Unpack(c2, c3);
-
-					switch(state.textureFormat)
-					{
-					case FORMAT_X8R8G8B8:
-						c.z = As<Short4>(UnpackLow(c.x, c.y));
-						c.x = As<Short4>(UnpackHigh(c.x, c.y));
-						c.y = c.z;
-						c.z = UnpackLow(As<Byte8>(c.z), As<Byte8>(c.z));
-						c.y = UnpackHigh(As<Byte8>(c.y), As<Byte8>(c.y));
-						c.x = UnpackLow(As<Byte8>(c.x), As<Byte8>(c.x));
-						break;
-					case FORMAT_X8B8G8R8_SNORM:
-					case FORMAT_X8B8G8R8I:
-					case FORMAT_X8B8G8R8:
-					case FORMAT_X8L8V8U8:
-					case FORMAT_SRGB8_X8:
-						c.z = As<Short4>(UnpackHigh(c.x, c.y));
-						c.x = As<Short4>(UnpackLow(c.x, c.y));
-						c.y = c.x;
-						c.x = UnpackLow(As<Byte8>(c.x), As<Byte8>(c.x));
-						c.y = UnpackHigh(As<Byte8>(c.y), As<Byte8>(c.y));
-						c.z = UnpackLow(As<Byte8>(c.z), As<Byte8>(c.z));
-						// Propagate sign bit
-						if(state.textureFormat == FORMAT_X8B8G8R8I)
-						{
-							c.x >>= 8;
-							c.y >>= 8;
-							c.z >>= 8;
-						}
-						break;
-					case FORMAT_X8B8G8R8UI:
-						c.z = As<Short4>(UnpackHigh(c.x, c.y));
-						c.x = As<Short4>(UnpackLow(c.x, c.y));
-						c.y = c.x;
-						c.x = UnpackLow(As<Byte8>(c.x), As<Byte8>(Short4(0)));
-						c.y = UnpackHigh(As<Byte8>(c.y), As<Byte8>(Short4(0)));
-						c.z = UnpackLow(As<Byte8>(c.z), As<Byte8>(Short4(0)));
-						break;
-					default:
-						ASSERT(false);
-					}
-				}
-				break;
 			case 2:
 				c.x = Insert(c.x, Pointer<Short>(buffer[f0])[index[0]], 0);
 				c.x = Insert(c.x, Pointer<Short>(buffer[f1])[index[1]], 1);
@@ -1891,8 +1752,6 @@
 				{
 				case FORMAT_G8R8:
 				case FORMAT_G8R8_SNORM:
-				case FORMAT_V8U8:
-				case FORMAT_A8L8:
 					c.y = (c.x & Short4(0xFF00u)) | As<Short4>(As<UShort4>(c.x) >> 8);
 					c.x = (c.x & Short4(0x00FFu)) | (c.x << 8);
 					break;
@@ -2012,9 +1871,9 @@
 		if(hasYuvFormat())
 		{
 			// Generic YPbPr to RGB transformation
-			// R = Y                               +           2 * (1 - Kr) * Pr
-			// G = Y - 2 * Kb * (1 - Kb) / Kg * Pb - 2 * Kr * (1 - Kr) / Kg * Pr
-			// B = Y +           2 * (1 - Kb) * Pb
+				// R = Y                               +           2 * (1 - Kr) * Pr
+				// G = Y - 2 * Kb * (1 - Kb) / Kg * Pb - 2 * Kr * (1 - Kr) / Kg * Pr
+				// B = Y +           2 * (1 - Kb) * Pb
 
 			float Kb = 0.114f;
 			float Kr = 0.299f;
@@ -2053,10 +1912,10 @@
 			const float Uu = studioSwing ? 255.0f / (240 - 16) : 1.0f;
 			const float Vv = studioSwing ? 255.0f / (240 - 16) : 1.0f;
 
-			const float Rv = Vv *  Rr;
-			const float Gu = Uu *  Gb;
-			const float Gv = Vv *  Gr;
-			const float Bu = Uu *  Bb;
+			const float Rv = Vv * Rr;
+			const float Gu = Uu * Gb;
+			const float Gv = Vv * Gr;
+			const float Bu = Uu * Bb;
 
 			const float R0 = (studioSwing * -16 * Yy - 128 * Rv) / 255;
 			const float G0 = (studioSwing * -16 * Yy - 128 * Gu - 128 * Gv) / 255;
@@ -2599,59 +2458,33 @@
 			return true;
 		case FORMAT_R8_SNORM:
 		case FORMAT_G8R8_SNORM:
-		case FORMAT_X8B8G8R8_SNORM:
 		case FORMAT_A8B8G8R8_SNORM:
 		case FORMAT_R8I:
 		case FORMAT_R8UI:
 		case FORMAT_G8R8I:
 		case FORMAT_G8R8UI:
-		case FORMAT_X8B8G8R8I:
-		case FORMAT_X8B8G8R8UI:
 		case FORMAT_A8B8G8R8I:
 		case FORMAT_A8B8G8R8UI:
 		case FORMAT_R32I:
 		case FORMAT_R32UI:
 		case FORMAT_G32R32I:
 		case FORMAT_G32R32UI:
-		case FORMAT_X32B32G32R32I:
-		case FORMAT_X32B32G32R32UI:
 		case FORMAT_A32B32G32R32I:
 		case FORMAT_A32B32G32R32UI:
 		case FORMAT_G8R8:
-		case FORMAT_X8R8G8B8:
-		case FORMAT_X8B8G8R8:
 		case FORMAT_A8R8G8B8:
 		case FORMAT_A8B8G8R8:
-		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
-		case FORMAT_V8U8:
-		case FORMAT_Q8W8V8U8:
-		case FORMAT_X8L8V8U8:
 		case FORMAT_R32F:
 		case FORMAT_G32R32F:
-		case FORMAT_X32B32G32R32F:
 		case FORMAT_A32B32G32R32F:
-		case FORMAT_X32B32G32R32F_UNSIGNED:
-		case FORMAT_A8:
 		case FORMAT_R8:
-		case FORMAT_L8:
-		case FORMAT_A8L8:
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32F_SHADOW:
-		case FORMAT_D32FS8_SHADOW:
-		case FORMAT_L16:
 		case FORMAT_G16R16:
 		case FORMAT_A16B16G16R16:
-		case FORMAT_V16U16:
-		case FORMAT_A16W16V16U16:
-		case FORMAT_Q16W16V16U16:
 		case FORMAT_R16I:
 		case FORMAT_R16UI:
 		case FORMAT_G16R16I:
 		case FORMAT_G16R16UI:
-		case FORMAT_X16B16G16R16I:
-		case FORMAT_X16B16G16R16UI:
 		case FORMAT_A16B16G16R16I:
 		case FORMAT_A16B16G16R16UI:
 		case FORMAT_YV12_BT601:
@@ -2670,62 +2503,36 @@
 		switch(state.textureFormat)
 		{
 		case FORMAT_G8R8:
-		case FORMAT_X8R8G8B8:
-		case FORMAT_X8B8G8R8:
 		case FORMAT_A8R8G8B8:
 		case FORMAT_A8B8G8R8:
-		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
-		case FORMAT_V8U8:
-		case FORMAT_Q8W8V8U8:
-		case FORMAT_X8L8V8U8:
-		case FORMAT_A8:
 		case FORMAT_R8:
-		case FORMAT_L8:
-		case FORMAT_A8L8:
 		case FORMAT_R8_SNORM:
 		case FORMAT_G8R8_SNORM:
-		case FORMAT_X8B8G8R8_SNORM:
 		case FORMAT_A8B8G8R8_SNORM:
 		case FORMAT_R8I:
 		case FORMAT_R8UI:
 		case FORMAT_G8R8I:
 		case FORMAT_G8R8UI:
-		case FORMAT_X8B8G8R8I:
-		case FORMAT_X8B8G8R8UI:
 		case FORMAT_A8B8G8R8I:
 		case FORMAT_A8B8G8R8UI:
 			return true;
 		case FORMAT_R5G6B5:
 		case FORMAT_R32F:
 		case FORMAT_G32R32F:
-		case FORMAT_X32B32G32R32F:
 		case FORMAT_A32B32G32R32F:
-		case FORMAT_X32B32G32R32F_UNSIGNED:
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32F_SHADOW:
-		case FORMAT_D32FS8_SHADOW:
-		case FORMAT_L16:
 		case FORMAT_G16R16:
 		case FORMAT_A16B16G16R16:
-		case FORMAT_V16U16:
-		case FORMAT_A16W16V16U16:
-		case FORMAT_Q16W16V16U16:
 		case FORMAT_R32I:
 		case FORMAT_R32UI:
 		case FORMAT_G32R32I:
 		case FORMAT_G32R32UI:
-		case FORMAT_X32B32G32R32I:
-		case FORMAT_X32B32G32R32UI:
 		case FORMAT_A32B32G32R32I:
 		case FORMAT_A32B32G32R32UI:
 		case FORMAT_R16I:
 		case FORMAT_R16UI:
 		case FORMAT_G16R16I:
 		case FORMAT_G16R16UI:
-		case FORMAT_X16B16G16R16I:
-		case FORMAT_X16B16G16R16UI:
 		case FORMAT_A16B16G16R16I:
 		case FORMAT_A16B16G16R16UI:
 		case FORMAT_YV12_BT601:
@@ -2746,65 +2553,39 @@
 		case FORMAT_R5G6B5:
 		case FORMAT_R8_SNORM:
 		case FORMAT_G8R8_SNORM:
-		case FORMAT_X8B8G8R8_SNORM:
 		case FORMAT_A8B8G8R8_SNORM:
 		case FORMAT_R8I:
 		case FORMAT_R8UI:
 		case FORMAT_G8R8I:
 		case FORMAT_G8R8UI:
-		case FORMAT_X8B8G8R8I:
-		case FORMAT_X8B8G8R8UI:
 		case FORMAT_A8B8G8R8I:
 		case FORMAT_A8B8G8R8UI:
 		case FORMAT_R32I:
 		case FORMAT_R32UI:
 		case FORMAT_G32R32I:
 		case FORMAT_G32R32UI:
-		case FORMAT_X32B32G32R32I:
-		case FORMAT_X32B32G32R32UI:
 		case FORMAT_A32B32G32R32I:
 		case FORMAT_A32B32G32R32UI:
 		case FORMAT_G8R8:
-		case FORMAT_X8R8G8B8:
-		case FORMAT_X8B8G8R8:
 		case FORMAT_A8R8G8B8:
 		case FORMAT_A8B8G8R8:
-		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
-		case FORMAT_V8U8:
-		case FORMAT_Q8W8V8U8:
-		case FORMAT_X8L8V8U8:
 		case FORMAT_R32F:
 		case FORMAT_G32R32F:
-		case FORMAT_X32B32G32R32F:
 		case FORMAT_A32B32G32R32F:
-		case FORMAT_X32B32G32R32F_UNSIGNED:
-		case FORMAT_A8:
 		case FORMAT_R8:
-		case FORMAT_L8:
-		case FORMAT_A8L8:
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32F_SHADOW:
-		case FORMAT_D32FS8_SHADOW:
 		case FORMAT_YV12_BT601:
 		case FORMAT_YV12_BT709:
 		case FORMAT_YV12_JFIF:
 			return false;
-		case FORMAT_L16:
 		case FORMAT_G16R16:
 		case FORMAT_A16B16G16R16:
 		case FORMAT_R16I:
 		case FORMAT_R16UI:
 		case FORMAT_G16R16I:
 		case FORMAT_G16R16UI:
-		case FORMAT_X16B16G16R16I:
-		case FORMAT_X16B16G16R16UI:
 		case FORMAT_A16B16G16R16I:
 		case FORMAT_A16B16G16R16UI:
-		case FORMAT_V16U16:
-		case FORMAT_A16W16V16U16:
-		case FORMAT_Q16W16V16U16:
 			return true;
 		default:
 			ASSERT(false);
@@ -2820,53 +2601,29 @@
 		case FORMAT_R5G6B5:
 		case FORMAT_R8_SNORM:
 		case FORMAT_G8R8_SNORM:
-		case FORMAT_X8B8G8R8_SNORM:
 		case FORMAT_A8B8G8R8_SNORM:
 		case FORMAT_R8I:
 		case FORMAT_R8UI:
 		case FORMAT_G8R8I:
 		case FORMAT_G8R8UI:
-		case FORMAT_X8B8G8R8I:
-		case FORMAT_X8B8G8R8UI:
 		case FORMAT_A8B8G8R8I:
 		case FORMAT_A8B8G8R8UI:
 		case FORMAT_G8R8:
-		case FORMAT_X8R8G8B8:
-		case FORMAT_X8B8G8R8:
 		case FORMAT_A8R8G8B8:
 		case FORMAT_A8B8G8R8:
-		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
-		case FORMAT_V8U8:
-		case FORMAT_Q8W8V8U8:
-		case FORMAT_X8L8V8U8:
-		case FORMAT_L16:
 		case FORMAT_G16R16:
 		case FORMAT_A16B16G16R16:
 		case FORMAT_R16I:
 		case FORMAT_R16UI:
 		case FORMAT_G16R16I:
 		case FORMAT_G16R16UI:
-		case FORMAT_X16B16G16R16I:
-		case FORMAT_X16B16G16R16UI:
 		case FORMAT_A16B16G16R16I:
 		case FORMAT_A16B16G16R16UI:
-		case FORMAT_V16U16:
-		case FORMAT_A16W16V16U16:
-		case FORMAT_Q16W16V16U16:
 		case FORMAT_R32F:
 		case FORMAT_G32R32F:
-		case FORMAT_X32B32G32R32F:
 		case FORMAT_A32B32G32R32F:
-		case FORMAT_X32B32G32R32F_UNSIGNED:
-		case FORMAT_A8:
 		case FORMAT_R8:
-		case FORMAT_L8:
-		case FORMAT_A8L8:
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32F_SHADOW:
-		case FORMAT_D32FS8_SHADOW:
 		case FORMAT_YV12_BT601:
 		case FORMAT_YV12_BT709:
 		case FORMAT_YV12_JFIF:
@@ -2875,8 +2632,6 @@
 		case FORMAT_R32UI:
 		case FORMAT_G32R32I:
 		case FORMAT_G32R32UI:
-		case FORMAT_X32B32G32R32I:
-		case FORMAT_X32B32G32R32UI:
 		case FORMAT_A32B32G32R32I:
 		case FORMAT_A32B32G32R32UI:
 			return true;
@@ -2898,61 +2653,35 @@
 		case FORMAT_R5G6B5:
 		case FORMAT_R8_SNORM:
 		case FORMAT_G8R8_SNORM:
-		case FORMAT_X8B8G8R8_SNORM:
 		case FORMAT_A8B8G8R8_SNORM:
 		case FORMAT_R8I:
 		case FORMAT_R8UI:
 		case FORMAT_G8R8I:
 		case FORMAT_G8R8UI:
-		case FORMAT_X8B8G8R8I:
-		case FORMAT_X8B8G8R8UI:
 		case FORMAT_A8B8G8R8I:
 		case FORMAT_A8B8G8R8UI:
 		case FORMAT_R32I:
 		case FORMAT_R32UI:
 		case FORMAT_G32R32I:
 		case FORMAT_G32R32UI:
-		case FORMAT_X32B32G32R32I:
-		case FORMAT_X32B32G32R32UI:
 		case FORMAT_A32B32G32R32I:
 		case FORMAT_A32B32G32R32UI:
 		case FORMAT_G8R8:
-		case FORMAT_X8R8G8B8:
-		case FORMAT_X8B8G8R8:
 		case FORMAT_A8R8G8B8:
 		case FORMAT_A8B8G8R8:
-		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
-		case FORMAT_V8U8:
-		case FORMAT_Q8W8V8U8:
-		case FORMAT_X8L8V8U8:
 		case FORMAT_R32F:
 		case FORMAT_G32R32F:
-		case FORMAT_X32B32G32R32F:
 		case FORMAT_A32B32G32R32F:
-		case FORMAT_X32B32G32R32F_UNSIGNED:
-		case FORMAT_A8:
 		case FORMAT_R8:
-		case FORMAT_L8:
-		case FORMAT_A8L8:
-		case FORMAT_D32F_LOCKABLE:
-		case FORMAT_D32FS8_TEXTURE:
-		case FORMAT_D32F_SHADOW:
-		case FORMAT_D32FS8_SHADOW:
-		case FORMAT_L16:
 		case FORMAT_G16R16:
 		case FORMAT_A16B16G16R16:
 		case FORMAT_R16I:
 		case FORMAT_R16UI:
 		case FORMAT_G16R16I:
 		case FORMAT_G16R16UI:
-		case FORMAT_X16B16G16R16I:
-		case FORMAT_X16B16G16R16UI:
 		case FORMAT_A16B16G16R16I:
 		case FORMAT_A16B16G16R16UI:
-		case FORMAT_V16U16:
-		case FORMAT_A16W16V16U16:
-		case FORMAT_Q16W16V16U16:
 			return false;
 		default:
 			ASSERT(false);
@@ -2968,61 +2697,35 @@
 		case FORMAT_R5G6B5:         return component < 3;
 		case FORMAT_R8_SNORM:      return component < 1;
 		case FORMAT_G8R8_SNORM:    return component < 2;
-		case FORMAT_X8B8G8R8_SNORM: return component < 3;
 		case FORMAT_A8B8G8R8_SNORM: return component < 3;
 		case FORMAT_R8I:            return component < 1;
 		case FORMAT_R8UI:           return component < 1;
 		case FORMAT_G8R8I:          return component < 2;
 		case FORMAT_G8R8UI:         return component < 2;
-		case FORMAT_X8B8G8R8I:      return component < 3;
-		case FORMAT_X8B8G8R8UI:     return component < 3;
 		case FORMAT_A8B8G8R8I:      return component < 3;
 		case FORMAT_A8B8G8R8UI:     return component < 3;
 		case FORMAT_R32I:           return component < 1;
 		case FORMAT_R32UI:          return component < 1;
 		case FORMAT_G32R32I:        return component < 2;
 		case FORMAT_G32R32UI:       return component < 2;
-		case FORMAT_X32B32G32R32I:  return component < 3;
-		case FORMAT_X32B32G32R32UI: return component < 3;
 		case FORMAT_A32B32G32R32I:  return component < 3;
 		case FORMAT_A32B32G32R32UI: return component < 3;
 		case FORMAT_G8R8:           return component < 2;
-		case FORMAT_X8R8G8B8:       return component < 3;
-		case FORMAT_X8B8G8R8:       return component < 3;
 		case FORMAT_A8R8G8B8:       return component < 3;
 		case FORMAT_A8B8G8R8:       return component < 3;
-		case FORMAT_SRGB8_X8:       return component < 3;
 		case FORMAT_SRGB8_A8:       return component < 3;
-		case FORMAT_V8U8:           return false;
-		case FORMAT_Q8W8V8U8:       return false;
-		case FORMAT_X8L8V8U8:       return false;
 		case FORMAT_R32F:           return component < 1;
 		case FORMAT_G32R32F:        return component < 2;
-		case FORMAT_X32B32G32R32F:  return component < 3;
 		case FORMAT_A32B32G32R32F:  return component < 3;
-		case FORMAT_X32B32G32R32F_UNSIGNED: return component < 3;
-		case FORMAT_A8:             return false;
 		case FORMAT_R8:             return component < 1;
-		case FORMAT_L8:             return component < 1;
-		case FORMAT_A8L8:           return component < 1;
-		case FORMAT_D32F_LOCKABLE:  return false;
-		case FORMAT_D32FS8_TEXTURE: return false;
-		case FORMAT_D32F_SHADOW:    return false;
-		case FORMAT_D32FS8_SHADOW:  return false;
-		case FORMAT_L16:            return component < 1;
 		case FORMAT_G16R16:         return component < 2;
 		case FORMAT_A16B16G16R16:   return component < 3;
 		case FORMAT_R16I:           return component < 1;
 		case FORMAT_R16UI:          return component < 1;
 		case FORMAT_G16R16I:        return component < 2;
 		case FORMAT_G16R16UI:       return component < 2;
-		case FORMAT_X16B16G16R16I:  return component < 3;
-		case FORMAT_X16B16G16R16UI: return component < 3;
 		case FORMAT_A16B16G16R16I:  return component < 3;
 		case FORMAT_A16B16G16R16UI: return component < 3;
-		case FORMAT_V16U16:         return false;
-		case FORMAT_A16W16V16U16:   return false;
-		case FORMAT_Q16W16V16U16:   return false;
 		case FORMAT_YV12_BT601:     return component < 3;
 		case FORMAT_YV12_BT709:     return component < 3;
 		case FORMAT_YV12_JFIF:      return component < 3;
diff --git a/src/WSI/FrameBuffer.cpp b/src/WSI/FrameBuffer.cpp
index 01838fe..772c0a0 100644
--- a/src/WSI/FrameBuffer.cpp
+++ b/src/WSI/FrameBuffer.cpp
@@ -40,7 +40,7 @@
 
 		this->width = width;
 		this->height = height;
-		format = FORMAT_X8R8G8B8;
+		format = FORMAT_A8R8G8B8;
 		stride = 0;
 
 		windowed = !fullscreen || forceWindowed;
@@ -187,14 +187,12 @@
 
 				switch(state.destFormat)
 				{
-				case FORMAT_X8R8G8B8:
 				case FORMAT_A8R8G8B8:
 					{
 						Int x = x0;
 
 						switch(state.sourceFormat)
 						{
-						case FORMAT_X8R8G8B8:
 						case FORMAT_A8R8G8B8:
 							For(, x < width - 3, x += 4)
 							{
@@ -204,7 +202,6 @@
 								d += 4 * dBytes;
 							}
 							break;
-						case FORMAT_X8B8G8R8:
 						case FORMAT_A8B8G8R8:
 							For(, x < width - 3, x += 4)
 							{
@@ -252,11 +249,9 @@
 						{
 							switch(state.sourceFormat)
 							{
-							case FORMAT_X8R8G8B8:
 							case FORMAT_A8R8G8B8:
 								*Pointer<Int>(d) = *Pointer<Int>(s);
 								break;
-							case FORMAT_X8B8G8R8:
 							case FORMAT_A8B8G8R8:
 								{
 									Int rgba = *Pointer<Int>(s);
@@ -293,16 +288,13 @@
 						}
 					}
 					break;
-				case FORMAT_X8B8G8R8:
 				case FORMAT_A8B8G8R8:
-				case FORMAT_SRGB8_X8:
 				case FORMAT_SRGB8_A8:
 					{
 						Int x = x0;
 
 						switch(state.sourceFormat)
 						{
-						case FORMAT_X8B8G8R8:
 						case FORMAT_A8B8G8R8:
 							For(, x < width - 3, x += 4)
 							{
@@ -312,7 +304,6 @@
 								d += 4 * dBytes;
 							}
 							break;
-						case FORMAT_X8R8G8B8:
 						case FORMAT_A8R8G8B8:
 							For(, x < width - 3, x += 4)
 							{
@@ -361,11 +352,9 @@
 						{
 							switch(state.sourceFormat)
 							{
-							case FORMAT_X8B8G8R8:
 							case FORMAT_A8B8G8R8:
 								*Pointer<Int>(d) = *Pointer<Int>(s);
 								break;
-							case FORMAT_X8R8G8B8:
 							case FORMAT_A8R8G8B8:
 								{
 									Int bgra = *Pointer<Int>(s);
@@ -401,55 +390,12 @@
 						}
 					}
 					break;
-				case FORMAT_R8G8B8:
-					{
-						For(Int x = x0, x < width, x++)
-						{
-							switch(state.sourceFormat)
-							{
-							case FORMAT_X8R8G8B8:
-							case FORMAT_A8R8G8B8:
-								*Pointer<Byte>(d + 0) = *Pointer<Byte>(s + 0);
-								*Pointer<Byte>(d + 1) = *Pointer<Byte>(s + 1);
-								*Pointer<Byte>(d + 2) = *Pointer<Byte>(s + 2);
-								break;
-							case FORMAT_X8B8G8R8:
-							case FORMAT_A8B8G8R8:
-								*Pointer<Byte>(d + 0) = *Pointer<Byte>(s + 2);
-								*Pointer<Byte>(d + 1) = *Pointer<Byte>(s + 1);
-								*Pointer<Byte>(d + 2) = *Pointer<Byte>(s + 0);
-								break;
-							case FORMAT_A16B16G16R16:
-								*Pointer<Byte>(d + 0) = *Pointer<Byte>(s + 5);
-								*Pointer<Byte>(d + 1) = *Pointer<Byte>(s + 3);
-								*Pointer<Byte>(d + 2) = *Pointer<Byte>(s + 1);
-								break;
-							case FORMAT_R5G6B5:
-								{
-									Int rgb = Int(*Pointer<Short>(s));
-
-									*Pointer<Byte>(d + 0) = Byte(((rgb & 0x001F) << 3) | ((rgb & 0x001C) >> 2));
-									*Pointer<Byte>(d + 1) = Byte(((rgb & 0x07E0) << 5) | ((rgb & 0x0600) >> 1));
-									*Pointer<Byte>(d + 2) = Byte(((rgb & 0xF800) << 8) | ((rgb & 0xE000) << 3));
-								}
-								break;
-							default:
-								ASSERT(false);
-								break;
-							}
-
-							s += sBytes;
-							d += dBytes;
-						}
-					}
-					break;
 				case FORMAT_R5G6B5:
 					{
 						For(Int x = x0, x < width, x++)
 						{
 							switch(state.sourceFormat)
 							{
-							case FORMAT_X8R8G8B8:
 							case FORMAT_A8R8G8B8:
 								{
 									Int c = *Pointer<Int>(s);
@@ -459,7 +405,6 @@
 									                           (c & 0x000000F8) >> 3);
 								}
 								break;
-							case FORMAT_X8B8G8R8:
 							case FORMAT_A8B8G8R8:
 								{
 									Int c = *Pointer<Int>(s);
@@ -543,11 +488,9 @@
 
 		switch(state.sourceFormat)
 		{
-		case FORMAT_X8R8G8B8:
 		case FORMAT_A8R8G8B8:
 			c2 = Unpack(*Pointer<Byte4>(s));
 			break;
-		case FORMAT_X8B8G8R8:
 		case FORMAT_A8B8G8R8:
 			c2 = Swizzle(Unpack(*Pointer<Byte4>(s)), 0xC6);
 			break;
@@ -581,13 +524,10 @@
 
 		switch(state.destFormat)
 		{
-		case FORMAT_X8R8G8B8:
 		case FORMAT_A8R8G8B8:
 			*Pointer<Byte4>(d) = Byte4(PackUnsigned(c1, c1));
 			break;
-		case FORMAT_X8B8G8R8:
 		case FORMAT_A8B8G8R8:
-		case FORMAT_SRGB8_X8:
 		case FORMAT_SRGB8_A8:
 			{
 				c1 = Swizzle(c1, 0xC6);
@@ -595,15 +535,6 @@
 				*Pointer<Byte4>(d) = Byte4(PackUnsigned(c1, c1));
 			}
 			break;
-		case FORMAT_R8G8B8:
-			{
-				Int c = Int(As<Int2>(PackUnsigned(c1, c1)));
-
-				*Pointer<Byte>(d + 0) = Byte(c >> 0);
-				*Pointer<Byte>(d + 1) = Byte(c >> 8);
-				*Pointer<Byte>(d + 2) = Byte(c >> 16);
-			}
-			break;
 		case FORMAT_R5G6B5:
 			{
 				Int c = Int(As<Int2>(PackUnsigned(c1, c1)));
diff --git a/src/WSI/FrameBufferDD.cpp b/src/WSI/FrameBufferDD.cpp
index 9625a13..dcf1c9f 100644
--- a/src/WSI/FrameBufferDD.cpp
+++ b/src/WSI/FrameBufferDD.cpp
@@ -106,8 +106,7 @@
 
 			switch(ddsd.ddpfPixelFormat.dwRGBBitCount)
 			{
-			case 32: format = FORMAT_X8R8G8B8; break;
-			case 24: format = FORMAT_R8G8B8;   break;
+			case 32: format = FORMAT_A8R8G8B8; break;
 			case 16: format = FORMAT_R5G6B5;   break;
 			default: format = FORMAT_NULL;     break;
 			}
@@ -202,27 +201,21 @@
 
 		directDraw->SetCooperativeLevel(windowHandle, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
 
-		long result;
+		long result = DD_FALSE;
 
 		do
 		{
-			format = FORMAT_X8R8G8B8;
+			format = FORMAT_A8R8G8B8;
 			result = directDraw->SetDisplayMode(width, height, 32);
 
 			if(result == DDERR_INVALIDMODE)
 			{
-				format = FORMAT_R8G8B8;
-				result = directDraw->SetDisplayMode(width, height, 24);
+				format = FORMAT_R5G6B5;
+				result = directDraw->SetDisplayMode(width, height, 16);
 
 				if(result == DDERR_INVALIDMODE)
 				{
-					format = FORMAT_R5G6B5;
-					result = directDraw->SetDisplayMode(width, height, 16);
-
-					if(result == DDERR_INVALIDMODE)
-					{
-						assert(!"Failed to initialize graphics: Display mode not supported.");
-					}
+					assert(!"Failed to initialize graphics: Display mode not supported.");
 				}
 			}
 
diff --git a/src/WSI/FrameBufferGDI.cpp b/src/WSI/FrameBufferGDI.cpp
index 5c80bd7..e932eb4 100644
--- a/src/WSI/FrameBufferGDI.cpp
+++ b/src/WSI/FrameBufferGDI.cpp
@@ -37,7 +37,7 @@
 
 		init(this->windowHandle);
 
-		format = FORMAT_X8R8G8B8;
+		format = FORMAT_A8R8G8B8;
 	}
 
 	FrameBufferGDI::~FrameBufferGDI()