• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _ESEXTCTESSELLATIONSHADERTRIANGLES_HPP
2 #define _ESEXTCTESSELLATIONSHADERTRIANGLES_HPP
3 /*-------------------------------------------------------------------------
4  * OpenGL Conformance Test Suite
5  * -----------------------------
6  *
7  * Copyright (c) 2014-2016 The Khronos Group Inc.
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  */ /*!
22  * \file
23  * \brief
24  */ /*-------------------------------------------------------------------*/
25 
26 #include "../esextcTestCaseBase.hpp"
27 #include "esextcTessellationShaderUtils.hpp"
28 #include "gluShaderUtil.hpp"
29 #include "tcuDefs.hpp"
30 
31 namespace glcts
32 {
33 /** A DEQP CTS test group that collects all tests that verify triangle
34  *  tessellation.
35  */
36 class TessellationShaderTrianglesTests : public glcts::TestCaseGroupBase
37 {
38 public:
39 	/* Public methods */
40 	TessellationShaderTrianglesTests(glcts::Context& context, const ExtParameters& extParams);
41 
~TessellationShaderTrianglesTests(void)42 	virtual ~TessellationShaderTrianglesTests(void)
43 	{
44 	}
45 
46 	void init(void);
47 
48 private:
49 	/* Private methods */
50 	TessellationShaderTrianglesTests(const TessellationShaderTrianglesTests& other);
51 	TessellationShaderTrianglesTests& operator=(const TessellationShaderTrianglesTests& other);
52 };
53 
54 /** Implementation of Test Caes 29
55  *
56  *  Make sure that only a single triangle with (u,v,w) coordinates set to
57  *  (0, 0, 1), (1, 0, 0) and (0, 1, 0) is generated by tessellation primitive
58  *  generator if the first inner tessellation level and all three outer
59  *  tessellation levels are set to one, equal_spacing or
60  *  fractional_odd_spacing vertex spacing modes are used AND triangles
61  *  geometry is requested.
62  *
63  *  The test should capture vertices output in TE stage, given the
64  *  pre-conditions described in the test summary, and then verify vertex
65  *  locations. Assume epsilon 1e-5. A single triangle should be drawn.
66  *
67  **/
68 class TessellationShaderTrianglesDegenerateTriangle : public TestCaseBase
69 {
70 public:
71 	/* Public methods */
72 	TessellationShaderTrianglesDegenerateTriangle(Context& context, const ExtParameters& extParams);
73 
~TessellationShaderTrianglesDegenerateTriangle(void)74 	virtual ~TessellationShaderTrianglesDegenerateTriangle(void)
75 	{
76 	}
77 
78 	virtual void		  deinit(void);
79 	void				  initTest(void);
80 	virtual IterateResult iterate(void);
81 
82 private:
83 	/* Private type definitions */
84 	typedef struct _test_descriptor
85 	{
86 		glw::GLuint							po_id;
87 		glw::GLuint							te_id;
88 		_tessellation_shader_vertex_spacing vertex_spacing;
89 
_test_descriptorglcts::TessellationShaderTrianglesDegenerateTriangle::_test_descriptor90 		_test_descriptor()
91 		{
92 			po_id		   = 0;
93 			te_id		   = 0;
94 			vertex_spacing = TESSELLATION_SHADER_VERTEX_SPACING_UNKNOWN;
95 		}
96 	} _test_descriptor;
97 
98 	typedef std::vector<_test_descriptor> _tests;
99 	typedef _tests::const_iterator		  _tests_const_iterator;
100 
101 	/* Private methods */
102 	void deinitTestDescriptor(_test_descriptor& test);
103 
104 	void initTestDescriptor(_test_descriptor& test, _tessellation_shader_vertex_spacing vertex_spacing);
105 
106 	/* Private variables */
107 	glw::GLuint m_bo_id;
108 	glw::GLuint m_fs_id;
109 	glw::GLuint m_tc_id;
110 	glw::GLuint m_vs_id;
111 	glw::GLuint m_vao_id;
112 
113 	_tests m_tests;
114 };
115 
116 /** Implementation of Test Case 28
117  *
118  *  Make sure that modifying second inner tessellation level and fourth outer
119  *  tessellation level does not affect geometry generated by tessellation
120  *  primitive generator, while in triangles mode.
121  *
122  *  Technical details:
123  *
124  *  0. (adapted bullet 0 from test case 25:)
125  *     Consider the following set: {1, MAX_TESS_GEN_LEVEL_EXT / 2,
126  *     MAX_TESS_GEN_LEVEL_EXT}.
127  *
128  *  1. For all combinations of values from this set in regard to relevant
129  *     inner/outer tessellation levels for triangles generator mode, two
130  *     different output vertex sets should be captured in TE:
131  *  1a. One for the configuration set considered;
132  *  1b. The other one for the configuration set with an exception that
133  *      second inner tessellation level and fourth outer tessellation level
134  *      have been set to 1/4th of the original value.
135  *  2. Test passes if all vertices from the first set can be found in the
136  *     second set. (assume epsilon 1e-5)
137  *
138  **/
139 class TessellationShaderTrianglesIdenticalTriangles : public TestCaseBase
140 {
141 public:
142 	/* Public methods */
143 	TessellationShaderTrianglesIdenticalTriangles(Context& context, const ExtParameters& extParams);
144 
~TessellationShaderTrianglesIdenticalTriangles(void)145 	virtual ~TessellationShaderTrianglesIdenticalTriangles(void)
146 	{
147 	}
148 
149 	virtual void		  deinit(void);
150 	void				  initTest(void);
151 	virtual IterateResult iterate(void);
152 
153 private:
154 	/* Private type definitions */
155 	typedef struct _run
156 	{
157 		float base_inner[2];
158 		float base_outer[4];
159 		float reference_inner[2];
160 		float reference_outer[4];
161 
162 		std::vector<char> base_data;
163 		std::vector<char> reference_data;
164 		unsigned int	  n_vertices;
165 
_runglcts::TessellationShaderTrianglesIdenticalTriangles::_run166 		_run()
167 		{
168 			memset(base_inner, 0, sizeof(base_inner));
169 			memset(base_outer, 0, sizeof(base_outer));
170 			memset(reference_inner, 0, sizeof(reference_inner));
171 			memset(reference_outer, 0, sizeof(reference_outer));
172 
173 			n_vertices = 0;
174 		}
175 	} _run;
176 
177 	typedef std::vector<_run>	 _runs;
178 	typedef _runs::const_iterator _runs_const_iterator;
179 
180 	/* Private variables */
181 	glw::GLuint				 m_vao_id;
182 	_runs					 m_runs;
183 	TessellationShaderUtils* m_utils;
184 };
185 
186 /**  Implementation of Test Case 30
187  *
188  *   Consider triangle tessellation.
189  *   Make sure that if inner tessellation level is set to one and any of the outer
190  *   tessellation levels is greater than one, the inner tessellation level
191  *   will be rounded up to two or three, depending on active vertex spacing mode.
192  *
193  *   Technical details:
194  *
195  *   0. Consider a set:
196  *
197  *      A = {2, MAX_TESS_GEN_LEVEL_EXT / 2, MAX_TESS_GEN_LEVEL_EXT};
198  *
199  *   1. For all values in A, and for all vertex spacing modes, let x be an
200  *      iteration-specific value from the set.
201  *   1a. Assuming an inner tessellation level set to 1 and outer tessellation level
202  *       set to x, "draw" a single patch. Capture output vertices from TE stage.
203  *   1b. Assuming an inner tessellation level set to 1 or 2 (depending on how
204  *       the rounding should work for iteration-specific vertex ordering mode)
205  *       and outer tessellation level set to x, "draw" a single patch. Capture
206  *       output vertices from TE stage to another buffer object region.
207  *   1c. Iteration passes if all vertices from the first captured set can be
208  *       found in the second captured set. [assume epsilon 1e-5].
209  *   2. Test passes if all iteration passed successfully.
210  *
211  **/
212 class TessellationShaderTrianglesInnerTessellationLevelRounding : public TestCaseBase
213 {
214 public:
215 	/* Public methods */
216 	TessellationShaderTrianglesInnerTessellationLevelRounding(Context& context, const ExtParameters& extParams);
217 
~TessellationShaderTrianglesInnerTessellationLevelRounding(void)218 	virtual ~TessellationShaderTrianglesInnerTessellationLevelRounding(void)
219 	{
220 	}
221 
222 	virtual void		  deinit(void);
223 	virtual IterateResult iterate(void);
224 	void				  runTestIterations(void);
225 
226 private:
227 	/* Private type definitions */
228 	typedef struct _run
229 	{
230 		float								set1_inner[2];
231 		float								set1_outer[4];
232 		float								set2_inner[2];
233 		float								set2_outer[4];
234 		_tessellation_shader_vertex_spacing vertex_spacing;
235 
236 		std::vector<char> set1_data;
237 		std::vector<char> set2_data;
238 		unsigned int	  n_vertices;
239 
_runglcts::TessellationShaderTrianglesInnerTessellationLevelRounding::_run240 		_run()
241 		{
242 			memset(set1_inner, 0, sizeof(set1_inner));
243 			memset(set1_outer, 0, sizeof(set1_outer));
244 			memset(set2_inner, 0, sizeof(set2_inner));
245 			memset(set2_outer, 0, sizeof(set2_outer));
246 
247 			n_vertices	 = 0;
248 			vertex_spacing = TESSELLATION_SHADER_VERTEX_SPACING_UNKNOWN;
249 		}
250 	} _run;
251 
252 	typedef std::vector<_run>	 _runs;
253 	typedef _runs::const_iterator _runs_const_iterator;
254 
255 	/* Private variables */
256 	glw::GLuint				 m_vao_id;
257 	_runs					 m_runs;
258 	TessellationShaderUtils* m_utils;
259 };
260 
261 } // namespace glcts
262 
263 #endif // _ESEXTCTESSELLATIONSHADERTRIANGLES_HPP
264