Home | History | Annotate | Download | only in khr_util
      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]
    186