Tests mixing UB/SSB with and without instance names
authorPiotr Byszewski <piotr.byszewski@mobica.com>
Fri, 15 Sep 2017 13:36:25 +0000 (15:36 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Mon, 9 Oct 2017 11:46:19 +0000 (07:46 -0400)
Matched uniform or shader storage block names (but not input or
output block names) must also either all be lacking an instance
name or all having an instance name.

Components: OpenGL

VK-GL-CTS issue: 3

Affects:
KHR-GL43.shader_storage_buffer_object.basic-name-match
KHR-GLES31.core.shader_storage_buffer_object.basic-name-match
KHR-GL33.shaders.uniform_block.common.name_matching
KHR-GLES3.shaders.uniform_block.common.name_matching

Change-Id: I7dc3476272d6f3fca3faa7e6bc57a008bce0e17f

13 files changed:
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.0.x/gl33-master.txt
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.0.x/gl40-master.txt
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.0.x/gl41-master.txt
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.0.x/gl42-master.txt
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.0.x/gl43-master.txt
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.0.x/gl44-master.txt
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.0.x/gl45-master.txt
external/openglcts/data/mustpass/gl/khronos_mustpass/4.6.0.x/gl46-master.txt
external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles3-khr-master.txt
external/openglcts/data/mustpass/gles/khronos_mustpass/master/gles31-khr-master.txt
external/openglcts/modules/common/glcUniformBlockTests.cpp
external/openglcts/modules/gl/gl4cShaderStorageBufferObjectTests.cpp
external/openglcts/modules/gles31/es31cShaderStorageBufferObjectTests.cpp

index 393fa2a..70932ae 100644 (file)
@@ -2740,6 +2740,7 @@ KHR-GL33.shaders.uniform_block.random.all_shared_buffer.16
 KHR-GL33.shaders.uniform_block.random.all_shared_buffer.17
 KHR-GL33.shaders.uniform_block.random.all_shared_buffer.18
 KHR-GL33.shaders.uniform_block.random.all_shared_buffer.19
+KHR-GL33.shaders.uniform_block.common.name_matching
 KHR-GL33.shaders.shader_integer_mix.define
 KHR-GL33.shaders.shader_integer_mix.prototypes-extension
 KHR-GL33.shaders.shader_integer_mix.prototypes
index f312f70..8a84d33 100644 (file)
@@ -2740,6 +2740,7 @@ KHR-GL40.shaders.uniform_block.random.all_shared_buffer.16
 KHR-GL40.shaders.uniform_block.random.all_shared_buffer.17
 KHR-GL40.shaders.uniform_block.random.all_shared_buffer.18
 KHR-GL40.shaders.uniform_block.random.all_shared_buffer.19
+KHR-GL40.shaders.uniform_block.common.name_matching
 KHR-GL40.shaders.shader_integer_mix.define
 KHR-GL40.shaders.shader_integer_mix.prototypes-extension
 KHR-GL40.shaders.shader_integer_mix.prototypes
index 9ce88d8..f4a618b 100644 (file)
@@ -2740,6 +2740,7 @@ KHR-GL41.shaders.uniform_block.random.all_shared_buffer.16
 KHR-GL41.shaders.uniform_block.random.all_shared_buffer.17
 KHR-GL41.shaders.uniform_block.random.all_shared_buffer.18
 KHR-GL41.shaders.uniform_block.random.all_shared_buffer.19
+KHR-GL41.shaders.uniform_block.common.name_matching
 KHR-GL41.shaders.shader_integer_mix.define
 KHR-GL41.shaders.shader_integer_mix.prototypes-extension
 KHR-GL41.shaders.shader_integer_mix.prototypes
index e96b8b8..643345e 100644 (file)
@@ -2740,6 +2740,7 @@ KHR-GL42.shaders.uniform_block.random.all_shared_buffer.16
 KHR-GL42.shaders.uniform_block.random.all_shared_buffer.17
 KHR-GL42.shaders.uniform_block.random.all_shared_buffer.18
 KHR-GL42.shaders.uniform_block.random.all_shared_buffer.19
+KHR-GL42.shaders.uniform_block.common.name_matching
 KHR-GL42.shaders.shader_integer_mix.define
 KHR-GL42.shaders.shader_integer_mix.prototypes-extension
 KHR-GL42.shaders.shader_integer_mix.prototypes
index 933f672..d3f41db 100644 (file)
@@ -2740,6 +2740,7 @@ KHR-GL43.shaders.uniform_block.random.all_shared_buffer.16
 KHR-GL43.shaders.uniform_block.random.all_shared_buffer.17
 KHR-GL43.shaders.uniform_block.random.all_shared_buffer.18
 KHR-GL43.shaders.uniform_block.random.all_shared_buffer.19
+KHR-GL43.shaders.uniform_block.common.name_matching
 KHR-GL43.shaders.shader_integer_mix.define
 KHR-GL43.shaders.shader_integer_mix.prototypes-extension
 KHR-GL43.shaders.shader_integer_mix.prototypes
@@ -4039,6 +4040,7 @@ KHR-GL43.shader_storage_buffer_object.basic-matrixOperations-case7-vs
 KHR-GL43.shader_storage_buffer_object.basic-matrixOperations-case7-cs
 KHR-GL43.shader_storage_buffer_object.basic-noBindingLayout
 KHR-GL43.shader_storage_buffer_object.basic-readonly-writeonly
+KHR-GL43.shader_storage_buffer_object.basic-name-match
 KHR-GL43.shader_storage_buffer_object.advanced-switchBuffers
 KHR-GL43.shader_storage_buffer_object.advanced-switchBuffers-cs
 KHR-GL43.shader_storage_buffer_object.advanced-switchPrograms
index 2f06cb7..df8f182 100644 (file)
@@ -2740,6 +2740,7 @@ KHR-GL44.shaders.uniform_block.random.all_shared_buffer.16
 KHR-GL44.shaders.uniform_block.random.all_shared_buffer.17
 KHR-GL44.shaders.uniform_block.random.all_shared_buffer.18
 KHR-GL44.shaders.uniform_block.random.all_shared_buffer.19
+KHR-GL44.shaders.uniform_block.common.name_matching
 KHR-GL44.shaders.shader_integer_mix.define
 KHR-GL44.shaders.shader_integer_mix.prototypes-extension
 KHR-GL44.shaders.shader_integer_mix.prototypes
@@ -4039,6 +4040,7 @@ KHR-GL44.shader_storage_buffer_object.basic-matrixOperations-case7-vs
 KHR-GL44.shader_storage_buffer_object.basic-matrixOperations-case7-cs
 KHR-GL44.shader_storage_buffer_object.basic-noBindingLayout
 KHR-GL44.shader_storage_buffer_object.basic-readonly-writeonly
+KHR-GL44.shader_storage_buffer_object.basic-name-match
 KHR-GL44.shader_storage_buffer_object.advanced-switchBuffers
 KHR-GL44.shader_storage_buffer_object.advanced-switchBuffers-cs
 KHR-GL44.shader_storage_buffer_object.advanced-switchPrograms
index 3426002..4f4f6a0 100644 (file)
@@ -2740,6 +2740,7 @@ KHR-GL45.shaders.uniform_block.random.all_shared_buffer.16
 KHR-GL45.shaders.uniform_block.random.all_shared_buffer.17
 KHR-GL45.shaders.uniform_block.random.all_shared_buffer.18
 KHR-GL45.shaders.uniform_block.random.all_shared_buffer.19
+KHR-GL45.shaders.uniform_block.common.name_matching
 KHR-GL45.shaders.shader_integer_mix.define
 KHR-GL45.shaders.shader_integer_mix.prototypes-extension
 KHR-GL45.shaders.shader_integer_mix.prototypes
@@ -4040,6 +4041,7 @@ KHR-GL45.shader_storage_buffer_object.basic-matrixOperations-case7-vs
 KHR-GL45.shader_storage_buffer_object.basic-matrixOperations-case7-cs
 KHR-GL45.shader_storage_buffer_object.basic-noBindingLayout
 KHR-GL45.shader_storage_buffer_object.basic-readonly-writeonly
+KHR-GL45.shader_storage_buffer_object.basic-name-match
 KHR-GL45.shader_storage_buffer_object.advanced-switchBuffers
 KHR-GL45.shader_storage_buffer_object.advanced-switchBuffers-cs
 KHR-GL45.shader_storage_buffer_object.advanced-switchPrograms
index 71a1987..008a702 100644 (file)
@@ -2740,6 +2740,7 @@ KHR-GL46.shaders.uniform_block.random.all_shared_buffer.16
 KHR-GL46.shaders.uniform_block.random.all_shared_buffer.17
 KHR-GL46.shaders.uniform_block.random.all_shared_buffer.18
 KHR-GL46.shaders.uniform_block.random.all_shared_buffer.19
+KHR-GL46.shaders.uniform_block.common.name_matching
 KHR-GL46.shaders.shader_integer_mix.define
 KHR-GL46.shaders.shader_integer_mix.prototypes-extension
 KHR-GL46.shaders.shader_integer_mix.prototypes
@@ -4040,6 +4041,7 @@ KHR-GL46.shader_storage_buffer_object.basic-matrixOperations-case7-vs
 KHR-GL46.shader_storage_buffer_object.basic-matrixOperations-case7-cs
 KHR-GL46.shader_storage_buffer_object.basic-noBindingLayout
 KHR-GL46.shader_storage_buffer_object.basic-readonly-writeonly
+KHR-GL46.shader_storage_buffer_object.basic-name-match
 KHR-GL46.shader_storage_buffer_object.advanced-switchBuffers
 KHR-GL46.shader_storage_buffer_object.advanced-switchBuffers-cs
 KHR-GL46.shader_storage_buffer_object.advanced-switchPrograms
index ac1d3f1..678e772 100644 (file)
@@ -2568,6 +2568,7 @@ KHR-GLES3.shaders.uniform_block.random.all_shared_buffer.17
 KHR-GLES3.shaders.uniform_block.random.all_shared_buffer.18
 KHR-GLES3.shaders.uniform_block.random.all_shared_buffer.19
 KHR-GLES3.shaders.uniform_block.common.precision_matching
+KHR-GLES3.shaders.uniform_block.common.name_matching
 KHR-GLES3.shaders.shader_integer_mix.define
 KHR-GLES3.shaders.shader_integer_mix.prototypes-extension
 KHR-GLES3.shaders.shader_integer_mix.prototypes
index 32b2b87..e70066d 100644 (file)
@@ -1901,6 +1901,7 @@ KHR-GLES31.core.shader_storage_buffer_object.basic-matrixOperations-case6-cs
 KHR-GLES31.core.shader_storage_buffer_object.basic-matrixOperations-case7-vs
 KHR-GLES31.core.shader_storage_buffer_object.basic-matrixOperations-case7-cs
 KHR-GLES31.core.shader_storage_buffer_object.basic-readonly-writeonly
+KHR-GLES31.core.shader_storage_buffer_object.basic-name-match
 KHR-GLES31.core.shader_storage_buffer_object.advanced-switchBuffers-vs
 KHR-GLES31.core.shader_storage_buffer_object.advanced-switchBuffers-cs
 KHR-GLES31.core.shader_storage_buffer_object.advanced-switchPrograms-vs
index be6c252..a3ac986 100644 (file)
@@ -679,6 +679,144 @@ private:
        glu::GLSLVersion m_glslVersion;
 };
 
