1 # -*- coding: utf-8 -*- 2 3 #------------------------------------------------------------------------- 4 # drawElements Quality Program utilities 5 # -------------------------------------- 6 # 7 # Copyright (c) 2016 The Khronos Group Inc. 8 # 9 # Licensed under the Apache License, Version 2.0 (the "License"); 10 # you may not use this file except in compliance with the License. 11 # You may obtain a copy of the License at 12 # 13 # http://www.apache.org/licenses/LICENSE-2.0 14 # 15 # Unless required by applicable law or agreed to in writing, software 16 # distributed under the License is distributed on an "AS IS" BASIS, 17 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 # See the License for the specific language governing permissions and 19 # limitations under the License. 20 # 21 #------------------------------------------------------------------------- 22 23 import sys 24 import string 25 from genutil import * 26 27 # Templates 28 29 INVALID_IMPLICIT_CONVESION_TEMPLATE0 = """ 30 case ${{NAME}} 31 expect compile_fail 32 version 300 es 33 34 both "" 35 #version 300 es 36 precision mediump float; 37 precision mediump int; 38 39 ${DECLARATIONS} 40 41 void main() 42 { 43 ${{TYPE0}} c; 44 ${{TYPE0}} a; 45 ${{TYPE1}} b; 46 ${{TYPE0}} c = a ${{OPERATION}} b; 47 } 48 "" 49 end 50 """[1:-1] 51 52 INVALID_IMPLICIT_CONVESION_TEMPLATE1 = """ 53 case ${{NAME}} 54 expect compile_fail 55 version 300 es 56 57 both "" 58 #version 300 es 59 precision mediump float; 60 precision mediump int; 61 62 ${DECLARATIONS} 63 64 void main() 65 { 66 ${{TYPE1}} c; 67 ${{TYPE0}} a; 68 ${{TYPE1}} b; 69 ${{TYPE1}} c = a ${{OPERATION}} b; 70 } 71 "" 72 end 73 """[1:-1] 74 75 arithOperations = {'+': 'add', '*':'mul', '/': 'div', '-':'sub'} 76 77 class InvalidImplicitConversionCase(ShaderCase): 78 def __init__(self, operation, type0, type1): 79 self.name = arithOperations[operation] + '_' + type0 + '_' + type1 80 self.operation = operation 81 self.type0 = type0 82 self.type1 = type1 83 84 def __str__(self): 85 86 params0 = { "NAME": self.name + '_' + self.type0, "TYPE0": self.type0, "TYPE1": self.type1, "OPERATION": self.operation } 87 params1 = { "NAME": self.name + '_' + self.type1, "TYPE0": self.type0, "TYPE1": self.type1, "OPERATION": self.operation } 88 return fillTemplate(INVALID_IMPLICIT_CONVESION_TEMPLATE0, params0) + '\n' + fillTemplate(INVALID_IMPLICIT_CONVESION_TEMPLATE1, params1) 89 90 def createCase(operation, type0, type1): 91 cases = [] 92 for t0 in type0: 93 for t1 in type1: 94 case = InvalidImplicitConversionCase(operation, t0, t1) 95 cases.append(case) 96 return cases 97 98 floats = ['float', 'vec2', 'vec3', 'vec4'] 99 sintegers = ['int', 'ivec2', 'ivec3', 'ivec4'] 100 uintegers = ['uint', 'uvec2', 'uvec3', 'uvec4'] 101 cases = [] 102 for op in arithOperations: 103 caseFpInt = createCase(op, floats, sintegers) 104 cases = cases + caseFpInt 105 caseFpUint = createCase(op, floats, uintegers) 106 cases = cases + caseFpUint 107 caseIntUint = createCase(op, sintegers, uintegers) 108 cases = cases + caseIntUint 109 110 invalidImplicitConversionCases = [ 111 CaseGroup("invalid_implicit_conversions", "Invalid Implicit Conversions", cases), 112 ] 113 114 if __name__ == "__main__": 115 print "Generating shader case files." 116 writeAllCases("invalid_implicit_conversions.test", invalidImplicitConversionCases) 117