• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _ESEXTCGEOMETRYSHADERNONARRAYINPUT_HPP
2 #define _ESEXTCGEOMETRYSHADERNONARRAYINPUT_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 
28 namespace glcts
29 {
30 /** Implementation of "Group 4" from CTS_EXT_geometry_shader. Description follows:
31  *
32  * 1. Make sure GLES implementation does not accept non-array input variables
33  *    in geometry shaders. Geometry shaders using unsized array-based input
34  *    variables and blocks should not be detrimental to the linking process.
35  *
36  *    Category : API;
37  *               Negative & positive tests.
38  *
39  *    Create two program objects, a boilerplate fragment shader object and two
40  *    vertex shader objects.
41  *
42  *    Create a geometry shader object A. The implementation should not use any
43  *    interface blocks - all input variables (discussed below) should be
44  *    located in the default interface block. Variable named v4 should lack
45  *    array brackets (as required by the spec). A corresponding vertex shader
46  *    object A should output all variables(see later discussion) expected by
47  *    the geometry shader, so that the interfaces match.
48  *
49  *    Create a geometry shader object B. The implementation should use a single
50  *    input interface block *not* being declared as an unsized array (opposite
51  *    to spec requirements). A corresponding vertex shader object B should
52  *    output the interface block, so that that interfaces match. Both stages
53  *    should use variables as discussed in next paragraph.
54  *
55  *    Vertex shader stage should output the following variables (in a separate
56  *    output interface block or in the default one, depending on geometry
57  *    shader object considered):
58  *
59  *    * vec4 v1 (set to (-1, -1, 0, 1) )
60  *    * vec4 v2 (set to (-1,  1, 0, 1) )
61  *    * vec4 v3 (set to ( 1, -1, 0, 1) )
62  *    * vec4 v4 (set to ( 1,  1, 0, 1) )
63  *
64  *    Both geometry shaders should take points on input and output a triangle
65  *    strip, consisting of a maximum of 4 vertices. For each input point, they
66  *    should emit 4 vertices, of which coordinates are subsequently described
67  *    by vectors v1, v2, v3 and v4.
68  *
69  *    Fragment shader stage should set output vec4 variable to (0, 255, 0, 255).
70  *
71  *    Program object A should use fragment shader object as described above,
72  *    geometry shader object A and vertex shader object A.
73  *    Program object B should use fragment shader object as described above,
74  *    geometry shader object B and vertex shader object B.
75  *
76  *    Both program objects A and B are expected not to link correctly (their
77  *    GL_LINK_STATUS after linking should be reported as GL_FALSE).
78  *
79  *    Delete both program objects and geometry shader objects. Geometry shader
80  *    objects should now use a slightly modified implementation where the input
81  *    variables and the interface block is correctly defined as unsized array.
82  *
83  *    Attach all shaders to corresponding program objects, compile them, link
84  *    program objects. Both program objects should now link correctly.
85  *
86  *    The test should now set up a FBO. A 2D texture of 4x4 resolution using
87  *    GL_RGBA8 internal format should be attached to its color attachment 0.
88  *
89  *    The test should generate and bind a vertex array object, as well as the
90  *    framebuffer object.
91  *
92  *    For each program object, the test should clear the color buffer with
93  *    (255, 0, 0, 0) color and then draw a single point. The test passes if all
94  *    of the texels of the texture attached to color attachment 0 are equal to
95  *    (0, 255, 0, 255).
96  */
97 
98 class GeometryShaderNonarrayInputCase : public TestCaseBase
99 {
100 public:
101 	/* Public methods */
102 	GeometryShaderNonarrayInputCase(Context& context, const ExtParameters& extParams, const char* name,
103 									const char* description);
104 
~GeometryShaderNonarrayInputCase(void)105 	virtual ~GeometryShaderNonarrayInputCase(void)
106 	{
107 	}
108 
109 	void		  deinit(void);
110 	IterateResult iterate(void);
111 
112 protected:
113 	/* Protected variables */
114 	glw::GLuint m_fbo_id;
115 	glw::GLuint m_fs;
116 	glw::GLuint m_gs_invalid_non_ib;
117 	glw::GLuint m_gs_invalid_ib;
118 	glw::GLuint m_gs_valid_non_ib;
119 	glw::GLuint m_gs_valid_ib;
120 	glw::GLuint m_po_a_invalid;
121 	glw::GLuint m_po_b_invalid;
122 	glw::GLuint m_po_a_valid;
123 	glw::GLuint m_po_b_valid;
124 	glw::GLuint m_to_id;
125 	glw::GLuint m_vao_id;
126 	glw::GLuint m_vs_valid_ib;
127 	glw::GLuint m_vs_valid_non_ib;
128 
129 	static const char* m_fs_code;
130 	static const char* m_gs_code_preamble;
131 	static const char* m_gs_code_body;
132 	static const char* m_vs_code_preamble;
133 	static const char* m_vs_code_body;
134 };
135 
136 } // namespace glcts
137 
138 #endif // _ESEXTCGEOMETRYSHADERNONARRAYINPUT_HPP
139