1 # -*- coding: utf-8 -*-
3 #-------------------------------------------------------------------------
4 # drawElements Quality Program utilities
5 # --------------------------------------
7 # Copyright 2015 The Android Open Source Project
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
13 # http://www.apache.org/licenses/LICENSE-2.0
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.
21 #-------------------------------------------------------------------------
25 from collections import namedtuple
30 declarationTemplate = """
36 precision mediump float;
37 attribute highp vec4 dEQP_Position;
44 gl_Position = dEQP_Position;
49 precision mediump float;
55 float result = x0 + x1;
56 gl_FragColor = vec4(result, result, result, 1.0);
62 parameterTemplate = """
68 precision mediump float;
71 float foo0 (${{PARAMETER0}})
76 void foo1 (${{PARAMETER1}})
81 float foo2 (${{PARAMETER2}})
101 class DeclarationCase(ShaderCase):
102 def __init__(self, compileFail, paramList):
103 self.compileFail = "expect compile_fail" if compileFail else "expect pass"
111 if paramList.index(p) != len(paramList)-1:
114 var0 += p.vars[0] + ' '
115 var1 += p.vars[1] + ' '
116 var2 += p.vars[2] + ' '
118 var0 += 'float x0;\n'
119 var1 += 'float x1;\n'
122 self.variableVtx = (var0 + var1 + var2).strip()
123 self.variableFrg = (var0 + var1).strip() # Omit 'attribute' in frag shader
124 self.variableVtx = self.variableVtx.replace(" ", " ")
125 self.variableFrg = self.variableFrg.replace(" ", " ")
130 "COMPILE_FAIL" : self.compileFail,
131 "VARIABLE_VTX" : self.variableVtx,
132 "VARIABLE_FRG" : self.variableFrg
134 return fillTemplate(declarationTemplate, params)
136 class ParameterCase(ShaderCase):
137 def __init__(self, compileFail, paramList):
138 self.compileFail = "expect compile_fail" if compileFail else "expect pass"
146 if paramList.index(p) != len(paramList)-1:
149 self.param0 += p.vars[0] + ' '
150 self.param1 += p.vars[1] + ' '
151 self.param2 += p.vars[2] + ' '
153 self.param0 += 'float x'
154 self.param1 += 'float x'
155 self.param2 += 'float x'
156 self.param0 = self.param0.replace(" ", " ")
157 self.param1 = self.param1.replace(" ", " ")
158 self.param2 = self.param2.replace(" ", " ")
163 "COMPILE_FAIL" : self.compileFail,
164 "PARAMETER0" : self.param0,
165 "PARAMETER1" : self.param1,
166 "PARAMETER2" : self.param2,
168 return fillTemplate(parameterTemplate, params)
172 CaseFormat = namedtuple('CaseFormat', 'name vars')
174 DECL_INVARIANT = CaseFormat("invariant", ["invariant", "", ""])
175 DECL_STORAGE = CaseFormat("storage", ["varying", "uniform", "attribute"])
176 DECL_PRECISION = CaseFormat("precision", ["lowp", "mediump", "mediump"])
178 PARAM_STORAGE = CaseFormat("storage", [ "const", "", ""])
179 PARAM_PARAMETER = CaseFormat("parameter", [ "in", "out", "inout" ])
180 PARAM_PRECISION = CaseFormat("precision", [ "lowp", "mediump", "mediump" ])
182 # Order of qualification tests
184 validDeclarationCases = []
185 invalidDeclarationCases = []
186 validParameterCases = []
187 invalidParameterCases = []
190 [DECL_INVARIANT, DECL_STORAGE, DECL_PRECISION],
191 [DECL_STORAGE, DECL_PRECISION],
192 [DECL_INVARIANT, DECL_STORAGE]
196 [PARAM_STORAGE, PARAM_PARAMETER, PARAM_PRECISION],
197 [PARAM_STORAGE, PARAM_PARAMETER],
198 [PARAM_STORAGE, PARAM_PRECISION],
199 [PARAM_PARAMETER, PARAM_PRECISION]
202 for f in declFormats:
203 for p in itertools.permutations(f):
205 validDeclarationCases.append(DeclarationCase(False, p)) # Correct order
207 invalidDeclarationCases.append(DeclarationCase(True, p)) # Incorrect order
209 for f in paramFormats:
210 for p in itertools.permutations(f):
212 validParameterCases.append(ParameterCase(False, p)) # Correct order
214 invalidParameterCases.append(ParameterCase(True, p)) # Incorrect order
216 qualificationOrderCases = [
217 CaseGroup("variables", "Order of qualification in variable declarations.", children = [
218 CaseGroup("valid", "Valid orderings.", validDeclarationCases),
219 CaseGroup("invalid", "Invalid orderings.", invalidDeclarationCases)
221 CaseGroup("parameters", "Order of qualification in function parameters.", children = [
222 CaseGroup("valid", "Valid orderings.", validParameterCases),
223 CaseGroup("invalid", "Invalid orderings.", invalidParameterCases)
229 if __name__ == "__main__":
230 print "Generating shader case files."
231 writeAllCases("qualification_order.test", qualificationOrderCases)