am aa771b2c: am 92582aed: am e641e248: Use gcc for mips target.
[platform/upstream/VK-GL-CTS.git] / scripts / khr_util / gen_str_util.py
1 # -*- coding: utf-8 -*-
2
3 from itertools import chain
4 from format import indentLines
5
6 def isValueDefined (definitions, value):
7         return value in definitions
8
9 def allValuesUndefined (definitions, values):
10         for value in values:
11                 if isValueDefined(definitions, value):
12                         return False
13         return True
14
15 def anyValueDefined (definitions, values):
16         return not allValuesUndefined(definitions, values)
17
18 def makeDefSet (iface):
19         return set(enum.name for enum in iface.enums) | \
20                    set(enum.alias for enum in iface.enums if enum.alias != None)
21
22 def genStrUtilProtos (iface, enumGroups, bitfieldGroups):
23         definitions = makeDefSet(iface)
24
25         def genNameProtos ():
26                 for groupName, values in enumGroups:
27                         if anyValueDefined(definitions, values):
28                                 yield "const char*\tget%sName\t(int value);" % groupName
29                         else:
30                                 print "Warning: Empty value set for %s, skipping" % groupName
31
32         def genBitfieldProtos ():
33                 for groupName, values in bitfieldGroups:
34                         if anyValueDefined(definitions, values):
35                                 yield "tcu::Format::Bitfield<16>\tget%sStr\t(int value);" % groupName
36                         else:
37                                 print "Warning: Empty value set for %s, skipping" % groupName
38
39         def genStrImpl ():
40                 for groupName, values in enumGroups:
41                         if anyValueDefined(definitions, values):
42                                 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}
43
44                 # booleans can be stored in enums or in byte-sized arrays. For clarity add special case
45                 if anyValueDefined(definitions, ["GL_TRUE", "GL_FALSE"]):
46                         yield "inline tcu::Format::Enum<int, 1>\tgetBooleanStr\t(deUint8 value)\t{ return tcu::Format::Enum<int, 1>(getBooleanName, (int)value); }"
47
48         return chain(genNameProtos(), genBitfieldProtos(), genStrImpl())
49
50 def genEnumStrImpl (groupName, values, definitions):
51         if allValuesUndefined(definitions, values):
52                 return
53
54         yield ""
55         yield "const char* get%sName (int value)" % groupName
56         yield "{"
57         yield "\tswitch (value)"
58         yield "\t{"
59
60         def genCases ():
61                 for value in values:
62                         if isValueDefined(definitions, value):
63                                 yield "case %s:\treturn \"%s\";" % (value, value)
64                         else:
65                                 print "Warning: %s not defined, skipping" % value
66                 yield "default:\treturn DE_NULL;"
67
68         for caseLine in indentLines(genCases()):
69                 yield "\t\t" + caseLine
70
71         yield "\t}"
72         yield "}"
73
74 def genBitfieldStrImpl (groupName, values, definitions):
75         if allValuesUndefined(definitions, values):
76                 return
77
78         yield ""
79         yield "tcu::Format::Bitfield<16> get%sStr (int value)" % groupName
80         yield "{"
81         yield "\tstatic const tcu::Format::BitDesc s_desc[] ="
82         yield "\t{"
83
84         def genFields ():
85                 for value in values:
86                         if isValueDefined(definitions, value):
87                                 yield "tcu::Format::BitDesc(%s,\t\"%s\")," % (value, value)
88                         else:
89                                 print "Warning: %s not defined, skipping" % value
90
91         for fieldLine in indentLines(genFields()):
92                 yield "\t\t" + fieldLine
93
94         yield "\t};"
95         yield "\treturn tcu::Format::Bitfield<16>(value, &s_desc[0], &s_desc[DE_LENGTH_OF_ARRAY(s_desc)]);"
96         yield "}"
97
98 def genStrUtilImpls (iface, enumGroups, bitfieldGroups):
99         definitions = makeDefSet(iface)
100
101         for groupName, values in enumGroups:
102                 for line in genEnumStrImpl(groupName, values, definitions):
103                         yield line
104         for groupName, values in bitfieldGroups:
105                 for line in genBitfieldStrImpl(groupName, values, definitions):
106                         yield line
107
108 def genEnumUtilImpl (groupName, groupQueries, allEnums):
109         yield ""
110         yield "int get%sQueryNumArgsOut (int pname)" % groupName
111         yield "{"
112         yield "\tswitch(pname)"
113         yield "\t{"
114
115         def genCases ():
116                 for enumName, enumQueryNumOutputs in groupQueries:
117                         if enumName in allEnums:
118                                 yield "case %s:\treturn %s;" % (enumName, enumQueryNumOutputs)
119                         else:
120                                 print "Warning: %s not defined, skipping" % enumName
121                 yield "default:\treturn 1;"
122
123         for caseLine in indentLines(genCases()):
124                 yield "\t\t" + caseLine
125
126         yield "\t}"
127         yield "}"
128
129 def genEnumUtilImpls (iface, queryGroups):
130         allEnums = makeDefSet(iface)
131
132         for groupName, groupQueries in queryGroups:
133                 for line in genEnumUtilImpl(groupName, groupQueries, allEnums):
134                         yield line
135
136 def addValuePrefix (groups, prefix):
137         return [(groupName, [prefix + value for value in values]) for groupName, values in groups]