| # -*- coding: utf-8 -*- |
| |
| #------------------------------------------------------------------------- |
| # drawElements Quality Program utilities |
| # -------------------------------------- |
| # |
| # Copyright (c) 2016 The Khronos Group Inc. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| #------------------------------------------------------------------------- |
| |
| import sys |
| import string |
| from genutil import * |
| |
| # Templates |
| |
| INVALID_IMPLICIT_CONVESION_TEMPLATE0 = """ |
| case ${{NAME}} |
| expect compile_fail |
| version 300 es |
| |
| both "" |
| #version 300 es |
| precision mediump float; |
| precision mediump int; |
| |
| ${DECLARATIONS} |
| |
| void main() |
| { |
| ${{TYPE0}} c; |
| ${{TYPE0}} a; |
| ${{TYPE1}} b; |
| ${{TYPE0}} c = a ${{OPERATION}} b; |
| } |
| "" |
| end |
| """[1:-1] |
| |
| INVALID_IMPLICIT_CONVESION_TEMPLATE1 = """ |
| case ${{NAME}} |
| expect compile_fail |
| version 300 es |
| |
| both "" |
| #version 300 es |
| precision mediump float; |
| precision mediump int; |
| |
| ${DECLARATIONS} |
| |
| void main() |
| { |
| ${{TYPE1}} c; |
| ${{TYPE0}} a; |
| ${{TYPE1}} b; |
| ${{TYPE1}} c = a ${{OPERATION}} b; |
| } |
| "" |
| end |
| """[1:-1] |
| |
| arithOperations = {'+': 'add', '*':'mul', '/': 'div', '-':'sub'} |
| |
| class InvalidImplicitConversionCase(ShaderCase): |
| def __init__(self, operation, type0, type1): |
| self.name = arithOperations[operation] + '_' + type0 + '_' + type1 |
| self.operation = operation |
| self.type0 = type0 |
| self.type1 = type1 |
| |
| def __str__(self): |
| |
| params0 = { "NAME": self.name + '_' + self.type0, "TYPE0": self.type0, "TYPE1": self.type1, "OPERATION": self.operation } |
| params1 = { "NAME": self.name + '_' + self.type1, "TYPE0": self.type0, "TYPE1": self.type1, "OPERATION": self.operation } |
| return fillTemplate(INVALID_IMPLICIT_CONVESION_TEMPLATE0, params0) + '\n' + fillTemplate(INVALID_IMPLICIT_CONVESION_TEMPLATE1, params1) |
| |
| def createCase(operation, type0, type1): |
| cases = [] |
| for t0 in type0: |
| for t1 in type1: |
| case = InvalidImplicitConversionCase(operation, t0, t1) |
| cases.append(case) |
| return cases |
| |
| floats = ['float', 'vec2', 'vec3', 'vec4'] |
| sintegers = ['int', 'ivec2', 'ivec3', 'ivec4'] |
| uintegers = ['uint', 'uvec2', 'uvec3', 'uvec4'] |
| cases = [] |
| for op in arithOperations: |
| caseFpInt = createCase(op, floats, sintegers) |
| cases = cases + caseFpInt |
| caseFpUint = createCase(op, floats, uintegers) |
| cases = cases + caseFpUint |
| caseIntUint = createCase(op, sintegers, uintegers) |
| cases = cases + caseIntUint |
| |
| invalidImplicitConversionCases = [ |
| CaseGroup("invalid_implicit_conversions", "Invalid Implicit Conversions", cases), |
| ] |
| |
| if __name__ == "__main__": |
| print("Generating shader case files.") |
| writeAllCases("invalid_implicit_conversions.test", invalidImplicitConversionCases) |