xref: /aosp_15_r20/external/deqp/modules/gles31/scripts/gen-implicit-conversions.py (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker# -*- coding: utf-8 -*-
2*35238bceSAndroid Build Coastguard Worker
3*35238bceSAndroid Build Coastguard Worker#-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker# drawElements Quality Program utilities
5*35238bceSAndroid Build Coastguard Worker# --------------------------------------
6*35238bceSAndroid Build Coastguard Worker#
7*35238bceSAndroid Build Coastguard Worker# Copyright 2015 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker#
9*35238bceSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker# You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker#
13*35238bceSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker#
15*35238bceSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker# limitations under the License.
20*35238bceSAndroid Build Coastguard Worker#
21*35238bceSAndroid Build Coastguard Worker#-------------------------------------------------------------------------
22*35238bceSAndroid Build Coastguard Worker
23*35238bceSAndroid Build Coastguard Workerimport sys
24*35238bceSAndroid Build Coastguard Workerimport itertools
25*35238bceSAndroid Build Coastguard Workerimport operator
26*35238bceSAndroid Build Coastguard Worker
27*35238bceSAndroid Build Coastguard Workerimport genutil
28*35238bceSAndroid Build Coastguard Worker
29*35238bceSAndroid Build Coastguard Workerfrom genutil import Scalar, Vec2, Vec3, Vec4, Uint, UVec2, UVec3, UVec4, CaseGroup
30*35238bceSAndroid Build Coastguard Worker
31*35238bceSAndroid Build Coastguard Worker
32*35238bceSAndroid Build Coastguard Worker# Templates
33*35238bceSAndroid Build Coastguard Worker
34*35238bceSAndroid Build Coastguard WorkerARTIHMETIC_CASE_TEMPLATE = """
35*35238bceSAndroid Build Coastguard Workercase ${{NAME}}
36*35238bceSAndroid Build Coastguard Worker    version 310 es
37*35238bceSAndroid Build Coastguard Worker    require extension { "GL_EXT_shader_implicit_conversions" } in { vertex, fragment }
38*35238bceSAndroid Build Coastguard Worker    values
39*35238bceSAndroid Build Coastguard Worker    {
40*35238bceSAndroid Build Coastguard Worker        ${{VALUES}}
41*35238bceSAndroid Build Coastguard Worker    }
42*35238bceSAndroid Build Coastguard Worker
43*35238bceSAndroid Build Coastguard Worker    both ""
44*35238bceSAndroid Build Coastguard Worker        #version 310 es
45*35238bceSAndroid Build Coastguard Worker        precision highp float;
46*35238bceSAndroid Build Coastguard Worker        ${DECLARATIONS}
47*35238bceSAndroid Build Coastguard Worker
48*35238bceSAndroid Build Coastguard Worker        void main()
49*35238bceSAndroid Build Coastguard Worker        {
50*35238bceSAndroid Build Coastguard Worker            ${SETUP}
51*35238bceSAndroid Build Coastguard Worker            out0 = ${{EXPR}};
52*35238bceSAndroid Build Coastguard Worker            ${OUTPUT}
53*35238bceSAndroid Build Coastguard Worker        }
54*35238bceSAndroid Build Coastguard Worker    ""
55*35238bceSAndroid Build Coastguard Workerend
56*35238bceSAndroid Build Coastguard Worker""".strip()
57*35238bceSAndroid Build Coastguard Worker
58*35238bceSAndroid Build Coastguard WorkerFUNCTIONS_CASE_TEMPLATE = """
59*35238bceSAndroid Build Coastguard Workercase ${{NAME}}
60*35238bceSAndroid Build Coastguard Worker    version 310 es
61*35238bceSAndroid Build Coastguard Worker    require extension { "GL_EXT_shader_implicit_conversions" } in { vertex, fragment }
62*35238bceSAndroid Build Coastguard Worker    values
63*35238bceSAndroid Build Coastguard Worker    {
64*35238bceSAndroid Build Coastguard Worker        ${{VALUES}}
65*35238bceSAndroid Build Coastguard Worker    }
66*35238bceSAndroid Build Coastguard Worker
67*35238bceSAndroid Build Coastguard Worker    both ""
68*35238bceSAndroid Build Coastguard Worker        #version 310 es
69*35238bceSAndroid Build Coastguard Worker        precision highp float;
70*35238bceSAndroid Build Coastguard Worker        ${DECLARATIONS}
71*35238bceSAndroid Build Coastguard Worker
72*35238bceSAndroid Build Coastguard Worker        ${{OUTTYPE}} func (${{OUTTYPE}} a)
73*35238bceSAndroid Build Coastguard Worker        {
74*35238bceSAndroid Build Coastguard Worker            return a * ${{OUTTYPE}}(2);
75*35238bceSAndroid Build Coastguard Worker        }
76*35238bceSAndroid Build Coastguard Worker
77*35238bceSAndroid Build Coastguard Worker        void main()
78*35238bceSAndroid Build Coastguard Worker        {
79*35238bceSAndroid Build Coastguard Worker            ${SETUP}
80*35238bceSAndroid Build Coastguard Worker            out0 = func(in0);
81*35238bceSAndroid Build Coastguard Worker            ${OUTPUT}
82*35238bceSAndroid Build Coastguard Worker        }
83*35238bceSAndroid Build Coastguard Worker    ""
84*35238bceSAndroid Build Coastguard Workerend
85*35238bceSAndroid Build Coastguard Worker""".strip()
86*35238bceSAndroid Build Coastguard Worker
87*35238bceSAndroid Build Coastguard WorkerARRAY_CASE_TEMPLATE = """
88*35238bceSAndroid Build Coastguard Workercase ${{NAME}}
89*35238bceSAndroid Build Coastguard Worker    version 310 es
90*35238bceSAndroid Build Coastguard Worker    require extension { "GL_EXT_shader_implicit_conversions" } in { vertex, fragment }
91*35238bceSAndroid Build Coastguard Worker    values
92*35238bceSAndroid Build Coastguard Worker    {
93*35238bceSAndroid Build Coastguard Worker        ${{VALUES}}
94*35238bceSAndroid Build Coastguard Worker    }
95*35238bceSAndroid Build Coastguard Worker
96*35238bceSAndroid Build Coastguard Worker    both ""
97*35238bceSAndroid Build Coastguard Worker        #version 310 es
98*35238bceSAndroid Build Coastguard Worker        precision highp float;
99*35238bceSAndroid Build Coastguard Worker        ${DECLARATIONS}
100*35238bceSAndroid Build Coastguard Worker
101*35238bceSAndroid Build Coastguard Worker        void main()
102*35238bceSAndroid Build Coastguard Worker        {
103*35238bceSAndroid Build Coastguard Worker            ${SETUP}
104*35238bceSAndroid Build Coastguard Worker            ${{ARRAYTYPE}}[] x = ${{ARRAYTYPE}}[] (${{ARRAYVALUES}});
105*35238bceSAndroid Build Coastguard Worker            out0 = ${{EXPR}};
106*35238bceSAndroid Build Coastguard Worker            ${OUTPUT}
107*35238bceSAndroid Build Coastguard Worker        }
108*35238bceSAndroid Build Coastguard Worker    ""
109*35238bceSAndroid Build Coastguard Workerend
110*35238bceSAndroid Build Coastguard Worker""".strip()
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard WorkerSTRUCT_CASE_TEMPLATE = """
113*35238bceSAndroid Build Coastguard Workercase ${{NAME}}
114*35238bceSAndroid Build Coastguard Worker    version 310 es
115*35238bceSAndroid Build Coastguard Worker    require extension { "GL_EXT_shader_implicit_conversions" } in { vertex, fragment }
116*35238bceSAndroid Build Coastguard Worker    values
117*35238bceSAndroid Build Coastguard Worker    {
118*35238bceSAndroid Build Coastguard Worker        ${{VALUES}}
119*35238bceSAndroid Build Coastguard Worker    }
120*35238bceSAndroid Build Coastguard Worker
121*35238bceSAndroid Build Coastguard Worker    both ""
122*35238bceSAndroid Build Coastguard Worker        #version 310 es
123*35238bceSAndroid Build Coastguard Worker        precision highp float;
124*35238bceSAndroid Build Coastguard Worker        ${DECLARATIONS}
125*35238bceSAndroid Build Coastguard Worker
126*35238bceSAndroid Build Coastguard Worker        void main()
127*35238bceSAndroid Build Coastguard Worker        {
128*35238bceSAndroid Build Coastguard Worker            ${SETUP}
129*35238bceSAndroid Build Coastguard Worker            struct {
130*35238bceSAndroid Build Coastguard Worker                ${{OUTTYPE}} val;
131*35238bceSAndroid Build Coastguard Worker            } x;
132*35238bceSAndroid Build Coastguard Worker
133*35238bceSAndroid Build Coastguard Worker            x.val = ${{STRUCTVALUE}};
134*35238bceSAndroid Build Coastguard Worker
135*35238bceSAndroid Build Coastguard Worker            out0 = ${{EXPR}};
136*35238bceSAndroid Build Coastguard Worker            ${OUTPUT}
137*35238bceSAndroid Build Coastguard Worker        }
138*35238bceSAndroid Build Coastguard Worker    ""
139*35238bceSAndroid Build Coastguard Workerend
140*35238bceSAndroid Build Coastguard Worker""".strip()
141*35238bceSAndroid Build Coastguard Worker
142*35238bceSAndroid Build Coastguard WorkerINVALID_CASE_TEMPLATE = """
143*35238bceSAndroid Build Coastguard Workercase ${{NAME}}
144*35238bceSAndroid Build Coastguard Worker    expect compile_fail
145*35238bceSAndroid Build Coastguard Worker    version 310 es
146*35238bceSAndroid Build Coastguard Worker    require extension { "GL_EXT_shader_implicit_conversions" } in { vertex, fragment }
147*35238bceSAndroid Build Coastguard Worker    values
148*35238bceSAndroid Build Coastguard Worker    {
149*35238bceSAndroid Build Coastguard Worker        ${{VALUES}}
150*35238bceSAndroid Build Coastguard Worker    }
151*35238bceSAndroid Build Coastguard Worker
152*35238bceSAndroid Build Coastguard Worker    both ""
153*35238bceSAndroid Build Coastguard Worker        #version 310 es
154*35238bceSAndroid Build Coastguard Worker        precision highp float;
155*35238bceSAndroid Build Coastguard Worker        ${DECLARATIONS}
156*35238bceSAndroid Build Coastguard Worker
157*35238bceSAndroid Build Coastguard Worker        void main()
158*35238bceSAndroid Build Coastguard Worker        {
159*35238bceSAndroid Build Coastguard Worker            ${SETUP}
160*35238bceSAndroid Build Coastguard Worker            out0 = in0 + ${{OPERAND}};
161*35238bceSAndroid Build Coastguard Worker            ${OUTPUT}
162*35238bceSAndroid Build Coastguard Worker        }
163*35238bceSAndroid Build Coastguard Worker    ""
164*35238bceSAndroid Build Coastguard Workerend
165*35238bceSAndroid Build Coastguard Worker""".strip()
166*35238bceSAndroid Build Coastguard Worker
167*35238bceSAndroid Build Coastguard WorkerINVALID_ARRAY_CASE_TEMPLATE = """
168*35238bceSAndroid Build Coastguard Workercase ${{NAME}}
169*35238bceSAndroid Build Coastguard Worker    expect compile_fail
170*35238bceSAndroid Build Coastguard Worker    version 310 es
171*35238bceSAndroid Build Coastguard Worker    require extension { "GL_EXT_shader_implicit_conversions" } in { vertex, fragment }
172*35238bceSAndroid Build Coastguard Worker    values {}
173*35238bceSAndroid Build Coastguard Worker
174*35238bceSAndroid Build Coastguard Worker    both ""
175*35238bceSAndroid Build Coastguard Worker        #version 310 es
176*35238bceSAndroid Build Coastguard Worker        precision highp float;
177*35238bceSAndroid Build Coastguard Worker        ${DECLARATIONS}
178*35238bceSAndroid Build Coastguard Worker
179*35238bceSAndroid Build Coastguard Worker        void main()
180*35238bceSAndroid Build Coastguard Worker        {
181*35238bceSAndroid Build Coastguard Worker            ${SETUP}
182*35238bceSAndroid Build Coastguard Worker            ${{EXPR}}
183*35238bceSAndroid Build Coastguard Worker            ${OUTPUT}
184*35238bceSAndroid Build Coastguard Worker        }
185*35238bceSAndroid Build Coastguard Worker    ""
186*35238bceSAndroid Build Coastguard Workerend
187*35238bceSAndroid Build Coastguard Worker""".strip()
188*35238bceSAndroid Build Coastguard Worker
189*35238bceSAndroid Build Coastguard WorkerINVALID_STRUCT_CASE_TEMPLATE = """
190*35238bceSAndroid Build Coastguard Workercase ${{NAME}}
191*35238bceSAndroid Build Coastguard Worker    expect compile_fail
192*35238bceSAndroid Build Coastguard Worker    version 310 es
193*35238bceSAndroid Build Coastguard Worker    require extension { "GL_EXT_shader_implicit_conversions" } in { vertex, fragment }
194*35238bceSAndroid Build Coastguard Worker    values {}
195*35238bceSAndroid Build Coastguard Worker
196*35238bceSAndroid Build Coastguard Worker    both ""
197*35238bceSAndroid Build Coastguard Worker        #version 310 es
198*35238bceSAndroid Build Coastguard Worker        precision highp float;
199*35238bceSAndroid Build Coastguard Worker        ${DECLARATIONS}
200*35238bceSAndroid Build Coastguard Worker
201*35238bceSAndroid Build Coastguard Worker        void main()
202*35238bceSAndroid Build Coastguard Worker        {
203*35238bceSAndroid Build Coastguard Worker            ${SETUP}
204*35238bceSAndroid Build Coastguard Worker            struct { ${{INTYPE}} value; } a;
205*35238bceSAndroid Build Coastguard Worker            struct { ${{OUTTYPE}} value; } b;
206*35238bceSAndroid Build Coastguard Worker            a = ${{INVALUE}};
207*35238bceSAndroid Build Coastguard Worker            b = a;
208*35238bceSAndroid Build Coastguard Worker            ${OUTPUT}
209*35238bceSAndroid Build Coastguard Worker        }
210*35238bceSAndroid Build Coastguard Worker    ""
211*35238bceSAndroid Build Coastguard Workerend
212*35238bceSAndroid Build Coastguard Worker""".strip()
213*35238bceSAndroid Build Coastguard Worker
214*35238bceSAndroid Build Coastguard Worker
215*35238bceSAndroid Build Coastguard Worker# Input values
216*35238bceSAndroid Build Coastguard Worker
217*35238bceSAndroid Build Coastguard WorkerIN_ISCALAR = [  2,  1,  1,  3,  5 ]
218*35238bceSAndroid Build Coastguard WorkerIN_USCALAR = [  1,  3,  4,  7, 11 ]
219*35238bceSAndroid Build Coastguard Worker
220*35238bceSAndroid Build Coastguard WorkerIN_IVECTOR = [
221*35238bceSAndroid Build Coastguard Worker    ( 1,  2,  3,  4),
222*35238bceSAndroid Build Coastguard Worker    ( 2,  1,  2,  6),
223*35238bceSAndroid Build Coastguard Worker    ( 3,  7,  2,  5),
224*35238bceSAndroid Build Coastguard Worker]
225*35238bceSAndroid Build Coastguard Worker
226*35238bceSAndroid Build Coastguard WorkerIN_UVECTOR = [
227*35238bceSAndroid Build Coastguard Worker    ( 2,  3,  5,  8),
228*35238bceSAndroid Build Coastguard Worker    ( 4,  6,  2,  9),
229*35238bceSAndroid Build Coastguard Worker    ( 1, 13,  7,  4),
230*35238bceSAndroid Build Coastguard Worker]
231*35238bceSAndroid Build Coastguard Worker
232*35238bceSAndroid Build Coastguard WorkerIN_VALUES = {
233*35238bceSAndroid Build Coastguard Worker    "int": [Scalar(x)                                for x in IN_ISCALAR],
234*35238bceSAndroid Build Coastguard Worker    "uint": [Scalar(x)                                for x in IN_USCALAR],
235*35238bceSAndroid Build Coastguard Worker    "ivec2": [Vec2(x[0], x[1])                        for x in IN_IVECTOR],
236*35238bceSAndroid Build Coastguard Worker    "uvec2": [Vec2(x[0], x[1])                        for x in IN_UVECTOR],
237*35238bceSAndroid Build Coastguard Worker    "ivec3": [Vec3(x[0], x[1], x[2])                    for x in IN_IVECTOR],
238*35238bceSAndroid Build Coastguard Worker    "uvec3": [Vec3(x[0], x[1], x[2])                    for x in IN_UVECTOR],
239*35238bceSAndroid Build Coastguard Worker    "ivec4": [Vec4(x[0], x[1], x[2], x[3])            for x in IN_IVECTOR],
240*35238bceSAndroid Build Coastguard Worker    "uvec4": [Vec4(x[0], x[1], x[2], x[3])            for x in IN_UVECTOR],
241*35238bceSAndroid Build Coastguard Worker    "float": [Scalar(x).toFloat()                    for x in IN_ISCALAR],
242*35238bceSAndroid Build Coastguard Worker    "vec2": [Vec2(x[0], x[1]).toFloat()                for x in IN_IVECTOR],
243*35238bceSAndroid Build Coastguard Worker    "vec3": [Vec3(x[0], x[1], x[2]).toFloat()        for x in IN_IVECTOR],
244*35238bceSAndroid Build Coastguard Worker    "vec4": [Vec4(x[0], x[1], x[2], x[3]).toFloat()    for x in IN_IVECTOR],
245*35238bceSAndroid Build Coastguard Worker}
246*35238bceSAndroid Build Coastguard Worker
247*35238bceSAndroid Build Coastguard WorkerVALID_CONVERSIONS = {
248*35238bceSAndroid Build Coastguard Worker    "int": ["float", "uint"],
249*35238bceSAndroid Build Coastguard Worker    "uint": ["float"],
250*35238bceSAndroid Build Coastguard Worker    "ivec2": ["uvec2", "vec2"],
251*35238bceSAndroid Build Coastguard Worker    "uvec2": ["vec2"],
252*35238bceSAndroid Build Coastguard Worker    "ivec3": ["uvec3", "vec3"],
253*35238bceSAndroid Build Coastguard Worker    "uvec3": ["vec3"],
254*35238bceSAndroid Build Coastguard Worker    "ivec4": ["uvec4", "vec4"],
255*35238bceSAndroid Build Coastguard Worker    "uvec4": ["vec4"]
256*35238bceSAndroid Build Coastguard Worker}
257*35238bceSAndroid Build Coastguard Worker
258*35238bceSAndroid Build Coastguard WorkerSCALAR_TO_VECTOR_CONVERSIONS = {
259*35238bceSAndroid Build Coastguard Worker    "int": ["vec2", "vec3", "vec4", "uvec2", "uvec3", "uvec4"],
260*35238bceSAndroid Build Coastguard Worker    "uint": ["vec2", "vec3", "vec4"]
261*35238bceSAndroid Build Coastguard Worker}
262*35238bceSAndroid Build Coastguard Worker
263*35238bceSAndroid Build Coastguard WorkerVALID_ASSIGNMENTS = {
264*35238bceSAndroid Build Coastguard Worker    "int": ["ivec2", "ivec3", "ivec4"],
265*35238bceSAndroid Build Coastguard Worker    "uint": ["uvec2", "uvec3", "uvec4"],
266*35238bceSAndroid Build Coastguard Worker    "ivec2": ["int", "float"],
267*35238bceSAndroid Build Coastguard Worker    "ivec3": ["int", "float"],
268*35238bceSAndroid Build Coastguard Worker    "ivec4": ["int", "float"],
269*35238bceSAndroid Build Coastguard Worker    "uvec2": ["uint", "float"],
270*35238bceSAndroid Build Coastguard Worker    "uvec3": ["uint", "float"],
271*35238bceSAndroid Build Coastguard Worker    "uvec4": ["uint", "float"],
272*35238bceSAndroid Build Coastguard Worker    "float": ["vec2", "vec3", "vec4"],
273*35238bceSAndroid Build Coastguard Worker    "vec2": ["float"],
274*35238bceSAndroid Build Coastguard Worker    "vec3": ["float"],
275*35238bceSAndroid Build Coastguard Worker    "vec4": ["float"]
276*35238bceSAndroid Build Coastguard Worker}
277*35238bceSAndroid Build Coastguard Worker
278*35238bceSAndroid Build Coastguard WorkerIN_TYPE_ORDER = [
279*35238bceSAndroid Build Coastguard Worker    "int",  "uint",
280*35238bceSAndroid Build Coastguard Worker    "ivec2", "uvec2", "ivec3",
281*35238bceSAndroid Build Coastguard Worker    "uvec3", "ivec4", "uvec4",
282*35238bceSAndroid Build Coastguard Worker
283*35238bceSAndroid Build Coastguard Worker    "float",
284*35238bceSAndroid Build Coastguard Worker    "vec2",  "vec3",  "vec4"
285*35238bceSAndroid Build Coastguard Worker]
286*35238bceSAndroid Build Coastguard Worker
287*35238bceSAndroid Build Coastguard Workerdef isScalarTypeName (name):
288*35238bceSAndroid Build Coastguard Worker    return name in ["float", "int", "uint"]
289*35238bceSAndroid Build Coastguard Worker
290*35238bceSAndroid Build Coastguard Workerdef isVec2TypeName (name):
291*35238bceSAndroid Build Coastguard Worker    return name in ["vec2", "ivec2", "uvec2"]
292*35238bceSAndroid Build Coastguard Worker
293*35238bceSAndroid Build Coastguard Workerdef isVec3TypeName (name):
294*35238bceSAndroid Build Coastguard Worker    return name in ["vec3", "ivec3", "uvec3"]
295*35238bceSAndroid Build Coastguard Worker
296*35238bceSAndroid Build Coastguard Workerdef isVec4TypeName (name):
297*35238bceSAndroid Build Coastguard Worker    return name in ["vec4", "ivec4", "uvec4"]
298*35238bceSAndroid Build Coastguard Worker
299*35238bceSAndroid Build Coastguard Worker# Utilities
300*35238bceSAndroid Build Coastguard Worker
301*35238bceSAndroid Build Coastguard Workerdef scalarToVector(a, b):
302*35238bceSAndroid Build Coastguard Worker    if isinstance(a, Scalar) and isinstance(b, Vec2):
303*35238bceSAndroid Build Coastguard Worker        a = a.toVec2()
304*35238bceSAndroid Build Coastguard Worker    elif isinstance(a, Scalar) and isinstance(b, Vec3):
305*35238bceSAndroid Build Coastguard Worker        a = a.toVec3()
306*35238bceSAndroid Build Coastguard Worker    elif isinstance(a, Scalar) and isinstance(b, Vec4):
307*35238bceSAndroid Build Coastguard Worker        a = a.toVec4()
308*35238bceSAndroid Build Coastguard Worker    return a
309*35238bceSAndroid Build Coastguard Worker
310*35238bceSAndroid Build Coastguard Workerdef isUintTypeName (type_name):
311*35238bceSAndroid Build Coastguard Worker    return type_name in ["uint", "uvec2", "uvec3", "uvec4"]
312*35238bceSAndroid Build Coastguard Worker
313*35238bceSAndroid Build Coastguard Workerdef convLiteral (type, value):
314*35238bceSAndroid Build Coastguard Worker    if isUintTypeName(type):
315*35238bceSAndroid Build Coastguard Worker        return int(value)
316*35238bceSAndroid Build Coastguard Worker    else:
317*35238bceSAndroid Build Coastguard Worker        return value
318*35238bceSAndroid Build Coastguard Worker
319*35238bceSAndroid Build Coastguard Workerdef valueToStr(value_type, value):
320*35238bceSAndroid Build Coastguard Worker    if isinstance(value, Scalar):
321*35238bceSAndroid Build Coastguard Worker        return str(value)
322*35238bceSAndroid Build Coastguard Worker    else:
323*35238bceSAndroid Build Coastguard Worker        assert isinstance(value, genutil.Vec)
324*35238bceSAndroid Build Coastguard Worker        out = value_type + "("
325*35238bceSAndroid Build Coastguard Worker        out += ", ".join([str(convLiteral(value_type, x)) for x in value.getScalars()])
326*35238bceSAndroid Build Coastguard Worker        out += ")"
327*35238bceSAndroid Build Coastguard Worker        return out
328*35238bceSAndroid Build Coastguard Worker
329*35238bceSAndroid Build Coastguard Worker
330*35238bceSAndroid Build Coastguard Workerdef valuesToStr(prefix, value_type, values):
331*35238bceSAndroid Build Coastguard Worker    def gen_value_strs(value_list, value_type):
332*35238bceSAndroid Build Coastguard Worker        for value in value_list:
333*35238bceSAndroid Build Coastguard Worker            yield valueToStr(value_type, value)
334*35238bceSAndroid Build Coastguard Worker    return "%s = [ %s ];" % (prefix, " | ".join(gen_value_strs(values, value_type)))
335*35238bceSAndroid Build Coastguard Worker
336*35238bceSAndroid Build Coastguard Worker
337*35238bceSAndroid Build Coastguard Worker# Test cases
338*35238bceSAndroid Build Coastguard Worker
339*35238bceSAndroid Build Coastguard Workerclass ArithmeticCase(genutil.ShaderCase):
340*35238bceSAndroid Build Coastguard Worker    def __init__(self, name, op, in_type, out_type, reverse=False):
341*35238bceSAndroid Build Coastguard Worker        self.op_func = {
342*35238bceSAndroid Build Coastguard Worker            "+": operator.add,
343*35238bceSAndroid Build Coastguard Worker            "-": operator.sub,
344*35238bceSAndroid Build Coastguard Worker            "*": operator.mul,
345*35238bceSAndroid Build Coastguard Worker            "/": operator.div,
346*35238bceSAndroid Build Coastguard Worker        }
347*35238bceSAndroid Build Coastguard Worker        self.name = name
348*35238bceSAndroid Build Coastguard Worker        self.op = op
349*35238bceSAndroid Build Coastguard Worker        self.in_type = in_type
350*35238bceSAndroid Build Coastguard Worker        self.out_type = out_type
351*35238bceSAndroid Build Coastguard Worker        self.reverse = reverse
352*35238bceSAndroid Build Coastguard Worker
353*35238bceSAndroid Build Coastguard Worker    def __str__(self):
354*35238bceSAndroid Build Coastguard Worker        params = {
355*35238bceSAndroid Build Coastguard Worker            "NAME": self.name,
356*35238bceSAndroid Build Coastguard Worker            "EXPR": self.get_expr(),
357*35238bceSAndroid Build Coastguard Worker            "VALUES": self.gen_values(),
358*35238bceSAndroid Build Coastguard Worker        }
359*35238bceSAndroid Build Coastguard Worker        return genutil.fillTemplate(ARTIHMETIC_CASE_TEMPLATE, params)
360*35238bceSAndroid Build Coastguard Worker
361*35238bceSAndroid Build Coastguard Worker    def apply(self, a, b):
362*35238bceSAndroid Build Coastguard Worker        assert(self.op in self.op_func)
363*35238bceSAndroid Build Coastguard Worker        a = scalarToVector(a, b)
364*35238bceSAndroid Build Coastguard Worker
365*35238bceSAndroid Build Coastguard Worker        if self.reverse:
366*35238bceSAndroid Build Coastguard Worker            b, a = a, b
367*35238bceSAndroid Build Coastguard Worker
368*35238bceSAndroid Build Coastguard Worker        return self.op_func[self.op](a, b)
369*35238bceSAndroid Build Coastguard Worker
370*35238bceSAndroid Build Coastguard Worker    def get_expr(self):
371*35238bceSAndroid Build Coastguard Worker        expr = ["in0", self.op, str(self.get_operand())]
372*35238bceSAndroid Build Coastguard Worker
373*35238bceSAndroid Build Coastguard Worker        if self.reverse:
374*35238bceSAndroid Build Coastguard Worker            expr.reverse()
375*35238bceSAndroid Build Coastguard Worker
376*35238bceSAndroid Build Coastguard Worker        return " ".join(expr)
377*35238bceSAndroid Build Coastguard Worker
378*35238bceSAndroid Build Coastguard Worker    def get_operand(self):
379*35238bceSAndroid Build Coastguard Worker        operands = {
380*35238bceSAndroid Build Coastguard Worker            "float": Scalar(2.0),
381*35238bceSAndroid Build Coastguard Worker            "vec2": Vec2(1.0, 2.0),
382*35238bceSAndroid Build Coastguard Worker            "vec3": Vec3(1.0, 2.0, 3.0),
383*35238bceSAndroid Build Coastguard Worker            "vec4": Vec4(1.0, 2.0, 3.0, 4.0),
384*35238bceSAndroid Build Coastguard Worker            "uint": Uint(2),
385*35238bceSAndroid Build Coastguard Worker            "uvec2": UVec2(1, 2),
386*35238bceSAndroid Build Coastguard Worker            "uvec3": UVec3(1, 2, 3),
387*35238bceSAndroid Build Coastguard Worker            "uvec4": UVec4(1, 2, 3, 4),
388*35238bceSAndroid Build Coastguard Worker        }
389*35238bceSAndroid Build Coastguard Worker        assert self.out_type in operands
390*35238bceSAndroid Build Coastguard Worker        return operands[self.out_type]
391*35238bceSAndroid Build Coastguard Worker
392*35238bceSAndroid Build Coastguard Worker    def gen_values(self):
393*35238bceSAndroid Build Coastguard Worker        in_values = IN_VALUES[self.in_type]
394*35238bceSAndroid Build Coastguard Worker
395*35238bceSAndroid Build Coastguard Worker        y = self.get_operand()
396*35238bceSAndroid Build Coastguard Worker        out_values = [self.apply(x, y) for x in in_values]
397*35238bceSAndroid Build Coastguard Worker
398*35238bceSAndroid Build Coastguard Worker        out = []
399*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("input %s in0" % (self.in_type), self.in_type, in_values))
400*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("output %s out0" % (self.out_type), self.out_type, out_values))
401*35238bceSAndroid Build Coastguard Worker
402*35238bceSAndroid Build Coastguard Worker        return "\n".join(out)
403*35238bceSAndroid Build Coastguard Worker
404*35238bceSAndroid Build Coastguard Worker
405*35238bceSAndroid Build Coastguard Workerclass ComparisonsCase(ArithmeticCase):
406*35238bceSAndroid Build Coastguard Worker    def __init__(self, name, op, in_type, out_type, reverse=False):
407*35238bceSAndroid Build Coastguard Worker        super(ComparisonsCase, self).__init__(name, op, in_type, out_type, reverse)
408*35238bceSAndroid Build Coastguard Worker
409*35238bceSAndroid Build Coastguard Worker        self.op_func = {
410*35238bceSAndroid Build Coastguard Worker            "==": operator.eq,
411*35238bceSAndroid Build Coastguard Worker            "!=": operator.ne,
412*35238bceSAndroid Build Coastguard Worker            "<": operator.lt,
413*35238bceSAndroid Build Coastguard Worker            ">": operator.gt,
414*35238bceSAndroid Build Coastguard Worker            "<=": operator.le,
415*35238bceSAndroid Build Coastguard Worker            ">=": operator.ge,
416*35238bceSAndroid Build Coastguard Worker        }
417*35238bceSAndroid Build Coastguard Worker
418*35238bceSAndroid Build Coastguard Worker    def apply(self, a, b):
419*35238bceSAndroid Build Coastguard Worker        assert(self.op in self.op_func)
420*35238bceSAndroid Build Coastguard Worker
421*35238bceSAndroid Build Coastguard Worker        if isinstance(a, Scalar) and isinstance(b, Scalar):
422*35238bceSAndroid Build Coastguard Worker            a, b = float(a), float(b)
423*35238bceSAndroid Build Coastguard Worker
424*35238bceSAndroid Build Coastguard Worker        if self.reverse:
425*35238bceSAndroid Build Coastguard Worker            b, a = a, b
426*35238bceSAndroid Build Coastguard Worker
427*35238bceSAndroid Build Coastguard Worker        return Scalar(self.op_func[self.op](a, b))
428*35238bceSAndroid Build Coastguard Worker
429*35238bceSAndroid Build Coastguard Worker    def gen_values(self):
430*35238bceSAndroid Build Coastguard Worker        in_values = IN_VALUES[self.in_type]
431*35238bceSAndroid Build Coastguard Worker
432*35238bceSAndroid Build Coastguard Worker        y = self.get_operand()
433*35238bceSAndroid Build Coastguard Worker        out_values = [self.apply(x, y) for x in in_values]
434*35238bceSAndroid Build Coastguard Worker
435*35238bceSAndroid Build Coastguard Worker        out = []
436*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("input %s in0" % (self.in_type), self.in_type, in_values))
437*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("output bool out0", "bool", out_values))
438*35238bceSAndroid Build Coastguard Worker
439*35238bceSAndroid Build Coastguard Worker        return "\n".join(out)
440*35238bceSAndroid Build Coastguard Worker
441*35238bceSAndroid Build Coastguard Worker
442*35238bceSAndroid Build Coastguard Workerclass ParenthesizedCase(genutil.ShaderCase):
443*35238bceSAndroid Build Coastguard Worker    def __init__(self, name, in_type, out_type, reverse=False, input_in_parens=False):
444*35238bceSAndroid Build Coastguard Worker        self.name = name
445*35238bceSAndroid Build Coastguard Worker        self.in_type = in_type
446*35238bceSAndroid Build Coastguard Worker        self.out_type = out_type
447*35238bceSAndroid Build Coastguard Worker        self.reverse = reverse
448*35238bceSAndroid Build Coastguard Worker        self.input_in_parens = input_in_parens
449*35238bceSAndroid Build Coastguard Worker
450*35238bceSAndroid Build Coastguard Worker    def __str__(self):
451*35238bceSAndroid Build Coastguard Worker        params = {
452*35238bceSAndroid Build Coastguard Worker            "NAME": self.name,
453*35238bceSAndroid Build Coastguard Worker            "EXPR": self.get_expr(),
454*35238bceSAndroid Build Coastguard Worker            "VALUES": self.gen_values(),
455*35238bceSAndroid Build Coastguard Worker        }
456*35238bceSAndroid Build Coastguard Worker        return genutil.fillTemplate(ARTIHMETIC_CASE_TEMPLATE, params)
457*35238bceSAndroid Build Coastguard Worker
458*35238bceSAndroid Build Coastguard Worker    def apply(self, a):
459*35238bceSAndroid Build Coastguard Worker        b, c = self.get_operand(0), self.get_operand(1)
460*35238bceSAndroid Build Coastguard Worker        a = scalarToVector(a, b)
461*35238bceSAndroid Build Coastguard Worker
462*35238bceSAndroid Build Coastguard Worker        if self.input_in_parens:
463*35238bceSAndroid Build Coastguard Worker            return b*(a+c)
464*35238bceSAndroid Build Coastguard Worker        else:
465*35238bceSAndroid Build Coastguard Worker            return a*(b+c)
466*35238bceSAndroid Build Coastguard Worker
467*35238bceSAndroid Build Coastguard Worker    def get_expr(self):
468*35238bceSAndroid Build Coastguard Worker        def make_paren_expr():
469*35238bceSAndroid Build Coastguard Worker            out = [
470*35238bceSAndroid Build Coastguard Worker                "in0" if self.input_in_parens else self.get_operand(0),
471*35238bceSAndroid Build Coastguard Worker                "+",
472*35238bceSAndroid Build Coastguard Worker                self.get_operand(1)
473*35238bceSAndroid Build Coastguard Worker            ]
474*35238bceSAndroid Build Coastguard Worker            return "(%s)" % (" ".join([str(x) for x in out]))
475*35238bceSAndroid Build Coastguard Worker
476*35238bceSAndroid Build Coastguard Worker        expr = [
477*35238bceSAndroid Build Coastguard Worker            "in0" if not self.input_in_parens else self.get_operand(0),
478*35238bceSAndroid Build Coastguard Worker            "*",
479*35238bceSAndroid Build Coastguard Worker            make_paren_expr()
480*35238bceSAndroid Build Coastguard Worker        ]
481*35238bceSAndroid Build Coastguard Worker
482*35238bceSAndroid Build Coastguard Worker        if self.reverse:
483*35238bceSAndroid Build Coastguard Worker            expr.reverse()
484*35238bceSAndroid Build Coastguard Worker
485*35238bceSAndroid Build Coastguard Worker        return " ".join([str(x) for x in expr])
486*35238bceSAndroid Build Coastguard Worker
487*35238bceSAndroid Build Coastguard Worker    def get_operand(self, ndx=0):
488*35238bceSAndroid Build Coastguard Worker        return IN_VALUES[self.out_type][ndx]
489*35238bceSAndroid Build Coastguard Worker
490*35238bceSAndroid Build Coastguard Worker    def gen_values(self):
491*35238bceSAndroid Build Coastguard Worker        in_values = IN_VALUES[self.in_type]
492*35238bceSAndroid Build Coastguard Worker
493*35238bceSAndroid Build Coastguard Worker        out_values = [self.apply(x) for x in in_values]
494*35238bceSAndroid Build Coastguard Worker
495*35238bceSAndroid Build Coastguard Worker        out = []
496*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("input %s in0" % (self.in_type), self.in_type, in_values))
497*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("output %s out0" % (self.out_type), self.out_type, out_values))
498*35238bceSAndroid Build Coastguard Worker
499*35238bceSAndroid Build Coastguard Worker        return "\n".join(out)
500*35238bceSAndroid Build Coastguard Worker
501*35238bceSAndroid Build Coastguard Worker
502*35238bceSAndroid Build Coastguard Workerclass FunctionsCase(genutil.ShaderCase):
503*35238bceSAndroid Build Coastguard Worker    def __init__(self, name, in_type, out_type):
504*35238bceSAndroid Build Coastguard Worker        self.name = name
505*35238bceSAndroid Build Coastguard Worker        self.in_type = in_type
506*35238bceSAndroid Build Coastguard Worker        self.out_type = out_type
507*35238bceSAndroid Build Coastguard Worker
508*35238bceSAndroid Build Coastguard Worker    def __str__(self):
509*35238bceSAndroid Build Coastguard Worker        params = {
510*35238bceSAndroid Build Coastguard Worker            "NAME": self.name,
511*35238bceSAndroid Build Coastguard Worker            "OUTTYPE": self.out_type,
512*35238bceSAndroid Build Coastguard Worker            "VALUES": self.gen_values(),
513*35238bceSAndroid Build Coastguard Worker        }
514*35238bceSAndroid Build Coastguard Worker        return genutil.fillTemplate(FUNCTIONS_CASE_TEMPLATE, params)
515*35238bceSAndroid Build Coastguard Worker
516*35238bceSAndroid Build Coastguard Worker    def apply(self, a):
517*35238bceSAndroid Build Coastguard Worker        if isUintTypeName(self.out_type):
518*35238bceSAndroid Build Coastguard Worker            return a.toUint() * Uint(2)
519*35238bceSAndroid Build Coastguard Worker        else:
520*35238bceSAndroid Build Coastguard Worker            return a.toFloat() * Scalar(2.0)
521*35238bceSAndroid Build Coastguard Worker
522*35238bceSAndroid Build Coastguard Worker    def gen_values(self):
523*35238bceSAndroid Build Coastguard Worker        in_values = IN_VALUES[self.in_type]
524*35238bceSAndroid Build Coastguard Worker        out_values = [self.apply(x) for x in in_values]
525*35238bceSAndroid Build Coastguard Worker
526*35238bceSAndroid Build Coastguard Worker        out = []
527*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("input %s in0" % (self.in_type), self.in_type, in_values))
528*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("output %s out0" % (self.out_type), self.out_type, out_values))
529*35238bceSAndroid Build Coastguard Worker
530*35238bceSAndroid Build Coastguard Worker        return "\n".join(out)
531*35238bceSAndroid Build Coastguard Worker
532*35238bceSAndroid Build Coastguard Worker
533*35238bceSAndroid Build Coastguard Workerclass ArrayCase(genutil.ShaderCase):
534*35238bceSAndroid Build Coastguard Worker    def __init__(self, name, in_type, out_type, reverse=False):
535*35238bceSAndroid Build Coastguard Worker        self.name = name
536*35238bceSAndroid Build Coastguard Worker        self.in_type = in_type
537*35238bceSAndroid Build Coastguard Worker        self.out_type = out_type
538*35238bceSAndroid Build Coastguard Worker        self.reverse = reverse
539*35238bceSAndroid Build Coastguard Worker
540*35238bceSAndroid Build Coastguard Worker    def __str__(self):
541*35238bceSAndroid Build Coastguard Worker        params = {
542*35238bceSAndroid Build Coastguard Worker            "NAME": self.name,
543*35238bceSAndroid Build Coastguard Worker            "VALUES": self.gen_values(),
544*35238bceSAndroid Build Coastguard Worker            "ARRAYTYPE": self.out_type,
545*35238bceSAndroid Build Coastguard Worker            "ARRAYVALUES": self.gen_array_values(),
546*35238bceSAndroid Build Coastguard Worker            "EXPR": self.get_expr(),
547*35238bceSAndroid Build Coastguard Worker        }
548*35238bceSAndroid Build Coastguard Worker        return genutil.fillTemplate(ARRAY_CASE_TEMPLATE, params)
549*35238bceSAndroid Build Coastguard Worker
550*35238bceSAndroid Build Coastguard Worker    def apply(self, a):
551*35238bceSAndroid Build Coastguard Worker        b = IN_VALUES[self.out_type][1]
552*35238bceSAndroid Build Coastguard Worker        a = scalarToVector(a, b)
553*35238bceSAndroid Build Coastguard Worker
554*35238bceSAndroid Build Coastguard Worker        return a + b
555*35238bceSAndroid Build Coastguard Worker
556*35238bceSAndroid Build Coastguard Worker    def get_expr(self):
557*35238bceSAndroid Build Coastguard Worker        if not self.reverse:
558*35238bceSAndroid Build Coastguard Worker            return "in0 + x[1]"
559*35238bceSAndroid Build Coastguard Worker        else:
560*35238bceSAndroid Build Coastguard Worker            return "x[1] + in0"
561*35238bceSAndroid Build Coastguard Worker
562*35238bceSAndroid Build Coastguard Worker    def gen_values(self):
563*35238bceSAndroid Build Coastguard Worker        in_values = IN_VALUES[self.in_type]
564*35238bceSAndroid Build Coastguard Worker        out_values = [self.apply(x) for x in in_values]
565*35238bceSAndroid Build Coastguard Worker
566*35238bceSAndroid Build Coastguard Worker        out = []
567*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("input %s in0" % (self.in_type), self.in_type, in_values))
568*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("output %s out0" % (self.out_type), self.out_type, out_values))
569*35238bceSAndroid Build Coastguard Worker
570*35238bceSAndroid Build Coastguard Worker        return "\n".join(out)
571*35238bceSAndroid Build Coastguard Worker
572*35238bceSAndroid Build Coastguard Worker    def gen_array_values(self):
573*35238bceSAndroid Build Coastguard Worker        out = [valueToStr(self.out_type, x) for x in IN_VALUES[self.out_type]]
574*35238bceSAndroid Build Coastguard Worker        return ", ".join(out)
575*35238bceSAndroid Build Coastguard Worker
576*35238bceSAndroid Build Coastguard Worker
577*35238bceSAndroid Build Coastguard Workerclass ArrayUnpackCase(genutil.ShaderCase):
578*35238bceSAndroid Build Coastguard Worker    def __init__(self, name, in_type, out_type):
579*35238bceSAndroid Build Coastguard Worker        self.name = name
580*35238bceSAndroid Build Coastguard Worker        self.in_type = in_type
581*35238bceSAndroid Build Coastguard Worker        self.out_type = out_type
582*35238bceSAndroid Build Coastguard Worker
583*35238bceSAndroid Build Coastguard Worker    def __str__(self):
584*35238bceSAndroid Build Coastguard Worker        params = {
585*35238bceSAndroid Build Coastguard Worker            "NAME": self.name,
586*35238bceSAndroid Build Coastguard Worker            "VALUES": self.gen_values(),
587*35238bceSAndroid Build Coastguard Worker            "ARRAYTYPE": "float",
588*35238bceSAndroid Build Coastguard Worker            "ARRAYVALUES": self.gen_array_values(),
589*35238bceSAndroid Build Coastguard Worker            "EXPR": self.get_expr(),
590*35238bceSAndroid Build Coastguard Worker        }
591*35238bceSAndroid Build Coastguard Worker        return genutil.fillTemplate(ARRAY_CASE_TEMPLATE, params)
592*35238bceSAndroid Build Coastguard Worker
593*35238bceSAndroid Build Coastguard Worker    def apply(self, a):
594*35238bceSAndroid Build Coastguard Worker        if isinstance(a, Scalar) and isVec2TypeName(self.out_type):
595*35238bceSAndroid Build Coastguard Worker            a = a.toVec2()
596*35238bceSAndroid Build Coastguard Worker        elif isinstance(a, Scalar) and isVec3TypeName(self.out_type):
597*35238bceSAndroid Build Coastguard Worker            a = a.toVec3()
598*35238bceSAndroid Build Coastguard Worker        elif isinstance(a, Scalar) and isVec4TypeName(self.out_type):
599*35238bceSAndroid Build Coastguard Worker            a = a.toVec4()
600*35238bceSAndroid Build Coastguard Worker
601*35238bceSAndroid Build Coastguard Worker        b = IN_VALUES["float"]
602*35238bceSAndroid Build Coastguard Worker
603*35238bceSAndroid Build Coastguard Worker        out = [Scalar(x)+y for x, y in zip(a.getScalars(), b)]
604*35238bceSAndroid Build Coastguard Worker
605*35238bceSAndroid Build Coastguard Worker        if self.out_type == "float":
606*35238bceSAndroid Build Coastguard Worker            return out[0].toFloat()
607*35238bceSAndroid Build Coastguard Worker        elif self.out_type == "uint":
608*35238bceSAndroid Build Coastguard Worker            return out[0].toUint()
609*35238bceSAndroid Build Coastguard Worker        elif self.out_type == "vec2":
610*35238bceSAndroid Build Coastguard Worker            return Vec2(out[0], out[1]).toFloat()
611*35238bceSAndroid Build Coastguard Worker        elif self.out_type == "uvec2":
612*35238bceSAndroid Build Coastguard Worker            return Vec2(out[0], out[1]).toUint()
613*35238bceSAndroid Build Coastguard Worker        elif self.out_type == "vec3":
614*35238bceSAndroid Build Coastguard Worker            return Vec3(out[0], out[1], out[2]).toFloat()
615*35238bceSAndroid Build Coastguard Worker        elif self.out_type == "uvec3":
616*35238bceSAndroid Build Coastguard Worker            return Vec3(out[0], out[1], out[2]).toUint()
617*35238bceSAndroid Build Coastguard Worker        elif self.out_type == "vec4":
618*35238bceSAndroid Build Coastguard Worker            return Vec4(out[0], out[1], out[2], out[3]).toFloat()
619*35238bceSAndroid Build Coastguard Worker        elif self.out_type == "uvec4":
620*35238bceSAndroid Build Coastguard Worker            return Vec4(out[0], out[1], out[2], out[3]).toUint()
621*35238bceSAndroid Build Coastguard Worker
622*35238bceSAndroid Build Coastguard Worker    def get_expr(self):
623*35238bceSAndroid Build Coastguard Worker        def num_scalars(typename):
624*35238bceSAndroid Build Coastguard Worker            return IN_VALUES[typename][0].getNumScalars()
625*35238bceSAndroid Build Coastguard Worker
626*35238bceSAndroid Build Coastguard Worker        def gen_sums():
627*35238bceSAndroid Build Coastguard Worker            in_scalars = num_scalars(self.in_type)
628*35238bceSAndroid Build Coastguard Worker            out_scalars = num_scalars(self.out_type)
629*35238bceSAndroid Build Coastguard Worker
630*35238bceSAndroid Build Coastguard Worker            for ndx in range(out_scalars):
631*35238bceSAndroid Build Coastguard Worker                if in_scalars > 1:
632*35238bceSAndroid Build Coastguard Worker                    yield "in0[%i] + x[%i]" % (ndx, ndx)
633*35238bceSAndroid Build Coastguard Worker                else:
634*35238bceSAndroid Build Coastguard Worker                    yield "in0 + x[%i]" % (ndx)
635*35238bceSAndroid Build Coastguard Worker
636*35238bceSAndroid Build Coastguard Worker        return "%s(%s)" % (self.out_type, ", ".join(gen_sums()))
637*35238bceSAndroid Build Coastguard Worker
638*35238bceSAndroid Build Coastguard Worker    def gen_values(self):
639*35238bceSAndroid Build Coastguard Worker        in_values = IN_VALUES[self.in_type]
640*35238bceSAndroid Build Coastguard Worker        out_values = [self.apply(x) for x in in_values]
641*35238bceSAndroid Build Coastguard Worker
642*35238bceSAndroid Build Coastguard Worker        out = []
643*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("input %s in0" % (self.in_type), self.in_type, in_values))
644*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("output %s out0" % (self.out_type), self.out_type, out_values))
645*35238bceSAndroid Build Coastguard Worker
646*35238bceSAndroid Build Coastguard Worker        return "\n".join(out)
647*35238bceSAndroid Build Coastguard Worker
648*35238bceSAndroid Build Coastguard Worker    def gen_array_values(self):
649*35238bceSAndroid Build Coastguard Worker        out = [valueToStr(self.out_type, x) for x in IN_VALUES["float"]]
650*35238bceSAndroid Build Coastguard Worker        return ", ".join(out)
651*35238bceSAndroid Build Coastguard Worker
652*35238bceSAndroid Build Coastguard Worker
653*35238bceSAndroid Build Coastguard Workerclass StructCase(genutil.ShaderCase):
654*35238bceSAndroid Build Coastguard Worker    def __init__(self, name, in_type, out_type, reverse=False):
655*35238bceSAndroid Build Coastguard Worker        self.name = name
656*35238bceSAndroid Build Coastguard Worker        self.in_type = in_type
657*35238bceSAndroid Build Coastguard Worker        self.out_type = out_type
658*35238bceSAndroid Build Coastguard Worker        self.reverse = reverse
659*35238bceSAndroid Build Coastguard Worker
660*35238bceSAndroid Build Coastguard Worker    def __str__(self):
661*35238bceSAndroid Build Coastguard Worker        params = {
662*35238bceSAndroid Build Coastguard Worker            "NAME": self.name,
663*35238bceSAndroid Build Coastguard Worker            "VALUES": self.gen_values(),
664*35238bceSAndroid Build Coastguard Worker            "OUTTYPE": self.out_type,
665*35238bceSAndroid Build Coastguard Worker            "STRUCTVALUE": self.get_struct_value(),
666*35238bceSAndroid Build Coastguard Worker            "EXPR": self.get_expr(),
667*35238bceSAndroid Build Coastguard Worker        }
668*35238bceSAndroid Build Coastguard Worker        return genutil.fillTemplate(STRUCT_CASE_TEMPLATE, params)
669*35238bceSAndroid Build Coastguard Worker
670*35238bceSAndroid Build Coastguard Worker    def apply(self, a):
671*35238bceSAndroid Build Coastguard Worker        if isinstance(a, Scalar) and isVec2TypeName(self.out_type):
672*35238bceSAndroid Build Coastguard Worker            a = a.toVec2()
673*35238bceSAndroid Build Coastguard Worker        elif isinstance(a, Scalar) and isVec3TypeName(self.out_type):
674*35238bceSAndroid Build Coastguard Worker            a = a.toVec3()
675*35238bceSAndroid Build Coastguard Worker        elif isinstance(a, Scalar) and isVec4TypeName(self.out_type):
676*35238bceSAndroid Build Coastguard Worker            a = a.toVec4()
677*35238bceSAndroid Build Coastguard Worker
678*35238bceSAndroid Build Coastguard Worker        b = IN_VALUES[self.out_type][0]
679*35238bceSAndroid Build Coastguard Worker
680*35238bceSAndroid Build Coastguard Worker        return a + b
681*35238bceSAndroid Build Coastguard Worker
682*35238bceSAndroid Build Coastguard Worker    def get_expr(self):
683*35238bceSAndroid Build Coastguard Worker        if not self.reverse:
684*35238bceSAndroid Build Coastguard Worker            return "in0 + x.val"
685*35238bceSAndroid Build Coastguard Worker        else:
686*35238bceSAndroid Build Coastguard Worker            return "x.val + in0"
687*35238bceSAndroid Build Coastguard Worker
688*35238bceSAndroid Build Coastguard Worker    def gen_values(self):
689*35238bceSAndroid Build Coastguard Worker        in_values = IN_VALUES[self.in_type]
690*35238bceSAndroid Build Coastguard Worker        out_values = [self.apply(x) for x in in_values]
691*35238bceSAndroid Build Coastguard Worker
692*35238bceSAndroid Build Coastguard Worker        out = []
693*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("input %s in0" % (self.in_type), self.in_type, in_values))
694*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("output %s out0" % (self.out_type), self.out_type, out_values))
695*35238bceSAndroid Build Coastguard Worker
696*35238bceSAndroid Build Coastguard Worker        return "\n".join(out)
697*35238bceSAndroid Build Coastguard Worker
698*35238bceSAndroid Build Coastguard Worker    def get_struct_value(self):
699*35238bceSAndroid Build Coastguard Worker        return valueToStr(self.out_type, IN_VALUES[self.out_type][0])
700*35238bceSAndroid Build Coastguard Worker
701*35238bceSAndroid Build Coastguard Worker
702*35238bceSAndroid Build Coastguard Workerclass InvalidCase(genutil.ShaderCase):
703*35238bceSAndroid Build Coastguard Worker    def __init__(self, name, in_type, out_type):
704*35238bceSAndroid Build Coastguard Worker        self.name = name
705*35238bceSAndroid Build Coastguard Worker        self.in_type = in_type
706*35238bceSAndroid Build Coastguard Worker        self.out_type = out_type
707*35238bceSAndroid Build Coastguard Worker
708*35238bceSAndroid Build Coastguard Worker    def __str__(self):
709*35238bceSAndroid Build Coastguard Worker        params = {
710*35238bceSAndroid Build Coastguard Worker            "NAME": self.name,
711*35238bceSAndroid Build Coastguard Worker            "OPERAND": str(self.get_operand()),
712*35238bceSAndroid Build Coastguard Worker            "VALUES": self.gen_values(),
713*35238bceSAndroid Build Coastguard Worker        }
714*35238bceSAndroid Build Coastguard Worker        return genutil.fillTemplate(INVALID_CASE_TEMPLATE, params)
715*35238bceSAndroid Build Coastguard Worker
716*35238bceSAndroid Build Coastguard Worker    def apply(self, a, b):
717*35238bceSAndroid Build Coastguard Worker        return b
718*35238bceSAndroid Build Coastguard Worker
719*35238bceSAndroid Build Coastguard Worker    def get_operand(self):
720*35238bceSAndroid Build Coastguard Worker        return IN_VALUES[self.out_type][0]
721*35238bceSAndroid Build Coastguard Worker
722*35238bceSAndroid Build Coastguard Worker    def gen_values(self):
723*35238bceSAndroid Build Coastguard Worker        in_values = IN_VALUES[self.in_type]
724*35238bceSAndroid Build Coastguard Worker
725*35238bceSAndroid Build Coastguard Worker        y = self.get_operand()
726*35238bceSAndroid Build Coastguard Worker        out_values = [self.apply(x, y) for x in in_values]
727*35238bceSAndroid Build Coastguard Worker
728*35238bceSAndroid Build Coastguard Worker        out = []
729*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("input %s in0" % (self.in_type), self.in_type, in_values))
730*35238bceSAndroid Build Coastguard Worker        out.append(valuesToStr("output %s out0" % (self.out_type), self.out_type, out_values))
731*35238bceSAndroid Build Coastguard Worker
732*35238bceSAndroid Build Coastguard Worker        return "\n".join(out)
733*35238bceSAndroid Build Coastguard Worker
734*35238bceSAndroid Build Coastguard Worker
735*35238bceSAndroid Build Coastguard Workerclass InvalidArrayCase(genutil.ShaderCase):
736*35238bceSAndroid Build Coastguard Worker    def __init__(self, name, in_type, out_type):
737*35238bceSAndroid Build Coastguard Worker        self.name = name
738*35238bceSAndroid Build Coastguard Worker        self.in_type = in_type
739*35238bceSAndroid Build Coastguard Worker        self.out_type = out_type
740*35238bceSAndroid Build Coastguard Worker
741*35238bceSAndroid Build Coastguard Worker    def __str__(self):
742*35238bceSAndroid Build Coastguard Worker        params = {
743*35238bceSAndroid Build Coastguard Worker            "NAME": self.name,
744*35238bceSAndroid Build Coastguard Worker            "EXPR": self.gen_expr(),
745*35238bceSAndroid Build Coastguard Worker        }
746*35238bceSAndroid Build Coastguard Worker        return genutil.fillTemplate(INVALID_ARRAY_CASE_TEMPLATE, params)
747*35238bceSAndroid Build Coastguard Worker
748*35238bceSAndroid Build Coastguard Worker    def gen_expr(self):
749*35238bceSAndroid Build Coastguard Worker        in_values = [valueToStr(self.out_type, x) for x in IN_VALUES[self.in_type]]
750*35238bceSAndroid Build Coastguard Worker
751*35238bceSAndroid Build Coastguard Worker        out = "%s a[] = %s[] (%s);" % (self.out_type, self.in_type, ", ".join(in_values))
752*35238bceSAndroid Build Coastguard Worker
753*35238bceSAndroid Build Coastguard Worker        return out
754*35238bceSAndroid Build Coastguard Worker
755*35238bceSAndroid Build Coastguard Worker
756*35238bceSAndroid Build Coastguard Workerclass InvalidStructCase(genutil.ShaderCase):
757*35238bceSAndroid Build Coastguard Worker    def __init__(self, name, in_type, out_type):
758*35238bceSAndroid Build Coastguard Worker        self.name = name
759*35238bceSAndroid Build Coastguard Worker        self.in_type = in_type
760*35238bceSAndroid Build Coastguard Worker        self.out_type = out_type
761*35238bceSAndroid Build Coastguard Worker
762*35238bceSAndroid Build Coastguard Worker    def __str__(self):
763*35238bceSAndroid Build Coastguard Worker        params = {
764*35238bceSAndroid Build Coastguard Worker            "NAME": self.name,
765*35238bceSAndroid Build Coastguard Worker            "INTYPE": self.in_type,
766*35238bceSAndroid Build Coastguard Worker            "OUTTYPE": self.out_type,
767*35238bceSAndroid Build Coastguard Worker            "INVALUE": self.get_value(),
768*35238bceSAndroid Build Coastguard Worker        }
769*35238bceSAndroid Build Coastguard Worker        return genutil.fillTemplate(INVALID_STRUCT_CASE_TEMPLATE, params)
770*35238bceSAndroid Build Coastguard Worker
771*35238bceSAndroid Build Coastguard Worker    def get_value(self):
772*35238bceSAndroid Build Coastguard Worker        return valueToStr(self.in_type, IN_VALUES[self.in_type][0])
773*35238bceSAndroid Build Coastguard Worker
774*35238bceSAndroid Build Coastguard Worker
775*35238bceSAndroid Build Coastguard Worker# Case file generation
776*35238bceSAndroid Build Coastguard Worker
777*35238bceSAndroid Build Coastguard Workerdef genConversionPairs(order=IN_TYPE_ORDER, scalar_to_vector=True, additional={}):
778*35238bceSAndroid Build Coastguard Worker    def gen_order(conversions):
779*35238bceSAndroid Build Coastguard Worker        key_set = set(conversions.iterkeys())
780*35238bceSAndroid Build Coastguard Worker        for typename in order:
781*35238bceSAndroid Build Coastguard Worker            if typename in key_set:
782*35238bceSAndroid Build Coastguard Worker                yield typename
783*35238bceSAndroid Build Coastguard Worker    conversions = {}
784*35238bceSAndroid Build Coastguard Worker
785*35238bceSAndroid Build Coastguard Worker    for in_type in VALID_CONVERSIONS:
786*35238bceSAndroid Build Coastguard Worker        conversions[in_type] = [] + VALID_CONVERSIONS[in_type]
787*35238bceSAndroid Build Coastguard Worker        if in_type in SCALAR_TO_VECTOR_CONVERSIONS and scalar_to_vector:
788*35238bceSAndroid Build Coastguard Worker            conversions[in_type] += SCALAR_TO_VECTOR_CONVERSIONS[in_type]
789*35238bceSAndroid Build Coastguard Worker
790*35238bceSAndroid Build Coastguard Worker    for key in additional.iterkeys():
791*35238bceSAndroid Build Coastguard Worker            value = conversions.get(key, [])
792*35238bceSAndroid Build Coastguard Worker            conversions[key] = value + additional[key]
793*35238bceSAndroid Build Coastguard Worker
794*35238bceSAndroid Build Coastguard Worker    for in_type in gen_order(conversions):
795*35238bceSAndroid Build Coastguard Worker        for out_type in conversions[in_type]:
796*35238bceSAndroid Build Coastguard Worker            yield (in_type, out_type)
797*35238bceSAndroid Build Coastguard Worker
798*35238bceSAndroid Build Coastguard Worker
799*35238bceSAndroid Build Coastguard Workerdef genInvalidConversions():
800*35238bceSAndroid Build Coastguard Worker    types = IN_TYPE_ORDER
801*35238bceSAndroid Build Coastguard Worker    valid_pairs = set(genConversionPairs(additional=VALID_ASSIGNMENTS))
802*35238bceSAndroid Build Coastguard Worker
803*35238bceSAndroid Build Coastguard Worker    for pair in itertools.permutations(types, 2):
804*35238bceSAndroid Build Coastguard Worker        if pair not in valid_pairs:
805*35238bceSAndroid Build Coastguard Worker            yield pair
806*35238bceSAndroid Build Coastguard Worker
807*35238bceSAndroid Build Coastguard Worker
808*35238bceSAndroid Build Coastguard Workerdef genArithmeticCases(reverse=False):
809*35238bceSAndroid Build Coastguard Worker    op_names = [
810*35238bceSAndroid Build Coastguard Worker        ("add", "Addition", "+"),
811*35238bceSAndroid Build Coastguard Worker        ("sub", "Subtraction", "-"),
812*35238bceSAndroid Build Coastguard Worker        ("mul", "Multiplication", "*"),
813*35238bceSAndroid Build Coastguard Worker        ("div", "Division", "/")
814*35238bceSAndroid Build Coastguard Worker    ]
815*35238bceSAndroid Build Coastguard Worker
816*35238bceSAndroid Build Coastguard Worker    for name, desc, op in op_names:
817*35238bceSAndroid Build Coastguard Worker        casegroup = CaseGroup(name, desc, [])
818*35238bceSAndroid Build Coastguard Worker        for in_type, out_type in genConversionPairs():
819*35238bceSAndroid Build Coastguard Worker            if op == "-" and isUintTypeName(out_type):
820*35238bceSAndroid Build Coastguard Worker                continue # Can't handle at the moment
821*35238bceSAndroid Build Coastguard Worker            name = in_type + "_to_" + out_type
822*35238bceSAndroid Build Coastguard Worker            casegroup.children.append(ArithmeticCase(name, op, in_type, out_type, reverse))
823*35238bceSAndroid Build Coastguard Worker        yield casegroup
824*35238bceSAndroid Build Coastguard Worker
825*35238bceSAndroid Build Coastguard Worker
826*35238bceSAndroid Build Coastguard Workerdef genComparisonCases(reverse=False):
827*35238bceSAndroid Build Coastguard Worker    op_names = [
828*35238bceSAndroid Build Coastguard Worker        ("equal", "Equal", "=="),
829*35238bceSAndroid Build Coastguard Worker        ("not_equal", "Not equal", "!="),
830*35238bceSAndroid Build Coastguard Worker        ("less", "Less than", "<"),
831*35238bceSAndroid Build Coastguard Worker        ("greater", "Greater than", ">"),
832*35238bceSAndroid Build Coastguard Worker        ("less_or_equal", "Less than or equal", "<="),
833*35238bceSAndroid Build Coastguard Worker        ("greater_or_equal", "Greater than or equal", ">="),
834*35238bceSAndroid Build Coastguard Worker    ]
835*35238bceSAndroid Build Coastguard Worker
836*35238bceSAndroid Build Coastguard Worker    for name, desc, op in op_names:
837*35238bceSAndroid Build Coastguard Worker        casegroup = CaseGroup(name, desc, [])
838*35238bceSAndroid Build Coastguard Worker        type_order = IN_TYPE_ORDER if name in ["equal", "not_equal"] else ["int", "uint"]
839*35238bceSAndroid Build Coastguard Worker
840*35238bceSAndroid Build Coastguard Worker        for in_type, out_type in genConversionPairs(order=type_order, scalar_to_vector=False):
841*35238bceSAndroid Build Coastguard Worker            name = in_type + "_to_" + out_type
842*35238bceSAndroid Build Coastguard Worker            casegroup.children.append(ComparisonsCase(name, op, in_type, out_type, reverse))
843*35238bceSAndroid Build Coastguard Worker        yield casegroup
844*35238bceSAndroid Build Coastguard Worker
845*35238bceSAndroid Build Coastguard Worker
846*35238bceSAndroid Build Coastguard Workerdef genParenthesizedCases():
847*35238bceSAndroid Build Coastguard Worker    for reverse in [True, False]:
848*35238bceSAndroid Build Coastguard Worker        if reverse:
849*35238bceSAndroid Build Coastguard Worker            name = "paren_expr_before_literal"
850*35238bceSAndroid Build Coastguard Worker            desc = "Parenthesized expression before literal"
851*35238bceSAndroid Build Coastguard Worker        else:
852*35238bceSAndroid Build Coastguard Worker            name = "literal_before_paren_expr"
853*35238bceSAndroid Build Coastguard Worker            desc = "Literal before parenthesized expression"
854*35238bceSAndroid Build Coastguard Worker        reversegroup = CaseGroup(name, desc, [])
855*35238bceSAndroid Build Coastguard Worker
856*35238bceSAndroid Build Coastguard Worker        for input_in_parens in [True, False]:
857*35238bceSAndroid Build Coastguard Worker            if input_in_parens:
858*35238bceSAndroid Build Coastguard Worker                name = "input_in_parens"
859*35238bceSAndroid Build Coastguard Worker                desc = "Input variable in parenthesized expression"
860*35238bceSAndroid Build Coastguard Worker            else:
861*35238bceSAndroid Build Coastguard Worker                name = "input_outside_parens"
862*35238bceSAndroid Build Coastguard Worker                desc = "Input variable outside parenthesized expression"
863*35238bceSAndroid Build Coastguard Worker            casegroup = CaseGroup(name, desc, [])
864*35238bceSAndroid Build Coastguard Worker
865*35238bceSAndroid Build Coastguard Worker            for in_type, out_type in genConversionPairs():
866*35238bceSAndroid Build Coastguard Worker                name = in_type + "_to_" + out_type
867*35238bceSAndroid Build Coastguard Worker                casegroup.children.append(
868*35238bceSAndroid Build Coastguard Worker                    ParenthesizedCase(name, in_type, out_type, reverse, input_in_parens)
869*35238bceSAndroid Build Coastguard Worker                )
870*35238bceSAndroid Build Coastguard Worker            reversegroup.children.append(casegroup)
871*35238bceSAndroid Build Coastguard Worker        yield reversegroup
872*35238bceSAndroid Build Coastguard Worker
873*35238bceSAndroid Build Coastguard Worker
874*35238bceSAndroid Build Coastguard Workerdef genArrayCases(reverse=False):
875*35238bceSAndroid Build Coastguard Worker    for in_type, out_type in genConversionPairs():
876*35238bceSAndroid Build Coastguard Worker        name = in_type + "_to_" + out_type
877*35238bceSAndroid Build Coastguard Worker        yield ArrayCase(name, in_type, out_type, reverse)
878*35238bceSAndroid Build Coastguard Worker
879*35238bceSAndroid Build Coastguard Worker
880*35238bceSAndroid Build Coastguard Workerdef genArrayUnpackCases(reverse=False):
881*35238bceSAndroid Build Coastguard Worker    for in_type, out_type in genConversionPairs():
882*35238bceSAndroid Build Coastguard Worker        name = in_type + "_to_" + out_type
883*35238bceSAndroid Build Coastguard Worker        yield ArrayUnpackCase(name, in_type, out_type)
884*35238bceSAndroid Build Coastguard Worker
885*35238bceSAndroid Build Coastguard Worker
886*35238bceSAndroid Build Coastguard Workerdef genFunctionsCases():
887*35238bceSAndroid Build Coastguard Worker    for in_type, out_type in genConversionPairs(scalar_to_vector=False):
888*35238bceSAndroid Build Coastguard Worker        name = in_type + "_to_" + out_type
889*35238bceSAndroid Build Coastguard Worker        yield FunctionsCase(name, in_type, out_type)
890*35238bceSAndroid Build Coastguard Worker
891*35238bceSAndroid Build Coastguard Worker
892*35238bceSAndroid Build Coastguard Workerdef genStructCases(reverse=False):
893*35238bceSAndroid Build Coastguard Worker    for in_type, out_type in genConversionPairs():
894*35238bceSAndroid Build Coastguard Worker        name = in_type + "_to_" + out_type
895*35238bceSAndroid Build Coastguard Worker        yield StructCase(name, in_type, out_type, reverse)
896*35238bceSAndroid Build Coastguard Worker
897*35238bceSAndroid Build Coastguard Worker
898*35238bceSAndroid Build Coastguard Workerdef genInvalidCases(reverse=False):
899*35238bceSAndroid Build Coastguard Worker    for in_type, out_type in genInvalidConversions():
900*35238bceSAndroid Build Coastguard Worker        name = in_type + "_to_" + out_type
901*35238bceSAndroid Build Coastguard Worker        yield InvalidCase(name, in_type, out_type)
902*35238bceSAndroid Build Coastguard Worker
903*35238bceSAndroid Build Coastguard Worker
904*35238bceSAndroid Build Coastguard Workerdef genInvalidArrayCases():
905*35238bceSAndroid Build Coastguard Worker    for in_type, out_type in genConversionPairs(scalar_to_vector=False):
906*35238bceSAndroid Build Coastguard Worker        name = in_type + "_to_" + out_type
907*35238bceSAndroid Build Coastguard Worker        yield InvalidArrayCase(name, in_type, out_type)
908*35238bceSAndroid Build Coastguard Worker
909*35238bceSAndroid Build Coastguard Worker
910*35238bceSAndroid Build Coastguard Workerdef genInvalidStructCases():
911*35238bceSAndroid Build Coastguard Worker    for in_type, out_type in genConversionPairs(scalar_to_vector=False):
912*35238bceSAndroid Build Coastguard Worker        name = in_type + "_to_" + out_type
913*35238bceSAndroid Build Coastguard Worker        yield InvalidStructCase(name, in_type, out_type)
914*35238bceSAndroid Build Coastguard Worker
915*35238bceSAndroid Build Coastguard Worker
916*35238bceSAndroid Build Coastguard Workerdef genAllCases():
917*35238bceSAndroid Build Coastguard Worker    yield CaseGroup(
918*35238bceSAndroid Build Coastguard Worker        "arithmetic", "Arithmetic operations",
919*35238bceSAndroid Build Coastguard Worker        [
920*35238bceSAndroid Build Coastguard Worker            CaseGroup("input_before_literal", "Input before literal",
921*35238bceSAndroid Build Coastguard Worker                      genArithmeticCases(reverse=False)),
922*35238bceSAndroid Build Coastguard Worker            CaseGroup("literal_before_input", "Literal before input",
923*35238bceSAndroid Build Coastguard Worker                      genArithmeticCases(reverse=True)),
924*35238bceSAndroid Build Coastguard Worker        ]
925*35238bceSAndroid Build Coastguard Worker    )
926*35238bceSAndroid Build Coastguard Worker
927*35238bceSAndroid Build Coastguard Worker    yield CaseGroup(
928*35238bceSAndroid Build Coastguard Worker        "comparisons", "Comparisons",
929*35238bceSAndroid Build Coastguard Worker        [
930*35238bceSAndroid Build Coastguard Worker            CaseGroup("input_before_literal", "Input before literal",
931*35238bceSAndroid Build Coastguard Worker                      genComparisonCases(reverse=False)),
932*35238bceSAndroid Build Coastguard Worker            CaseGroup("literal_before_input", "Literal before input",
933*35238bceSAndroid Build Coastguard Worker                      genComparisonCases(reverse=True)),
934*35238bceSAndroid Build Coastguard Worker        ]
935*35238bceSAndroid Build Coastguard Worker    )
936*35238bceSAndroid Build Coastguard Worker
937*35238bceSAndroid Build Coastguard Worker    yield CaseGroup(
938*35238bceSAndroid Build Coastguard Worker        "array_subscripts", "Array subscripts",
939*35238bceSAndroid Build Coastguard Worker        [
940*35238bceSAndroid Build Coastguard Worker            CaseGroup("input_before_subscript", "Input before subscript",
941*35238bceSAndroid Build Coastguard Worker                      genArrayCases(reverse=False)),
942*35238bceSAndroid Build Coastguard Worker            CaseGroup("subscript_before_input", "Subscript before input",
943*35238bceSAndroid Build Coastguard Worker                      genArrayCases(reverse=True)),
944*35238bceSAndroid Build Coastguard Worker        #    CaseGroup("unpack", "Unpack array and repack as value",
945*35238bceSAndroid Build Coastguard Worker        #              genArrayUnpackCases()),
946*35238bceSAndroid Build Coastguard Worker        ]
947*35238bceSAndroid Build Coastguard Worker    )
948*35238bceSAndroid Build Coastguard Worker
949*35238bceSAndroid Build Coastguard Worker    yield CaseGroup("functions", "Function calls",
950*35238bceSAndroid Build Coastguard Worker                    genFunctionsCases())
951*35238bceSAndroid Build Coastguard Worker
952*35238bceSAndroid Build Coastguard Worker    yield CaseGroup("struct_fields", "Struct field selectors",
953*35238bceSAndroid Build Coastguard Worker        [
954*35238bceSAndroid Build Coastguard Worker            CaseGroup("input_before_field", "Input before field",
955*35238bceSAndroid Build Coastguard Worker                      genStructCases(reverse=False)),
956*35238bceSAndroid Build Coastguard Worker            CaseGroup("field_before_input", "Field before input",
957*35238bceSAndroid Build Coastguard Worker                      genStructCases(reverse=True)),
958*35238bceSAndroid Build Coastguard Worker        ]
959*35238bceSAndroid Build Coastguard Worker    )
960*35238bceSAndroid Build Coastguard Worker
961*35238bceSAndroid Build Coastguard Worker    yield CaseGroup("parenthesized_expressions", "Parenthesized expressions",
962*35238bceSAndroid Build Coastguard Worker                    genParenthesizedCases())
963*35238bceSAndroid Build Coastguard Worker
964*35238bceSAndroid Build Coastguard Worker    yield CaseGroup(
965*35238bceSAndroid Build Coastguard Worker        "invalid", "Invalid conversions",
966*35238bceSAndroid Build Coastguard Worker        [
967*35238bceSAndroid Build Coastguard Worker            CaseGroup("variables", "Single variables",
968*35238bceSAndroid Build Coastguard Worker                      genInvalidCases()),
969*35238bceSAndroid Build Coastguard Worker            CaseGroup("arrays", "Arrays",
970*35238bceSAndroid Build Coastguard Worker                      genInvalidArrayCases()),
971*35238bceSAndroid Build Coastguard Worker            CaseGroup("structs", "Structs",
972*35238bceSAndroid Build Coastguard Worker                      genInvalidStructCases()),
973*35238bceSAndroid Build Coastguard Worker        ]
974*35238bceSAndroid Build Coastguard Worker    )
975*35238bceSAndroid Build Coastguard Worker
976*35238bceSAndroid Build Coastguard Worker
977*35238bceSAndroid Build Coastguard Workerif __name__ == "__main__":
978*35238bceSAndroid Build Coastguard Worker    print("Generating shader case files.")
979*35238bceSAndroid Build Coastguard Worker    genutil.writeAllCases("implicit_conversions.test", genAllCases())
980