Suppress samplers in structs test failures on Intel OpenGL

Some of the tests made to verify D3D implementation of samplers in
structs are failing on Intel's OpenGL drivers, so suppress the
failures.

Since the test was crashing in shader program setup, shader program
setup needs to be moved out of the SetUp() function of the texture
tests.

BUG=600758
TEST=angle_end2end_tests

Change-Id: I1b6e788d900425e914572d2a3d7ef1fc43146f50
Reviewed-on: https://chromium-review.googlesource.com/337500
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/tests/gl_tests/TextureTest.cpp b/src/tests/gl_tests/TextureTest.cpp
index bed1771..e74519c 100644
--- a/src/tests/gl_tests/TextureTest.cpp
+++ b/src/tests/gl_tests/TextureTest.cpp
@@ -55,15 +55,19 @@
 
     virtual std::string getFragmentShaderSource() = 0;
 
-    void SetUp() override
+    virtual void setUpProgram()
     {
-        ANGLETest::SetUp();
         const std::string vertexShaderSource   = getVertexShaderSource();
         const std::string fragmentShaderSource = getFragmentShaderSource();
 
         mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
         ASSERT_NE(0u, mProgram);
         ASSERT_GL_NO_ERROR();
+    }
+
+    void SetUp() override
+    {
+        ANGLETest::SetUp();
 
         setUpFramebuffer();
     }
@@ -141,15 +145,19 @@
 
     virtual const char *getTextureUniformName() { return "tex"; }
 
+    void setUpProgram() override
+    {
+        TexCoordDrawTest::setUpProgram();
+        mTexture2DUniformLocation = glGetUniformLocation(mProgram, getTextureUniformName());
+        ASSERT_NE(-1, mTexture2DUniformLocation);
+    }
+
     void SetUp() override
     {
         TexCoordDrawTest::SetUp();
         mTexture2D = create2DTexture();
 
         ASSERT_GL_NO_ERROR();
-
-        mTexture2DUniformLocation = glGetUniformLocation(mProgram, getTextureUniformName());
-        ASSERT_NE(-1, mTexture2DUniformLocation);
     }
 
     void TearDown() override
@@ -168,6 +176,8 @@
             return;
         }
 
+        setUpProgram();
+
         if (getClientVersion() < 3)
         {
             if (!extensionEnabled("GL_OES_texture_float"))
@@ -322,6 +332,12 @@
             "    fragColor = texture(tex, texcoord);\n"
             "}\n");
     }
+
+    void SetUp() override
+    {
+        Texture2DTest::SetUp();
+        setUpProgram();
+    }
 };
 
 class Texture2DIntegerAlpha1TestES3 : public Texture2DTest
@@ -357,6 +373,12 @@
             "    fragColor = (texture(tex, texcoord).a == 1) ? green : black;\n"
             "}\n");
     }
+
+    void SetUp() override
+    {
+        Texture2DTest::SetUp();
+        setUpProgram();
+    }
 };
 
 class Texture2DUnsignedIntegerAlpha1TestES3 : public Texture2DTest
@@ -392,6 +414,12 @@
             "    fragColor = (texture(tex, texcoord).a == 1u) ? green : black;\n"
             "}\n");
     }
+
+    void SetUp() override
+    {
+        Texture2DTest::SetUp();
+        setUpProgram();
+    }
 };
 
 class Texture2DTestWithDrawScale : public Texture2DTest
@@ -421,6 +449,9 @@
     void SetUp() override
     {
         Texture2DTest::SetUp();
+
+        setUpProgram();
+
         mDrawScaleUniformLocation = glGetUniformLocation(mProgram, "drawScale");
         ASSERT_NE(-1, mDrawScaleUniformLocation);
 
@@ -458,6 +489,12 @@
         )
         );
     }
+
+    void SetUp() override
+    {
+        Texture2DTest::SetUp();
+        setUpProgram();
+    }
 };
 
 class TextureCubeTest : public TexCoordDrawTest
@@ -501,6 +538,8 @@
 
         mTexture2D = create2DTexture();
 
+        setUpProgram();
+
         mTexture2DUniformLocation = glGetUniformLocation(mProgram, "tex2D");
         ASSERT_NE(-1, mTexture2DUniformLocation);
         mTextureCubeUniformLocation = glGetUniformLocation(mProgram, "texCube");
