resolve merge conflicts of eb48f49dd to oc-dev
[platform/upstream/VK-GL-CTS.git] / scripts / khr_util / gen_str_util.py
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
23 from itertools import chain
24 from format import indentLines
25
26 def isValueDefined (definitions, value):
27         return value in definitions
28
29 def allValuesUndefined (definitions, values):
30         for value in values:
31                 if isValueDefined(definitions, value):
32                         return False
33         return True
34
35 def anyValueDefined (definitions, values):
36         return not allValuesUndefined(definitions, values)
37
38 def 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
42 def 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(deUint8 value)\t{ return tcu::Format::Enum<int, 1>(getBooleanName, (int)value); }"
67
68         return chain(genNameProtos(), genBitfieldProtos(), genStrImpl())
69
70 def 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
94 def 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
118 def 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
128 def 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
149 def 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
156 def 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
177 def 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
184 def addValuePrefix (groups, prefix):
185         return [(groupName, [prefix + value for value in values]) for groupName, values in groups]