Implement support for RGBA sampling.

Also improve the filtering precision of 3-byte formats.

Change-Id: If314c870735488dfcd22b9ab60b4783e31a4c05b
Reviewed-on: https://swiftshader-review.googlesource.com/2751
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Shader/SamplerCore.cpp b/src/Shader/SamplerCore.cpp
index 6022647..75ceceb 100644
--- a/src/Shader/SamplerCore.cpp
+++ b/src/Shader/SamplerCore.cpp
@@ -134,7 +134,9 @@
 				{
 				case FORMAT_R8:
 				case FORMAT_X8R8G8B8:
+				case FORMAT_X8B8G8R8:
 				case FORMAT_A8R8G8B8:
+				case FORMAT_A8B8G8R8:
 				case FORMAT_V8U8:
 				case FORMAT_Q8W8V8U8:
 				case FORMAT_X8L8V8U8:
@@ -288,7 +290,9 @@
 				{
 				case FORMAT_R8:
 				case FORMAT_X8R8G8B8:
+				case FORMAT_X8B8G8R8:
 				case FORMAT_A8R8G8B8:
+				case FORMAT_A8B8G8R8:
 				case FORMAT_V8U8:
 				case FORMAT_Q8W8V8U8:
 				case FORMAT_X8L8V8U8:
@@ -1509,6 +1513,7 @@
 						c.x = UnpackLow(As<Byte8>(c.x), As<Byte8>(c.x));
 						c.w = UnpackHigh(As<Byte8>(c.w), As<Byte8>(c.w));
 						break;
+					case FORMAT_A8B8G8R8:
 					case FORMAT_Q8W8V8U8:
 						c.z = c.x;
 						c.x = As<Short4>(UnpackLow(c.x, c.y));
@@ -1545,15 +1550,14 @@
 						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:
 					case FORMAT_X8L8V8U8:
 						c.z = c.x;
 						c.x = As<Short4>(UnpackLow(c.x, c.y));
 						c.z = As<Short4>(UnpackHigh(c.z, c.y));
 						c.y = c.x;
-						c.x = UnpackLow(As<Byte8>(c.x), As<Byte8>(Short4(0x0000, 0x0000, 0x0000, 0x0000)));
-						c.x = c.x << 8;
-						c.y = UnpackHigh(As<Byte8>(c.y), As<Byte8>(Short4(0x0000, 0x0000, 0x0000, 0x0000)));
-						c.y = c.y << 8;
+						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));
 						break;
 					default:
@@ -1811,7 +1815,9 @@
 		{
 		case FORMAT_G8R8:
 		case FORMAT_X8R8G8B8:
+		case FORMAT_X8B8G8R8:
 		case FORMAT_A8R8G8B8:
+		case FORMAT_A8B8G8R8:
 		case FORMAT_V8U8:
 		case FORMAT_Q8W8V8U8:
 		case FORMAT_X8L8V8U8:
@@ -1846,7 +1852,9 @@
 		{
 		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_V8U8:           return false;
 		case FORMAT_Q8W8V8U8:       return false;
 		case FORMAT_X8L8V8U8:       return false;