Remove struct-capturing XFB PIQ cases.
authorJarkko Pöyry <jpoyry@google.com>
Mon, 16 Mar 2015 20:05:57 +0000 (13:05 -0700)
committerJarkko Pöyry <jpoyry@google.com>
Mon, 16 Mar 2015 20:05:57 +0000 (13:05 -0700)
- Remove transform feedback program interface query cases that tried to
  capture whole struct. This was disallowed in the resolution of
  Khronos bug #12787.

Bug: 18524718
Change-Id: Ibca5f334ffddb2647472c65dc34d5fa44953e730

modules/gles31/functional/es31fProgramInterfaceDefinition.cpp
modules/gles31/functional/es31fProgramInterfaceQueryTests.cpp

index 01fc4b5..88ae724 100644 (file)
@@ -22,6 +22,7 @@
  *//*--------------------------------------------------------------------*/
 
 #include "es31fProgramInterfaceDefinition.hpp"
+#include "es31fProgramInterfaceDefinitionUtil.hpp"
 #include "gluVarType.hpp"
 #include "gluShaderProgram.hpp"
 #include "deSTLUtil.hpp"
@@ -568,12 +569,13 @@ void Program::setTessellationNumOutputPatchVertices (deUint32 vertices)
 
 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;
@@ -629,6 +631,23 @@ bool Program::isValid (void) const
        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;
 }
 
index b860f9e..83fa13c 100644 (file)
@@ -6195,13 +6195,6 @@ static void generateTransformFeedbackResourceListBlockContents (Context& context
                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));
@@ -6244,13 +6237,6 @@ static void generateTransformFeedbackVariableBlockContents (Context& context, co
                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));