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 ~TessellationShadersIsolines(void)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 _test_resultglcts::TessellationShadersIsolines::_test_result95 _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 _test_descriptorglcts::TessellationShadersIsolines::_test_descriptor124 _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