Wrap integer textures with correct wrap mode in HLSL
The wrap mode information for all three dimensions is packed to a
single integer in order to conserve sampler metadata space. Only one
int4 vector is used for the metadata for a single sampler.
The sampler metadata is now packed into a struct instead of an array
of integers in order to make the code more readable and maintainable.
The internalFormatBits field is not removed in this patch. It's better
to remove it in a separate patch, so restoring it is easier in case it
will be used for optimizing some of the texture sampling functions.
The wrap mode passed in sampler metadata is used to wrap the texture
coordinates in the code generated to implement ESSL 3.00 integer
texture sampling built-ins.
Those dEQP-GLES3.functional.texture.units.* tests that sample from
integer cube maps still fail on Intel D3D after this change,
presumably due to driver issues.
BUG=angleproject:1244
BUG=angleproject:1095
BUG=angleproject:1092
TEST=dEQP-GLES3.functional.texture.units.* (all pass on NVIDIA),
dEQP-GLES3.functional.shaders.texture_functions.* (no regressions)
Change-Id: I4e31e5796086f9cc290c6f1f8c4380a768758d71
Reviewed-on: https://chromium-review.googlesource.com/336638
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/compiler/translator/OutputHLSL.cpp b/src/compiler/translator/OutputHLSL.cpp
index a5c9d2a..225f154 100644
--- a/src/compiler/translator/OutputHLSL.cpp
+++ b/src/compiler/translator/OutputHLSL.cpp
@@ -74,6 +74,42 @@
return constUnionIterated;
}
+void OutputIntTexCoordWrap(TInfoSinkBase &out,
+ const char *wrapMode,
+ const char *size,
+ const TString &texCoord,
+ const TString &texCoordOffset,
+ const char *texCoordOutName)
+{
+ // GLES 3.0.4 table 3.22 specifies how the wrap modes work. We don't use the formulas verbatim
+ // but rather use equivalent formulas that map better to HLSL.
+ out << "int " << texCoordOutName << ";\n";
+ out << "float " << texCoordOutName << "Offset = " << texCoord << " + float(" << texCoordOffset
+ << ") / " << size << ";\n";
+
+ // CLAMP_TO_EDGE
+ out << "if (" << wrapMode << " == 1)\n";
+ out << "{\n";
+ out << " " << texCoordOutName << " = clamp(int(floor(" << size << " * " << texCoordOutName
+ << "Offset)), 0, int(" << size << ") - 1);\n";
+ out << "}\n";
+
+ // MIRRORED_REPEAT
+ out << "else if (" << wrapMode << " == 3)\n";
+ out << "{\n";
+ out << " float coordWrapped = 1.0 - abs(frac(abs(" << texCoordOutName
+ << "Offset) * 0.5) * 2.0 - 1.0);\n";
+ out << " " << texCoordOutName << " = int(floor(" << size << " * coordWrapped));\n";
+ out << "}\n";
+
+ // REPEAT
+ out << "else\n";
+ out << "{\n";
+ out << " " << texCoordOutName << " = int(floor(" << size << " * frac(" << texCoordOutName
+ << "Offset)));\n";
+ out << "}\n";
+}
+
} // namespace
namespace sh
@@ -864,7 +900,7 @@
if (textureFunction->method == TextureFunction::SIZE)
{
- out << "int baseLevel = samplerMetadata[samplerIndex].x;\n";
+ out << "int baseLevel = samplerMetadata[samplerIndex].baseLevel;\n";
if (IsSampler2D(textureFunction->sampler) || IsSamplerCube(textureFunction->sampler))
{
if (IsSamplerArray(textureFunction->sampler) ||
@@ -1169,8 +1205,26 @@
else UNREACHABLE();
// Convert from normalized floating-point to integer
- texCoordX = "int(floor(width * frac(" + texCoordX + ")))";
- texCoordY = "int(floor(height * frac(" + texCoordY + ")))";
+ out << "int wrapS = samplerMetadata[samplerIndex].wrapModes & 0x3;\n";
+ if (textureFunction->offset)
+ {
+ OutputIntTexCoordWrap(out, "wrapS", "width", texCoordX, "offset.x", "tix");
+ }
+ else
+ {
+ OutputIntTexCoordWrap(out, "wrapS", "width", texCoordX, "0", "tix");
+ }
+ texCoordX = "tix";
+ out << "int wrapT = (samplerMetadata[samplerIndex].wrapModes >> 2) & 0x3;\n";
+ if (textureFunction->offset)
+ {
+ OutputIntTexCoordWrap(out, "wrapT", "height", texCoordY, "offset.y", "tiy");
+ }
+ else
+ {
+ OutputIntTexCoordWrap(out, "wrapT", "height", texCoordY, "0", "tiy");
+ }
+ texCoordY = "tiy";
if (IsSamplerArray(textureFunction->sampler))
{
@@ -1179,7 +1233,16 @@
else if (!IsSamplerCube(textureFunction->sampler) &&
!IsSampler2D(textureFunction->sampler))
{
- texCoordZ = "int(floor(depth * frac(" + texCoordZ + ")))";
+ out << "int wrapR = (samplerMetadata[samplerIndex].wrapModes >> 4) & 0x3;\n";
+ if (textureFunction->offset)
+ {
+ OutputIntTexCoordWrap(out, "wrapR", "depth", texCoordZ, "offset.z", "tiz");
+ }
+ else
+ {
+ OutputIntTexCoordWrap(out, "wrapR", "depth", texCoordZ, "0", "tiz");
+ }
+ texCoordZ = "tiz";
}
}
@@ -1421,7 +1484,8 @@
}
}
- if (textureFunction->offset)
+ if (textureFunction->offset && (!IsIntegerSampler(textureFunction->sampler) ||
+ textureFunction->method == TextureFunction::FETCH))
{
out << ", offset";
}
diff --git a/src/compiler/translator/UniformHLSL.cpp b/src/compiler/translator/UniformHLSL.cpp
index 37e4def..24d7760 100644
--- a/src/compiler/translator/UniformHLSL.cpp
+++ b/src/compiler/translator/UniformHLSL.cpp
@@ -337,8 +337,15 @@
// If mSamplerRegister is 0 the shader doesn't use any textures.
if (mSamplerRegister > 0)
{
- out << " int4 samplerMetadata[" << mSamplerRegister << "] : packoffset(" << reg
- << ");\n";
+ out << " struct SamplerMetadata\n"
+ " {\n"
+ " int baseLevel;\n"
+ " int internalFormatBits;\n"
+ " int wrapModes;\n"
+ " int padding;\n"
+ " };\n"
+ " SamplerMetadata samplerMetadata["
+ << mSamplerRegister << "] : packoffset(" << reg << ");\n";
}
}
diff --git a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
index 424aa27..26326e5 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
@@ -362,6 +362,22 @@
}
}
+int GetWrapBits(GLenum wrap)
+{
+ switch (wrap)
+ {
+ case GL_CLAMP_TO_EDGE:
+ return 0x1;
+ case GL_REPEAT:
+ return 0x2;
+ case GL_MIRRORED_REPEAT:
+ return 0x3;
+ default:
+ UNREACHABLE();
+ return 0;
+ }
+}
+
} // anonymous namespace
Renderer11::Renderer11(egl::Display *display)
@@ -1213,8 +1229,7 @@
else UNREACHABLE();
ASSERT(metadata != nullptr);
- metadata->update(index, texture->getBaseLevel(),
- texture->getInternalFormat(texture->getTarget(), texture->getBaseLevel()));
+ metadata->update(index, *texture);
return gl::Error(GL_NO_ERROR);
}
@@ -2354,21 +2369,21 @@
mSamplerMetadata.resize(samplerCount);
}
-void Renderer11::SamplerMetadataD3D11::update(unsigned int samplerIndex,
- unsigned int baseLevel,
- GLenum internalFormat)
+void Renderer11::SamplerMetadataD3D11::update(unsigned int samplerIndex, const gl::Texture &texture)
{
- if (mSamplerMetadata[samplerIndex].parameters[0] != static_cast<int>(baseLevel))
+ unsigned int baseLevel = texture.getBaseLevel();
+ GLenum internalFormat = texture.getInternalFormat(texture.getTarget(), texture.getBaseLevel());
+ if (mSamplerMetadata[samplerIndex].baseLevel != static_cast<int>(baseLevel))
{
- mSamplerMetadata[samplerIndex].parameters[0] = static_cast<int>(baseLevel);
- mDirty = true;
+ mSamplerMetadata[samplerIndex].baseLevel = static_cast<int>(baseLevel);
+ mDirty = true;
}
- // internalFormatBits == 0 means a 32-bit texture in the case of integer textures. In the case
- // of non-integer textures, internalFormatBits is meaningless. We avoid updating the constant
- // buffer unnecessarily by changing the data only in case the texture is an integer texture and
- // the value has changed.
- bool needInternalFormatBits = false;
+ // Some metadata is needed only for integer textures. We avoid updating the constant buffer
+ // unnecessarily by changing the data only in case the texture is an integer texture and
+ // the values have changed.
+ bool needIntegerTextureMetadata = false;
+ // internalFormatBits == 0 means a 32-bit texture in the case of integer textures.
int internalFormatBits = 0;
switch (internalFormat)
{
@@ -2380,7 +2395,7 @@
case GL_RG32UI:
case GL_R32I:
case GL_R32UI:
- needInternalFormatBits = true;
+ needIntegerTextureMetadata = true;
break;
case GL_RGBA16I:
case GL_RGBA16UI:
@@ -2390,7 +2405,7 @@
case GL_RG16UI:
case GL_R16I:
case GL_R16UI:
- needInternalFormatBits = true;
+ needIntegerTextureMetadata = true;
internalFormatBits = 16;
break;
case GL_RGBA8I:
@@ -2401,21 +2416,34 @@
case GL_RG8UI:
case GL_R8I:
case GL_R8UI:
- needInternalFormatBits = true;
+ needIntegerTextureMetadata = true;
internalFormatBits = 8;
break;
case GL_RGB10_A2UI:
- needInternalFormatBits = true;
+ needIntegerTextureMetadata = true;
internalFormatBits = 10;
break;
default:
break;
}
- if (needInternalFormatBits &&
- mSamplerMetadata[samplerIndex].parameters[1] != internalFormatBits)
+ if (needIntegerTextureMetadata)
{
- mSamplerMetadata[samplerIndex].parameters[1] = internalFormatBits;
- mDirty = true;
+ if (mSamplerMetadata[samplerIndex].internalFormatBits != internalFormatBits)
+ {
+ mSamplerMetadata[samplerIndex].internalFormatBits = internalFormatBits;
+ mDirty = true;
+ }
+ // Pack the wrap values into one integer so we can fit all the metadata in one 4-integer
+ // vector.
+ GLenum wrapS = texture.getWrapS();
+ GLenum wrapT = texture.getWrapT();
+ GLenum wrapR = texture.getWrapR();
+ int wrapModes = GetWrapBits(wrapS) | (GetWrapBits(wrapT) << 2) | (GetWrapBits(wrapR) << 4);
+ if (mSamplerMetadata[samplerIndex].wrapModes != wrapModes)
+ {
+ mSamplerMetadata[samplerIndex].wrapModes = wrapModes;
+ mDirty = true;
+ }
}
}
diff --git a/src/libANGLE/renderer/d3d/d3d11/Renderer11.h b/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
index a23cc29..fda7118 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
@@ -350,11 +350,16 @@
struct dx_SamplerMetadata
{
- int parameters[4];
+ int baseLevel;
+ int internalFormatBits;
+ int wrapModes;
+ int padding; // This just pads the struct to 16 bytes
};
+ static_assert(sizeof(dx_SamplerMetadata) == 16u,
+ "Sampler metadata struct must be one 4-vec / 16 bytes.");
void initData(unsigned int samplerCount);
- void update(unsigned int samplerIndex, unsigned int baseLevel, GLenum internalFormat);
+ void update(unsigned int samplerIndex, const gl::Texture &texture);
const dx_SamplerMetadata *getData() const;
size_t sizeBytes() const;
diff --git a/src/tests/deqp_support/deqp_gles3_test_expectations.txt b/src/tests/deqp_support/deqp_gles3_test_expectations.txt
index c114f36..219590a 100644
--- a/src/tests/deqp_support/deqp_gles3_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_gles3_test_expectations.txt
@@ -98,76 +98,27 @@
1091 WIN : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.nested_tricky_dataflow_1_fragment = FAIL
1091 WIN : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.nested_tricky_dataflow_2_vertex = FAIL
1091 WIN : dEQP-GLES3.functional.shaders.loops.do_while_constant_iterations.nested_tricky_dataflow_2_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureoffset.isampler* = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureoffset.usampler* = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureoffset.sampler3d_fixed_fragment = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureoffset.sampler3d_float_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojoffset.isampler* = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojoffset.usampler* = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojoffset.sampler3d_fixed_fragment = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojoffset.sampler3d_float_fragment = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelod.sampler2dshadow_* = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.isampler2d_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.isampler2d_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.usampler2d_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.usampler2d_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.isampler2darray_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.isampler2darray_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.usampler2darray_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.isampler3d_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.isampler3d_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.usampler3d_fragment = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.sampler2dshadow_vertex = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturelodoffset.sampler2dshadow_fragment = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlod.sampler2dshadow_vertex = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlod.sampler2dshadow_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.isampler2d_vec3_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.isampler2d_vec3_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.usampler2d_vec3_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.usampler2d_vec3_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.isampler2d_vec4_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.isampler2d_vec4_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.usampler2d_vec4_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.usampler2d_vec4_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.isampler3d_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.usampler3d_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.usampler3d_fragment = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.sampler2dshadow_vertex = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojlodoffset.sampler2dshadow_fragment = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2dshadow_vertex = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2dshadow_fragment = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2darrayshadow_vertex = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.sampler2darrayshadow_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.isampler2d_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.isampler2d_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.usampler2d_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.usampler2d_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.isampler2darray_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.isampler2darray_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.usampler2darray_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.usampler2darray_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.isampler3d_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.isampler3d_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.usampler3d_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.usampler3d_fragment = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.sampler2dshadow_vertex = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.sampler2dshadow_fragment = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.sampler2darrayshadow_vertex = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturegradoffset.sampler2darrayshadow_fragment = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler2dshadow_vertex = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgrad.sampler2dshadow_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.isampler2d_vec3_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.isampler2d_vec3_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.usampler2d_vec3_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.usampler2d_vec3_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.isampler2d_vec4_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.isampler2d_vec4_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.usampler2d_vec4_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.usampler2d_vec4_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.isampler3d_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.isampler3d_fragment = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.usampler3d_vertex = FAIL
-1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.usampler3d_fragment = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.sampler2dshadow_vertex = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.textureprojgradoffset.sampler2dshadow_fragment = FAIL
1092 WIN : dEQP-GLES3.functional.shaders.texture_functions.texturesize.sampler2d_fixed_vertex = FAIL
@@ -237,69 +188,6 @@
1095 WIN : dEQP-GLES3.functional.texture.specification.teximage3d_depth_pbo.depth_component24_2d_array = FAIL
1095 WIN : dEQP-GLES3.functional.texture.specification.texsubimage3d_depth.depth_component32f_2d_array = FAIL
1095 WIN : dEQP-GLES3.functional.texture.specification.texsubimage3d_depth.depth32f_stencil8_2d_array = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_2d.3 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_2d.5 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_2d.7 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_2d.8 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_2d_array.3 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_2d_array.4 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_2d_array.5 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_2d_array.7 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_2d_array.8 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_3d.3 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_3d.4 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_3d.5 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_3d.7 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_3d.8 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.only_3d.9 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.mixed.1 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.mixed.2 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.2_units.mixed.9 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d.0 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d.1 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d.3 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d.5 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d.6 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d.7 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d.8 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d.9 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d_array.0 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d_array.1 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d_array.3 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d_array.5 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d_array.6 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d_array.7 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d_array.8 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_2d_array.9 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_3d.0 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_3d.1 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_3d.3 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_3d.5 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_3d.6 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_3d.7 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_3d.8 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.only_3d.9 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.mixed.0 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.mixed.1 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.mixed.2 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.mixed.3 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.mixed.6 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.4_units.mixed.9 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.8_units.only_2d.1 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.8_units.only_2d.2 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.8_units.only_2d.3 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.8_units.only_2d.4 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.8_units.only_2d.5 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.8_units.only_2d.6 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.8_units.only_2d.8 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.8_units.only_2d.9 = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.8_units.only_2d_array.* = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.8_units.only_3d.* = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.8_units.mixed.* = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.all_units.only_2d.* = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.all_units.only_2d_array.* = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.all_units.only_3d.* = FAIL
-1095 WIN : dEQP-GLES3.functional.texture.units.all_units.mixed.* = FAIL
1096 WIN : dEQP-GLES3.functional.fragment_ops.depth_stencil.stencil_depth_funcs.stencil_* = FAIL
1096 WIN : dEQP-GLES3.functional.fragment_ops.depth_stencil.stencil_ops.* = FAIL
1096 WIN : dEQP-GLES3.functional.fragment_ops.depth_stencil.write_mask.* = FAIL
@@ -413,6 +301,34 @@
1349 WIN INTEL : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.isamplercube_vertex = FAIL
1349 WIN INTEL : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.usamplercube_vertex = FAIL
1349 WIN INTEL : dEQP-GLES3.functional.shaders.texture_functions.texturegrad.usamplercube_fragment = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.2_units.only_cube.0 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.2_units.only_cube.2 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.2_units.only_cube.4 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.2_units.only_cube.7 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.2_units.only_cube.8 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.2_units.mixed.4 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.only_cube.0 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.only_cube.1 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.only_cube.2 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.only_cube.6 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.only_cube.7 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.only_cube.8 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.only_cube.9 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.mixed.4 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.mixed.6 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.4_units.mixed.7 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.8_units.only_cube.* = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.8_units.mixed.2 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.8_units.mixed.3 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.8_units.mixed.4 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.8_units.mixed.6 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.8_units.mixed.7 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.all_units.only_cube.* = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.all_units.mixed.2 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.all_units.mixed.3 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.all_units.mixed.4 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.all_units.mixed.6 = FAIL
+1349 WIN INTEL : dEQP-GLES3.functional.texture.units.all_units.mixed.7 = FAIL
// Linux only failures