+class UniformBlockNameMatching : public TestCase
+{
+public:
+       UniformBlockNameMatching(Context& context, glu::GLSLVersion glslVersion)
+               : TestCase(context, "name_matching", ""), m_glslVersion(glslVersion)
+       {
+       }
+
+       IterateResult iterate(void)
+       {
+               m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
+
+               std::string vs1("precision highp float;\n"
+                                               "layout (std140) uniform Data { vec4 v; };\n"
+                                               "void main() {\n"
+                                               "  gl_Position = v;\n"
+                                               "}");
+               std::string fs1("precision highp float;\n"
+                                               "out vec4 color;\n"
+                                               "layout (std140) uniform Data { vec4 v; } myData;\n"
+                                               "void main() {\n"
+                                               "  color = vec4(myData.v);\n"
+                                               "}");
+
+               // check if link error is generated when one of matched blocks has instance name and other doesn't
+               if (!Test(vs1, fs1, GL_FALSE))
+                       return STOP;
+
+               std::string vs2("precision highp float;\n"
+                                               "uniform Data { vec4 v; };\n"
+                                               "void main() {\n"
+                                               "  gl_Position = v;\n"
+                                               "}");
+               std::string fs2("precision highp float;\n"
+                                               "out vec4 color;\n"
+                                               "uniform Data { vec4 v; };\n"
+                                               "void main() {\n"
+                                               "  color = v;\n"
+                                               "}");
+
+               // check if linking succeeds when both matched blocks are lacking an instance name
+               if (!Test(vs2, fs2, GL_TRUE))
+                       return STOP;
+
+               std::string vs3("precision highp float;\n"
+                                               "layout (std140) uniform Data { vec4 v; } a;\n"
+                                               "void main() {\n"
+                                               "  gl_Position = a.v;\n"
+                                               "}");
+               std::string fs3("precision highp float;\n"
+                                               "out vec4 color;\n"
+                                               "layout (std140) uniform Data { vec4 v; } b;\n"
+                                               "void main() {\n"
+                                               "  color = b.v;\n"
+                                               "}");
+
+               // check if linking succeeds when both matched blocks are lacking an instance name
+               if (!Test(vs3, fs3, GL_TRUE))
+                       return STOP;
+
+               m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
+               return STOP;
+       }
+
+       bool Test(const std::string& vs, const std::string& fs, glw::GLint expectedLinkStatus)
+       {
+               const glw::Functions& gl          = m_context.getRenderContext().getFunctions();
+               const glw::GLuint        p                = gl.createProgram();
+               const std::string        version = glu::getGLSLVersionDeclaration(m_glslVersion);
+
+               const struct
+               {
+                       const char*                name;
+                       const std::string& body;
+                       glw::GLenum                type;
+               } shaderDefinition[] = { { "VS", vs, GL_VERTEX_SHADER }, { "FS", fs, GL_FRAGMENT_SHADER } };
+
+               for (unsigned int index = 0; index < 2; ++index)
+               {
+                       std::string shaderSource        = version + "\n" + shaderDefinition[index].body;
+                       const char* shaderSourcePtr = shaderSource.c_str();
+
+                       glw::GLuint sh = gl.createShader(shaderDefinition[index].type);
+                       gl.attachShader(p, sh);
+                       gl.deleteShader(sh);
+                       gl.shaderSource(sh, 1, &shaderSourcePtr, NULL);
+                       gl.compileShader(sh);
+
+                       glw::GLint status;
+                       gl.getShaderiv(sh, GL_COMPILE_STATUS, &status);
+                       if (status == GL_FALSE)
+                       {
+                               glw::GLint length;
+                               gl.getShaderiv(sh, GL_INFO_LOG_LENGTH, &length);
+                               if (length > 0)
+                               {
+                                       std::vector<glw::GLchar> log(length);
+                                       gl.getShaderInfoLog(sh, length, NULL, &log[0]);
+                                       m_context.getTestContext().getLog() << tcu::TestLog::Message << shaderDefinition[index].name
+                                                                                                               << " compilation should succed. Info Log:\n"
+                                                                                                               << &log[0] << tcu::TestLog::EndMessage;
+                               }
+                               gl.deleteProgram(p);
+                               return false;
+                       }
+               }
+
+               gl.linkProgram(p);
+
+               bool       result = true;
+               glw::GLint status;
+               gl.getProgramiv(p, GL_LINK_STATUS, &status);
+               if (status != expectedLinkStatus)
+               {
+                       if (status == GL_TRUE)
+                       {
+                               m_context.getTestContext().getLog() << tcu::TestLog::Message << "Link operation should fail.\n"
+                                                                                                       << tcu::TestLog::EndMessage;
+                       }
+                       else
+                       {
+                               glw::GLchar log[1024];
+                               gl.getProgramInfoLog(p, sizeof(log), NULL, log);
+                               m_context.getTestContext().getLog()
+                                       << tcu::TestLog::Message << "Link operation should succed. Info Log:\n"
+                                       << log << tcu::TestLog::EndMessage;
+                       }
+                       result = false;
+               }
+
+               gl.deleteProgram(p);
+               return result;
+       }
+
+private:
+       glu::GLSLVersion m_glslVersion;
+};
+
 UniformBlockTests::UniformBlockTests(Context& context, glu::GLSLVersion glslVersion)
        : TestCaseGroup(context, "uniform_block", "Uniform Block tests"), m_glslVersion(glslVersion)
 {
@@ -1096,6 +1234,13 @@ void UniformBlockTests::init(void)
                tcu::TestCaseGroup* commonGroup = new tcu::TestCaseGroup(m_testCtx, "common", "Common Uniform Block cases");
                addChild(commonGroup);
                commonGroup->addChild(new UniformBlockPrecisionMatching(m_context, m_glslVersion));
+               commonGroup->addChild(new UniformBlockNameMatching(m_context, m_glslVersion));
+       }
+       else if (glu::isGLSLVersionSupported(m_context.getRenderContext().getType(), glu::GLSL_VERSION_150))
+       {
+               tcu::TestCaseGroup* commonGroup = new tcu::TestCaseGroup(m_testCtx, "common", "Common Uniform Block cases");
+               addChild(commonGroup);
+               commonGroup->addChild(new UniformBlockNameMatching(m_context, m_glslVersion));
        }
 }
 
