Fix PIPELINE_STAGE_TOP_OF_PIPE_BIT usage in api tests
[platform/upstream/VK-GL-CTS.git] / modules / gles31 / functional / es31fNegativePreciseTests.cpp
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES 3.1 Module
3  * -------------------------------------------------
4  *
5  * Copyright 2016 The Android Open Source Project
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief Negative Precise Tests
22  *//*--------------------------------------------------------------------*/
23
24 #include "es31fNegativePreciseTests.hpp"
25
26 #include "gluShaderProgram.hpp"
27 #include "glwEnums.hpp"
28
29 namespace deqp
30 {
31 namespace gles31
32 {
33 namespace Functional
34 {
35 namespace NegativeTestShared
36 {
37 namespace
38 {
39
40 enum TestPrecise
41 {
42         TEST_PRECISE_AS_VARIABLE_NAME = 0,
43         TEST_PRECISE_AS_FUNCTION_NAME,
44         TEST_PRECISE_AS_ARGUMENT_NAME,
45         TEST_PRECISE_AS_MACRO_NAME,
46         TEST_PRECISE_MACRO_AND_VARIABLE,
47         TEST_PRECISE_MACRO_AND_FUNCTION,
48         TEST_PRECISE_MACRO_AND_ARGUMENT,
49
50         TEST_PRECISE_LAST
51 };
52
53 static const glu::ShaderType s_shaderTypes[] =
54 {
55         glu::SHADERTYPE_VERTEX,
56         glu::SHADERTYPE_FRAGMENT,
57         glu::SHADERTYPE_GEOMETRY,
58         glu::SHADERTYPE_COMPUTE,
59         glu::SHADERTYPE_TESSELLATION_CONTROL,
60         glu::SHADERTYPE_TESSELLATION_EVALUATION
61 };
62
63 std::string generateShaderSource (NegativeTestContext& ctx, glu::ShaderType shaderType, TestPrecise test)
64 {
65         const bool                              supportsES32    = contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
66         const glu::GLSLVersion  version = supportsES32 ? glu::GLSL_VERSION_320_ES : glu::GLSL_VERSION_310_ES;
67         std::ostringstream              source;
68
69         source  << glu::getGLSLVersionDeclaration(version) << "\n"
70                         << (supportsES32 ? "" : "#extension GL_EXT_gpu_shader5 : enable\n");
71
72         switch (test)
73         {
74                 case TEST_PRECISE_AS_MACRO_NAME:                source << "#define precise 0\n";                break;
75
76                 case TEST_PRECISE_MACRO_AND_VARIABLE:
77                 case TEST_PRECISE_MACRO_AND_FUNCTION:
78                 case TEST_PRECISE_MACRO_AND_ARGUMENT:   source << "#define precise aName\n";    break;
79                 default:
80                         break;
81         }
82
83     switch (shaderType)
84     {
85         case glu::SHADERTYPE_GEOMETRY:
86             source  << (supportsES32 ? "" : "#extension GL_EXT_geometry_shader : enable\n")
87                     << "layout(max_vertices = 5) out;\n";
88             break;
89
90         case glu::SHADERTYPE_TESSELLATION_CONTROL:
91             source  << (supportsES32 ? "" : "#extension GL_EXT_tessellation_shader : enable\n")
92                     << "layout(vertices = 3) out;\n";
93             break;
94
95         case glu::SHADERTYPE_TESSELLATION_EVALUATION:
96             source  << (supportsES32 ? "" : "#extension GL_EXT_tessellation_shader : enable\n")
97                     << "layout(triangles, equal_spacing, cw) in;\n";
98             break;
99
100         default:
101             break;
102     }
103
104         switch (test)
105         {
106                 case TEST_PRECISE_AS_FUNCTION_NAME:
107                 case TEST_PRECISE_MACRO_AND_FUNCTION:
108                         source  << "\n"
109                                         << "void precise()\n"
110                                         << "{\n"
111                                         << "}\n";
112                         break;
113
114                 case TEST_PRECISE_AS_ARGUMENT_NAME:
115                 case TEST_PRECISE_MACRO_AND_ARGUMENT:
116                         source  << "\n"
117                                         << "void example(int precise)\n"
118                                         << "{\n"
119                                         << "}\n";
120                         break;
121
122                 default:
123                         break;
124         }
125
126     source  << "void main()\n"
127                         << "{\n";
128
129         switch (test)
130         {
131                 case TEST_PRECISE_AS_VARIABLE_NAME:
132                 case TEST_PRECISE_MACRO_AND_VARIABLE:   source << "     int precise = 1;\n";            break;
133                 case TEST_PRECISE_AS_MACRO_NAME:                source << "     int number = precise;\n";       break;
134                 default:
135                         break;
136         }
137
138         source << "}\n";
139
140         return source.str();
141 }
142
143 void generateAndVerifyShader (NegativeTestContext& ctx, glu::ShaderType shaderType, TestPrecise test)
144 {
145         glu::Shader                     shader                  (ctx.getRenderContext(), shaderType);
146         std::string                     shaderSource    = generateShaderSource(ctx, shaderType, test);
147         const char* const       source                  = shaderSource.c_str();
148         const int                       length                  = (int) shaderSource.size();
149
150         shader.setSources(1, &source, &length);
151         shader.compile();
152
153         ctx.getLog() << shader;
154
155         if (shader.getCompileStatus())
156                 ctx.fail("Shader was not expected to compile.");
157 }
158
159 void precise_as_variable_name (NegativeTestContext& ctx)
160 {
161         TCU_CHECK_AND_THROW(NotSupportedError,
162                 ctx.isExtensionSupported("GL_EXT_gpu_shader5") || contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)),
163                 "This test requires support for the extension GL_EXT_gpu_shader5 or context version 3.2 or higher.");
164
165         ctx.beginSection("Test that precise cannot be used as a variable name.");
166         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_shaderTypes); ++ndx)
167         {
168                 if (ctx.isShaderSupported(s_shaderTypes[ndx]))
169                         generateAndVerifyShader(ctx, s_shaderTypes[ndx], TEST_PRECISE_AS_VARIABLE_NAME);
170         }
171         ctx.endSection();
172 }
173
174 void precise_as_function_name (NegativeTestContext& ctx)
175 {
176         TCU_CHECK_AND_THROW(NotSupportedError,
177                 ctx.isExtensionSupported("GL_EXT_gpu_shader5") || contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)),
178                 "This test requires support for the extension GL_EXT_gpu_shader5 or context version 3.2 or higher.");
179
180         ctx.beginSection("Test that precise cannot be used as a function name.");
181         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_shaderTypes); ++ndx)
182         {
183                 if (ctx.isShaderSupported(s_shaderTypes[ndx]))
184                         generateAndVerifyShader(ctx, s_shaderTypes[ndx], TEST_PRECISE_AS_FUNCTION_NAME);
185         }
186         ctx.endSection();
187 }
188
189 void precise_as_function_argument (NegativeTestContext& ctx)
190 {
191         TCU_CHECK_AND_THROW(NotSupportedError,
192                 ctx.isExtensionSupported("GL_EXT_gpu_shader5") || contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)),
193                 "This test requires support for the extension GL_EXT_gpu_shader5 or context version 3.2 or higher.");
194
195         ctx.beginSection("Test that precise cannot be used as a argument name.");
196         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_shaderTypes); ++ndx)
197         {
198                 if (ctx.isShaderSupported(s_shaderTypes[ndx]))
199                         generateAndVerifyShader(ctx, s_shaderTypes[ndx], TEST_PRECISE_AS_ARGUMENT_NAME);
200         }
201         ctx.endSection();
202 }
203
204 } // anonymous
205
206 std::vector<FunctionContainer> getNegativePreciseTestFunctions (void)
207 {
208         const FunctionContainer funcs[] =
209         {
210         {precise_as_variable_name,                      "precise_as_variable_name",                     "Test precise keyword as variable name."                        },
211         {precise_as_function_name,                      "precise_as_function_name",                     "Test precise keyword as function name."                        },
212         {precise_as_function_argument,          "precise_as_function_argument",         "Test precise keyword as argument name."                        },
213         };
214
215         return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
216 }
217
218 } // NegativeTestShared
219 } // Functional
220 } // gles31
221 } // deqp