xref: /aosp_15_r20/external/deqp/scripts/egl/call_log_wrapper.py (revision 35238bce31c2a825756842865a792f8cf7f89930)
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