Implemented 3D sampler HLSL translation.

TRAC #23365
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 38df101..d8c6912 100644
--- a/src/compiler/OutputHLSL.cpp
+++ b/src/compiler/OutputHLSL.cpp
@@ -41,6 +41,12 @@
     mUsesTexture2DProj_bias = false;
     mUsesTexture2DProjLod = false;
     mUsesTexture2DLod = false;
+    mUsesTexture3D = false;
+    mUsesTexture3D_bias = false;
+    mUsesTexture3DProj = false;
+    mUsesTexture3DProj_bias = false;
+    mUsesTexture3DProjLod = false;
+    mUsesTexture3DLod = false;
     mUsesTextureCube = false;
     mUsesTextureCube_bias = false;
     mUsesTextureCubeLod = false;
@@ -48,6 +54,10 @@
     mUsesTexture2DLod0_bias = false;
     mUsesTexture2DProjLod0 = false;
     mUsesTexture2DProjLod0_bias = false;
+    mUsesTexture3DLod0 = false;
+    mUsesTexture3DLod0_bias = false;
+    mUsesTexture3DProjLod0 = false;
+    mUsesTexture3DProjLod0_bias = false;
     mUsesTextureCubeLod0 = false;
     mUsesTextureCubeLod0_bias = false;
     mUsesFragColor = false;
@@ -823,6 +833,98 @@
             else UNREACHABLE();
         }
 
+        if (mUsesTexture3D)
+        {
+            if (mOutputType == SH_HLSL11_OUTPUT)
+            {
+                out << "float4 gl_texture3D(Texture3D t, SamplerState s, float3 uvw)\n"
+                       "{\n"
+                       "    return t.Sample(s, uvw);\n"
+                       "}\n"
+                       "\n"
+                       "int4 gl_texture3D(Texture3D<int4> t, SamplerState s, float3 uvw)\n"
+                       "{\n"
+                       "    return t.Sample(s, uvw);\n"
+                       "}\n"
+                       "\n"
+                       "uint4 gl_texture3D(Texture3D<uint4> t, SamplerState s, float3 uvw)\n"
+                       "{\n"
+                       "    return t.Sample(s, uvw);\n"
+                       "}\n"
+                       "\n";
+            }
+            else UNREACHABLE();
+        }
+
+        if (mUsesTexture3D_bias)
+        {
+            if (mOutputType == SH_HLSL11_OUTPUT)
+            {
+                out << "float4 gl_texture3D(Texture3D t, SamplerState s, float3 uvw, float bias)\n"
+                       "{\n"
+                       "    return t.SampleBias(s, uvw, bias);\n"
+                       "}\n"
+                       "\n"
+                       "int4 gl_texture3D(Texture3D<int4> t, SamplerState s, float3 uvw, float bias)\n"
+                       "{\n"
+                       "    return t.SampleBias(s, uvw, bias);\n"
+                       "}\n"
+                       "\n"
+                       "uint4 gl_texture3D(Texture3D<uint4> t, SamplerState s, float3 uvw, float bias)\n"
+                       "{\n"
+                       "    return t.SampleBias(s, uvw, bias);\n"
+                       "}\n"
+                       "\n";
+            }
+            else UNREACHABLE();
+        }
+
+        if (mUsesTexture3DProj)
+        {
+            if (mOutputType == SH_HLSL11_OUTPUT)
+            {
+                out << "float4 gl_texture3DProj(Texture3D t, SamplerState s, float4 uvw)\n"
+                       "{\n"
+                       "    return t.Sample(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w));\n"
+                       "}\n"
+                       "\n"
+                       "int4 gl_texture3DProj(Texture3D<int4> t, SamplerState s, float4 uvw)\n"
+                       "{\n"
+                       "    return t.Sample(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w));\n"
+                       "}\n"
+                       "\n"
+                       "uint4 gl_texture3DProj(Texture3D<uint4> t, SamplerState s, float4 uvw)\n"
+                       "{\n"
+                       "    return t.Sample(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w));\n"
+                       "}\n"
+                       "\n";
+            }
+            else UNREACHABLE();
+        }
+
+        if (mUsesTexture3DProj_bias)
+        {
+            if (mOutputType == SH_HLSL11_OUTPUT)
+            {
+                out << "float4 gl_texture3DProj(Texture3D t, SamplerState s, float4 uvw, float bias)\n"
+                       "{\n"
+                       "    return t.SampleBias(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), bias);\n"
+                       "}\n"
+                       "\n"
+                       "int4 gl_texture3DProj(Texture3D<int4> t, SamplerState s, float4 uvw, float bias)\n"
+                       "{\n"
+                       "    return t.SampleBias(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), bias);\n"
+                       "}\n"
+                       "\n"
+                       "uint4 gl_texture3DProj(Texture3D<uint4> t, SamplerState s, float4 uvw, float bias)\n"
+                       "{\n"
+                       "    return t.SampleBias(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), bias);\n"
+                       "}\n"
+                       "\n";
+            }
+            else UNREACHABLE();
+        }
+
         if (mUsesTextureCube)
         {
             if (mOutputType == SH_HLSL9_OUTPUT)
@@ -1051,6 +1153,99 @@
             else UNREACHABLE();
         }
 
