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