xref: /aosp_15_r20/external/deqp/modules/gles3/scripts/gen-large-constant-arrays.py (revision 35238bce31c2a825756842865a792f8cf7f89930)
1# -*- coding: utf-8 -*-
2
3#-------------------------------------------------------------------------
4# drawElements Quality Program utilities
5# --------------------------------------
6#
7# Copyright 2017 The Android Open Source Project
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 random
24from genutil import *
25
26random.seed(0x1234)
27
28DATA_TYPES = ["float", "vec4"]
29ARRAY_SIZES = [16, 32, 64, 128]
30
31s_largeArrayCaseTemplate = """
32case ${{NAME}}
33    version 300 es
34    values
35    {
36        ${{VALUES}}
37    }
38
39    both ""
40        #version 300 es
41        precision mediump float;
42
43        ${DECLARATIONS}
44
45        void main()
46        {
47            ${{ARRAY_DECL}}
48
49            ${SETUP}
50            ${{OP}}
51            ${OUTPUT}
52        }
53    ""
54end
55"""[1:]
56
57
58class LargeConstantArrayCase(ShaderCase):
59    def __init__(self, name, array, inputs, outputs):
60        self.name = name
61        self.array = array
62        self.inputs = inputs
63        self.outputs = outputs
64        self.op = "out0 = array[in0];"
65
66    def __str__(self):
67        params = {
68            "NAME": self.name,
69            "VALUES": genValues(self.inputs, self.outputs),
70            "ARRAY_DECL": self.array,
71            "OP": self.op
72        }
73        return fillTemplate(s_largeArrayCaseTemplate, params)
74
75
76def genArray(dataType, size):
77    elements = []
78    for i in xrange(size):
79        if dataType == "float":
80            elements.append(Scalar(round(random.uniform(-1.0, 1.0), 6)))
81        if dataType == "vec4":
82            elements.append(Vec4(*[round(random.uniform(-1.0, 1.0), 6) for x in range(4)]))
83
84    return elements
85
86
87def arrayToString(elements):
88    array = ('const {TYPE} array[{LENGTH}] = {TYPE}[](\n'
89        .format(TYPE=elements[0].typeString(), LENGTH=len(elements)))
90
91    array += "\n".join(str(e) + ',' for e in elements[:-1])
92    array += "\n" + str(elements[-1])
93    array += ");"
94
95    return array
96
97allCases = []
98largeConstantArrayCases = []
99
100for dataType in DATA_TYPES:
101    for arraySize in ARRAY_SIZES:
102        indexes = random.sample(range(arraySize-1), 10)
103        array = genArray(dataType, arraySize)
104        outputs = [array[index] for index in indexes]
105        outType = outputs[0].typeString()
106        caseName = "%s_%s" % (dataType, arraySize)
107
108        case = LargeConstantArrayCase(caseName,
109                          arrayToString(array),
110                          [("int in0", indexes)],
111                          [("%s out0" % outType, outputs)])
112
113        largeConstantArrayCases.append(case)
114
115allCases.append(CaseGroup("indexing", "Large constant array indexing", largeConstantArrayCases))
116
117if __name__ == "__main__":
118    print("Generating shader case files.")
119    writeAllCases("large_constant_arrays.test", allCases)
120