#ifndef _ESEXTCTESSELLATIONSHADERTRIANGLES_HPP #define _ESEXTCTESSELLATIONSHADERTRIANGLES_HPP /*------------------------------------------------------------------------- * OpenGL Conformance Test Suite * ----------------------------- * * Copyright (c) 2014-2016 The Khronos Group Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /*! * \file * \brief */ /*-------------------------------------------------------------------*/ #include "../esextcTestCaseBase.hpp" #include "esextcTessellationShaderUtils.hpp" #include "gluShaderUtil.hpp" #include "tcuDefs.hpp" namespace glcts { /** A DEQP CTS test group that collects all tests that verify triangle * tessellation. */ class TessellationShaderTrianglesTests : public glcts::TestCaseGroupBase { public: /* Public methods */ TessellationShaderTrianglesTests(glcts::Context& context, const ExtParameters& extParams); virtual ~TessellationShaderTrianglesTests(void) { } void init(void); private: /* Private methods */ TessellationShaderTrianglesTests(const TessellationShaderTrianglesTests& other); TessellationShaderTrianglesTests& operator=(const TessellationShaderTrianglesTests& other); }; /** Implementation of Test Caes 29 * * Make sure that only a single triangle with (u,v,w) coordinates set to * (0, 0, 1), (1, 0, 0) and (0, 1, 0) is generated by tessellation primitive * generator if the first inner tessellation level and all three outer * tessellation levels are set to one, equal_spacing or * fractional_odd_spacing vertex spacing modes are used AND triangles * geometry is requested. * * The test should capture vertices output in TE stage, given the * pre-conditions described in the test summary, and then verify vertex * locations. Assume epsilon 1e-5. A single triangle should be drawn. * **/ class TessellationShaderTrianglesDegenerateTriangle : public TestCaseBase { public: /* Public methods */ TessellationShaderTrianglesDegenerateTriangle(Context& context, const ExtParameters& extParams); virtual ~TessellationShaderTrianglesDegenerateTriangle(void) { } virtual void deinit(void); void initTest(void); virtual IterateResult iterate(void); private: /* Private type definitions */ typedef struct _test_descriptor { glw::GLuint po_id; glw::GLuint te_id; _tessellation_shader_vertex_spacing vertex_spacing; _test_descriptor() { po_id = 0; te_id = 0; vertex_spacing = TESSELLATION_SHADER_VERTEX_SPACING_UNKNOWN; } } _test_descriptor; typedef std::vector<_test_descriptor> _tests; typedef _tests::const_iterator _tests_const_iterator; /* Private methods */ void deinitTestDescriptor(_test_descriptor& test); void initTestDescriptor(_test_descriptor& test, _tessellation_shader_vertex_spacing vertex_spacing); /* Private variables */ glw::GLuint m_bo_id; glw::GLuint m_fs_id; glw::GLuint m_tc_id; glw::GLuint m_vs_id; glw::GLuint m_vao_id; _tests m_tests; }; /** Implementation of Test Case 28 * * Make sure that modifying second inner tessellation level and fourth outer * tessellation level does not affect geometry generated by tessellation * primitive generator, while in triangles mode. * * Technical details: * * 0. (adapted bullet 0 from test case 25:) * Consider the following set: {1, MAX_TESS_GEN_LEVEL_EXT / 2, * MAX_TESS_GEN_LEVEL_EXT}. * * 1. For all combinations of values from this set in regard to relevant * inner/outer tessellation levels for triangles generator mode, two * different output vertex sets should be captured in TE: * 1a. One for the configuration set considered; * 1b. The other one for the configuration set with an exception that * second inner tessellation level and fourth outer tessellation level * have been set to 1/4th of the original value. * 2. Test passes if all vertices from the first set can be found in the * second set. (assume epsilon 1e-5) * **/ class TessellationShaderTrianglesIdenticalTriangles : public TestCaseBase { public: /* Public methods */ TessellationShaderTrianglesIdenticalTriangles(Context& context, const ExtParameters& extParams); virtual ~TessellationShaderTrianglesIdenticalTriangles(void) { } virtual void deinit(void); void initTest(void); virtual IterateResult iterate(void); private: /* Private type definitions */ typedef struct _run { float base_inner[2]; float base_outer[4]; float reference_inner[2]; float reference_outer[4]; std::vector base_data; std::vector reference_data; unsigned int n_vertices; _run() { memset(base_inner, 0, sizeof(base_inner)); memset(base_outer, 0, sizeof(base_outer)); memset(reference_inner, 0, sizeof(reference_inner)); memset(reference_outer, 0, sizeof(reference_outer)); n_vertices = 0; } } _run; typedef std::vector<_run> _runs; typedef _runs::const_iterator _runs_const_iterator; /* Private variables */ glw::GLuint m_vao_id; _runs m_runs; TessellationShaderUtils* m_utils; }; /** Implementation of Test Case 30 * * Consider triangle tessellation. * Make sure that if inner tessellation level is set to one and any of the outer * tessellation levels is greater than one, the inner tessellation level * will be rounded up to two or three, depending on active vertex spacing mode. * * Technical details: * * 0. Consider a set: * * A = {2, MAX_TESS_GEN_LEVEL_EXT / 2, MAX_TESS_GEN_LEVEL_EXT}; * * 1. For all values in A, and for all vertex spacing modes, let x be an * iteration-specific value from the set. * 1a. Assuming an inner tessellation level set to 1 and outer tessellation level * set to x, "draw" a single patch. Capture output vertices from TE stage. * 1b. Assuming an inner tessellation level set to 1 or 2 (depending on how * the rounding should work for iteration-specific vertex ordering mode) * and outer tessellation level set to x, "draw" a single patch. Capture * output vertices from TE stage to another buffer object region. * 1c. Iteration passes if all vertices from the first captured set can be * found in the second captured set. [assume epsilon 1e-5]. * 2. Test passes if all iteration passed successfully. * **/ class TessellationShaderTrianglesInnerTessellationLevelRounding : public TestCaseBase { public: /* Public methods */ TessellationShaderTrianglesInnerTessellationLevelRounding(Context& context, const ExtParameters& extParams); virtual ~TessellationShaderTrianglesInnerTessellationLevelRounding(void) { } virtual void deinit(void); virtual IterateResult iterate(void); void runTestIterations(void); private: /* Private type definitions */ typedef struct _run { float set1_inner[2]; float set1_outer[4]; float set2_inner[2]; float set2_outer[4]; _tessellation_shader_vertex_spacing vertex_spacing; std::vector set1_data; std::vector set2_data; unsigned int n_vertices; _run() { memset(set1_inner, 0, sizeof(set1_inner)); memset(set1_outer, 0, sizeof(set1_outer)); memset(set2_inner, 0, sizeof(set2_inner)); memset(set2_outer, 0, sizeof(set2_outer)); n_vertices = 0; vertex_spacing = TESSELLATION_SHADER_VERTEX_SPACING_UNKNOWN; } } _run; typedef std::vector<_run> _runs; typedef _runs::const_iterator _runs_const_iterator; /* Private variables */ glw::GLuint m_vao_id; _runs m_runs; TessellationShaderUtils* m_utils; }; } // namespace glcts #endif // _ESEXTCTESSELLATIONSHADERTRIANGLES_HPP