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
generateShaderSource(NegativeTestContext & ctx,glu::ShaderType shaderType,TestPrecise test)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
generateAndVerifyShader(NegativeTestContext & ctx,glu::ShaderType shaderType,TestPrecise test)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
precise_as_variable_name(NegativeTestContext & ctx)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
precise_as_function_name(NegativeTestContext & ctx)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
precise_as_function_argument(NegativeTestContext & ctx)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
getNegativePreciseTestFunctions(void)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
222