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;