xref: /aosp_15_r20/external/deqp/external/openglcts/modules/gl/gl3cGPUShader5Tests.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1 #ifndef _GL3CGPUSHADER5TESTS_HPP
2 #define _GL3CGPUSHADER5TESTS_HPP
3 /*-------------------------------------------------------------------------
4  * OpenGL Conformance Test Suite
5  * -----------------------------
6  *
7  * Copyright (c) 2015-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  gl3cGPUShader5Tests.hpp
28  * \brief Declares test classes for "GPU Shader 5" functionality.
29  */ /*-------------------------------------------------------------------*/
30 
31 #include "glcTestCase.hpp"
32 #include "glwDefs.hpp"
33 #include "glwEnums.hpp"
34 #include "tcuDefs.hpp"
35 #include "tcuVector.hpp"
36 #include <queue>
37 
38 namespace gl3cts
39 {
40 class Utils
41 {
42 public:
43     /* Public type definitions */
44     /* Defines GLSL variable type */
45     enum _variable_type
46     {
47         VARIABLE_TYPE_FLOAT,
48         VARIABLE_TYPE_INT,
49         VARIABLE_TYPE_IVEC2,
50         VARIABLE_TYPE_IVEC3,
51         VARIABLE_TYPE_IVEC4,
52         VARIABLE_TYPE_UINT,
53         VARIABLE_TYPE_UVEC2,
54         VARIABLE_TYPE_UVEC3,
55         VARIABLE_TYPE_UVEC4,
56         VARIABLE_TYPE_VEC2,
57         VARIABLE_TYPE_VEC3,
58         VARIABLE_TYPE_VEC4,
59 
60         /* Always last */
61         VARIABLE_TYPE_UNKNOWN
62     };
63 
64     /** Store information about program object
65      *
66      **/
67     struct programInfo
68     {
69         programInfo(deqp::Context &context);
70         ~programInfo();
71 
72         void build(const glw::GLchar *fragment_shader_code, const glw::GLchar *vertex_shader_code);
73         void compile(glw::GLuint shader_id, const glw::GLchar *shader_code) const;
74         void link() const;
75 
76         void setUniform(Utils::_variable_type type, const glw::GLchar *name, const glw::GLvoid *data);
77 
78         deqp::Context &m_context;
79 
80         glw::GLuint m_fragment_shader_id;
81         glw::GLuint m_program_object_id;
82         glw::GLuint m_vertex_shader_id;
83     };
84 
85     /* Public static methods */
86     static void replaceToken(const glw::GLchar *token, size_t &search_position, const glw::GLchar *text,
87                              std::string &string);
88 };
89 
90 /** Implements ImplicitConversions test, description follows:
91  *
92  * Verifies that compiler accepts implicit conversions and the results of
93  * implicit conversions are the same as explicit conversions.
94  *
95  * Steps:
96  * - prepare a program consisting of vertex and fragment shader; Vertex shader
97  * should implement the following snippet:
98  *
99  *   uniform SOURCE_TYPE u1;
100  *   uniform SOURCE_TYPE u2;
101  *
102  *   out vec4 result;
103  *
104  *   void main()
105  *   {
106  *     DESTINATION_TYPE v = 0;
107  *
108  *     v = DESTINATION_TYPE(u2) - u1;
109  *
110  *     result = vec4(0.0, 0.0, 0.0, 0.0);
111  *
112  *     if (0 == v)
113  *     {
114  *       result = vec4(1.0, 1.0, 1.0, 1.0);
115  *     }
116  *   }
117  *
118  * Fragment shader should pass result from vertex shader to output color.
119  * - it is expected that program will link without any errors;
120  * - set u1 and u2 with different values;
121  * - draw fullscreen quad;
122  * - it is expected that drawn image is filled with black color;
123  * - set u1 and u2 with the same value;
124  * - draw fullscreen quad;
125  * - it is expected that drawn image is filled with white color;
126  *
127  * Repeat steps for the following pairs:
128  *
129  *   int   - uint
130  *   int   - float
131  *   ivec2 - uvec2
132  *   ivec3 - uvec3
133  *   ivec4 - uvec4
134  *   ivec2 - vec2
135  *   ivec3 - vec3
136  *   ivec4 - vec4
137  *   uint  - float
138  *   uvec2 - vec2
139  *   uvec3 - vec3
140  *   uvec4 - vec4
141  **/
142 class GPUShader5ImplicitConversionsTest : public deqp::TestCase
143 {
144 public:
145     /* Public methods */
146     GPUShader5ImplicitConversionsTest(deqp::Context &context);
147     GPUShader5ImplicitConversionsTest(deqp::Context &context, const char *name, const char *description);
148 
149     void deinit();
150     virtual tcu::TestNode::IterateResult iterate();
151 
152 protected:
153     /* Protected methods*/
154     void testInit();
155     void verifyImage(glw::GLuint color, bool is_expected) const;
156 
157 private:
158     /* Private type definitions */
159     struct testCase
160     {
161         const glw::GLchar *m_destination_type;
162         bool m_is_white_expected;
163         const glw::GLchar *m_source_type;
164         Utils::_variable_type m_source_variable_type;
165         const void *m_u1_data;
166         const void *m_u2_data;
167     };
168 
169     /* Private methods */
170     void executeTestCase(const testCase &test_case);
171     std::string getFragmentShader();
172     std::string getVertexShader(const glw::GLchar *destination_type, const glw::GLchar *source_type);
173 
174     /* Private fields */
175     glw::GLuint m_fbo_id;
176     glw::GLuint m_tex_id;
177     glw::GLuint m_vao_id;
178 
179     /* Private constants */
180     static const glw::GLsizei m_width;
181     static const glw::GLsizei m_height;
182 };
183 
184 /** Implements FunctionOverloading test, description follows:
185  *
186  * Verifies that compiler accepts overloaded functions and selects proper one.
187  *
188  * Steps:
189  * - prepare a program consisting of vertex and fragment shader; Vertex shader
190  * should implement the following snippet:
191  *
192  *   uniform ivec4 u1;
193  *   uniform uvec4 u2;
194  *
195  *   out vec4 result;
196  *
197  *   vec4 f(in vec4 a, in vec4 b) // first
198  *   {
199  *     return a * b;
200  *   }
201  *
202  *   vec4 f(in uvec4 a, in uvec4 b) // second
203  *   {
204  *     return a - b;
205  *   }
206  *
207  *   void main()
208  *   {
209  *     result = f(u1, u2);
210  *   }
211  *
212  * Fragment shader should pass result from vertex shader to output color.
213  * - it is expected that program will link without any errors;
214  * - set u1 and u2 with different positive values;
215  * - draw fullscreen quad;
216  * - it is expected that drawn image is filled with non-black color;
217  * - set u1 and u2 with the same positive value;
218  * - draw fullscreen quad;
219  * - it is expected that drawn image is filled with black color;
220  *
221  * The second function should be considered a better match as u2 is exact
222  * match.
223  **/
224 class GPUShader5FunctionOverloadingTest : public GPUShader5ImplicitConversionsTest
225 {
226 public:
227     /* Public methods */
228     GPUShader5FunctionOverloadingTest(deqp::Context &context);
229 
230     virtual tcu::TestNode::IterateResult iterate();
231 
232 private:
233     /* Private methods */
234     void execute(const glw::GLint *u1_data, const glw::GLuint *u2_data, bool is_black_expected);
235 };
236 
237 /** Implements FunctionOverloading test, description follows:
238  *
239  * Verifies functions: floatBitsTo* and *BitsToFloat work as expected.
240  *
241  * Steps:
242  * - prepare a program consisting of vertex and fragment shader; Vertex shader
243  * should implement the following snippet:
244  *
245  *   uniform T1 value;
246  *   uniform T2 expected_result;
247  *
248  *   out vec4 result;
249  *
250  *   void main()
251  *   {
252  *     result = 1;
253  *
254  *     T2 ret_val = TESTED_FUNCTION(value);
255  *
256  *     if (expected_result != ret_val)
257  *     {
258  *       result = 0;
259  *     }
260  *   }
261  *
262  * Fragment shader should pass result from vertex shader to output color.
263  * - it is expected that program will link without any errors;
264  * - set uniforms with "matching" values;
265  * - draw fullscreen quad;
266  * - inspect drawn image.
267  *
268  * Repeat steps to test the following functions:
269  * - floatBitsToInt
270  * - floatBitsToUint
271  * - intBitsToFloat
272  * - uintBitsToFloat
273  *
274  * Select "value" and "expected_result" to provoke both "white" and "black"
275  * results.
276  **/
277 class GPUShader5FloatEncodingTest : public GPUShader5ImplicitConversionsTest
278 {
279 public:
280     /* Public methods */
281     GPUShader5FloatEncodingTest(deqp::Context &context);
282 
283     virtual tcu::TestNode::IterateResult iterate();
284 
285 private:
286     /* Private types */
287     struct valueInfo
288     {
289         const Utils::_variable_type m_type;
290         const glw::GLchar *m_type_name;
291         const void *m_data;
292     };
293 
294     struct testCase
295     {
296         const valueInfo m_expected_value;
297         const valueInfo m_value;
298         const glw::GLchar *m_function_name;
299         bool m_is_white_expected;
300     };
301 
302     /* Private methods */
303     void execute(const testCase &test_case);
304     std::string getVertexShader(const testCase &test_case) const;
305 };
306 
307 /** Group class for GPU Shader 5 conformance tests */
308 class GPUShader5Tests : public deqp::TestCaseGroup
309 {
310 public:
311     /* Public methods */
312     GPUShader5Tests(deqp::Context &context);
~GPUShader5Tests()313     virtual ~GPUShader5Tests()
314     {
315     }
316 
317     virtual void init(void);
318 
319 private:
320     /* Private methods */
321     GPUShader5Tests(const GPUShader5Tests &);
322     GPUShader5Tests &operator=(const GPUShader5Tests &);
323 };
324 } // namespace gl3cts
325 
326 #endif // _GL3CGPUSHADER5TESTS_HPP
327