1 #ifndef _ESEXTCTESSELLATIONSHADERPRIMITIVECOVERAGE_HPP
2 #define _ESEXTCTESSELLATIONSHADERPRIMITIVECOVERAGE_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 /*!
27  * \file esextcTessellationShaderPrimitiveCoverage.hpp
28  * \brief TessellationShadePrimitiveCoverage (Test 31)
29  */ /*-------------------------------------------------------------------*/
30 
31 #include "../esextcTestCaseBase.hpp"
32 #include "esextcTessellationShaderUtils.hpp"
33 #include "gluShaderUtil.hpp"
34 #include "tcuDefs.hpp"
35 
36 namespace glcts
37 {
38 /** Implementation of Test 31 from CTS_EXT_tessellation_shader. Description follows:
39  *
40  *  Assume this test is run separately for a tessellated full-screen triangle
41  *  and a tessellated full-screen quad.
42  *  Using a stencil buffer, make sure that the whole domain is always
43  *  covered by exactly one triangle generated during the process of tessellation.
44  *  Make sure that the whole domain is covered by the set of all triangles
45  *  generated during the process of tessellation.
46  *
47  *    Category: Functional Test.
48  *    Priority: Must-Have
49  */
50 class TessellationShaderPrimitiveCoverage : public TestCaseBase
51 {
52 public:
53     /* Public methods */
54     TessellationShaderPrimitiveCoverage(Context &context, const ExtParameters &extParams);
55 
~TessellationShaderPrimitiveCoverage()56     virtual ~TessellationShaderPrimitiveCoverage()
57     {
58     }
59 
60     virtual void deinit(void);
61     virtual IterateResult iterate(void);
62 
63 private:
64     /* Private methods */
65     void initBufferObjects(void);
66     void initFramebuffer(void);
67     void initProgramObjects(void);
68     void initTest(void);
69 
70     void drawPatch(glw::GLuint po_id, glw::GLuint n_patch_vertices, glw::GLuint n_draw_call_vertices,
71                    const glw::GLfloat inner_levels[], const glw::GLfloat outer_levels[]);
72 
73     bool verifyDrawBufferContents(void);
74 
75     /* Private variables */
76     glw::GLuint m_vao_id;                       /* name of vertex array object */
77     glw::GLuint m_quad_tessellation_po_id;      /* name of program object that performs quad tessellation */
78     glw::GLuint m_stencil_verification_po_id;   /* name of program object for stencil setup */
79     glw::GLuint m_triangles_tessellation_po_id; /* name of program object that performs triangle tessellation */
80 
81     glw::GLuint m_bo_id; /* name of a buffer object used to hold input vertex data */
82 
83     glw::GLuint m_fs_id; /* name of fragment shader object */
84     glw::GLuint
85         m_quad_tessellation_tcs_id; /* name of tessellation control    shader object that performs quad tessellation */
86     glw::GLuint
87         m_quad_tessellation_tes_id; /* name of tessellation evaluation shader object that performs quad tessellation */
88     glw::GLuint
89         m_triangles_tessellation_tcs_id; /* name of tessellation control    shader object that performs triangle tessellation */
90     glw::GLuint
91         m_triangles_tessellation_tes_id; /* name of tessellation evaluation shader object that performs triangle tessellation */
92     glw::GLuint m_vs_id;                 /* nameof vertex shader object */
93 
94     glw::GLuint m_fbo_id;         /* name of a framebuffer object */
95     glw::GLuint m_color_rbo_id;   /* name of a renderbuffer object to be used as color attachment */
96     glw::GLuint m_stencil_rbo_id; /* name of a renderbuffer object to be used as stencil attachment */
97 
98     static const char *m_fs_code;                         /* fragment shader source code */
99     static const char *m_quad_tessellation_tcs_code;      /* tessellation control    shader source code */
100     static const char *m_quad_tessellation_tes_code;      /* tessellation evaluation shader source code */
101     static const char *m_triangles_tessellation_tcs_code; /* tessellation control    shader source code */
102     static const char *m_triangles_tessellation_tes_code; /* tessellation evaluation shader source code */
103     static const char *m_vs_code;                         /* vertex shader source code */
104 
105     static const glw::GLuint m_height;       /* height of the rendering area */
106     static const glw::GLuint m_n_components; /* number of components used by a single texel */
107     static const glw::GLuint m_width;        /* width of the rendering area */
108 
109     static const glw::GLfloat m_clear_color[4];           /* clear color */
110     static const glw::GLfloat m_stencil_pass_color[4];    /* primitive color when stencil fails */
111     glw::GLubyte *m_rendered_data_buffer;                 /* pixel buffer for fetched data */
112     static const glw::GLuint m_rendered_data_buffer_size; /* pixel buffer size */
113 };
114 
115 } // namespace glcts
116 
117 #endif // _ESEXTCTESSELLATIONSHADERPRIMITIVECOVERAGE_HPP
118