Merge "Add negative tests for per-patch output aggregate types."
diff --git a/data/gles31/shaders/tessellation_negative_user_defined_io.test b/data/gles31/shaders/tessellation_negative_user_defined_io.test
new file mode 100644
index 0000000..36bd5e7
--- /dev/null
+++ b/data/gles31/shaders/tessellation_negative_user_defined_io.test
@@ -0,0 +1,116 @@
+case per_patch_array_of_structs
+ version 310 es
+ desc "per-patch variable type is array of structs"
+ expect compile_or_link_fail
+ require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
+ vertex ""
+ #version 310 es
+ ${VERTEX_DECLARATIONS}
+ void main()
+ {
+ ${VERTEX_OUTPUT}
+ }
+ ""
+ tessellation_control ""
+ #version 310 es
+ ${TESSELLATION_CONTROL_DECLARATIONS}
+ struct S
+ {
+ highp float a;
+ highp vec2 b;
+ };
+ patch out S patchVariable[2]; // array of structures is illegal
+ void main()
+ {
+ patchVariable[0].a = gl_in[0].gl_Position.x;
+ patchVariable[0].b = gl_in[0].gl_Position.yz;
+ patchVariable[1].a = gl_in[0].gl_Position.z;
+ patchVariable[1].b = gl_in[0].gl_Position.wx;
+ ${TESSELLATION_CONTROL_OUTPUT}
+ }
+ ""
+ tessellation_evaluation ""
+ #version 310 es
+ ${TESSELLATION_EVALUATION_DECLARATIONS}
+ struct S
+ {
+ highp float a;
+ highp vec2 b;
+ };
+ patch in S patchVariable[2]; // array of structures is illegal
+ out mediump float te_out;
+ void main()
+ {
+ te_out = patchVariable[0].a + patchVariable[1].b.y;
+ ${TESSELLATION_EVALUATION_OUTPUT}
+ }
+ ""
+ fragment ""
+ #version 310 es
+ precision mediump float;
+ ${FRAGMENT_DECLARATIONS}
+ in mediump float te_out;
+ void main()
+ {
+ ${FRAG_COLOR} = vec4(te_out);
+ }
+ ""
+end
+
+case per_patch_structs_containing_arrays
+ version 310 es
+ desc "per-patch variable type is struct containing array"
+ expect compile_or_link_fail
+ require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
+ vertex ""
+ #version 310 es
+ ${VERTEX_DECLARATIONS}
+ void main()
+ {
+ ${VERTEX_OUTPUT}
+ }
+ ""
+ tessellation_control ""
+ #version 310 es
+ ${TESSELLATION_CONTROL_DECLARATIONS}
+ struct S
+ {
+ highp float a;
+ highp float b[2];
+ };
+ patch out S patchVariable; // output structure containing array is illegal
+ void main()
+ {
+ patchVariable.a = gl_in[0].gl_Position.x;
+ patchVariable.b[0] = gl_in[0].gl_Position.y;
+ patchVariable.b[1] = gl_in[0].gl_Position.w;
+ ${TESSELLATION_CONTROL_OUTPUT}
+ }
+ ""
+ tessellation_evaluation ""
+ #version 310 es
+ ${TESSELLATION_EVALUATION_DECLARATIONS}
+ struct S
+ {
+ highp float a;
+ highp float b[2];
+ };
+ patch in S patchVariable; // output structure containing array is illegal
+ out mediump float te_out;
+ void main()
+ {
+ te_out = patchVariable.a + patchVariable.b[1];
+ ${TESSELLATION_EVALUATION_OUTPUT}
+ }
+ ""
+ fragment ""
+ #version 310 es
+ precision mediump float;
+ ${FRAGMENT_DECLARATIONS}
+ in mediump float te_out;
+ void main()
+ {
+ ${FRAG_COLOR} = vec4(te_out);
+ }
+ ""
+end
diff --git a/modules/gles31/functional/es31fTessellationTests.cpp b/modules/gles31/functional/es31fTessellationTests.cpp
index 45b8295..4b7ceac 100644
--- a/modules/gles31/functional/es31fTessellationTests.cpp
+++ b/modules/gles31/functional/es31fTessellationTests.cpp
@@ -23,6 +23,7 @@
#include "es31fTessellationTests.hpp"
#include "glsTextureTestUtil.hpp"
+#include "glsShaderLibrary.hpp"
#include "glsStateQueryUtil.hpp"
#include "gluShaderProgram.hpp"
#include "gluRenderContext.hpp"
@@ -7568,6 +7569,17 @@
}
}
}
+
+ {
+ TestCaseGroup* const negativeGroup = new TestCaseGroup(m_context, "negative", "Negative cases");
+ gls::ShaderLibrary shaderLibrary (m_testCtx, m_context.getRenderContext(), m_context.getContextInfo());
+ const std::vector<tcu::TestNode*> children = shaderLibrary.loadShaderFile("shaders/tessellation_negative_user_defined_io.test");
+
+ userDefinedIOGroup->addChild(negativeGroup);
+
+ for (int i = 0; i < (int)children.size(); i++)
+ negativeGroup->addChild(children[i]);
+ }
}
}