1 #ifndef _ESEXTCTESSELLATIONSHADERPOINTS_HPP 2 #define _ESEXTCTESSELLATIONSHADERPOINTS_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 34 /** A DEQP CTS test group that collects all tests that verify triangle 35 * tessellation. 36 */ 37 class TessellationShaderPointsTests : public glcts::TestCaseGroupBase 38 { 39 public: 40 /* Public methods */ 41 TessellationShaderPointsTests(glcts::Context& context, const ExtParameters& extParams); ~TessellationShaderPointsTests(void)42 virtual ~TessellationShaderPointsTests(void) 43 { 44 } 45 46 virtual void init(void); 47 48 private: 49 /* Private methods */ 50 TessellationShaderPointsTests(const TessellationShaderPointsTests& other); 51 TessellationShaderPointsTests& operator=(const TessellationShaderPointsTests& other); 52 }; 53 54 /** Implementation of Test Case 39 55 * 56 * Assuming the implementation reports maximum point size to be at least 2, 57 * make sure that points are rendered with size as defined by: 58 * 59 * * geometry shader (if present); (*) 60 * * tessellation evaluation shader (if GL_EXT_tessellation_shader and 61 * GL_EXT_tessellation_shader_point_size extensions are supported and no 62 * geometry shader is active); (**) 63 * 64 * Technical details. 65 * 66 * 0. The test should draw points in a few pre-defined locations (screen corners, 67 * center of the draw buffer). 68 * 1a. For case (*), vertex shader should set point size to 0.01, TE should 69 * set point size to 0.1 and GE should set point size to 2 for each 70 * vertex processed. 71 * 1b. For case (**), TE should set the point size to 2 and VE should set it 72 * to 0.1. 73 * 2. The test passes if centers of the rendered points have correct values. 74 * 75 **/ 76 class TessellationShaderPointsgl_PointSize : public TestCaseBase 77 { 78 public: 79 /* Public methods */ 80 TessellationShaderPointsgl_PointSize(Context& context, const ExtParameters& extParams); 81 ~TessellationShaderPointsgl_PointSize(void)82 virtual ~TessellationShaderPointsgl_PointSize(void) 83 { 84 } 85 86 virtual void deinit(); 87 void initTest(void); 88 virtual IterateResult iterate(void); 89 90 private: 91 /* Private type definitions */ 92 typedef struct _test_descriptor 93 { 94 const char* fs_body; 95 const char* gs_body; 96 const char* tes_body; 97 const char* tcs_body; 98 const char* vs_body; 99 100 glw::GLint fs_id; 101 glw::GLint gs_id; 102 glw::GLint tes_id; 103 glw::GLint tcs_id; 104 glw::GLint vs_id; 105 106 glw::GLint draw_call_count; 107 glw::GLint po_id; 108 _test_descriptorglcts::TessellationShaderPointsgl_PointSize::_test_descriptor109 _test_descriptor() 110 { 111 fs_body = NULL; 112 gs_body = NULL; 113 tes_body = NULL; 114 tcs_body = NULL; 115 vs_body = NULL; 116 117 fs_id = 0; 118 gs_id = 0; 119 tes_id = 0; 120 tcs_id = 0; 121 vs_id = 0; 122 123 draw_call_count = 0; 124 po_id = 0; 125 } 126 } _test_descriptor; 127 128 typedef std::vector<_test_descriptor> _tests; 129 typedef _tests::iterator _tests_iterator; 130 131 /* Private methods */ 132 133 /* Private variables */ 134 _tests m_tests; 135 136 glw::GLuint m_fbo_id; 137 glw::GLuint m_to_id; 138 glw::GLuint m_vao_id; 139 140 static const unsigned int m_rt_height; 141 static const unsigned int m_rt_width; 142 }; 143 144 /** Implementation of Test Case 27 145 * 146 * Make sure that point mode enabled in a tessellation evaluation shader 147 * affects geometry generated by tessellation primitive generator. Iterate 148 * over all vertex spacing modes. 149 * Cover all three tessellation primitive generator modes (triangles, quads, 150 * isolines). 151 * 152 * Technical details: 153 * 154 * 0. Consider the following set: {-1 (where valid), 1, MAX_TESS_GEN_LEVEL_EXT / 2, 155 * MAX_TESS_GEN_LEVEL_EXT}. All combinations of values from this set 156 * in regard to relevant inner/outer tessellation levels for all 157 * primitive generator modes should be checked by this test. 158 * 159 * 1. TE should capture output points. Captured vertices should not 160 * duplicate and their amount should be exactly as defined in the spec 161 * for the (inner tessellation level, outer tessellation level, output 162 * geometry) combination considered. 163 * 164 * This test implementation skips configurations meeting all of the following 165 * properties: 166 * 167 * - primitive mode: QUADS or TRIANGLES 168 * - vertex spacing mode: FRACTIONAL ODD 169 * - inner tess level[0]: <= 1 170 * - inner tess level[1]: <= 1 171 * 172 * These configurations are affected by a nuance described in greater 173 * detail in Khronos Bugzilla#11979, which this test cannot handle. 174 * 175 **/ 176 class TessellationShaderPointsVerification : public TestCaseBase 177 { 178 public: 179 /* Public methods */ 180 TessellationShaderPointsVerification(Context& context, const ExtParameters& extParams); 181 ~TessellationShaderPointsVerification(void)182 virtual ~TessellationShaderPointsVerification(void) 183 { 184 } 185 186 virtual void deinit(void); 187 void initTest(void); 188 virtual IterateResult iterate(void); 189 190 private: 191 /* Private declarations */ 192 typedef struct _run 193 { 194 float inner[2]; 195 float outer[4]; 196 _tessellation_primitive_mode primitive_mode; 197 _tessellation_shader_vertex_spacing vertex_spacing; 198 _runglcts::TessellationShaderPointsVerification::_run199 _run() 200 { 201 memset(inner, 0, sizeof(inner)); 202 memset(outer, 0, sizeof(outer)); 203 204 primitive_mode = TESSELLATION_SHADER_PRIMITIVE_MODE_UNKNOWN; 205 vertex_spacing = TESSELLATION_SHADER_VERTEX_SPACING_UNKNOWN; 206 } 207 } _run; 208 209 /* Private methods */ 210 void verifyCorrectAmountOfDuplicateVertices(const _run& run, const void* run_data, unsigned int run_n_vertices); 211 212 void verifyCorrectAmountOfVertices(const _run& run, const void* run_data, unsigned int run_n_vertices); 213 214 /* Private variables */ 215 std::vector<_run> m_runs; 216 TessellationShaderUtils* m_utils; 217 glw::GLuint m_vao_id; 218 }; 219 220 } // namespace glcts 221 222 #endif // _ESEXTCTESSELLATIONSHADERPOINTS_HPP 223