blob: 184d64d958a9ef04f5c9c336996feb4825cbee03 [file] [log] [blame]
Pyry Haulosa0178632014-11-21 14:56:21 -08001# -*- coding: utf-8 -*-
2
Jarkko Pöyry3c77ed42015-01-06 12:54:34 -08003#-------------------------------------------------------------------------
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
Pyry Haulosa0178632014-11-21 14:56:21 -080023from itertools import chain
24from 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):
Jarkko Pöyry1f99d692014-11-17 14:21:54 -080062 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); }"
Pyry Haulosa0178632014-11-21 14:56:21 -080067
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
Jarkko Pöyry7af3c6f2015-02-12 15:27:33 -0800128def genQueryEnumUtilImpl (groupName, groupQueries, allEnums):
Jarkko Pöyry1f99d692014-11-17 14:21:54 -0800129 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
Jarkko Pöyry7af3c6f2015-02-12 15:27:33 -0800149def genQueryEnumUtilImpls (iface, queryGroups):
Jarkko Pöyry1f99d692014-11-17 14:21:54 -0800150 allEnums = makeDefSet(iface)
151
152 for groupName, groupQueries in queryGroups:
Jarkko Pöyry7af3c6f2015-02-12 15:27:33 -0800153 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):
Jarkko Pöyry1f99d692014-11-17 14:21:54 -0800182 yield line
183
Pyry Haulosa0178632014-11-21 14:56:21 -0800184def addValuePrefix (groups, prefix):
185 return [(groupName, [prefix + value for value in values]) for groupName, values in groups]