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