class ComputeBuiltinVarCase : public vkt::TestCase
{
public:
- ComputeBuiltinVarCase (tcu::TestContext& context, const char* name, const char* varName, glu::DataType varType);
+ ComputeBuiltinVarCase (tcu::TestContext& context, const string& name, const char* varName, glu::DataType varType, bool readByComponent);
~ComputeBuiltinVarCase (void);
TestInstance* createInstance (Context& context) const
virtual UVec3 computeReference (const UVec3& numWorkGroups, const UVec3& workGroupSize, const UVec3& workGroupID, const UVec3& localInvocationID) const = 0;
protected:
- string genBuiltinVarSource (const string& varName, glu::DataType varType, const UVec3& localSize) const;
+ string genBuiltinVarSource (const string& varName, glu::DataType varType, const UVec3& localSize, bool readByComponent) const;
vector<SubCase> m_subCases;
private:
const string m_varName;
const glu::DataType m_varType;
int m_subCaseNdx;
+ bool m_readByComponent;
ComputeBuiltinVarCase (const ComputeBuiltinVarCase& other);
ComputeBuiltinVarCase& operator= (const ComputeBuiltinVarCase& other);
};
-ComputeBuiltinVarCase::ComputeBuiltinVarCase (tcu::TestContext& context, const char* name, const char* varName, glu::DataType varType)
- : TestCase (context, name, varName)
- , m_varName (varName)
- , m_varType (varType)
- , m_subCaseNdx (0)
+ComputeBuiltinVarCase::ComputeBuiltinVarCase (tcu::TestContext& context, const string& name, const char* varName, glu::DataType varType, bool readByComponent)
+ : TestCase (context, name + (readByComponent ? "_component" : ""), varName)
+ , m_varName (varName)
+ , m_varType (varType)
+ , m_subCaseNdx (0)
+ , m_readByComponent (readByComponent)
{
}
const SubCase& subCase = m_subCases[i];
std::ostringstream name;
name << s_prefixProgramName << i;
- programCollection.glslSources.add(name.str()) << glu::ComputeSource(genBuiltinVarSource(m_varName, m_varType, subCase.localSize()).c_str());
+ programCollection.glslSources.add(name.str()) << glu::ComputeSource(genBuiltinVarSource(m_varName, m_varType, subCase.localSize(), m_readByComponent).c_str());
}
}
-string ComputeBuiltinVarCase::genBuiltinVarSource (const string& varName, glu::DataType varType, const UVec3& localSize) const
+string ComputeBuiltinVarCase::genBuiltinVarSource (const string& varName, glu::DataType varType, const UVec3& localSize, bool readByComponent) const
{
std::ostringstream src;
src << "#version 310 es\n"
- << "layout (local_size_x = " << localSize.x() << ", local_size_y = " << localSize.y() << ", local_size_z = " << localSize.z() << ") in;\n"
- << "layout(set = 0, binding = 0) uniform Stride\n"
+ << "layout (local_size_x = " << localSize.x() << ", local_size_y = " << localSize.y() << ", local_size_z = " << localSize.z() << ") in;\n";
+
+ // For the gl_WorkGroupSize case, force it to be specialized so that
+ // Glslang can't just bypass the read of the builtin variable.
+ // We will not override these spec constants.
+ src << "layout (local_size_x_id = 0, local_size_y_id = 1, local_size_z_id = 2) in;\n";
+
+ src << "layout(set = 0, binding = 0) uniform Stride\n"
<< "{\n"
<< " uvec2 u_stride;\n"
<< "}stride;\n"
<< "\n"
<< "void main (void)\n"
<< "{\n"
- << " highp uint offset = stride.u_stride.x*gl_GlobalInvocationID.z + stride.u_stride.y*gl_GlobalInvocationID.y + gl_GlobalInvocationID.x;\n"
- << " sb_out.result[offset] = " << varName << ";\n"
- << "}\n";
+ << " highp uint offset = stride.u_stride.x*gl_GlobalInvocationID.z + stride.u_stride.y*gl_GlobalInvocationID.y + gl_GlobalInvocationID.x;\n";
+
+ if (readByComponent && varType != glu::TYPE_UINT) {
+ switch(varType)
+ {
+ case glu::TYPE_UINT_VEC4:
+ src << " sb_out.result[offset].w = " << varName << ".w;\n";
+ // Fall through
+ case glu::TYPE_UINT_VEC3:
+ src << " sb_out.result[offset].z = " << varName << ".z;\n";
+ // Fall through
+ case glu::TYPE_UINT_VEC2:
+ src << " sb_out.result[offset].y = " << varName << ".y;\n"
+ << " sb_out.result[offset].x = " << varName << ".x;\n";
+ break;
+ default:
+ DE_ASSERT("Illegal data type");
+ break;
+ }
+ } else {
+ src << " sb_out.result[offset] = " << varName << ";\n";
+ }
+ src << "}\n";
return src.str();
}
class NumWorkGroupsCase : public ComputeBuiltinVarCase
{
public:
- NumWorkGroupsCase (tcu::TestContext& context)
- : ComputeBuiltinVarCase(context, "num_work_groups", "gl_NumWorkGroups", glu::TYPE_UINT_VEC3)
+ NumWorkGroupsCase (tcu::TestContext& context, bool readByCompnent)
+ : ComputeBuiltinVarCase(context, "num_work_groups", "gl_NumWorkGroups", glu::TYPE_UINT_VEC3, readByCompnent)
{
m_subCases.push_back(SubCase(UVec3(1, 1, 1), UVec3(1, 1, 1)));
m_subCases.push_back(SubCase(UVec3(1, 1, 1), UVec3(52, 1, 1)));
class WorkGroupSizeCase : public ComputeBuiltinVarCase
{
public:
- WorkGroupSizeCase (tcu::TestContext& context)
- : ComputeBuiltinVarCase(context, "work_group_size", "gl_WorkGroupSize", glu::TYPE_UINT_VEC3)
+ WorkGroupSizeCase (tcu::TestContext& context, bool readByComponent)
+ : ComputeBuiltinVarCase(context, "work_group_size", "gl_WorkGroupSize", glu::TYPE_UINT_VEC3, readByComponent)
{
m_subCases.push_back(SubCase(UVec3(1, 1, 1), UVec3(1, 1, 1)));
m_subCases.push_back(SubCase(UVec3(1, 1, 1), UVec3(2, 7, 3)));
class WorkGroupIDCase : public ComputeBuiltinVarCase
{
public:
- WorkGroupIDCase (tcu::TestContext& context)
- : ComputeBuiltinVarCase(context, "work_group_id", "gl_WorkGroupID", glu::TYPE_UINT_VEC3)
+ WorkGroupIDCase (tcu::TestContext& context, bool readbyComponent)
+ : ComputeBuiltinVarCase(context, "work_group_id", "gl_WorkGroupID", glu::TYPE_UINT_VEC3, readbyComponent)
{
m_subCases.push_back(SubCase(UVec3(1, 1, 1), UVec3(1, 1, 1)));
m_subCases.push_back(SubCase(UVec3(1, 1, 1), UVec3(52, 1, 1)));
class LocalInvocationIDCase : public ComputeBuiltinVarCase
{
public:
- LocalInvocationIDCase (tcu::TestContext& context)
- : ComputeBuiltinVarCase(context, "local_invocation_id", "gl_LocalInvocationID", glu::TYPE_UINT_VEC3)
+ LocalInvocationIDCase (tcu::TestContext& context, bool readByComponent)
+ : ComputeBuiltinVarCase(context, "local_invocation_id", "gl_LocalInvocationID", glu::TYPE_UINT_VEC3, readByComponent)
{
m_subCases.push_back(SubCase(UVec3(1, 1, 1), UVec3(1, 1, 1)));
m_subCases.push_back(SubCase(UVec3(1, 1, 1), UVec3(2, 7, 3)));
class GlobalInvocationIDCase : public ComputeBuiltinVarCase
{
public:
- GlobalInvocationIDCase (tcu::TestContext& context)
- : ComputeBuiltinVarCase(context, "global_invocation_id", "gl_GlobalInvocationID", glu::TYPE_UINT_VEC3)
+ GlobalInvocationIDCase (tcu::TestContext& context, bool readByComponent)
+ : ComputeBuiltinVarCase(context, "global_invocation_id", "gl_GlobalInvocationID", glu::TYPE_UINT_VEC3, readByComponent)
{
m_subCases.push_back(SubCase(UVec3(1, 1, 1), UVec3(1, 1, 1)));
m_subCases.push_back(SubCase(UVec3(1, 1, 1), UVec3(52, 1, 1)));
class LocalInvocationIndexCase : public ComputeBuiltinVarCase
{
public:
- LocalInvocationIndexCase (tcu::TestContext& context)
- : ComputeBuiltinVarCase(context, "local_invocation_index", "gl_LocalInvocationIndex", glu::TYPE_UINT)
+ LocalInvocationIndexCase (tcu::TestContext& context, bool readByComponent)
+ : ComputeBuiltinVarCase(context, "local_invocation_index", "gl_LocalInvocationIndex", glu::TYPE_UINT, readByComponent)
{
m_subCases.push_back(SubCase(UVec3(1, 1, 1), UVec3(1, 1, 1)));
m_subCases.push_back(SubCase(UVec3(1, 1, 1), UVec3(1, 39, 1)));
void ComputeShaderBuiltinVarTests::init (void)
{
- addChild(new NumWorkGroupsCase(this->getTestContext()));
- addChild(new WorkGroupSizeCase(this->getTestContext()));
- addChild(new WorkGroupIDCase(this->getTestContext()));
- addChild(new LocalInvocationIDCase(this->getTestContext()));
- addChild(new GlobalInvocationIDCase(this->getTestContext()));
- addChild(new LocalInvocationIndexCase(this->getTestContext()));
+ // Builtin variables with vector values should be read whole and by component.
+ for (int i = 0; i < 2; i++)
+ {
+ const bool readByComponent = (i != 0);
+ addChild(new NumWorkGroupsCase(this->getTestContext(), readByComponent));
+ addChild(new WorkGroupSizeCase(this->getTestContext(), readByComponent));
+ addChild(new WorkGroupIDCase(this->getTestContext(), readByComponent));
+ addChild(new LocalInvocationIDCase(this->getTestContext(), readByComponent));
+ addChild(new GlobalInvocationIDCase(this->getTestContext(), readByComponent));
+ }
+ // Local invocation index is already just a scalar.
+ addChild(new LocalInvocationIndexCase(this->getTestContext(), false));
}
} // anonymous