index ed7881c..9e2a497 100644 (file)
@@ -5203,6 +5203,84 @@ class BasicReadonlyWriteonly : public ShaderStorageBufferObjectBase
        }
 };
 
+//----------------------------------------------------------------------------
+// 1.15 BasicNameMatch
+//-----------------------------------------------------------------------------
+class BasicNameMatch : public ShaderStorageBufferObjectBase
+{
+       virtual long Run()
+       {
+               GLint blocksVS, blocksFS;
+               glGetIntegerv(GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS, &blocksVS);
+               glGetIntegerv(GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, &blocksFS);
+               if ((blocksVS == 0) || (blocksFS == 0))
+                       return NOT_SUPPORTED;
+
+               // check if link error is generated when one of matched blocks has instance name and other doesn't
+               std::string vs1("buffer Buf { float x; };\n"
+                                               "void main() {\n"
+                                               "  gl_Position = vec4(x);\n"
+                                               "}");
+               std::string fs1("buffer Buf { float x; } b;\n"
+                                               "out vec4 color;\n"
+                                               "void main() {\n"
+                                               "  color = vec4(b.x);\n"
+                                               "}");
+               if (Link(vs1, fs1))
+               {
+                       m_context.getTestContext().getLog()
+                               << tcu::TestLog::Message << "Linking should fail." << tcu::TestLog::EndMessage;
+                       return ERROR;
+               }
+
+               // check if linking succeeds when both matched blocks are lacking an instance name
+               std::string vs2("buffer Buf { float x; };\n"
+                                               "void main() {\n"
+                                               "  gl_Position = vec4(x);\n"
+                                               "}");
+               std::string fs2("buffer Buf { float x; };\n"
+                                               "out vec4 color;\n"
+                                               "void main() {\n"
+                                               "  color = vec4(x);\n"
+                                               "}");
+               if (!Link(vs2, fs2))
+               {
+                       m_context.getTestContext().getLog()
+                               << tcu::TestLog::Message << "Linking should succeed." << tcu::TestLog::EndMessage;
+                       return ERROR;
+               }
+
+               // check if linking succeeds when both matched blocks have different instance names
+               std::string vs3("buffer Buf { float x; } a;\n"
+                                               "void main() {\n"
+                                               "  gl_Position = vec4(a.x);\n"
+                                               "}");
+               std::string fs3("buffer Buf { float x; } b;\n"
+                                               "out vec4 color;\n"
+                                               "void main() {\n"
+                                               "  color = vec4(b.x);\n"
+                                               "}");
+               if (!Link(vs3, fs3))
+               {
+                       m_context.getTestContext().getLog()
+                               << tcu::TestLog::Message << "Linking should succeed." << tcu::TestLog::EndMessage;
+                       return ERROR;
+               }
+
+               return NO_ERROR;
+       }
+
+       bool Link(const std::string& vs, const std::string& fs)
+       {
+               GLuint program = CreateProgram(vs, fs);
+               glLinkProgram(program);
+               GLint status;
+               glGetProgramiv(program, GL_LINK_STATUS, &status);
+               glDeleteProgram(program);
+               return (status == GL_TRUE);
+       }
+};
+
 //-----------------------------------------------------------------------------
 // 2.1 AdvancedSwitchBuffers
 //-----------------------------------------------------------------------------
