*//*--------------------------------------------------------------------*/
#include "es31fProgramInterfaceDefinition.hpp"
+#include "es31fProgramInterfaceDefinitionUtil.hpp"
#include "gluVarType.hpp"
#include "gluShaderProgram.hpp"
#include "deSTLUtil.hpp"
bool Program::isValid (void) const
{
- bool computePresent = false;
- bool vertexPresent = false;
- bool fragmentPresent = false;
- bool tessControlPresent = false;
- bool tessEvalPresent = false;
- bool geometryPresent = false;
+ const bool isOpenGLES = (m_shaders.empty()) ? (false) : (glu::glslVersionIsES(m_shaders[0]->getVersion()));
+ bool computePresent = false;
+ bool vertexPresent = false;
+ bool fragmentPresent = false;
+ bool tessControlPresent = false;
+ bool tessEvalPresent = false;
+ bool geometryPresent = false;
if (m_shaders.empty())
return false;
if ((m_geoNumOutputVertices != 0) != geometryPresent)
return false;
+ for (int ndx = 0; ndx < (int)m_xfbVaryings.size(); ++ndx)
+ {
+ // user-defined
+ if (m_xfbVaryings[ndx].find("gl_") != 0)
+ {
+ std::vector<ProgramInterfaceDefinition::VariablePathComponent> path;
+ if (!findProgramVariablePathByPathName(path, this, m_xfbVaryings[ndx], VariableSearchFilter::createShaderTypeStorageFilter(getProgramTransformFeedbackStage(this), glu::STORAGE_OUT)))
+ return false;
+ if (!path.back().isVariableType())
+ return false;
+
+ // Khronos bug #12787 disallowed capturing whole structs in OpenGL ES.
+ if (path.back().getVariableType()->isStructType() && isOpenGLES)
+ return false;
+ }
+ }
+
return true;
}
const ResourceDefinition::Node::SharedPtr variable (new ResourceDefinition::Variable(xfbTarget, glu::TYPE_FLOAT_VEC4));
targetGroup->addChild(new FeedbackResourceListTestCase(context, variable, "default_block_basic_type"));
}
- // .default_block_struct
- {
- const ResourceDefinition::Node::SharedPtr xfbTarget (new ResourceDefinition::TransformFeedbackTarget(output));
- const ResourceDefinition::Node::SharedPtr structMbr (new ResourceDefinition::StructMember(xfbTarget));
- const ResourceDefinition::Node::SharedPtr variable (new ResourceDefinition::Variable(structMbr, glu::TYPE_FLOAT_VEC4));
- targetGroup->addChild(new FeedbackResourceListTestCase(context, variable, "default_block_struct"));
- }
// .default_block_struct_member
{
const ResourceDefinition::Node::SharedPtr structMbr (new ResourceDefinition::StructMember(output));
const ResourceDefinition::Node::SharedPtr variable (new ResourceDefinition::Variable(xfbTarget, glu::TYPE_FLOAT_VEC4));
targetGroup->addChild(new ResourceTestCase(context, variable, ProgramResourceQueryTestTarget(PROGRAMINTERFACE_TRANSFORM_FEEDBACK_VARYING, TargetProp), "default_block_basic_type"));
}
- // .default_block_struct
- {
- const ResourceDefinition::Node::SharedPtr xfbTarget (new ResourceDefinition::TransformFeedbackTarget(output));
- const ResourceDefinition::Node::SharedPtr structMbr (new ResourceDefinition::StructMember(xfbTarget));
- const ResourceDefinition::Node::SharedPtr variable (new ResourceDefinition::Variable(structMbr, glu::TYPE_FLOAT_VEC4));
- targetGroup->addChild(new ResourceTestCase(context, variable, ProgramResourceQueryTestTarget(PROGRAMINTERFACE_TRANSFORM_FEEDBACK_VARYING, TargetProp), "default_block_struct"));
- }
// .default_block_struct_member
{
const ResourceDefinition::Node::SharedPtr structMbr (new ResourceDefinition::StructMember(output));