+        if (mUsesTexture3DLod0)
+        {
+            if (mOutputType == SH_HLSL11_OUTPUT)
+            {
+                out << "float4 gl_texture3DLod0(Texture3D t, SamplerState s, float3 uvw)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, uvw, 0);\n"
+                       "}\n"
+                       "\n"
+                       "int4 gl_texture3DLod0(Texture3D<int4> t, SamplerState s, float3 uvw)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, uvw, 0);\n"
+                       "}\n"
+                       "\n"
+                       "uint4 gl_texture3DLod0(Texture3D<uint4> t, SamplerState s, float3 uvw)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, uvw, 0);\n"
+                       "}\n"
+                       "\n";
+            }
+            else UNREACHABLE();
+        }
+
+        if (mUsesTexture3DLod0_bias)
+        {
+            if (mOutputType == SH_HLSL11_OUTPUT)
+            {
+                out << "float4 gl_texture3DLod0(Texture3D t, SamplerState s, float3 uvw, float bias)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, uvw, 0);\n"
+                       "}\n"
+                       "\n"
+                       "int4 gl_texture3DLod0(Texture3D<int4> t, SamplerState s, float3 uvw, float bias)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, uvw, 0);\n"
+                       "}\n"
+                       "\n"
+                       "uint4 gl_texture3DLod0(Texture3D<uint4> t, SamplerState s, float3 uvw, float bias)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, uvw, 0);\n"
+                       "}\n"
+                       "\n";
+            }
+            else UNREACHABLE();
+        }
+
+        if (mUsesTexture3DProjLod0)
+        {
+            if (mOutputType == SH_HLSL11_OUTPUT)
+            {
+                out << "float4 gl_texture3DProjLod0(Texture3D t, SamplerState s, float4 uvw)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), 0);\n"
+                       "}\n"
+                       "\n"
+                       "int4 gl_texture3DProjLod0(Texture3D<int4> t, SamplerState s, float4 uvw)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), 0);\n"
+                       "}\n"
+                       "\n"
+                       "uint4 gl_texture3DProjLod0(Texture3D<uint4> t, SamplerState s, float4 uvw)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), 0);\n"
+                       "}\n"
+                       "\n";
+            }
+            else UNREACHABLE();
+        }
+
+        if (mUsesTexture3DProjLod0_bias)
+        {
+            if (mOutputType == SH_HLSL11_OUTPUT)
+            {
+                out << "float4 gl_texture3DProjLod_bias(Texture3D t, SamplerState s, float4 uvw, float bias)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), 0);\n"
+                       "}\n"
+                       "\n"
+                       "int4 gl_texture3DProjLod_bias(Texture3D<int4> t, SamplerState s, float4 uvw, float bias)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), 0);\n"
+                       "}\n"
+                       "\n"
+                       "\n"
+                       "uint4 gl_texture3DProjLod_bias(Texture3D<uint4> t, SamplerState s, float4 uvw, float bias)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), 0);\n"
+                       "}\n"
+                       "\n";
+            }
+            else UNREACHABLE();
+        }
+
         if (mUsesTextureCubeLod0)
         {
             if (mOutputType == SH_HLSL9_OUTPUT)
@@ -1357,6 +1552,88 @@
             else UNREACHABLE();
         }
 