@@ -9071,6 +9149,7 @@ void ShaderStorageBufferObjectTests::init()
                                                         TestSubcase::Create<BasicMatrixOperationsCase7CS>));
        addChild(new TestSubcase(m_context, "basic-noBindingLayout", TestSubcase::Create<BasicNoBindingLayout>));
        addChild(new TestSubcase(m_context, "basic-readonly-writeonly", TestSubcase::Create<BasicReadonlyWriteonly>));
+       addChild(new TestSubcase(m_context, "basic-name-match", TestSubcase::Create<BasicNameMatch>));
        addChild(new TestSubcase(m_context, "advanced-switchBuffers", TestSubcase::Create<AdvancedSwitchBuffers>));
        addChild(new TestSubcase(m_context, "advanced-switchBuffers-cs", TestSubcase::Create<AdvancedSwitchBuffersCS>));
        addChild(new TestSubcase(m_context, "advanced-switchPrograms", TestSubcase::Create<AdvancedSwitchPrograms>));
index 3e9cfe6..9fe1321 100644 (file)
@@ -4923,6 +4923,84 @@ class BasicReadonlyWriteonly : public ShaderStorageBufferObjectBase
        }
 };
 
+//----------------------------------------------------------------------------
+// 1.15 BasicNameMatch
+//-----------------------------------------------------------------------------
+class BasicNameMatch : public ShaderStorageBufferObjectBase
+{
+       virtual long Run()
+       {
+               GLint blocksVS, blocksFS;
+               glGetIntegerv(GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS, &blocksVS);
+               glGetIntegerv(GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, &blocksFS);
+               if ((blocksVS == 0) || (blocksFS == 0))
+                       return NOT_SUPPORTED;
+
+               // check if link error is generated when one of matched blocks has instance name and other doesn't
+               std::string vs1("buffer Buf { float x; };\n"
+                                               "void main() {\n"
+                                               "  gl_Position = vec4(x);\n"
+                                               "}");
+               std::string fs1("buffer Buf { float x; } b;\n"
+                                               "out vec4 color;\n"
+                                               "void main() {\n"
+                                               "  color = vec4(b.x);\n"
+                                               "}");
+               if (Link(vs1, fs1))
+               {
+                       m_context.getTestContext().getLog()
+                               << tcu::TestLog::Message << "Linking should fail." << tcu::TestLog::EndMessage;
+                       return ERROR;
+               }
+
+               // check if linking succeeds when both matched blocks are lacking an instance name
+               std::string vs2("buffer Buf { float x; };\n"
+                                               "void main() {\n"
+                                               "  gl_Position = vec4(x);\n"
+                                               "}");
+               std::string fs2("buffer Buf { float x; };\n"
+                                               "out vec4 color;\n"
+                                               "void main() {\n"
+                                               "  color = vec4(x);\n"
+                                               "}");
+               if (!Link(vs2, fs2))
+               {
+                       m_context.getTestContext().getLog()
+                               << tcu::TestLog::Message << "Linking should succeed." << tcu::TestLog::EndMessage;
+                       return ERROR;
+               }
+
+               // check if linking succeeds when both matched blocks have different instance names
+               std::string vs3("buffer Buf { float x; } a;\n"
+                                               "void main() {\n"
+                                               "  gl_Position = vec4(a.x);\n"
+                                               "}");
+               std::string fs3("buffer Buf { float x; } b;\n"
+                                               "out vec4 color;\n"
+                                               "void main() {\n"
+                                               "  color = vec4(b.x);\n"
+                                               "}");
+               if (!Link(vs3, fs3))
+               {
+                       m_context.getTestContext().getLog()
+                               << tcu::TestLog::Message << "Linking should succeed." << tcu::TestLog::EndMessage;
+                       return ERROR;
+               }
+
+               return NO_ERROR;
+       }
+
+       bool Link(const std::string& vs, const std::string& fs)
+       {
+               GLuint program = CreateProgram(vs, fs);
+               glLinkProgram(program);
+               GLint status;
+               glGetProgramiv(program, GL_LINK_STATUS, &status);
+               glDeleteProgram(program);
+               return (status == GL_TRUE);
+       }
+};
+
 //-----------------------------------------------------------------------------
 // 2.1 AdvancedSwitchBuffers
 //-----------------------------------------------------------------------------
@@ -8599,6 +8677,7 @@ void ShaderStorageBufferObjectTests::init()
        addChild(new TestSubcase(m_context, "basic-matrixOperations-case7-cs",
                                                         TestSubcase::Create<BasicMatrixOperationsCase7CS>));
        addChild(new TestSubcase(m_context, "basic-readonly-writeonly", TestSubcase::Create<BasicReadonlyWriteonly>));
+       addChild(new TestSubcase(m_context, "basic-name-match", TestSubcase::Create<BasicNameMatch>));
        addChild(new TestSubcase(m_context, "advanced-switchBuffers-vs", TestSubcase::Create<AdvancedSwitchBuffersVS>));
        addChild(new TestSubcase(m_context, "advanced-switchBuffers-cs", TestSubcase::Create<AdvancedSwitchBuffersCS>));
        addChild(new TestSubcase(m_context, "advanced-switchPrograms-vs", TestSubcase::Create<AdvancedSwitchProgramsVS>));