xref: /aosp_15_r20/external/deqp/scripts/khr_util/gen_str_util.py (revision 35238bce31c2a825756842865a792f8cf7f89930)
1# -*- coding: utf-8 -*-
2
3#-------------------------------------------------------------------------
4# drawElements Quality Program utilities
5# --------------------------------------
6#
7# Copyright 2015 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
23from itertools import chain
24from khr_util.format import indentLines
25
26def isValueDefined (definitions, value):
27    return value in definitions
28
29def allValuesUndefined (definitions, values):
30    for value in values:
31        if isValueDefined(definitions, value):
32            return False
33    return True
34
35def anyValueDefined (definitions, values):
36    return not allValuesUndefined(definitions, values)
37
38def makeDefSet (iface):
39    return set(enum.name for enum in iface.enums) | \
40           set(enum.alias for enum in iface.enums if enum.alias != None)
41
42def genStrUtilProtos (iface, enumGroups, bitfieldGroups):
43    definitions = makeDefSet(iface)
44
45    def genNameProtos ():
46        for groupName, values in enumGroups:
47            if anyValueDefined(definitions, values):
48                yield "const char*\tget%sName\t(int value);" % groupName
49            else:
50                print("Warning: Empty value set for %s, skipping" % groupName)
51
52    def genBitfieldProtos ():
53        for groupName, values in bitfieldGroups:
54            if anyValueDefined(definitions, values):
55                yield "tcu::Format::Bitfield<16>\tget%sStr\t(int value);" % groupName
56            else:
57                print("Warning: Empty value set for %s, skipping" % groupName)
58
59    def genStrImpl ():
60        for groupName, values in enumGroups:
61            if anyValueDefined(definitions, values):
62                yield "inline tcu::Format::Enum<int, 2>\tget%(name)sStr\t(int value)\t{ return tcu::Format::Enum<int, 2>(get%(name)sName, value); }" % {"name": groupName}
63
64        # booleans can be stored in enums or in byte-sized arrays. For clarity add special case
65        if anyValueDefined(definitions, ["GL_TRUE", "GL_FALSE"]):
66            yield "inline tcu::Format::Enum<int, 1>\tgetBooleanStr\t(uint8_t value)\t{ return tcu::Format::Enum<int, 1>(getBooleanName, (int)value); }"
67
68    return chain(genNameProtos(), genBitfieldProtos(), genStrImpl())
69
70def genEnumStrImpl (groupName, values, definitions):
71    if allValuesUndefined(definitions, values):
72        return
73
74    yield ""
75    yield "const char* get%sName (int value)" % groupName
76    yield "{"
77    yield "\tswitch (value)"
78    yield "\t{"
79
80    def genCases ():
81        for value in values:
82            if isValueDefined(definitions, value):
83                yield "case %s:\treturn \"%s\";" % (value, value)
84            else:
85                print("Warning: %s not defined, skipping" % value)
86        yield "default:\treturn DE_NULL;"
87
88    for caseLine in indentLines(genCases()):
89        yield "\t\t" + caseLine
90
91    yield "\t}"
92    yield "}"
93
94def genBitfieldStrImpl (groupName, values, definitions):
95    if allValuesUndefined(definitions, values):
96        return
97
98    yield ""
99    yield "tcu::Format::Bitfield<16> get%sStr (int value)" % groupName
100    yield "{"
101    yield "\tstatic const tcu::Format::BitDesc s_desc[] ="
102    yield "\t{"
103
104    def genFields ():
105        for value in values:
106            if isValueDefined(definitions, value):
107                yield "tcu::Format::BitDesc(%s,\t\"%s\")," % (value, value)
108            else:
109                print("Warning: %s not defined, skipping" % value)
110
111    for fieldLine in indentLines(genFields()):
112        yield "\t\t" + fieldLine
113
114    yield "\t};"
115    yield "\treturn tcu::Format::Bitfield<16>(value, &s_desc[0], &s_desc[DE_LENGTH_OF_ARRAY(s_desc)]);"
116    yield "}"
117
118def genStrUtilImpls (iface, enumGroups, bitfieldGroups):
119    definitions = makeDefSet(iface)
120
121    for groupName, values in enumGroups:
122        for line in genEnumStrImpl(groupName, values, definitions):
123            yield line
124    for groupName, values in bitfieldGroups:
125        for line in genBitfieldStrImpl(groupName, values, definitions):
126            yield line
127
128def genQueryEnumUtilImpl (groupName, groupQueries, allEnums):
129    yield ""
130    yield "int get%sQueryNumArgsOut (int pname)" % groupName
131    yield "{"
132    yield "\tswitch(pname)"
133    yield "\t{"
134
135    def genCases ():
136        for enumName, enumQueryNumOutputs in groupQueries:
137            if enumName in allEnums:
138                yield "case %s:\treturn %s;" % (enumName, enumQueryNumOutputs)
139            else:
140                print("Warning: %s not defined, skipping" % enumName)
141        yield "default:\treturn 1;"
142
143    for caseLine in indentLines(genCases()):
144        yield "\t\t" + caseLine
145
146    yield "\t}"
147    yield "}"
148
149def genQueryEnumUtilImpls (iface, queryGroups):
150    allEnums = makeDefSet(iface)
151
152    for groupName, groupQueries in queryGroups:
153        for line in genQueryEnumUtilImpl(groupName, groupQueries, allEnums):
154            yield line
155
156def genSetEnumUtilImpl (groupName, groupQueries, allEnums):
157    yield ""
158    yield "int get%sNumArgs (int pname)" % groupName
159    yield "{"
160    yield "\tswitch(pname)"
161    yield "\t{"
162
163    def genCases ():
164        for enumName, enumQueryNumOutputs in groupQueries:
165            if enumName in allEnums:
166                yield "case %s:\treturn %s;" % (enumName, enumQueryNumOutputs)
167            else:
168                print("Warning: %s not defined, skipping" % enumName)
169        yield "default:\treturn 1;"
170
171    for caseLine in indentLines(genCases()):
172        yield "\t\t" + caseLine
173
174    yield "\t}"
175    yield "}"
176
177def genSetEnumUtilImpls (iface, queryGroups):
178    allEnums = makeDefSet(iface)
179
180    for groupName, groupQueries in queryGroups:
181        for line in genSetEnumUtilImpl(groupName, groupQueries, allEnums):
182            yield line
183
184def addValuePrefix (groups, prefix):
185    return [(groupName, [prefix + value for value in values]) for groupName, values in groups]
186