Imported a few ES3 fixes from Angle

Imported some of the more trivial bug fixes:
- Added a few missing interface block cases
- Added checks for varying structs
- Added checks for unsized arrays
- Added first-class array check for pre ES3 compilation
- Added check that ES3 functions do not use builtin names (ES3 only)
- Added more binary operator checks

Change-Id: I3d75453f17e1123478ef7da0998e869970a7fb7d
Reviewed-on: https://swiftshader-review.googlesource.com/8289
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/compiler/Intermediate.cpp b/src/OpenGL/compiler/Intermediate.cpp
index dbbfb19..a6b1b82 100644
--- a/src/OpenGL/compiler/Intermediate.cpp
+++ b/src/OpenGL/compiler/Intermediate.cpp
@@ -62,6 +62,134 @@
 	}
 }
 
+TOperator TypeToConstructorOperator(const TType &type)
+{
+	switch(type.getBasicType())
+	{
+	case EbtFloat:
+		if(type.isMatrix())
+		{
+			switch(type.getNominalSize())
+			{
+			case 2:
+				switch(type.getSecondarySize())
+				{
+				case 2:
+					return EOpConstructMat2;
+				case 3:
+					return EOpConstructMat2x3;
+				case 4:
+					return EOpConstructMat2x4;
+				default:
+					break;
+				}
+				break;
+
+			case 3:
+				switch(type.getSecondarySize())
+				{
+				case 2:
+					return EOpConstructMat3x2;
+				case 3:
+					return EOpConstructMat3;
+				case 4:
+					return EOpConstructMat3x4;
+				default:
+					break;
+				}
+				break;
+
+			case 4:
+				switch(type.getSecondarySize())
+				{
+				case 2:
+					return EOpConstructMat4x2;
+				case 3:
+					return EOpConstructMat4x3;
+				case 4:
+					return EOpConstructMat4;
+				default:
+					break;
+				}
+				break;
+			}
+		}
+		else
+		{
+			switch(type.getNominalSize())
+			{
+			case 1:
+				return EOpConstructFloat;
+			case 2:
+				return EOpConstructVec2;
+			case 3:
+				return EOpConstructVec3;
+			case 4:
+				return EOpConstructVec4;
+			default:
+				break;
+			}
+		}
+		break;
+
+	case EbtInt:
+		switch(type.getNominalSize())
+		{
+		case 1:
+			return EOpConstructInt;
+		case 2:
+			return EOpConstructIVec2;
+		case 3:
+			return EOpConstructIVec3;
+		case 4:
+			return EOpConstructIVec4;
+		default:
+			break;
+		}
+		break;
+
+	case EbtUInt:
+		switch(type.getNominalSize())
+		{
+		case 1:
+			return EOpConstructUInt;
+		case 2:
+			return EOpConstructUVec2;
+		case 3:
+			return EOpConstructUVec3;
+		case 4:
+			return EOpConstructUVec4;
+		default:
+			break;
+		}
+		break;
+
+	case EbtBool:
+		switch(type.getNominalSize())
+		{
+		case 1:
+			return EOpConstructBool;
+		case 2:
+			return EOpConstructBVec2;
+		case 3:
+			return EOpConstructBVec3;
+		case 4:
+			return EOpConstructBVec4;
+		default:
+			break;
+		}
+		break;
+
+	case EbtStruct:
+		return EOpConstructStruct;
+
+	default:
+		break;
+	}
+
+	return EOpNull;
+}
+
 const char* getOperatorString(TOperator op) {
 	switch (op) {
 	case EOpInitialize: return "=";
@@ -657,6 +785,17 @@
 //
 ////////////////////////////////////////////////////////////////
 
+// static
+TIntermTyped *TIntermTyped::CreateIndexNode(int index)
+{
+	ConstantUnion *u = new ConstantUnion[1];
+	u[0].setIConst(index);
+
+	TType type(EbtInt, EbpUndefined, EvqConstExpr, 1);
+	TIntermConstantUnion *node = new TIntermConstantUnion(u, type);
+	return node;
+}
+
 //
 // Say whether or not an operation node changes the value of a variable.
 //