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