Implemented 2D array sampler HLSL translation.

TRAC #23377
Signed-off-by: Jamie Madill
Signed-off-by: Shannon Woods
Author: Nicolas Capens
diff --git a/src/compiler/OutputHLSL.cpp b/src/compiler/OutputHLSL.cpp
index 0d41d64..22a4e4f 100644
--- a/src/compiler/OutputHLSL.cpp
+++ b/src/compiler/OutputHLSL.cpp
@@ -35,7 +35,10 @@
 
     if (sampler == EbtSampler2D ||
         sampler == EbtISampler2D ||
-        sampler == EbtUSampler2D)
+        sampler == EbtUSampler2D ||
+        sampler == EbtSampler2DArray ||
+        sampler == EbtISampler2DArray ||
+        sampler == EbtUSampler2DArray)
     {
         name += "2D";
     }
@@ -780,15 +783,18 @@
         // Return type
         switch(textureFunction->sampler)
         {
-          case EbtSampler2D:    out << "float4 "; break;
-          case EbtSampler3D:    out << "float4 "; break;
-          case EbtSamplerCube:  out << "float4 "; break;
-          case EbtISampler2D:   out << "int4 ";   break;
-          case EbtISampler3D:   out << "int4 ";   break;
-          case EbtISamplerCube: out << "int4 ";   break;
-          case EbtUSampler2D:   out << "uint4 ";  break;
-          case EbtUSampler3D:   out << "uint4 ";  break;
-          case EbtUSamplerCube: out << "uint4 ";  break;
+          case EbtSampler2D:       out << "float4 "; break;
+          case EbtSampler3D:       out << "float4 "; break;
+          case EbtSamplerCube:     out << "float4 "; break;
+          case EbtSampler2DArray:  out << "float4 "; break;
+          case EbtISampler2D:      out << "int4 ";   break;
+          case EbtISampler3D:      out << "int4 ";   break;
+          case EbtISamplerCube:    out << "int4 ";   break;
+          case EbtISampler2DArray: out << "int4 ";   break;
+          case EbtUSampler2D:      out << "uint4 ";  break;
+          case EbtUSampler3D:      out << "uint4 ";  break;
+          case EbtUSamplerCube:    out << "uint4 ";  break;
+          case EbtUSampler2DArray: out << "uint4 ";  break;
           default: UNREACHABLE();
         }
 
@@ -820,15 +826,18 @@
         {
             switch(textureFunction->sampler)
             {
-              case EbtSampler2D:    out << "Texture2D x, SamplerState s";          hlslCoords = 2; break;
-              case EbtSampler3D:    out << "Texture3D x, SamplerState s";          hlslCoords = 3; break;
-              case EbtSamplerCube:  out << "TextureCube x, SamplerState s";        hlslCoords = 3; break;
-              case EbtISampler2D:   out << "Texture2D<int4> x, SamplerState s";    hlslCoords = 2; break;
-              case EbtISampler3D:   out << "Texture3D<int4> x, SamplerState s";    hlslCoords = 3; break;
-              case EbtISamplerCube: out << "TextureCube<int4> x, SamplerState s";  hlslCoords = 3; break;
-              case EbtUSampler2D:   out << "Texture2D<uint4> x, SamplerState s";   hlslCoords = 2; break;
-              case EbtUSampler3D:   out << "Texture3D<uint4> x, SamplerState s";   hlslCoords = 3; break;
-              case EbtUSamplerCube: out << "TextureCube<uint4> x, SamplerState s"; hlslCoords = 3; break;
+              case EbtSampler2D:       out << "Texture2D x, SamplerState s";             hlslCoords = 2; break;
+              case EbtSampler3D:       out << "Texture3D x, SamplerState s";             hlslCoords = 3; break;
+              case EbtSamplerCube:     out << "TextureCube x, SamplerState s";           hlslCoords = 3; break;
+              case EbtSampler2DArray:  out << "Texture2DArray x, SamplerState s";        hlslCoords = 2; break;
+              case EbtISampler2D:      out << "Texture2D<int4> x, SamplerState s";       hlslCoords = 2; break;
+              case EbtISampler3D:      out << "Texture3D<int4> x, SamplerState s";       hlslCoords = 3; break;
+              case EbtISamplerCube:    out << "TextureCube<int4> x, SamplerState s";     hlslCoords = 3; break;
+              case EbtISampler2DArray: out << "Texture2DArray<int4> x, SamplerState s";  hlslCoords = 2; break;
+              case EbtUSampler2D:      out << "Texture2D<uint4> x, SamplerState s";      hlslCoords = 2; break;
+              case EbtUSampler3D:      out << "Texture3D<uint4> x, SamplerState s";      hlslCoords = 3; break;
+              case EbtUSamplerCube:    out << "TextureCube<uint4> x, SamplerState s";    hlslCoords = 3; break;
+              case EbtUSampler2DArray: out << "Texture2DArray<uint4> x, SamplerState s"; hlslCoords = 2; break;
               default: UNREACHABLE();
             }
         }
