# -*- coding: utf-8 -*-
#-------------------------------------------------------------------------
# drawElements Quality Program utilities
# --------------------------------------
#
# Copyright 2015 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#-------------------------------------------------------------------------
from itertools import chain
from format import indentLines
def isValueDefined (definitions, value):
return value in definitions
def allValuesUndefined (definitions, values):
for value in values:
if isValueDefined(definitions, value):
return False
return True
def anyValueDefined (definitions, values):
return not allValuesUndefined(definitions, values)
def makeDefSet (iface):
return set(enum.name for enum in iface.enums) | \
set(enum.alias for enum in iface.enums if enum.alias != None)
def genStrUtilProtos (iface, enumGroups, bitfieldGroups):
definitions = makeDefSet(iface)
def genNameProtos ():
for groupName, values in enumGroups:
if anyValueDefined(definitions, values):
yield "const char*\tget%sName\t(int value);" % groupName
else:
print "Warning: Empty value set for %s, skipping" % groupName
def genBitfieldProtos ():
for groupName, values in bitfieldGroups:
if anyValueDefined(definitions, values):
yield "tcu::Format::Bitfield<16>\tget%sStr\t(int value);" % groupName
else:
print "Warning: Empty value set for %s, skipping" % groupName
def genStrImpl ():
for groupName, values in enumGroups:
if anyValueDefined(definitions, values):
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}
# booleans can be stored in enums or in byte-sized arrays. For clarity add special case
if anyValueDefined(definitions, ["GL_TRUE", "GL_FALSE"]):
yield "inline tcu::Format::Enum<int, 1>\tgetBooleanStr\t(deUint8 value)\t{ return tcu::Format::Enum<int, 1>(getBooleanName, (int)value); }"
return chain(genNameProtos(), genBitfieldProtos(), genStrImpl())
def genEnumStrImpl (groupName, values, definitions):
if allValuesUndefined(definitions, values):
return
yield ""
yield "const char* get%sName (int value)" % groupName
yield "{"
yield "\tswitch (value)"
yield "\t{"
def genCases ():
for value in values:
if isValueDefined(definitions, value):
yield "case %s:\treturn \"%s\";" % (value, value)
else:
print "Warning: %s not defined, skipping" % value
yield "default:\treturn DE_NULL;"
for caseLine in indentLines(genCases()):
yield "\t\t" + caseLine
yield "\t}"
yield "}"
def genBitfieldStrImpl (groupName, values, definitions):
if allValuesUndefined(definitions, values):
return
yield ""
yield "tcu::Format::Bitfield<16> get%sStr (int value)" % groupName
yield "{"
yield "\tstatic const tcu::Format::BitDesc s_desc[] ="
yield "\t{"
def genFields ():
for value in values:
if isValueDefined(definitions, value):
yield "tcu::Format::BitDesc(%s,\t\"%s\")," % (value, value)
else:
print "Warning: %s not defined, skipping" % value
for fieldLine in indentLines(genFields()):
yield "\t\t" + fieldLine
yield "\t};"
yield "\treturn tcu::Format::Bitfield<16>(value, &s_desc[0], &s_desc[DE_LENGTH_OF_ARRAY(s_desc)]);"
yield "}"
def genStrUtilImpls (iface, enumGroups, bitfieldGroups):
definitions = makeDefSet(iface)
for groupName, values in enumGroups:
for line in genEnumStrImpl(groupName, values, definitions):
yield line
for groupName, values in bitfieldGroups:
for line in genBitfieldStrImpl(groupName, values, definitions):
yield line
def genQueryEnumUtilImpl (groupName, groupQueries, allEnums):
yield ""
yield "int get%sQueryNumArgsOut (int pname)" % groupName
yield "{"
yield "\tswitch(pname)"
yield "\t{"
def genCases ():
for enumName, enumQueryNumOutputs in groupQueries:
if enumName in allEnums:
yield "case %s:\treturn %s;" % (enumName, enumQueryNumOutputs)
else:
print "Warning: %s not defined, skipping" % enumName
yield "default:\treturn 1;"
for caseLine in indentLines(genCases()):
yield "\t\t" + caseLine
yield "\t}"
yield "}"
def genQueryEnumUtilImpls (iface, queryGroups):
allEnums = makeDefSet(iface)
for groupName, groupQueries in queryGroups:
for line in genQueryEnumUtilImpl(groupName, groupQueries, allEnums):
yield line
def genSetEnumUtilImpl (groupName, groupQueries, allEnums):
yield ""
yield "int get%sNumArgs (int pname)" % groupName
yield "{"
yield "\tswitch(pname)"
yield "\t{"
def genCases ():
for enumName, enumQueryNumOutputs in groupQueries:
if enumName in allEnums:
yield "case %s:\treturn %s;" % (enumName, enumQueryNumOutputs)
else:
print "Warning: %s not defined, skipping" % enumName
yield "default:\treturn 1;"
for caseLine in indentLines(genCases()):
yield "\t\t" + caseLine
yield "\t}"
yield "}"
def genSetEnumUtilImpls (iface, queryGroups):
allEnums = makeDefSet(iface)
for groupName, groupQueries in queryGroups:
for line in genSetEnumUtilImpl(groupName, groupQueries, allEnums):
yield line
def addValuePrefix (groups, prefix):
return [(groupName, [prefix + value for value in values]) for groupName, values in groups]