Added vertex attribute types

Added a few types:
- Half float
- 2_10_10_10_INT
- 2_10_10_10_UINT

Related dEQP tests pass.

Change-Id: I2fb04fee89c3d69367dc2e401ac53d9758add9bf
Reviewed-on: https://swiftshader-review.googlesource.com/5356
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index 94b8fe8..6477734 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -210,6 +210,9 @@
 		case GL_UNSIGNED_INT:   return mSize * sizeof(GLuint);
 		case GL_FIXED:          return mSize * sizeof(GLfixed);
 		case GL_FLOAT:          return mSize * sizeof(GLfloat);
+		case GL_HALF_FLOAT:     return mSize * sizeof(GLhalf);
+		case GL_INT_2_10_10_10_REV:          return sizeof(GLint);
+		case GL_UNSIGNED_INT_2_10_10_10_REV: return sizeof(GLuint);
 		default: UNREACHABLE(mType); return mSize * sizeof(GLfloat);
 		}
 	}
diff --git a/src/OpenGL/libGLESv2/VertexDataManager.cpp b/src/OpenGL/libGLESv2/VertexDataManager.cpp
index ddc9d8d..7f2dd83 100644
--- a/src/OpenGL/libGLESv2/VertexDataManager.cpp
+++ b/src/OpenGL/libGLESv2/VertexDataManager.cpp
@@ -192,6 +192,9 @@
 				case GL_UNSIGNED_INT:   translated[i].type = sw::STREAMTYPE_UINT;   break;
 				case GL_FIXED:          translated[i].type = sw::STREAMTYPE_FIXED;  break;
 				case GL_FLOAT:          translated[i].type = sw::STREAMTYPE_FLOAT;  break;
+				case GL_HALF_FLOAT:     translated[i].type = sw::STREAMTYPE_HALF;   break;
+				case GL_INT_2_10_10_10_REV:          translated[i].type = sw::STREAMTYPE_2_10_10_10_INT;  break;
+				case GL_UNSIGNED_INT_2_10_10_10_REV: translated[i].type = sw::STREAMTYPE_2_10_10_10_UINT; break;
 				default: UNREACHABLE(attrib.mType); translated[i].type = sw::STREAMTYPE_FLOAT;  break;
 				}
 
diff --git a/src/Renderer/Stream.hpp b/src/Renderer/Stream.hpp
index 9e06cf3..047cf75 100644
--- a/src/Renderer/Stream.hpp
+++ b/src/Renderer/Stream.hpp
@@ -36,6 +36,8 @@
 		STREAMTYPE_UINT,
 		STREAMTYPE_FIXED,     // Normalization ignored (16.16 format)
 		STREAMTYPE_HALF,      // Normalization ignored
+		STREAMTYPE_2_10_10_10_INT,
+		STREAMTYPE_2_10_10_10_UINT,
 
 		STREAMTYPE_LAST = STREAMTYPE_HALF
 	};
diff --git a/src/Shader/VertexRoutine.cpp b/src/Shader/VertexRoutine.cpp
index e5405ef..626f710 100644
--- a/src/Shader/VertexRoutine.cpp
+++ b/src/Shader/VertexRoutine.cpp
@@ -482,6 +482,50 @@
 				v.x.w = *Pointer<Float>(source3);
 			}
 			break;
+		case STREAMTYPE_2_10_10_10_INT:
+			{
+				Int4 src;
+				src = Insert(src, *Pointer<Int>(source0), 0);
+				src = Insert(src, *Pointer<Int>(source1), 1);
+				src = Insert(src, *Pointer<Int>(source2), 2);
+				src = Insert(src, *Pointer<Int>(source3), 3);
+
+				v.x = Float4((src << 22) >> 22);
+				v.y = Float4((src << 12) >> 22);
+				v.z = Float4((src << 02) >> 22);
+				v.w = Float4(src >> 30);
+
+				if(stream.normalized)
+				{
+					v.x = Max(v.x * Float4(1.0f / 0x1FF), Float4(-1.0f));
+					v.y = Max(v.y * Float4(1.0f / 0x1FF), Float4(-1.0f));
+					v.z = Max(v.z * Float4(1.0f / 0x1FF), Float4(-1.0f));
+					v.w = Max(v.w, Float4(-1.0f));
+				}
+			}
+			break;
+		case STREAMTYPE_2_10_10_10_UINT:
+			{
+				Int4 src;
+				src = Insert(src, *Pointer<Int>(source0), 0);
+				src = Insert(src, *Pointer<Int>(source1), 1);
+				src = Insert(src, *Pointer<Int>(source2), 2);
+				src = Insert(src, *Pointer<Int>(source3), 3);
+
+				v.x = Float4(src & Int4(0x3FF));
+				v.y = Float4((src >> 10) & Int4(0x3FF));
+				v.z = Float4((src >> 20) & Int4(0x3FF));
+				v.w = Float4((src >> 30) & Int4(0x3));
+
+				if(stream.normalized)
+				{
+					v.x *= Float4(1.0f / 0x3FF);
+					v.y *= Float4(1.0f / 0x3FF);
+					v.z *= Float4(1.0f / 0x3FF);
+					v.w *= Float4(1.0f / 0x3);
+				}
+			}
+			break;
 		default:
 			ASSERT(false);
 		}