@@ -2823,6 +2832,9 @@
           case EbtSampler2D:
           case EbtISampler2D:
           case EbtUSampler2D:
+          case EbtSampler2DArray:
+          case EbtISampler2DArray:
+          case EbtUSampler2DArray:
             return "sampler2D";
           case EbtSamplerCube:
           case EbtISamplerCube:
@@ -2843,20 +2855,16 @@
 {
     switch (type.getBasicType())
     {
-      case EbtSampler2D:
-        return "Texture2D";
-      case EbtSamplerCube:
-        return "TextureCube";
-      case EbtSamplerExternalOES:
-        return "Texture2D";
-      case EbtISampler2D:
-        return "Texture2D<int4>";
-      case EbtISamplerCube:
-        return "TextureCube<int4>";
-      case EbtUSampler2D:
-        return "Texture2D<uint4>";
-      case EbtUSamplerCube:
-        return "TextureCube<uint4>";
+      case EbtSampler2D:          return "Texture2D";
+      case EbtSamplerCube:        return "TextureCube";
+      case EbtSamplerExternalOES: return "Texture2D";
+      case EbtSampler2DArray:     return "Texture2DArray";
+      case EbtISampler2D:         return "Texture2D<int4>";
+      case EbtISamplerCube:       return "TextureCube<int4>";
+      case EbtISampler2DArray:    return "Texture2DArray<int4>";
+      case EbtUSampler2D:         return "Texture2D<uint4>";
+      case EbtUSamplerCube:       return "TextureCube<uint4>";
+      case EbtUSampler2DArray:    return "Texture2DArray<uint4>";
       default:
         break;
     }
@@ -3476,6 +3484,10 @@
     {
         return GL_SAMPLER_CUBE;
     }
+    else if (type.getBasicType() == EbtSampler2DArray)
+    {
+        return GL_SAMPLER_2D_ARRAY;
+    }
     else if (type.getBasicType() == EbtISampler2D)
     {
         return GL_INT_SAMPLER_2D;
@@ -3488,6 +3500,10 @@
     {
         return GL_INT_SAMPLER_CUBE;
     }
+    else if (type.getBasicType() == EbtISampler2DArray)
+    {
+        return GL_INT_SAMPLER_2D_ARRAY;
+    }
     else if (type.getBasicType() == EbtUSampler2D)
     {
         return GL_UNSIGNED_INT_SAMPLER_2D;
@@ -3500,6 +3516,10 @@
     {
         return GL_UNSIGNED_INT_SAMPLER_CUBE;
     }
+    else if (type.getBasicType() == EbtUSampler2DArray)
+    {
+        return GL_UNSIGNED_INT_SAMPLER_2D_ARRAY;
+    }
     else UNREACHABLE();
 
     return GL_NONE;