Implement R5G6B5 texel fetch.

Bug 20891368

Change-Id: I9e45baa999eef62452c8ee467b1be69998f74187
Reviewed-on: https://swiftshader-review.googlesource.com/3091
Reviewed-by: Alexis Hétu <sugoi@google.com>
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 888e0a6..17814e3 100644
--- a/src/Shader/SamplerCore.cpp
+++ b/src/Shader/SamplerCore.cpp
@@ -133,6 +133,7 @@
 				switch(state.textureFormat)
 				{
 				case FORMAT_R8:
+				case FORMAT_R5G6B5:
 				case FORMAT_X8R8G8B8:
 				case FORMAT_X8B8G8R8:
 				case FORMAT_A8R8G8B8:
@@ -289,6 +290,7 @@
 				switch(state.textureFormat)
 				{
 				case FORMAT_R8:
+				case FORMAT_R5G6B5:
 				case FORMAT_X8R8G8B8:
 				case FORMAT_X8B8G8R8:
 				case FORMAT_A8R8G8B8:
@@ -1477,7 +1479,21 @@
 
 		if(has16bitTextureFormat())
 		{
-			UNIMPLEMENTED();
+			c.x = Insert(c.x, *Pointer<Short>(buffer[f0] + 2 * index[0]), 0);
+			c.x = Insert(c.x, *Pointer<Short>(buffer[f1] + 2 * index[1]), 1);
+			c.x = Insert(c.x, *Pointer<Short>(buffer[f2] + 2 * index[2]), 2);
+			c.x = Insert(c.x, *Pointer<Short>(buffer[f3] + 2 * index[3]), 3);
+
+			switch(state.textureFormat)
+			{
+			case FORMAT_R5G6B5:
+				c.z = (c.x & Short4(0x001Fu)) << 11;
+				c.y = (c.x & Short4(0x07E0u)) << 5;
+				c.x = (c.x & Short4(0xF800u));
+				break;
+			default:
+				ASSERT(false);
+			}
 		}
 		else if(!has16bitTextureComponents())   // 8-bit components
 		{
@@ -1568,8 +1584,8 @@
 				case FORMAT_G8R8:
 				case FORMAT_V8U8:
 				case FORMAT_A8L8:
-					c.y = (c.x & Short4(0xFF00, 0xFF00, 0xFF00, 0xFF00)) | As<Short4>(As<UShort4>(c.x) >> 8);
-					c.x = (c.x & Short4(0x00FF, 0x00FF, 0x00FF, 0x00FF)) | (c.x << 8);
+					c.y = (c.x & Short4(0xFF00u, 0xFF00u, 0xFF00u, 0xFF00u)) | As<Short4>(As<UShort4>(c.x) >> 8);
+					c.x = (c.x & Short4(0x00FFu, 0x00FFu, 0x00FFu, 0x00FFu)) | (c.x << 8);
 					break;
 				default:
 					ASSERT(false);