@@ -551,6 +590,8 @@
     {
         TexCoordDrawTest::SetUp();
 
+        setUpProgram();
+
         mTexture0UniformLocation = glGetUniformLocation(mProgram, "tex2DArray[0]");
         ASSERT_NE(-1, mTexture0UniformLocation);
         mTexture1UniformLocation = glGetUniformLocation(mProgram, "tex2DArray[1]");
@@ -665,6 +706,8 @@
     {
         TexCoordDrawTest::SetUp();
 
+        setUpProgram();
+
         mTextureArrayLocation = glGetUniformLocation(mProgram, "tex2DArray");
         ASSERT_NE(-1, mTextureArrayLocation);
 
@@ -724,6 +767,8 @@
     {
         TexCoordDrawTest::SetUp();
 
+        setUpProgram();
+
         mTexture0Location = glGetUniformLocation(mProgram, "tex2DArray[0]");
         ASSERT_NE(-1, mTexture0Location);
         mTexture1Location = glGetUniformLocation(mProgram, "tex2DArray[1]");
@@ -800,6 +845,8 @@
         glBindTexture(GL_TEXTURE_2D, mTextureShadow);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
 
+        setUpProgram();
+
         mTextureShadowUniformLocation = glGetUniformLocation(mProgram, "tex2DShadow");
         ASSERT_NE(-1, mTextureShadowUniformLocation);
         mTexture3DUniformLocation = glGetUniformLocation(mProgram, "tex3D");
@@ -889,6 +936,8 @@
         glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureCubeShadow);
         glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
 
+        setUpProgram();
+
         mTexture2DUniformLocation = glGetUniformLocation(mProgram, "tex2D");
         ASSERT_NE(-1, mTexture2DUniformLocation);
         mTextureCubeUniformLocation = glGetUniformLocation(mProgram, "texCube");
@@ -949,6 +998,8 @@
 
     void runSamplerInStructTest()
     {
+        setUpProgram();
+
         glActiveTexture(GL_TEXTURE0);
         glBindTexture(GL_TEXTURE_2D, mTexture2D);
         GLubyte texDataGreen[1u * 1u * 4u];
@@ -1074,6 +1125,8 @@
     glBindTexture(GL_TEXTURE_2D, mTexture2D);
     EXPECT_GL_ERROR(GL_NO_ERROR);
 
+    setUpProgram();
+
     const GLubyte *pixels[20] = { 0 };
     glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
     EXPECT_GL_ERROR(GL_INVALID_VALUE);
@@ -1084,6 +1137,8 @@
     glBindTexture(GL_TEXTURE_2D, mTexture2D);
     EXPECT_GL_ERROR(GL_NO_ERROR);
 
+    setUpProgram();
+
     // Use the texture first to make sure it's in video memory
     glUseProgram(mProgram);
     glUniform1i(mTexture2DUniformLocation, 0);
@@ -1272,6 +1327,8 @@
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
+    setUpProgram();
+
     glUseProgram(mProgram);
     glUniform1i(mTexture2DUniformLocation, 0);
     drawQuad(mProgram, "position", 0.5f);
@@ -1324,6 +1381,8 @@
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
+        setUpProgram();
+
         glUseProgram(mProgram);
         glUniform1i(mTexture2DUniformLocation, 0);
         drawQuad(mProgram, "position", 0.5f);
@@ -1442,6 +1501,8 @@
         return;
     }
 
+    setUpProgram();
+
     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 
     // Default unpack alignment is 4. The values of 'pixels' below needs it to be 1.
@@ -2028,6 +2089,11 @@
 // parameter.
 TEST_P(SamplerInStructArrayAsFunctionParameterTest, SamplerInStructArrayAsFunctionParameter)
 {
+    if (IsIntel() && GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE)
+    {
+        std::cout << "Test skipped on Intel OpenGL." << std::endl;
+        return;
+    }
     runSamplerInStructTest();
 }
 
@@ -2035,6 +2101,11 @@
 // parameter.
 TEST_P(SamplerInNestedStructAsFunctionParameterTest, SamplerInNestedStructAsFunctionParameter)
 {
+    if (IsIntel() && GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE)
+    {
+        std::cout << "Test skipped on Intel OpenGL." << std::endl;
+        return;
+    }
     runSamplerInStructTest();
 }