+        if (mUsesTexture3D)
+        {
+            if (mOutputType == SH_HLSL11_OUTPUT)
+            {
+                out << "float4 gl_texture3D(Texture3D t, SamplerState s, float3 uvw)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, uvw, 0);\n"
+                       "}\n"
+                       "\n"
+                       "int4 gl_texture3D(Texture3D<int> t, SamplerState s, float3 uvw)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, uvw, 0);\n"
+                       "}\n"
+                       "\n";
+            }
+            else UNREACHABLE();
+        }
+
+        if (mUsesTexture3DLod)
+        {
+            if (mOutputType == SH_HLSL11_OUTPUT)
+            {
+                out << "float4 gl_texture3DLod(Texture3D t, SamplerState s, float3 uvw, float lod)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, uvw, lod);\n"
+                       "}\n"
+                       "\n"
+                       "int4 gl_texture3DLod(Texture3D<int> t, SamplerState s, float3 uvw, float lod)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, uvw, lod);\n"
+                       "}\n"
+                       "\n";
+            }
+            else UNREACHABLE();
+        }
+
+        if (mUsesTexture3DProj)
+        {
+            if (mOutputType == SH_HLSL11_OUTPUT)
+            {
+                out << "float4 gl_texture3DProj(Texture3D t, SamplerState s, float4 uvw)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), 0);\n"
+                       "}\n"
+                       "\n"
+                       "int4 gl_texture3DProj(Texture3D<int4> t, SamplerState s, float4 uvw)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), 0);\n"
+                       "}\n"
+                       "\n"
+                       "uint4 gl_texture3DProj(Texture3D<uint4> t, SamplerState s, float4 uvw)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), 0);\n"
+                       "}\n"
+                       "\n";
+            }
+            else UNREACHABLE();
+        }
+
+        if (mUsesTexture3DProjLod)
+        {
+            if (mOutputType == SH_HLSL11_OUTPUT)
+            {
+                out << "float4 gl_texture3DProj(Texture3D t, SamplerState s, float4 uvw, float lod)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), lod);\n"
+                       "}\n"
+                       "\n"
+                       "int4 gl_texture3DProj(Texture3D<int4> t, SamplerState s, float4 uvw, float lod)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), lod);\n"
+                       "}\n"
+                       "\n"
+                       "uint4 gl_texture3DProj(Texture3D<uint4> t, SamplerState s, float4 uvw, float lod)\n"
+                       "{\n"
+                       "    return t.SampleLevel(s, float3(uvw.x / uvw.w, uvw.y / uvw.w, uvw.z / uvw.w), lod);\n"
+                       "}\n"
+                       "\n";
+            }
+            else UNREACHABLE();
+        }
+
         if (mUsesTextureCube)
         {
             if (mOutputType == SH_HLSL9_OUTPUT)
@@ -2548,6 +2825,68 @@
                         out << "gl_texture2DProjLod0(";
                     }
                 }
+                else if (name == "texture" && (samplerType == EbtSampler3D || samplerType == EbtISampler3D || samplerType == EbtUSampler3D))
+                {
+                    if (!lod0)
+                    {
+                        if (arguments.size() == 2)
+                        {
+                            mUsesTexture3D = true;
+                        }
+                        else if (arguments.size() == 3)
+                        {
+                            mUsesTexture3D_bias = true;
+                        }
+                        else UNREACHABLE();
+
+                        out << "gl_texture3D(";
+                    }
+                    else
+                    {
+                        if (arguments.size() == 2)
+                        {
+                            mUsesTexture3DLod0 = true;
+                        }
+                        else if (arguments.size() == 3)
+                        {
+                            mUsesTexture3DLod0_bias = true;
+                        }
+                        else UNREACHABLE();
+
+                        out << "gl_texture3DLod0(";
+                    }
+                }
+                else if (name == "textureProj" && (samplerType == EbtSampler3D || samplerType == EbtISampler3D || samplerType == EbtUSampler3D))
+                {
+                    if (!lod0)
+                    {
+                        if (arguments.size() == 2)
+                        {
+                            mUsesTexture3DProj = true;
+                        }
+                        else if (arguments.size() == 3)
+                        {
+                            mUsesTexture3DProj_bias = true;
+                        }
+                        else UNREACHABLE();
+
+                        out << "gl_texture3DProj(";
+                    }
+                    else
+                    {
+                        if (arguments.size() == 2)
+                        {
+                            mUsesTexture3DProjLod0 = true;
+                        }
+                        else if (arguments.size() == 3)
+                        {
+                            mUsesTexture3DProjLod0_bias = true;
+                        }
+                        else UNREACHABLE();
+
+                        out << "gl_texture3DProjLod0(";
+                    }
+                }
                 else if (name == "textureCube" ||
                          (name == "texture" && (samplerType == EbtSamplerCube || samplerType == EbtISamplerCube || samplerType == EbtUSamplerCube)))
                 {
@@ -2602,6 +2941,26 @@
 
                     out << "gl_texture2DProjLod(";
                 }
