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