1e5c31af7Sopenharmony_ci# -*- coding: utf-8 -*-
2e5c31af7Sopenharmony_ci
3e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci# drawElements Quality Program utilities
5e5c31af7Sopenharmony_ci# --------------------------------------
6e5c31af7Sopenharmony_ci#
7e5c31af7Sopenharmony_ci# Copyright 2015 The Android Open Source Project
8e5c31af7Sopenharmony_ci#
9e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci#
13e5c31af7Sopenharmony_ci#      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci#
15e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci# limitations under the License.
20e5c31af7Sopenharmony_ci#
21e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
22e5c31af7Sopenharmony_ci
23e5c31af7Sopenharmony_cifrom itertools import chain
24e5c31af7Sopenharmony_cifrom khr_util.format import indentLines
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_cidef isValueDefined (definitions, value):
27e5c31af7Sopenharmony_ci	return value in definitions
28e5c31af7Sopenharmony_ci
29e5c31af7Sopenharmony_cidef allValuesUndefined (definitions, values):
30e5c31af7Sopenharmony_ci	for value in values:
31e5c31af7Sopenharmony_ci		if isValueDefined(definitions, value):
32e5c31af7Sopenharmony_ci			return False
33e5c31af7Sopenharmony_ci	return True
34e5c31af7Sopenharmony_ci
35e5c31af7Sopenharmony_cidef anyValueDefined (definitions, values):
36e5c31af7Sopenharmony_ci	return not allValuesUndefined(definitions, values)
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_cidef makeDefSet (iface):
39e5c31af7Sopenharmony_ci	return set(enum.name for enum in iface.enums) | \
40e5c31af7Sopenharmony_ci		   set(enum.alias for enum in iface.enums if enum.alias != None)
41e5c31af7Sopenharmony_ci
42e5c31af7Sopenharmony_cidef genStrUtilProtos (iface, enumGroups, bitfieldGroups):
43e5c31af7Sopenharmony_ci	definitions = makeDefSet(iface)
44e5c31af7Sopenharmony_ci
45e5c31af7Sopenharmony_ci	def genNameProtos ():
46e5c31af7Sopenharmony_ci		for groupName, values in enumGroups:
47e5c31af7Sopenharmony_ci			if anyValueDefined(definitions, values):
48e5c31af7Sopenharmony_ci				yield "const char*\tget%sName\t(int value);" % groupName
49e5c31af7Sopenharmony_ci			else:
50e5c31af7Sopenharmony_ci				print("Warning: Empty value set for %s, skipping" % groupName)
51e5c31af7Sopenharmony_ci
52e5c31af7Sopenharmony_ci	def genBitfieldProtos ():
53e5c31af7Sopenharmony_ci		for groupName, values in bitfieldGroups:
54e5c31af7Sopenharmony_ci			if anyValueDefined(definitions, values):
55e5c31af7Sopenharmony_ci				yield "tcu::Format::Bitfield<16>\tget%sStr\t(int value);" % groupName
56e5c31af7Sopenharmony_ci			else:
57e5c31af7Sopenharmony_ci				print("Warning: Empty value set for %s, skipping" % groupName)
58e5c31af7Sopenharmony_ci
59e5c31af7Sopenharmony_ci	def genStrImpl ():
60e5c31af7Sopenharmony_ci		for groupName, values in enumGroups:
61e5c31af7Sopenharmony_ci			if anyValueDefined(definitions, values):
62e5c31af7Sopenharmony_ci				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}
63e5c31af7Sopenharmony_ci
64e5c31af7Sopenharmony_ci		# booleans can be stored in enums or in byte-sized arrays. For clarity add special case
65e5c31af7Sopenharmony_ci		if anyValueDefined(definitions, ["GL_TRUE", "GL_FALSE"]):
66e5c31af7Sopenharmony_ci			yield "inline tcu::Format::Enum<int, 1>\tgetBooleanStr\t(deUint8 value)\t{ return tcu::Format::Enum<int, 1>(getBooleanName, (int)value); }"
67e5c31af7Sopenharmony_ci
68e5c31af7Sopenharmony_ci	return chain(genNameProtos(), genBitfieldProtos(), genStrImpl())
69e5c31af7Sopenharmony_ci
70e5c31af7Sopenharmony_cidef genEnumStrImpl (groupName, values, definitions):
71e5c31af7Sopenharmony_ci	if allValuesUndefined(definitions, values):
72e5c31af7Sopenharmony_ci		return
73e5c31af7Sopenharmony_ci
74e5c31af7Sopenharmony_ci	yield ""
75e5c31af7Sopenharmony_ci	yield "const char* get%sName (int value)" % groupName
76e5c31af7Sopenharmony_ci	yield "{"
77e5c31af7Sopenharmony_ci	yield "\tswitch (value)"
78e5c31af7Sopenharmony_ci	yield "\t{"
79e5c31af7Sopenharmony_ci
80e5c31af7Sopenharmony_ci	def genCases ():
81e5c31af7Sopenharmony_ci		for value in values:
82e5c31af7Sopenharmony_ci			if isValueDefined(definitions, value):
83e5c31af7Sopenharmony_ci				yield "case %s:\treturn \"%s\";" % (value, value)
84e5c31af7Sopenharmony_ci			else:
85e5c31af7Sopenharmony_ci				print("Warning: %s not defined, skipping" % value)
86e5c31af7Sopenharmony_ci		yield "default:\treturn DE_NULL;"
87e5c31af7Sopenharmony_ci
88e5c31af7Sopenharmony_ci	for caseLine in indentLines(genCases()):
89e5c31af7Sopenharmony_ci		yield "\t\t" + caseLine
90e5c31af7Sopenharmony_ci
91e5c31af7Sopenharmony_ci	yield "\t}"
92e5c31af7Sopenharmony_ci	yield "}"
93e5c31af7Sopenharmony_ci
94e5c31af7Sopenharmony_cidef genBitfieldStrImpl (groupName, values, definitions):
95e5c31af7Sopenharmony_ci	if allValuesUndefined(definitions, values):
96e5c31af7Sopenharmony_ci		return
97e5c31af7Sopenharmony_ci
98e5c31af7Sopenharmony_ci	yield ""
99e5c31af7Sopenharmony_ci	yield "tcu::Format::Bitfield<16> get%sStr (int value)" % groupName
100e5c31af7Sopenharmony_ci	yield "{"
101e5c31af7Sopenharmony_ci	yield "\tstatic const tcu::Format::BitDesc s_desc[] ="
102e5c31af7Sopenharmony_ci	yield "\t{"
103e5c31af7Sopenharmony_ci
104e5c31af7Sopenharmony_ci	def genFields ():
105e5c31af7Sopenharmony_ci		for value in values:
106e5c31af7Sopenharmony_ci			if isValueDefined(definitions, value):
107e5c31af7Sopenharmony_ci				yield "tcu::Format::BitDesc(%s,\t\"%s\")," % (value, value)
108e5c31af7Sopenharmony_ci			else:
109e5c31af7Sopenharmony_ci				print("Warning: %s not defined, skipping" % value)
110e5c31af7Sopenharmony_ci
111e5c31af7Sopenharmony_ci	for fieldLine in indentLines(genFields()):
112e5c31af7Sopenharmony_ci		yield "\t\t" + fieldLine
113e5c31af7Sopenharmony_ci
114e5c31af7Sopenharmony_ci	yield "\t};"
115e5c31af7Sopenharmony_ci	yield "\treturn tcu::Format::Bitfield<16>(value, &s_desc[0], &s_desc[DE_LENGTH_OF_ARRAY(s_desc)]);"
116e5c31af7Sopenharmony_ci	yield "}"
117e5c31af7Sopenharmony_ci
118e5c31af7Sopenharmony_cidef genStrUtilImpls (iface, enumGroups, bitfieldGroups):
119e5c31af7Sopenharmony_ci	definitions = makeDefSet(iface)
120e5c31af7Sopenharmony_ci
121e5c31af7Sopenharmony_ci	for groupName, values in enumGroups:
122e5c31af7Sopenharmony_ci		for line in genEnumStrImpl(groupName, values, definitions):
123e5c31af7Sopenharmony_ci			yield line
124e5c31af7Sopenharmony_ci	for groupName, values in bitfieldGroups:
125e5c31af7Sopenharmony_ci		for line in genBitfieldStrImpl(groupName, values, definitions):
126e5c31af7Sopenharmony_ci			yield line
127e5c31af7Sopenharmony_ci
128e5c31af7Sopenharmony_cidef genQueryEnumUtilImpl (groupName, groupQueries, allEnums):
129e5c31af7Sopenharmony_ci	yield ""
130e5c31af7Sopenharmony_ci	yield "int get%sQueryNumArgsOut (int pname)" % groupName
131e5c31af7Sopenharmony_ci	yield "{"
132e5c31af7Sopenharmony_ci	yield "\tswitch(pname)"
133e5c31af7Sopenharmony_ci	yield "\t{"
134e5c31af7Sopenharmony_ci
135e5c31af7Sopenharmony_ci	def genCases ():
136e5c31af7Sopenharmony_ci		for enumName, enumQueryNumOutputs in groupQueries:
137e5c31af7Sopenharmony_ci			if enumName in allEnums:
138e5c31af7Sopenharmony_ci				yield "case %s:\treturn %s;" % (enumName, enumQueryNumOutputs)
139e5c31af7Sopenharmony_ci			else:
140e5c31af7Sopenharmony_ci				print("Warning: %s not defined, skipping" % enumName)
141e5c31af7Sopenharmony_ci		yield "default:\treturn 1;"
142e5c31af7Sopenharmony_ci
143e5c31af7Sopenharmony_ci	for caseLine in indentLines(genCases()):
144e5c31af7Sopenharmony_ci		yield "\t\t" + caseLine
145e5c31af7Sopenharmony_ci
146e5c31af7Sopenharmony_ci	yield "\t}"
147e5c31af7Sopenharmony_ci	yield "}"
148e5c31af7Sopenharmony_ci
149e5c31af7Sopenharmony_cidef genQueryEnumUtilImpls (iface, queryGroups):
150e5c31af7Sopenharmony_ci	allEnums = makeDefSet(iface)
151e5c31af7Sopenharmony_ci
152e5c31af7Sopenharmony_ci	for groupName, groupQueries in queryGroups:
153e5c31af7Sopenharmony_ci		for line in genQueryEnumUtilImpl(groupName, groupQueries, allEnums):
154e5c31af7Sopenharmony_ci			yield line
155e5c31af7Sopenharmony_ci
156e5c31af7Sopenharmony_cidef genSetEnumUtilImpl (groupName, groupQueries, allEnums):
157e5c31af7Sopenharmony_ci	yield ""
158e5c31af7Sopenharmony_ci	yield "int get%sNumArgs (int pname)" % groupName
159e5c31af7Sopenharmony_ci	yield "{"
160e5c31af7Sopenharmony_ci	yield "\tswitch(pname)"
161e5c31af7Sopenharmony_ci	yield "\t{"
162e5c31af7Sopenharmony_ci
163e5c31af7Sopenharmony_ci	def genCases ():
164e5c31af7Sopenharmony_ci		for enumName, enumQueryNumOutputs in groupQueries:
165e5c31af7Sopenharmony_ci			if enumName in allEnums:
166e5c31af7Sopenharmony_ci				yield "case %s:\treturn %s;" % (enumName, enumQueryNumOutputs)
167e5c31af7Sopenharmony_ci			else:
168e5c31af7Sopenharmony_ci				print("Warning: %s not defined, skipping" % enumName)
169e5c31af7Sopenharmony_ci		yield "default:\treturn 1;"
170e5c31af7Sopenharmony_ci
171e5c31af7Sopenharmony_ci	for caseLine in indentLines(genCases()):
172e5c31af7Sopenharmony_ci		yield "\t\t" + caseLine
173e5c31af7Sopenharmony_ci
174e5c31af7Sopenharmony_ci	yield "\t}"
175e5c31af7Sopenharmony_ci	yield "}"
176e5c31af7Sopenharmony_ci
177e5c31af7Sopenharmony_cidef genSetEnumUtilImpls (iface, queryGroups):
178e5c31af7Sopenharmony_ci	allEnums = makeDefSet(iface)
179e5c31af7Sopenharmony_ci
180e5c31af7Sopenharmony_ci	for groupName, groupQueries in queryGroups:
181e5c31af7Sopenharmony_ci		for line in genSetEnumUtilImpl(groupName, groupQueries, allEnums):
182e5c31af7Sopenharmony_ci			yield line
183e5c31af7Sopenharmony_ci
184e5c31af7Sopenharmony_cidef addValuePrefix (groups, prefix):
185e5c31af7Sopenharmony_ci	return [(groupName, [prefix + value for value in values]) for groupName, values in groups]
186