1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2016 The Khronos Group Inc.
6 * Copyright (c) 2016 The Android Open Source Project
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 * \brief Varying Geometry Shader Tests
23 *//*--------------------------------------------------------------------*/
25 #include "vktGeometryVaryingGeometryShaderTests.hpp"
26 #include "vktGeometryBasicClass.hpp"
27 #include "vktGeometryTestsUtil.hpp"
30 #include "vktTestCase.hpp"
31 #include "vktTestCaseUtil.hpp"
32 #include "vkImageUtil.hpp"
33 #include "vkTypeUtil.hpp"
34 #include "vkPrograms.hpp"
35 #include "vkBuilderUtil.hpp"
37 #include "vkRefUtil.hpp"
38 #include "vkQueryUtil.hpp"
39 #include "vkMemUtil.hpp"
51 using tcu::TestStatus;
52 using tcu::TestContext;
53 using tcu::TestCaseGroup;
57 typedef enum VertexOutputs {VERTEXT_NO_OP = -1,VERTEXT_ZERO, VERTEXT_ONE} VertexOut;
58 typedef enum GeometryOutputs {GEOMETRY_ZERO, GEOMETRY_ONE, GEOMETRY_TWO} GeometryOut;
60 struct VaryingTestSpec
62 VertexOutputs vertexOutputs;
63 GeometryOutputs geometryOutputs;
68 class GeometryVaryingTestInstance : public GeometryExpanderRenderTestInstance
71 GeometryVaryingTestInstance (Context& context,
74 void genVertexAttribData (void);
77 GeometryVaryingTestInstance::GeometryVaryingTestInstance (Context& context, const char* name)
78 : GeometryExpanderRenderTestInstance (context, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, name)
80 genVertexAttribData();
83 void GeometryVaryingTestInstance::genVertexAttribData (void)
85 m_numDrawVertices = 3;
86 m_vertexPosData.resize(m_numDrawVertices);
87 m_vertexPosData[0] = tcu::Vec4(0.5f, 0.0f, 0.0f, 1.0f);
88 m_vertexPosData[1] = tcu::Vec4(0.0f, 0.5f, 0.0f, 1.0f);
89 m_vertexPosData[2] = tcu::Vec4(0.1f, 0.0f, 0.0f, 1.0f);
91 m_vertexAttrData.resize(m_numDrawVertices);
92 m_vertexAttrData[0] = tcu::Vec4(0.7f, 0.4f, 0.6f, 1.0f);
93 m_vertexAttrData[1] = tcu::Vec4(0.9f, 0.2f, 0.5f, 1.0f);
94 m_vertexAttrData[2] = tcu::Vec4(0.1f, 0.8f, 0.3f, 1.0f);
97 class VaryingTest : public TestCase
100 VaryingTest (TestContext& testCtx,
101 const VaryingTestSpec& varyingTestSpec);
103 void checkSupport (Context& context) const;
104 void initPrograms (SourceCollections& sourceCollections) const;
105 virtual TestInstance* createInstance (Context& context) const;
108 const VaryingTestSpec m_varyingTestSpec;
111 VaryingTest::VaryingTest (TestContext& testCtx, const VaryingTestSpec& varyingTestSpec)
112 : TestCase (testCtx, varyingTestSpec.name, varyingTestSpec.desc)
113 , m_varyingTestSpec (varyingTestSpec)
119 void VaryingTest::checkSupport (Context& context) const
121 context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
124 void VaryingTest::initPrograms (SourceCollections& sourceCollections) const
127 std::ostringstream src;
128 src << "#version 310 es\n"
129 <<"layout(location = 0) in highp vec4 a_position;\n"
130 <<"layout(location = 1) in highp vec4 a_color;\n";
131 switch(m_varyingTestSpec.vertexOutputs)
134 src << "void main (void)\n"
139 src << "void main (void)\n"
141 << " gl_Position = a_position;\n"
145 src <<"layout(location = 0) out highp vec4 v_geom_0;\n"
146 << "void main (void)\n"
148 << " gl_Position = a_position;\n"
149 << " v_geom_0 = a_color;\n"
155 sourceCollections.glslSources.add("vertex") << glu::VertexSource(src.str());
159 std::ostringstream src;
160 src << "#version 310 es\n"
161 << "#extension GL_EXT_geometry_shader : require\n"
162 << "layout(triangles) in;\n"
163 << "layout(triangle_strip, max_vertices = 3) out;\n";
165 if (m_varyingTestSpec.vertexOutputs == VERTEXT_ONE)
166 src << "layout(location = 0) in highp vec4 v_geom_0[];\n";
168 if (m_varyingTestSpec.geometryOutputs >= GEOMETRY_ONE)
169 src << "layout(location = 0) out highp vec4 v_frag_0;\n";
170 if (m_varyingTestSpec.geometryOutputs == GEOMETRY_TWO)
171 src << "layout(location = 1) out highp vec4 v_frag_1;\n";
173 src << "void main (void)\n"
175 << " highp vec4 offset = vec4(-0.2, -0.2, 0.0, 0.0);\n"
176 << " highp vec4 inputColor;\n"
178 if (m_varyingTestSpec.vertexOutputs == VERTEXT_ONE)
179 src << " inputColor = v_geom_0[0];\n";
181 src << " inputColor = vec4(1.0, 0.0, 0.0, 1.0);\n";
183 if (m_varyingTestSpec.vertexOutputs == VERTEXT_NO_OP)
184 src << " gl_Position = vec4(0.0, 0.0, 0.0, 1.0) + offset;\n";
185 if (m_varyingTestSpec.vertexOutputs >= VERTEXT_ZERO)
186 src << " gl_Position = gl_in[0].gl_Position + offset;\n";
188 if (m_varyingTestSpec.geometryOutputs == GEOMETRY_ONE)
189 src << " v_frag_0 = inputColor;\n";
190 if (m_varyingTestSpec.geometryOutputs == GEOMETRY_TWO)
191 src << " v_frag_0 = inputColor * 0.5;\n"
192 << " v_frag_1 = inputColor.yxzw * 0.5;\n";
194 src << " EmitVertex();\n"
196 if (m_varyingTestSpec.vertexOutputs == VERTEXT_ONE)
197 src << " inputColor = v_geom_0[1];\n";
199 src << " inputColor = vec4(1.0, 0.0, 0.0, 1.0);\n";
201 if (m_varyingTestSpec.vertexOutputs == VERTEXT_NO_OP)
202 src << " gl_Position = vec4(1.0, 0.0, 0.0, 1.0) + offset;\n";
203 if (m_varyingTestSpec.vertexOutputs >= VERTEXT_ZERO)
204 src << " gl_Position = gl_in[1].gl_Position + offset;\n";
206 if (m_varyingTestSpec.geometryOutputs == GEOMETRY_ONE)
207 src << " v_frag_0 = inputColor;\n";
208 if (m_varyingTestSpec.geometryOutputs == GEOMETRY_TWO)
209 src << " v_frag_0 = inputColor * 0.5;\n"
210 << " v_frag_1 = inputColor.yxzw * 0.5;\n";
212 src << " EmitVertex();\n"
215 if (m_varyingTestSpec.vertexOutputs == VERTEXT_ONE)
216 src << " inputColor = v_geom_0[2];\n";
218 src << " inputColor = vec4(1.0, 0.0, 0.0, 1.0);\n";
220 if (m_varyingTestSpec.vertexOutputs == VERTEXT_NO_OP)
221 src << " gl_Position = vec4(1.0, 1.0, 0.0, 1.0) + offset;\n";
222 if (m_varyingTestSpec.vertexOutputs >= VERTEXT_ZERO)
223 src << " gl_Position = gl_in[2].gl_Position + offset;\n";
225 if (m_varyingTestSpec.geometryOutputs == GEOMETRY_ONE)
226 src << " v_frag_0 = inputColor;\n";
227 if (m_varyingTestSpec.geometryOutputs == GEOMETRY_TWO)
228 src << " v_frag_0 = inputColor * 0.5;\n"
229 << " v_frag_1 = inputColor.yxzw * 0.5;\n";
231 src << " EmitVertex();\n"
233 << " EndPrimitive();\n"
235 sourceCollections.glslSources.add("geometry") << glu::GeometrySource(src.str());
239 std::ostringstream src;
240 src << "#version 310 es\n"
241 <<"layout(location = 0) out highp vec4 fragColor;\n";
242 if (m_varyingTestSpec.geometryOutputs >= GEOMETRY_ONE)
243 src <<"layout(location = 0) in highp vec4 v_frag_0;\n";
244 if (m_varyingTestSpec.geometryOutputs == GEOMETRY_TWO)
245 src <<"layout(location = 1) in highp vec4 v_frag_1;\n";
247 src <<"void main (void)\n"
249 if (m_varyingTestSpec.geometryOutputs == GEOMETRY_ZERO)
250 src <<"fragColor = vec4(1.0, 0.0, 0.0, 1.0);\n";
251 if (m_varyingTestSpec.geometryOutputs == GEOMETRY_ONE)
252 src <<" fragColor = v_frag_0;\n";
253 if (m_varyingTestSpec.geometryOutputs == GEOMETRY_TWO)
254 src <<" fragColor = v_frag_0 + v_frag_1.yxzw;\n";
256 sourceCollections.glslSources.add("fragment") << glu::FragmentSource(src.str());
260 TestInstance* VaryingTest::createInstance (Context& context) const
262 return new GeometryVaryingTestInstance(context, getName());
267 TestCaseGroup* createVaryingGeometryShaderTests (TestContext& testCtx)
269 MovePtr<TestCaseGroup> varyingGroup (new TestCaseGroup(testCtx, "varying", "Test varyings."));
273 static const VaryingTestSpec varyingTests[] =
275 { VERTEXT_NO_OP, GEOMETRY_ONE, "vertex_no_op_geometry_out_1", "vertex_no_op_geometry_out_1" },
276 { VERTEXT_ZERO, GEOMETRY_ONE, "vertex_out_0_geometry_out_1", "vertex_out_0_geometry_out_1" },
277 { VERTEXT_ZERO, GEOMETRY_TWO, "vertex_out_0_geometry_out_2", "vertex_out_0_geometry_out_2" },
278 { VERTEXT_ONE, GEOMETRY_ZERO, "vertex_out_1_geometry_out_0", "vertex_out_1_geometry_out_0" },
279 { VERTEXT_ONE, GEOMETRY_TWO, "vertex_out_1_geometry_out_2", "vertex_out_1_geometry_out_2" },
282 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(varyingTests); ++ndx)
283 varyingGroup->addChild(new VaryingTest(testCtx, varyingTests[ndx]));
286 return varyingGroup.release();