Home | History | Annotate | Download | only in tessellation_shader
      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 
     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 
     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 
     90 		_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 
    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 
    166 		_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 
    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 
    240 		_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