Add basic support for ESSL3 vec2 (un)pack functions

The functions are emulated on HLSL, and use the native functions on
OpenGL 4.2+ and GLES3.0. Emulation for OpenGL versions <= 4.1 is not yet
implemented.

BUG=angle:865

Change-Id: I6803a1767dacdb3dca12f13924651fd38fcacb75
Reviewed-on: https://chromium-review.googlesource.com/240961
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Tested-by: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/compiler/translator/Intermediate.cpp b/src/compiler/translator/Intermediate.cpp
index 914b450..de72cfe 100644
--- a/src/compiler/translator/Intermediate.cpp
+++ b/src/compiler/translator/Intermediate.cpp
@@ -231,6 +231,22 @@
     if (!node->promote(mInfoSink))
         return 0;
 
+    switch (op)
+    {
+      case EOpPackSnorm2x16:
+      case EOpPackUnorm2x16:
+      case EOpPackHalf2x16:
+      case EOpUnpackSnorm2x16:
+      case EOpUnpackUnorm2x16:
+        node->getTypePointer()->setPrecision(EbpHigh);
+        break;
+      case EOpUnpackHalf2x16:
+        node->getTypePointer()->setPrecision(EbpMedium);
+        break;
+      default:
+        break;
+    }
+
     if (childTempConstant)
     {
         TIntermTyped *newChild = childTempConstant->fold(op, 0, mInfoSink);