Home | History | Annotate | Download | only in tessellation_shader
      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 
     33 namespace 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  **/
     60 class TessellationShadersIsolines : public TestCaseBase
     61 {
     62 public:
     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 
     73 private:
     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