xref: /aosp_15_r20/external/deqp/modules/gles3/scripts/gen-invalid-implicit-conversions.py (revision 35238bce31c2a825756842865a792f8cf7f89930)
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
23import sys
24import string
25from genutil import *
26
27# Templates
28
29INVALID_IMPLICIT_CONVESION_TEMPLATE0 = """
30case ${{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    ""
49end
50"""[1:-1]
51
52INVALID_IMPLICIT_CONVESION_TEMPLATE1 = """
53case ${{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    ""
72end
73"""[1:-1]
74
75arithOperations = {'+': 'add', '*':'mul', '/': 'div', '-':'sub'}
76
77class 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
90def 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
98floats = ['float', 'vec2', 'vec3', 'vec4']
99sintegers = ['int', 'ivec2', 'ivec3', 'ivec4']
100uintegers = ['uint', 'uvec2', 'uvec3', 'uvec4']
101cases = []
102for 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
110invalidImplicitConversionCases = [
111        CaseGroup("invalid_implicit_conversions", "Invalid Implicit Conversions", cases),
112]
113
114if __name__ == "__main__":
115    print("Generating shader case files.")
116    writeAllCases("invalid_implicit_conversions.test", invalidImplicitConversionCases)
117