1#ifndef _ESEXTCTESSELLATIONSHADERISOLINES_HPP
2#define _ESEXTCTESSELLATIONSHADERISOLINES_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#include <map>
31#include <vector>
32
33namespace glcts
34{
35/** Implementation of Test Case 34
36 *
37 *  Consider isoline tessellation.
38 *  Make sure that the number of isolines generated is derived from the first
39 *  outer tessellation level;
40 *  Make sure that the number of segments in each isoline is derived
41 *  from the second outer tessellation level.
42 *  Make sure that both inner tessellation levels and the third and the fourth
43 *  outer tessellation levels do not affect the tessellation process.
44 *  Make sure that 'equal_spacing' vertex spacing mode is always used for
45 *  vertical subdivision of the input quad.
46 *  Make sure no line is drawn between (0, 1) and (1, 1) in (u, v) domain.
47 *
48 *  0. Consider the following set: {-1, 1, MAX_TESS_GEN_LEVEL_EXT / 2,
49 *     MAX_TESS_GEN_LEVEL_EXT}. All combinations of values from this set
50 *     in regard to the first two outer tessellation levels for isolines
51 *     generator mode should be checked by this test.
52 *  1. For each combination and case described in the test summary, output
53 *     vertices processed by TE should be XFBed and verified by the test
54 *     implementation.
55 *  2. For the case where we verify that inner tessellation level and
56 *     the 3rd and the 4th outer tessellation levels are ignored,
57 *     the test should work along the lines of test case 28.
58 *
59 **/
60class TessellationShadersIsolines : public TestCaseBase
61{
62public:
63	/* Public methods */
64	TessellationShadersIsolines(Context& context, const ExtParameters& extParams);
65
66	virtual ~TessellationShadersIsolines(void)
67	{
68	}
69
70	virtual void		  deinit(void);
71	virtual IterateResult iterate(void);
72
73private:
74	/* Forward declarations */
75	struct _test_descriptor;
76
77	/* Private type definitions */
78	/** Stores:
79	 *
80	 *  a) properties used to generate tessellated coordinates.
81	 *  b) pointer to owning test descriptor
82	 *  c) captured tessellated coordinates.
83	 **/
84	typedef struct _test_result
85	{
86		unsigned int			n_isolines;
87		unsigned int			n_vertices;
88		const _test_descriptor* parent;
89		std::vector<float>		rendered_data;
90
91		int irrelevant_tess_level;
92		int outer1_tess_level;
93		int outer2_tess_level;
94
95		_test_result()
96		{
97			n_isolines = 0;
98			n_vertices = 0;
99			parent	 = DE_NULL;
100			rendered_data.clear();
101
102			irrelevant_tess_level = 0;
103			outer1_tess_level	 = 0;
104			outer2_tess_level	 = 0;
105		}
106	} _test_result;
107
108	/** Encapsulates:
109	 *
110	 *  a) Tessellation properties corresponding to what is set
111	 *     in TC and TE stages, when the particular program object
112	 *     is used for draw calls.
113	 *  b) Pointer to test instance.
114	 **/
115	typedef struct _test_descriptor
116	{
117		TessellationShadersIsolines* parent;
118
119		float								inner_tess_levels[2];
120		float								irrelevant_tess_level;
121		float								outer_tess_levels[4];
122		_tessellation_shader_vertex_spacing vertex_spacing_mode;
123
124		_test_descriptor() : irrelevant_tess_level(0)
125		{
126			parent = DE_NULL;
127
128			memset(inner_tess_levels, 0, sizeof(inner_tess_levels));
129			memset(outer_tess_levels, 0, sizeof(outer_tess_levels));
130
131			vertex_spacing_mode = TESSELLATION_SHADER_VERTEX_SPACING_UNKNOWN;
132		}
133	} _test_descriptor;
134
135	/** Function pointer used to refer to verification functions that operate on
136	 *  a single test result descriptor.
137	 **/
138	typedef void (*PFNTESTRESULTPROCESSORPROC)(_test_result& test_result, glw::GLenum glToken);
139
140	typedef std::vector<_test_descriptor> _tests;
141	typedef _tests::const_iterator		  _tests_const_iterator;
142	typedef _tests::iterator			  _tests_iterator;
143	typedef std::map<_tessellation_shader_vertex_spacing, _tests> _tests_per_vertex_spacing_map;
144	typedef _tests_per_vertex_spacing_map::const_iterator _tests_per_vertex_spacing_map_const_iterator;
145	typedef _tests_per_vertex_spacing_map::iterator		  _tests_per_vertex_spacing_map_iterator;
146	typedef std::vector<_test_result>					  _test_results;
147	typedef _test_results::iterator						  _test_results_iterator;
148	typedef std::map<_tessellation_shader_vertex_spacing, _test_results> _test_results_per_vertex_spacing_map;
149	typedef _test_results_per_vertex_spacing_map::const_iterator _test_results_per_vertex_spacing_map_const_iterator;
150	typedef _test_results_per_vertex_spacing_map::iterator		 _test_results_per_vertex_spacing_map_iterator;
151
152	typedef int _irrelevant_tess_level;
153	typedef int _outer1_tess_level;
154	typedef int _outer2_tess_level;
155
156	/* Private methods */
157	void countIsolines(_test_result& test_result);
158
159	_test_result findTestResult(_irrelevant_tess_level irrelevant_tess_level, _outer1_tess_level outer1_tess_level,
160								_outer2_tess_level					outer2_tess_level,
161								_tessellation_shader_vertex_spacing vertex_spacing_mode);
162
163	Context& getContext();
164	void	 initTest(void);
165
166	void initTestDescriptor(_tessellation_shader_vertex_spacing vertex_spacing_mode, const float* inner_tess_levels,
167							const float* outer_tess_levels, float irrelevant_tess_level, _test_descriptor& test);
168
169	void runForAllTestResults(PFNTESTRESULTPROCESSORPROC pProcessTestResult);
170
171	static void checkFirstOuterTessellationLevelEffect(_test_result&	 test_result,
172													   const glw::GLenum glMaxTessGenLevelToken);
173
174	void checkIrrelevantTessellationLevelsHaveNoEffect();
175
176	static void checkNoLineSegmentIsDefinedAtHeightOne(_test_result& test_result, const glw::GLenum unused);
177
178	static void checkSecondOuterTessellationLevelEffect(_test_result&	 test_result,
179														const glw::GLenum glMaxTessGenLevelToken);
180
181	void checkVertexSpacingDoesNotAffectAmountOfGeneratedIsolines();
182
183	/* Private variables */
184	float m_irrelevant_tess_value_1;
185	float m_irrelevant_tess_value_2;
186
187	_test_results_per_vertex_spacing_map m_test_results;
188	_tests_per_vertex_spacing_map		 m_tests;
189	TessellationShaderUtils*			 m_utils_ptr;
190	glw::GLuint							 m_vao_id;
191};
192
193} // namespace glcts
194
195#endif // _ESEXTCTESSELLATIONSHADERISOLINES_HPP
196