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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
{
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));
}
}
}
};
+//----------------------------------------------------------------------------
+// 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
//-----------------------------------------------------------------------------
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>));
}
};
+//----------------------------------------------------------------------------
+// 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
//-----------------------------------------------------------------------------
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>));