1*35238bceSAndroid Build Coastguard Worker# -*- coding: utf-8 -*- 2*35238bceSAndroid Build Coastguard Worker 3*35238bceSAndroid Build Coastguard Worker#------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker# drawElements Quality Program utilities 5*35238bceSAndroid Build Coastguard Worker# -------------------------------------- 6*35238bceSAndroid Build Coastguard Worker# 7*35238bceSAndroid Build Coastguard Worker# Copyright 2015 The Android Open Source Project 8*35238bceSAndroid Build Coastguard Worker# 9*35238bceSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 10*35238bceSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 11*35238bceSAndroid Build Coastguard Worker# You may obtain a copy of the License at 12*35238bceSAndroid Build Coastguard Worker# 13*35238bceSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 14*35238bceSAndroid Build Coastguard Worker# 15*35238bceSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 16*35238bceSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 17*35238bceSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18*35238bceSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 19*35238bceSAndroid Build Coastguard Worker# limitations under the License. 20*35238bceSAndroid Build Coastguard Worker# 21*35238bceSAndroid Build Coastguard Worker#------------------------------------------------------------------------- 22*35238bceSAndroid Build Coastguard Worker 23*35238bceSAndroid Build Coastguard Workerimport os 24*35238bceSAndroid Build Coastguard Workerimport string 25*35238bceSAndroid Build Coastguard Worker 26*35238bceSAndroid Build Coastguard Workerfrom egl.common import * 27*35238bceSAndroid Build Coastguard Workerfrom khr_util.format import indentLines 28*35238bceSAndroid Build Coastguard Worker 29*35238bceSAndroid Build Coastguard Workerclass LogSpec: 30*35238bceSAndroid Build Coastguard Worker def __init__ (self, argInPrints, argOutPrints = {}, returnPrint = None): 31*35238bceSAndroid Build Coastguard Worker self.argInPrints = argInPrints 32*35238bceSAndroid Build Coastguard Worker self.argOutPrints = argOutPrints 33*35238bceSAndroid Build Coastguard Worker self.returnPrint = returnPrint 34*35238bceSAndroid Build Coastguard Worker 35*35238bceSAndroid Build Coastguard Workerdef enum (group): 36*35238bceSAndroid Build Coastguard Worker return lambda name: "get%sStr(%s)" % (group, name) 37*35238bceSAndroid Build Coastguard Worker 38*35238bceSAndroid Build Coastguard Workerdef pointer (size): 39*35238bceSAndroid Build Coastguard Worker return lambda name: "getPointerStr(%s, %s)" % (name, size) 40*35238bceSAndroid Build Coastguard Worker 41*35238bceSAndroid Build Coastguard Workerdef enumPointer (group, size): 42*35238bceSAndroid Build Coastguard Worker return lambda name: "getEnumPointerStr<%(nameFunc)s>(%(name)s, %(size)s)" % {"name": name, "size": size, "nameFunc": ("get%sName" % group)} 43*35238bceSAndroid Build Coastguard Worker 44*35238bceSAndroid Build Coastguard Workerdef configAttrib (attribNdx): 45*35238bceSAndroid Build Coastguard Worker return lambda name: "getConfigAttribValueStr(param%d, %s)" % (attribNdx, name) 46*35238bceSAndroid Build Coastguard Worker 47*35238bceSAndroid Build Coastguard Worker# Special rules for printing call arguments 48*35238bceSAndroid Build Coastguard WorkerCALL_LOG_SPECS = { 49*35238bceSAndroid Build Coastguard Worker "eglBindAPI": LogSpec({0: enum("API")}), 50*35238bceSAndroid Build Coastguard Worker "eglChooseConfig": LogSpec({1: lambda n: "getConfigAttribListStr(%s)" % n}, argOutPrints = {2: pointer("(num_config && returnValue) ? deMin32(config_size, *num_config) : 0"), 4: lambda n: "(%s ? de::toString(*%s) : \"NULL\")" % (n, n)}), 51*35238bceSAndroid Build Coastguard Worker "eglCreateContext": LogSpec({3: lambda n: "getContextAttribListStr(%s)" % n}), 52*35238bceSAndroid Build Coastguard Worker "eglCreatePbufferSurface": LogSpec({2: lambda n: "getSurfaceAttribListStr(%s)" % n}), 53*35238bceSAndroid Build Coastguard Worker "eglCreatePixmapSurface": LogSpec({3: lambda n: "getSurfaceAttribListStr(%s)" % n}), 54*35238bceSAndroid Build Coastguard Worker "eglCreateWindowSurface": LogSpec({3: lambda n: "getSurfaceAttribListStr(%s)" % n}), 55*35238bceSAndroid Build Coastguard Worker "eglGetError": LogSpec({}, returnPrint = enum("Error")), 56*35238bceSAndroid Build Coastguard Worker "eglGetConfigAttrib": LogSpec({2: enum("ConfigAttrib")}, argOutPrints = {3: lambda n: "getConfigAttribValuePointerStr(attribute, %s)" % n}), 57*35238bceSAndroid Build Coastguard Worker "eglGetCurrentSurface": LogSpec({0: enum("SurfaceTarget")}), 58*35238bceSAndroid Build Coastguard Worker "eglGetProcAddress": LogSpec({}, returnPrint = lambda n: "tcu::toHex(%s)" % (n)), 59*35238bceSAndroid Build Coastguard Worker "eglQueryAPI": LogSpec({}, returnPrint = enum("API")), 60*35238bceSAndroid Build Coastguard Worker "eglQueryContext": LogSpec({2: enum("ContextAttrib")}, argOutPrints = {3: lambda n: "getContextAttribValuePointerStr(attribute, %s)" % n}), 61*35238bceSAndroid Build Coastguard Worker "eglQuerySurface": LogSpec({2: enum("SurfaceAttrib")}, argOutPrints = {3: lambda n: "getSurfaceAttribValuePointerStr(attribute, %s)" % n}), 62*35238bceSAndroid Build Coastguard Worker "eglSurfaceAttrib": LogSpec({2: enum("SurfaceAttrib"), 3: lambda n: "getSurfaceAttribValueStr(attribute, %s)" % n}), 63*35238bceSAndroid Build Coastguard Worker} 64*35238bceSAndroid Build Coastguard Worker 65*35238bceSAndroid Build Coastguard Workerdef eglwPrefix (string): 66*35238bceSAndroid Build Coastguard Worker if string[:5] == "__egl": 67*35238bceSAndroid Build Coastguard Worker return "eglw::" + string 68*35238bceSAndroid Build Coastguard Worker else: 69*35238bceSAndroid Build Coastguard Worker return re.sub(r'\bEGL', 'eglw::EGL', string) 70*35238bceSAndroid Build Coastguard Worker 71*35238bceSAndroid Build Coastguard Workerdef prefixedParams (command): 72*35238bceSAndroid Build Coastguard Worker if len(command.params) > 0: 73*35238bceSAndroid Build Coastguard Worker return ", ".join(eglwPrefix(param.declaration) for param in command.params) 74*35238bceSAndroid Build Coastguard Worker else: 75*35238bceSAndroid Build Coastguard Worker return "void" 76*35238bceSAndroid Build Coastguard Worker 77*35238bceSAndroid Build Coastguard Workerdef commandLogWrapperMemberDecl (command): 78*35238bceSAndroid Build Coastguard Worker return "%s\t%s\t(%s);" % (eglwPrefix(command.type), command.name, prefixedParams(command)) 79*35238bceSAndroid Build Coastguard Worker 80*35238bceSAndroid Build Coastguard Workerdef getVarDefaultPrint (type, varName): 81*35238bceSAndroid Build Coastguard Worker if re.match(r'^const +char *\*$', type): 82*35238bceSAndroid Build Coastguard Worker return "getStringStr(%s)" % varName 83*35238bceSAndroid Build Coastguard Worker elif re.match(r'(EGLenum|EGLConfig|EGLSurface|EGLClientBuffer|EGLNativeDisplayType|EGLNativeWindowType|EGLNativePixmapType|\*)$', type): 84*35238bceSAndroid Build Coastguard Worker return "toHex(%s)" % varName 85*35238bceSAndroid Build Coastguard Worker elif type == 'EGLBoolean': 86*35238bceSAndroid Build Coastguard Worker return "getBooleanStr(%s)" % varName 87*35238bceSAndroid Build Coastguard Worker else: 88*35238bceSAndroid Build Coastguard Worker return varName 89*35238bceSAndroid Build Coastguard Worker 90*35238bceSAndroid Build Coastguard Workerdef commandLogWrapperMemberDef (command): 91*35238bceSAndroid Build Coastguard Worker src = "" 92*35238bceSAndroid Build Coastguard Worker try: 93*35238bceSAndroid Build Coastguard Worker logSpec = CALL_LOG_SPECS[command.name] 94*35238bceSAndroid Build Coastguard Worker except KeyError: 95*35238bceSAndroid Build Coastguard Worker logSpec = None 96*35238bceSAndroid Build Coastguard Worker 97*35238bceSAndroid Build Coastguard Worker src += "\n" 98*35238bceSAndroid Build Coastguard Worker src += "%s CallLogWrapper::%s (%s)\n{\n" % (eglwPrefix(command.type), command.name, ", ".join(eglwPrefix(p.declaration) for p in command.params)) 99*35238bceSAndroid Build Coastguard Worker 100*35238bceSAndroid Build Coastguard Worker # Append paramemetrs 101*35238bceSAndroid Build Coastguard Worker callPrintItems = ["\"%s(\"" % command.name] 102*35238bceSAndroid Build Coastguard Worker for paramNdx, param in enumerate(command.params): 103*35238bceSAndroid Build Coastguard Worker if paramNdx > 0: 104*35238bceSAndroid Build Coastguard Worker callPrintItems.append("\", \"") 105*35238bceSAndroid Build Coastguard Worker 106*35238bceSAndroid Build Coastguard Worker if logSpec and paramNdx in logSpec.argInPrints: 107*35238bceSAndroid Build Coastguard Worker callPrintItems.append(logSpec.argInPrints[paramNdx](param.name)) 108*35238bceSAndroid Build Coastguard Worker else: 109*35238bceSAndroid Build Coastguard Worker callPrintItems.append(getVarDefaultPrint(param.type, param.name)) 110*35238bceSAndroid Build Coastguard Worker 111*35238bceSAndroid Build Coastguard Worker callPrintItems += ["\");\"", "TestLog::EndMessage"] 112*35238bceSAndroid Build Coastguard Worker 113*35238bceSAndroid Build Coastguard Worker src += "\tif (m_enableLog)\n" 114*35238bceSAndroid Build Coastguard Worker src += "\t\tm_log << TestLog::Message << %s;\n" % " << ".join(callPrintItems) 115*35238bceSAndroid Build Coastguard Worker 116*35238bceSAndroid Build Coastguard Worker callStr = "m_egl.%s(%s)" % (getFunctionMemberName(command.name), ", ".join([p.name for p in command.params])) 117*35238bceSAndroid Build Coastguard Worker 118*35238bceSAndroid Build Coastguard Worker isVoid = command.type == 'void' 119*35238bceSAndroid Build Coastguard Worker if isVoid: 120*35238bceSAndroid Build Coastguard Worker src += "\t%s;\n" % callStr 121*35238bceSAndroid Build Coastguard Worker else: 122*35238bceSAndroid Build Coastguard Worker src += "\t%s returnValue = %s;\n" % (eglwPrefix(command.type), callStr) 123*35238bceSAndroid Build Coastguard Worker 124*35238bceSAndroid Build Coastguard Worker if logSpec and len(logSpec.argOutPrints) > 0: 125*35238bceSAndroid Build Coastguard Worker # Print values returned in pointers 126*35238bceSAndroid Build Coastguard Worker src += "\tif (m_enableLog)\n\t{\n" 127*35238bceSAndroid Build Coastguard Worker 128*35238bceSAndroid Build Coastguard Worker for paramNdx, param in enumerate(command.params): 129*35238bceSAndroid Build Coastguard Worker if paramNdx in logSpec.argOutPrints: 130*35238bceSAndroid Build Coastguard Worker src += "\t\tm_log << TestLog::Message << \"// %s = \" << %s << TestLog::EndMessage;\n" % (param.name, logSpec.argOutPrints[paramNdx](param.name)) 131*35238bceSAndroid Build Coastguard Worker 132*35238bceSAndroid Build Coastguard Worker src += "\t}\n" 133*35238bceSAndroid Build Coastguard Worker 134*35238bceSAndroid Build Coastguard Worker if not isVoid: 135*35238bceSAndroid Build Coastguard Worker # Print return value 136*35238bceSAndroid Build Coastguard Worker returnPrint = getVarDefaultPrint(command.type, "returnValue") 137*35238bceSAndroid Build Coastguard Worker if logSpec and logSpec.returnPrint: 138*35238bceSAndroid Build Coastguard Worker returnPrint = logSpec.returnPrint("returnValue") 139*35238bceSAndroid Build Coastguard Worker 140*35238bceSAndroid Build Coastguard Worker src += "\tif (m_enableLog)\n" 141*35238bceSAndroid Build Coastguard Worker src += "\t\tm_log << TestLog::Message << \"// \" << %s << \" returned\" << TestLog::EndMessage;\n" % returnPrint 142*35238bceSAndroid Build Coastguard Worker src += "\treturn returnValue;\n" 143*35238bceSAndroid Build Coastguard Worker 144*35238bceSAndroid Build Coastguard Worker src += "}" 145*35238bceSAndroid Build Coastguard Worker return src 146*35238bceSAndroid Build Coastguard Worker 147*35238bceSAndroid Build Coastguard Workerdef gen (iface): 148*35238bceSAndroid Build Coastguard Worker genCommandList(iface, commandLogWrapperMemberDecl, EGL_DIR, "egluCallLogWrapperApi.inl", True) 149*35238bceSAndroid Build Coastguard Worker genCommandList(iface, commandLogWrapperMemberDef, EGL_DIR, "egluCallLogWrapper.inl", False) 150