1e5c31af7Sopenharmony_ci#ifndef _ESEXTCTESSELLATIONSHADERTRIANGLES_HPP 2e5c31af7Sopenharmony_ci#define _ESEXTCTESSELLATIONSHADERTRIANGLES_HPP 3e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------- 4e5c31af7Sopenharmony_ci * OpenGL Conformance Test Suite 5e5c31af7Sopenharmony_ci * ----------------------------- 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Copyright (c) 2014-2016 The Khronos Group Inc. 8e5c31af7Sopenharmony_ci * 9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 14e5c31af7Sopenharmony_ci * 15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 19e5c31af7Sopenharmony_ci * limitations under the License. 20e5c31af7Sopenharmony_ci * 21e5c31af7Sopenharmony_ci */ /*! 22e5c31af7Sopenharmony_ci * \file 23e5c31af7Sopenharmony_ci * \brief 24e5c31af7Sopenharmony_ci */ /*-------------------------------------------------------------------*/ 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ci#include "../esextcTestCaseBase.hpp" 27e5c31af7Sopenharmony_ci#include "esextcTessellationShaderUtils.hpp" 28e5c31af7Sopenharmony_ci#include "gluShaderUtil.hpp" 29e5c31af7Sopenharmony_ci#include "tcuDefs.hpp" 30e5c31af7Sopenharmony_ci 31e5c31af7Sopenharmony_cinamespace glcts 32e5c31af7Sopenharmony_ci{ 33e5c31af7Sopenharmony_ci/** A DEQP CTS test group that collects all tests that verify triangle 34e5c31af7Sopenharmony_ci * tessellation. 35e5c31af7Sopenharmony_ci */ 36e5c31af7Sopenharmony_ciclass TessellationShaderTrianglesTests : public glcts::TestCaseGroupBase 37e5c31af7Sopenharmony_ci{ 38e5c31af7Sopenharmony_cipublic: 39e5c31af7Sopenharmony_ci /* Public methods */ 40e5c31af7Sopenharmony_ci TessellationShaderTrianglesTests(glcts::Context& context, const ExtParameters& extParams); 41e5c31af7Sopenharmony_ci 42e5c31af7Sopenharmony_ci virtual ~TessellationShaderTrianglesTests(void) 43e5c31af7Sopenharmony_ci { 44e5c31af7Sopenharmony_ci } 45e5c31af7Sopenharmony_ci 46e5c31af7Sopenharmony_ci void init(void); 47e5c31af7Sopenharmony_ci 48e5c31af7Sopenharmony_ciprivate: 49e5c31af7Sopenharmony_ci /* Private methods */ 50e5c31af7Sopenharmony_ci TessellationShaderTrianglesTests(const TessellationShaderTrianglesTests& other); 51e5c31af7Sopenharmony_ci TessellationShaderTrianglesTests& operator=(const TessellationShaderTrianglesTests& other); 52e5c31af7Sopenharmony_ci}; 53e5c31af7Sopenharmony_ci 54e5c31af7Sopenharmony_ci/** Implementation of Test Caes 29 55e5c31af7Sopenharmony_ci * 56e5c31af7Sopenharmony_ci * Make sure that only a single triangle with (u,v,w) coordinates set to 57e5c31af7Sopenharmony_ci * (0, 0, 1), (1, 0, 0) and (0, 1, 0) is generated by tessellation primitive 58e5c31af7Sopenharmony_ci * generator if the first inner tessellation level and all three outer 59e5c31af7Sopenharmony_ci * tessellation levels are set to one, equal_spacing or 60e5c31af7Sopenharmony_ci * fractional_odd_spacing vertex spacing modes are used AND triangles 61e5c31af7Sopenharmony_ci * geometry is requested. 62e5c31af7Sopenharmony_ci * 63e5c31af7Sopenharmony_ci * The test should capture vertices output in TE stage, given the 64e5c31af7Sopenharmony_ci * pre-conditions described in the test summary, and then verify vertex 65e5c31af7Sopenharmony_ci * locations. Assume epsilon 1e-5. A single triangle should be drawn. 66e5c31af7Sopenharmony_ci * 67e5c31af7Sopenharmony_ci **/ 68e5c31af7Sopenharmony_ciclass TessellationShaderTrianglesDegenerateTriangle : public TestCaseBase 69e5c31af7Sopenharmony_ci{ 70e5c31af7Sopenharmony_cipublic: 71e5c31af7Sopenharmony_ci /* Public methods */ 72e5c31af7Sopenharmony_ci TessellationShaderTrianglesDegenerateTriangle(Context& context, const ExtParameters& extParams); 73e5c31af7Sopenharmony_ci 74e5c31af7Sopenharmony_ci virtual ~TessellationShaderTrianglesDegenerateTriangle(void) 75e5c31af7Sopenharmony_ci { 76e5c31af7Sopenharmony_ci } 77e5c31af7Sopenharmony_ci 78e5c31af7Sopenharmony_ci virtual void deinit(void); 79e5c31af7Sopenharmony_ci void initTest(void); 80e5c31af7Sopenharmony_ci virtual IterateResult iterate(void); 81e5c31af7Sopenharmony_ci 82e5c31af7Sopenharmony_ciprivate: 83e5c31af7Sopenharmony_ci /* Private type definitions */ 84e5c31af7Sopenharmony_ci typedef struct _test_descriptor 85e5c31af7Sopenharmony_ci { 86e5c31af7Sopenharmony_ci glw::GLuint po_id; 87e5c31af7Sopenharmony_ci glw::GLuint te_id; 88e5c31af7Sopenharmony_ci _tessellation_shader_vertex_spacing vertex_spacing; 89e5c31af7Sopenharmony_ci 90e5c31af7Sopenharmony_ci _test_descriptor() 91e5c31af7Sopenharmony_ci { 92e5c31af7Sopenharmony_ci po_id = 0; 93e5c31af7Sopenharmony_ci te_id = 0; 94e5c31af7Sopenharmony_ci vertex_spacing = TESSELLATION_SHADER_VERTEX_SPACING_UNKNOWN; 95e5c31af7Sopenharmony_ci } 96e5c31af7Sopenharmony_ci } _test_descriptor; 97e5c31af7Sopenharmony_ci 98e5c31af7Sopenharmony_ci typedef std::vector<_test_descriptor> _tests; 99e5c31af7Sopenharmony_ci typedef _tests::const_iterator _tests_const_iterator; 100e5c31af7Sopenharmony_ci 101e5c31af7Sopenharmony_ci /* Private methods */ 102e5c31af7Sopenharmony_ci void deinitTestDescriptor(_test_descriptor& test); 103e5c31af7Sopenharmony_ci 104e5c31af7Sopenharmony_ci void initTestDescriptor(_test_descriptor& test, _tessellation_shader_vertex_spacing vertex_spacing); 105e5c31af7Sopenharmony_ci 106e5c31af7Sopenharmony_ci /* Private variables */ 107e5c31af7Sopenharmony_ci glw::GLuint m_bo_id; 108e5c31af7Sopenharmony_ci glw::GLuint m_fs_id; 109e5c31af7Sopenharmony_ci glw::GLuint m_tc_id; 110e5c31af7Sopenharmony_ci glw::GLuint m_vs_id; 111e5c31af7Sopenharmony_ci glw::GLuint m_vao_id; 112e5c31af7Sopenharmony_ci 113e5c31af7Sopenharmony_ci _tests m_tests; 114e5c31af7Sopenharmony_ci}; 115e5c31af7Sopenharmony_ci 116e5c31af7Sopenharmony_ci/** Implementation of Test Case 28 117e5c31af7Sopenharmony_ci * 118e5c31af7Sopenharmony_ci * Make sure that modifying second inner tessellation level and fourth outer 119e5c31af7Sopenharmony_ci * tessellation level does not affect geometry generated by tessellation 120e5c31af7Sopenharmony_ci * primitive generator, while in triangles mode. 121e5c31af7Sopenharmony_ci * 122e5c31af7Sopenharmony_ci * Technical details: 123e5c31af7Sopenharmony_ci * 124e5c31af7Sopenharmony_ci * 0. (adapted bullet 0 from test case 25:) 125e5c31af7Sopenharmony_ci * Consider the following set: {1, MAX_TESS_GEN_LEVEL_EXT / 2, 126e5c31af7Sopenharmony_ci * MAX_TESS_GEN_LEVEL_EXT}. 127e5c31af7Sopenharmony_ci * 128e5c31af7Sopenharmony_ci * 1. For all combinations of values from this set in regard to relevant 129e5c31af7Sopenharmony_ci * inner/outer tessellation levels for triangles generator mode, two 130e5c31af7Sopenharmony_ci * different output vertex sets should be captured in TE: 131e5c31af7Sopenharmony_ci * 1a. One for the configuration set considered; 132e5c31af7Sopenharmony_ci * 1b. The other one for the configuration set with an exception that 133e5c31af7Sopenharmony_ci * second inner tessellation level and fourth outer tessellation level 134e5c31af7Sopenharmony_ci * have been set to 1/4th of the original value. 135e5c31af7Sopenharmony_ci * 2. Test passes if all vertices from the first set can be found in the 136e5c31af7Sopenharmony_ci * second set. (assume epsilon 1e-5) 137e5c31af7Sopenharmony_ci * 138e5c31af7Sopenharmony_ci **/ 139e5c31af7Sopenharmony_ciclass TessellationShaderTrianglesIdenticalTriangles : public TestCaseBase 140e5c31af7Sopenharmony_ci{ 141e5c31af7Sopenharmony_cipublic: 142e5c31af7Sopenharmony_ci /* Public methods */ 143e5c31af7Sopenharmony_ci TessellationShaderTrianglesIdenticalTriangles(Context& context, const ExtParameters& extParams); 144e5c31af7Sopenharmony_ci 145e5c31af7Sopenharmony_ci virtual ~TessellationShaderTrianglesIdenticalTriangles(void) 146e5c31af7Sopenharmony_ci { 147e5c31af7Sopenharmony_ci } 148e5c31af7Sopenharmony_ci 149e5c31af7Sopenharmony_ci virtual void deinit(void); 150e5c31af7Sopenharmony_ci void initTest(void); 151e5c31af7Sopenharmony_ci virtual IterateResult iterate(void); 152e5c31af7Sopenharmony_ci 153e5c31af7Sopenharmony_ciprivate: 154e5c31af7Sopenharmony_ci /* Private type definitions */ 155e5c31af7Sopenharmony_ci typedef struct _run 156e5c31af7Sopenharmony_ci { 157e5c31af7Sopenharmony_ci float base_inner[2]; 158e5c31af7Sopenharmony_ci float base_outer[4]; 159e5c31af7Sopenharmony_ci float reference_inner[2]; 160e5c31af7Sopenharmony_ci float reference_outer[4]; 161e5c31af7Sopenharmony_ci 162e5c31af7Sopenharmony_ci std::vector<char> base_data; 163e5c31af7Sopenharmony_ci std::vector<char> reference_data; 164e5c31af7Sopenharmony_ci unsigned int n_vertices; 165e5c31af7Sopenharmony_ci 166e5c31af7Sopenharmony_ci _run() 167e5c31af7Sopenharmony_ci { 168e5c31af7Sopenharmony_ci memset(base_inner, 0, sizeof(base_inner)); 169e5c31af7Sopenharmony_ci memset(base_outer, 0, sizeof(base_outer)); 170e5c31af7Sopenharmony_ci memset(reference_inner, 0, sizeof(reference_inner)); 171e5c31af7Sopenharmony_ci memset(reference_outer, 0, sizeof(reference_outer)); 172e5c31af7Sopenharmony_ci 173e5c31af7Sopenharmony_ci n_vertices = 0; 174e5c31af7Sopenharmony_ci } 175e5c31af7Sopenharmony_ci } _run; 176e5c31af7Sopenharmony_ci 177e5c31af7Sopenharmony_ci typedef std::vector<_run> _runs; 178e5c31af7Sopenharmony_ci typedef _runs::const_iterator _runs_const_iterator; 179e5c31af7Sopenharmony_ci 180e5c31af7Sopenharmony_ci /* Private variables */ 181e5c31af7Sopenharmony_ci glw::GLuint m_vao_id; 182e5c31af7Sopenharmony_ci _runs m_runs; 183e5c31af7Sopenharmony_ci TessellationShaderUtils* m_utils; 184e5c31af7Sopenharmony_ci}; 185e5c31af7Sopenharmony_ci 186e5c31af7Sopenharmony_ci/** Implementation of Test Case 30 187e5c31af7Sopenharmony_ci * 188e5c31af7Sopenharmony_ci * Consider triangle tessellation. 189e5c31af7Sopenharmony_ci * Make sure that if inner tessellation level is set to one and any of the outer 190e5c31af7Sopenharmony_ci * tessellation levels is greater than one, the inner tessellation level 191e5c31af7Sopenharmony_ci * will be rounded up to two or three, depending on active vertex spacing mode. 192e5c31af7Sopenharmony_ci * 193e5c31af7Sopenharmony_ci * Technical details: 194e5c31af7Sopenharmony_ci * 195e5c31af7Sopenharmony_ci * 0. Consider a set: 196e5c31af7Sopenharmony_ci * 197e5c31af7Sopenharmony_ci * A = {2, MAX_TESS_GEN_LEVEL_EXT / 2, MAX_TESS_GEN_LEVEL_EXT}; 198e5c31af7Sopenharmony_ci * 199e5c31af7Sopenharmony_ci * 1. For all values in A, and for all vertex spacing modes, let x be an 200e5c31af7Sopenharmony_ci * iteration-specific value from the set. 201e5c31af7Sopenharmony_ci * 1a. Assuming an inner tessellation level set to 1 and outer tessellation level 202e5c31af7Sopenharmony_ci * set to x, "draw" a single patch. Capture output vertices from TE stage. 203e5c31af7Sopenharmony_ci * 1b. Assuming an inner tessellation level set to 1 or 2 (depending on how 204e5c31af7Sopenharmony_ci * the rounding should work for iteration-specific vertex ordering mode) 205e5c31af7Sopenharmony_ci * and outer tessellation level set to x, "draw" a single patch. Capture 206e5c31af7Sopenharmony_ci * output vertices from TE stage to another buffer object region. 207e5c31af7Sopenharmony_ci * 1c. Iteration passes if all vertices from the first captured set can be 208e5c31af7Sopenharmony_ci * found in the second captured set. [assume epsilon 1e-5]. 209e5c31af7Sopenharmony_ci * 2. Test passes if all iteration passed successfully. 210e5c31af7Sopenharmony_ci * 211e5c31af7Sopenharmony_ci **/ 212e5c31af7Sopenharmony_ciclass TessellationShaderTrianglesInnerTessellationLevelRounding : public TestCaseBase 213e5c31af7Sopenharmony_ci{ 214e5c31af7Sopenharmony_cipublic: 215e5c31af7Sopenharmony_ci /* Public methods */ 216e5c31af7Sopenharmony_ci TessellationShaderTrianglesInnerTessellationLevelRounding(Context& context, const ExtParameters& extParams); 217e5c31af7Sopenharmony_ci 218e5c31af7Sopenharmony_ci virtual ~TessellationShaderTrianglesInnerTessellationLevelRounding(void) 219e5c31af7Sopenharmony_ci { 220e5c31af7Sopenharmony_ci } 221e5c31af7Sopenharmony_ci 222e5c31af7Sopenharmony_ci virtual void deinit(void); 223e5c31af7Sopenharmony_ci virtual IterateResult iterate(void); 224e5c31af7Sopenharmony_ci void runTestIterations(void); 225e5c31af7Sopenharmony_ci 226e5c31af7Sopenharmony_ciprivate: 227e5c31af7Sopenharmony_ci /* Private type definitions */ 228e5c31af7Sopenharmony_ci typedef struct _run 229e5c31af7Sopenharmony_ci { 230e5c31af7Sopenharmony_ci float set1_inner[2]; 231e5c31af7Sopenharmony_ci float set1_outer[4]; 232e5c31af7Sopenharmony_ci float set2_inner[2]; 233e5c31af7Sopenharmony_ci float set2_outer[4]; 234e5c31af7Sopenharmony_ci _tessellation_shader_vertex_spacing vertex_spacing; 235e5c31af7Sopenharmony_ci 236e5c31af7Sopenharmony_ci std::vector<char> set1_data; 237e5c31af7Sopenharmony_ci std::vector<char> set2_data; 238e5c31af7Sopenharmony_ci unsigned int n_vertices; 239e5c31af7Sopenharmony_ci 240e5c31af7Sopenharmony_ci _run() 241e5c31af7Sopenharmony_ci { 242e5c31af7Sopenharmony_ci memset(set1_inner, 0, sizeof(set1_inner)); 243e5c31af7Sopenharmony_ci memset(set1_outer, 0, sizeof(set1_outer)); 244e5c31af7Sopenharmony_ci memset(set2_inner, 0, sizeof(set2_inner)); 245e5c31af7Sopenharmony_ci memset(set2_outer, 0, sizeof(set2_outer)); 246e5c31af7Sopenharmony_ci 247e5c31af7Sopenharmony_ci n_vertices = 0; 248e5c31af7Sopenharmony_ci vertex_spacing = TESSELLATION_SHADER_VERTEX_SPACING_UNKNOWN; 249e5c31af7Sopenharmony_ci } 250e5c31af7Sopenharmony_ci } _run; 251e5c31af7Sopenharmony_ci 252e5c31af7Sopenharmony_ci typedef std::vector<_run> _runs; 253e5c31af7Sopenharmony_ci typedef _runs::const_iterator _runs_const_iterator; 254e5c31af7Sopenharmony_ci 255e5c31af7Sopenharmony_ci /* Private variables */ 256e5c31af7Sopenharmony_ci glw::GLuint m_vao_id; 257e5c31af7Sopenharmony_ci _runs m_runs; 258e5c31af7Sopenharmony_ci TessellationShaderUtils* m_utils; 259e5c31af7Sopenharmony_ci}; 260e5c31af7Sopenharmony_ci 261e5c31af7Sopenharmony_ci} // namespace glcts 262e5c31af7Sopenharmony_ci 263e5c31af7Sopenharmony_ci#endif // _ESEXTCTESSELLATIONSHADERTRIANGLES_HPP 264