+                else if (name == "textureLod" && (samplerType == EbtSampler3D || samplerType == EbtISampler3D || samplerType == EbtUSampler3D))
+                {
+                    if (arguments.size() == 3)
+                    {
+                        mUsesTexture3DLod = true;
+                    }
+                    else UNREACHABLE();
+
+                    out << "gl_texture3DLod(";
+                }
+                else if (name == "textureProjLod" && (samplerType == EbtSampler3D || samplerType == EbtISampler3D || samplerType == EbtUSampler3D))
+                {
+                    if (arguments.size() == 3)
+                    {
+                        mUsesTexture3DProjLod = true;
+                    }
+                    else UNREACHABLE();
+
+                    out << "gl_texture3DProjLod(";
+                }
                 else if (name == "textureCubeLod" ||
                          (name == "textureLod" && (samplerType == EbtSamplerCube || samplerType == EbtISamplerCube || samplerType == EbtUSamplerCube)))
                 {
@@ -4010,6 +4369,10 @@
     {
         return GL_SAMPLER_2D;
     }
+    else if (type.getBasicType() == EbtSampler3D)
+    {
+        return GL_SAMPLER_3D;
+    }
     else if (type.getBasicType() == EbtSamplerCube)
     {
         return GL_SAMPLER_CUBE;
@@ -4018,6 +4381,10 @@
     {
         return GL_INT_SAMPLER_2D;
     }
+    else if (type.getBasicType() == EbtISampler3D)
+    {
+        return GL_INT_SAMPLER_3D;
+    }
     else if (type.getBasicType() == EbtISamplerCube)
     {
         return GL_INT_SAMPLER_CUBE;
@@ -4026,6 +4393,10 @@
     {
         return GL_UNSIGNED_INT_SAMPLER_2D;
     }
+    else if (type.getBasicType() == EbtUSampler3D)
+    {
+        return GL_UNSIGNED_INT_SAMPLER_3D;
+    }
     else if (type.getBasicType() == EbtUSamplerCube)
     {
         return GL_UNSIGNED_INT_SAMPLER_CUBE;
diff --git a/src/compiler/OutputHLSL.h b/src/compiler/OutputHLSL.h
index 2b7bce3..6607357 100644
--- a/src/compiler/OutputHLSL.h
+++ b/src/compiler/OutputHLSL.h
@@ -101,6 +101,12 @@
     bool mUsesTexture2DProj;
     bool mUsesTexture2DProj_bias;
     bool mUsesTexture2DProjLod;
+    bool mUsesTexture3D;
+    bool mUsesTexture3D_bias;
+    bool mUsesTexture3DLod;
+    bool mUsesTexture3DProj;
+    bool mUsesTexture3DProj_bias;
+    bool mUsesTexture3DProjLod;
     bool mUsesTextureCube;
     bool mUsesTextureCube_bias;
     bool mUsesTextureCubeLod;
@@ -108,6 +114,10 @@
     bool mUsesTexture2DLod0_bias;
     bool mUsesTexture2DProjLod0;
     bool mUsesTexture2DProjLod0_bias;
+    bool mUsesTexture3DLod0;
+    bool mUsesTexture3DLod0_bias;
+    bool mUsesTexture3DProjLod0;
+    bool mUsesTexture3DProjLod0_bias;
     bool mUsesTextureCubeLod0;
     bool mUsesTextureCubeLod0_bias;
     bool mUsesFragColor;