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 src_util import * 24 import re 25 26 class LogSpec: 27 def __init__ (self, argInPrints, argOutPrints = {}, returnPrint = None): 28 self.argInPrints = argInPrints 29 self.argOutPrints = argOutPrints 30 self.returnPrint = returnPrint 31 32 def enum (group): 33 return lambda name: "get%sStr(%s)" % (group, name) 34 35 def pointer (size): 36 return lambda name: "getPointerStr(%s, %s)" % (name, size) 37 38 def enumPointer (group, size): 39 return lambda name: "getEnumPointerStr(%(name)s, %(size)s, %(nameFunc)s)" % {"name": name, "size": size, "nameFunc": ("get%sName" % group)} 40 41 def booleanPointer (size): 42 return lambda name: "getBooleanPointerStr(%s, %s)" % (name, size) 43 44 def textureUnit (name): 45 return "getTextureUnitStr(%s)" % name 46 47 def voidPointer (name): 48 return "toHex(reinterpret_cast<deUintptr>(static_cast<const void*>(%s)))" % name 49 50 def fnPointer (name): 51 return "toHex(reinterpret_cast<deUintptr>(%s))" % name 52 53 stringVal = lambda name: "getStringStr(%s)" % name 54 55 # Special rules for printing call arguments 56 CALL_LOG_SPECS = { 57 "glActiveTexture": LogSpec({0: textureUnit}), 58 "glBeginQuery": LogSpec({0: enum("QueryTarget")}), 59 "glBeginTransformFeedback": LogSpec({0: enum("PrimitiveType")}), 60 "glBindBuffer": LogSpec({0: enum("BufferTarget")}), 61 "glBindBufferBase": LogSpec({0: enum("BufferTarget")}), 62 "glBindBufferRange": LogSpec({0: enum("BufferTarget")}), 63 "glBindFramebuffer": LogSpec({0: enum("FramebufferTarget")}), 64 "glBindRenderbuffer": LogSpec({0: enum("FramebufferTarget")}), 65 "glBindTexture": LogSpec({0: enum("TextureTarget")}), 66 "glBindTransformFeedback": LogSpec({0: enum("TransformFeedbackTarget")}), 67 "glBlendEquation": LogSpec({0: enum("BlendEquation")}), 68 "glBlendEquationSeparate": LogSpec({0: enum("BlendEquation"), 1: enum("BlendEquation")}), 69 "glBlendEquationi": LogSpec({1: enum("BlendEquation")}), 70 "glBlendEquationSeparatei": LogSpec({1: enum("BlendEquation"), 2: enum("BlendEquation")}), 71 "glBlendFunc": LogSpec({0: enum("BlendFactor"), 1: enum("BlendFactor")}), 72 "glBlendFuncSeparate": LogSpec({0: enum("BlendFactor"), 1: enum("BlendFactor"), 2: enum("BlendFactor"), 3: enum("BlendFactor")}), 73 "glBlitFramebuffer": LogSpec({8: enum("BufferMask"), 9: enum("TextureFilter")}), 74 "glBufferData": LogSpec({0: enum("BufferTarget"), 3: enum("Usage")}), 75 "glBufferSubData": LogSpec({0: enum("BufferTarget")}), 76 "glCheckFramebufferStatus": LogSpec({0: enum("FramebufferTarget")}, returnPrint = enum("FramebufferStatus")), 77 "glClear": LogSpec({0: enum("BufferMask")}), 78 "glClearBufferfv": LogSpec({0: enum("Buffer")}), 79 "glClearBufferfi": LogSpec({0: enum("Buffer")}), 80 "glClearBufferiv": LogSpec({0: enum("Buffer")}), 81 "glClearBufferuiv": LogSpec({0: enum("Buffer")}), 82 "glCompressedTexImage2D": LogSpec({0: enum("TextureTarget"), 2: enum("CompressedTextureFormat")}), 83 "glCompressedTexSubImage2D": LogSpec({0: enum("TextureTarget"), 6: enum("CompressedTextureFormat")}), 84 "glCompressedTexImage3D": LogSpec({0: enum("TextureTarget"), 2: enum("CompressedTextureFormat")}), 85 "glCompressedTexSubImage3D": LogSpec({0: enum("TextureTarget"), 8: enum("CompressedTextureFormat")}), 86 "glCopyTexImage1D": LogSpec({0: enum("TextureTarget"), 2: enum("UncompressedTextureFormat")}), 87 "glCopyTexImage2D": LogSpec({0: enum("TextureTarget"), 2: enum("UncompressedTextureFormat")}), 88 "glCreateShader": LogSpec({0: enum("ShaderType")}), 89 "glCullFace": LogSpec({0: enum("Face")}), 90 "glDeleteBuffers": LogSpec({1: pointer(size = "n")}), 91 "glDeleteFramebuffers": LogSpec({1: pointer(size = "n")}), 92 "glDeleteQueries": LogSpec({1: pointer(size = "n")}), 93 "glDeleteRenderbuffers": LogSpec({1: pointer(size = "n")}), 94 "glDeleteBuffers": LogSpec({1: pointer(size = "n")}), 95 "glDeleteTextures": LogSpec({1: pointer(size = "n")}), 96 "glDeleteVertexArrays": LogSpec({1: pointer(size = "n")}), 97 "glDeleteProgramPipelines": LogSpec({1: pointer(size = "n")}), 98 "glDepthFunc": LogSpec({0: enum("CompareFunc")}), 99 "glDisable": LogSpec({0: enum("EnableCap")}), 100 "glDisablei": LogSpec({0: enum("IndexedEnableCap")}), 101 "glDrawArrays": LogSpec({0: enum("PrimitiveType")}), 102 "glDrawArraysInstanced": LogSpec({0: enum("PrimitiveType")}), 103 "glDrawBuffers": LogSpec({1: enumPointer("DrawReadBuffer", size = "n")}), 104 "glDrawElements": LogSpec({0: enum("PrimitiveType"), 2: enum("Type")}), 105 "glDrawElementsInstanced": LogSpec({0: enum("PrimitiveType"), 2: enum("Type")}), 106 "glDrawRangeElements": LogSpec({0: enum("PrimitiveType"), 4: enum("Type")}), 107 "glDrawArraysIndirect": LogSpec({0: enum("PrimitiveType")}), 108 "glDrawElementsIndirect": LogSpec({0: enum("PrimitiveType"), 1: enum("Type")}), 109 "glDrawElementsBaseVertex": LogSpec({0: enum("PrimitiveType"), 2: enum("Type")}), 110 "glDrawElementsInstancedBaseVertex": LogSpec({0: enum("PrimitiveType"), 2: enum("Type")}), 111 "glDrawRangeElementsBaseVertex": LogSpec({0: enum("PrimitiveType"), 4: enum("Type")}), 112 "glMultiDrawArrays": LogSpec({0: enum("PrimitiveType")}), 113 "glMultiDrawElements": LogSpec({0: enum("PrimitiveType"), 2: enum("Type")}), 114 "glMultiDrawElementsBaseVertex": LogSpec({0: enum("PrimitiveType"), 2: enum("Type")}), 115 "glEnable": LogSpec({0: enum("EnableCap")}), 116 "glEnablei": LogSpec({0: enum("IndexedEnableCap")}), 117 "glEndQuery": LogSpec({0: enum("QueryTarget")}), 118 "glFramebufferRenderbuffer": LogSpec({0: enum("FramebufferTarget"), 1: enum("FramebufferAttachment"), 2: enum("FramebufferTarget")}), 119 "glFramebufferTexture2D": LogSpec({0: enum("FramebufferTarget"), 1: enum("FramebufferAttachment"), 2: enum("TextureTarget")}), 120 "glFramebufferTextureLayer": LogSpec({0: enum("FramebufferTarget"), 1: enum("FramebufferAttachment")}), 121 "glFramebufferTexture": LogSpec({0: enum("FramebufferTarget"), 1: enum("FramebufferAttachment")}), 122 "glFramebufferParameteri": LogSpec({0: enum("FramebufferTarget"), 1: enum("FramebufferParameter")}), 123 "glFrontFace": LogSpec({0: enum("Winding")}), 124 "glGenBuffers": LogSpec({}, argOutPrints = {1: pointer(size = "n")}), 125 "glGenerateMipmap": LogSpec({0: enum("TextureTarget")}), 126 "glGenFramebuffers": LogSpec({}, argOutPrints = {1: pointer(size = "n")}), 127 "glGenQueries": LogSpec({}, argOutPrints = {1: pointer(size = "n")}), 128 "glGenRenderbuffers": LogSpec({}, argOutPrints = {1: pointer(size = "n")}), 129 "glGenTextures": LogSpec({}, argOutPrints = {1: pointer(size = "n")}), 130 "glGenTransformFeedbacks": LogSpec({}, argOutPrints = {1: pointer(size = "n")}), 131 "glGenVertexArrays": LogSpec({}, argOutPrints = {1: pointer(size = "n")}), 132 "glGenProgramPipelines": LogSpec({}, argOutPrints = {1: pointer(size = "n")}), 133 # "glGetActiveAttrib": 134 "glGetActiveUniform": LogSpec({}, argOutPrints = {3: pointer(size = "1"), 4: pointer(size = "1"), 5: enumPointer("ShaderVarType", size = "1"), 6: stringVal}), 135 "glGetActiveUniformsiv": LogSpec({2: pointer(size = "uniformCount"), 3: enum("UniformParam")}, argOutPrints = {4: pointer(size = "uniformCount")}), 136 # "glGetAttachedShaders": 137 "glGetBooleanv": 138 LogSpec( 139 { 140 0: enum("GettableState"), 141 1: voidPointer # second argument has type of GLboolean* (aka. char*). Prevent 142 # wrapper from attempting to print the argument as a C string. 143 }, 144 argOutPrints = {1: booleanPointer(size = "getBasicQueryNumArgsOut(pname)")}), 145 "glGetBufferParameteriv": LogSpec({0: enum("BufferTarget"), 1: enum("BufferQuery")}), 146 "glGetBufferParameteri64v": LogSpec({0: enum("BufferTarget"), 1: enum("BufferQuery")}), 147 "glGetError": LogSpec({}, returnPrint = enum("Error")), 148 "glGetFloatv": LogSpec({0: enum("GettableState")}, argOutPrints = {1: pointer(size = "getBasicQueryNumArgsOut(pname)")}), 149 "glGetFramebufferAttachmentParameteriv": 150 LogSpec( 151 { 152 0: enum("FramebufferTarget"), 153 1: enum("FramebufferAttachment"), 154 2: enum("FramebufferAttachmentParameter") 155 }, 156 argOutPrints = {3: lambda name: "getFramebufferAttachmentParameterValueStr(pname, %s)" % name}), 157 "glGetFramebufferParameteriv": LogSpec({0: enum("FramebufferTarget"), 1: enum("FramebufferParameter")}, argOutPrints = {2: pointer(size = "1")}), 158 "glGetIntegerv": LogSpec({0: enum("GettableState")}, argOutPrints = {1: pointer(size = "getBasicQueryNumArgsOut(pname)")}), 159 "glGetInteger64v": LogSpec({0: enum("GettableState")}, argOutPrints = {1: pointer(size = "getBasicQueryNumArgsOut(pname)")}), 160 "glGetIntegeri_v": LogSpec({0: enum("GettableIndexedState")}, argOutPrints = {2:pointer(size = "getIndexedQueryNumArgsOut(target)")}), 161 "glGetInteger64i_v": LogSpec({0: enum("GettableIndexedState")}, argOutPrints = {2: pointer(size = "getIndexedQueryNumArgsOut(target)")}), 162 "glGetBooleani_v": 163 LogSpec( 164 { 165 0: enum("GettableIndexedState"), 166 2: voidPointer # last argument has type of GLboolean* (aka. char*). Prevent 167 # wrapper from attempting to print the argument as a C string. 168 }, 169 argOutPrints = {2: booleanPointer(size = "getIndexedQueryNumArgsOut(target)")}), 170 "glGetInternalformativ": LogSpec({0: enum("InternalFormatTarget"), 1: enum("UncompressedTextureFormat"), 2: enum("InternalFormatParameter")}, argOutPrints = {4: pointer(size = "bufSize")}), 171 "glGetMultisamplefv": LogSpec({0: enum("MultisampleParameter")}, argOutPrints = {2: pointer(size = "2")}), 172 "glGetPointerv": LogSpec({0: enum("PointerState")}, argOutPrints = {1: pointer(size = "1")}), 173 "glGetProgramiv": LogSpec({1: enum("ProgramParam")}, argOutPrints = {2: pointer(size = "getProgramQueryNumArgsOut(pname)")}), 174 "glGetProgramInfoLog": LogSpec({3: voidPointer}, argOutPrints = {2: pointer(size = "1")}), 175 "glGetProgramPipelineiv": LogSpec({1: enum("PipelineParam")}, argOutPrints = {2: pointer(size = "1")}), 176 "glGetProgramPipelineInfoLog": LogSpec({3: voidPointer}, argOutPrints = {2: pointer(size = "1")}), 177 "glGetQueryiv": LogSpec({0: enum("QueryTarget"), 1: enum("QueryParam")}, argOutPrints = {2: pointer(size = "1")}), 178 "glGetQueryObjectiv": LogSpec({1: enum("QueryObjectParam")}, argOutPrints = {2: pointer(size = "1")}), 179 "glGetQueryObjectuiv": LogSpec({1: enum("QueryObjectParam")}, argOutPrints = {2: pointer(size = "1")}), 180 "glGetQueryObjecti64v": LogSpec({1: enum("QueryObjectParam")}, argOutPrints = {2: pointer(size = "1")}), 181 "glGetQueryObjectui64v": LogSpec({1: enum("QueryObjectParam")}, argOutPrints = {2: pointer(size = "1")}), 182 "glGetRenderbufferParameteriv": LogSpec({0: enum("FramebufferTarget"), 1: enum("RenderbufferParameter")}), 183 "glGetSamplerParameterfv": LogSpec({1: enum("TextureParameter")}, argOutPrints = {2: pointer(size = "getTextureParamQueryNumArgsOut(pname)")}), 184 "glGetSamplerParameteriv": LogSpec({1: enum("TextureParameter")}, argOutPrints = {2: pointer(size = "getTextureParamQueryNumArgsOut(pname)")}), 185 "glGetSamplerParameterIiv": LogSpec({1: enum("TextureParameter")}, argOutPrints = {2: pointer(size = "getTextureParamQueryNumArgsOut(pname)")}), 186 "glGetSamplerParameterIuiv": LogSpec({1: enum("TextureParameter")}, argOutPrints = {2: pointer(size = "getTextureParamQueryNumArgsOut(pname)")}), 187 "glGetShaderiv": LogSpec({1: enum("ShaderParam")}, argOutPrints = {2: pointer(size = "1")}), 188 "glGetShaderInfoLog": LogSpec({3: voidPointer}, argOutPrints = {2: pointer(size = "1")}), 189 "glGetShaderPrecisionFormat": LogSpec({0: enum("ShaderType"), 1: enum("PrecisionFormatType")}), 190 # "glGetShaderSource": 191 "glGetString": LogSpec({0: enum("GettableString")}, returnPrint=stringVal), 192 "glGetStringi": LogSpec({0: enum("GettableString")}, returnPrint=stringVal), 193 "glGetTexParameterfv": LogSpec({0: enum("TextureTarget"), 1: enum("TextureParameter")}, argOutPrints = {2: pointer(size = "getTextureParamQueryNumArgsOut(pname)")}), 194 "glGetTexParameteriv": LogSpec({0: enum("TextureTarget"), 1: enum("TextureParameter")}, argOutPrints = {2: pointer(size = "getTextureParamQueryNumArgsOut(pname)")}), 195 "glGetTexParameterIiv": LogSpec({0: enum("TextureTarget"), 1: enum("TextureParameter")}, argOutPrints = {2: pointer(size = "getTextureParamQueryNumArgsOut(pname)")}), 196 "glGetTexParameterIuiv": LogSpec({0: enum("TextureTarget"), 1: enum("TextureParameter")}, argOutPrints = {2: pointer(size = "getTextureParamQueryNumArgsOut(pname)")}), 197 "glGetTexLevelParameterfv": LogSpec({0: enum("TextureTarget"), 2: enum("TextureLevelParameter")}, argOutPrints = {3: pointer(size = "1")}), 198 "glGetTexLevelParameteriv": LogSpec({0: enum("TextureTarget"), 2: enum("TextureLevelParameter")}, argOutPrints = {3: pointer(size = "1")}), 199 # "glGetUniformfv": 200 # "glGetUniformiv": 201 "glGetUniformIndices": LogSpec({2: pointer(size = "uniformCount")}, argOutPrints = {3: pointer(size = "uniformCount")}), 202 "glGetVertexAttribfv": LogSpec({1: enum("VertexAttribParameterName")}, argOutPrints = {2: pointer(size = "getAttributeQueryNumArgsOut(pname)")}), 203 "glGetVertexAttribiv": LogSpec({1: enum("VertexAttribParameterName")}, argOutPrints = {2: pointer(size = "getAttributeQueryNumArgsOut(pname)")}), 204 "glGetVertexAttribIiv": LogSpec({1: enum("VertexAttribParameterName")}, argOutPrints = {2: pointer(size = "getAttributeQueryNumArgsOut(pname)")}), 205 "glGetVertexAttribIuiv": LogSpec({1: enum("VertexAttribParameterName")}, argOutPrints = {2: pointer(size = "getAttributeQueryNumArgsOut(pname)")}), 206 # "glGetVertexAttribPointerv": 207 "glHint": LogSpec({0: enum("Hint"), 1: enum("HintMode")}), 208 "glIsEnabled": LogSpec({0: enum("EnableCap")}), 209 "glIsEnabledi": LogSpec({0: enum("IndexedEnableCap")}), 210 "glPixelStorei": LogSpec({0: enum("PixelStoreParameter")}), 211 "glReadBuffer": LogSpec({0: enum("DrawReadBuffer")}), 212 "glReadPixels": LogSpec({4: enum("UncompressedTextureFormat"), 5: enum("Type")}), 213 "glRenderbufferStorage": LogSpec({0: enum("FramebufferTarget"), 1: enum("UncompressedTextureFormat")}), 214 "glRenderbufferStorageMultisample": LogSpec({0: enum("FramebufferTarget"), 2: enum("UncompressedTextureFormat")}), 215 "glStencilFunc": LogSpec({0: enum("CompareFunc")}), 216 "glStencilFuncSeparate": LogSpec({0: enum("Face"), 1: enum("CompareFunc")}), 217 "glStencilMaskSeparate": LogSpec({0: enum("Face")}), 218 "glStencilOp": LogSpec({0: enum("StencilOp"), 1: enum("StencilOp"), 2: enum("StencilOp")}), 219 "glStencilOpSeparate": LogSpec({0: enum("Face"), 1: enum("StencilOp"), 2: enum("StencilOp"), 3: enum("StencilOp")}), 220 "glTexImage1D": LogSpec({0: enum("TextureTarget"), 2: enum("UncompressedTextureFormat"), 5: enum("UncompressedTextureFormat"), 6: enum("Type")}), 221 "glTexImage2D": LogSpec({0: enum("TextureTarget"), 2: enum("UncompressedTextureFormat"), 6: enum("UncompressedTextureFormat"), 7: enum("Type")}), 222 "glTexImage2DMultisample": LogSpec({0: enum("TextureTarget"), 2: enum("UncompressedTextureFormat"), 5: enum("Boolean")}), 223 "glTexImage3D": LogSpec({0: enum("TextureTarget"), 2: enum("UncompressedTextureFormat"), 7: enum("UncompressedTextureFormat"), 8: enum("Type")}), 224 "glTexStorage2D": LogSpec({0: enum("TextureTarget"), 2: enum("TextureFormat")}), 225 "glTexStorage3D": LogSpec({0: enum("TextureTarget"), 2: enum("TextureFormat")}), 226 "glTexStorage2DMultisample": LogSpec({0: enum("TextureTarget"), 2: enum("UncompressedTextureFormat"), 5: enum("Boolean")}), 227 "glTexStorage3DMultisample": LogSpec({0: enum("TextureTarget"), 2: enum("UncompressedTextureFormat"), 6: enum("Boolean")}), 228 # \todo [2012-03-08 pyry] Pointer values.. 229 "glTexParameterf": LogSpec({0: enum("TextureTarget"), 1: enum("TextureParameter")}), 230 "glTexParameteri": LogSpec({0: enum("TextureTarget"), 1: enum("TextureParameter"), 2: lambda name: "getTextureParameterValueStr(pname, %s)" % name}), 231 "glTexParameterfv": LogSpec({0: enum("TextureTarget"), 1: enum("TextureParameter"), 2: pointer(size = "getTextureParamNumArgs(pname)")}), 232 "glTexParameteriv": LogSpec({0: enum("TextureTarget"), 1: enum("TextureParameter"), 2: pointer(size = "getTextureParamNumArgs(pname)")}), 233 "glTexParameterIiv": LogSpec({0: enum("TextureTarget"), 1: enum("TextureParameter"), 2: pointer(size = "getTextureParamNumArgs(pname)")}), 234 "glTexParameterIuiv": LogSpec({0: enum("TextureTarget"), 1: enum("TextureParameter"), 2: pointer(size = "getTextureParamNumArgs(pname)")}), 235 "glSamplerParameterf": LogSpec({1: enum("TextureParameter")}), 236 "glSamplerParameteri": LogSpec({1: enum("TextureParameter"), 2: lambda name: "getTextureParameterValueStr(pname, %s)" % name}), 237 "glSamplerParameterfv": LogSpec({1: enum("TextureParameter"), 2: pointer(size = "getTextureParamNumArgs(pname)")}), 238 "glSamplerParameteriv": LogSpec({1: enum("TextureParameter"), 2: pointer(size = "getTextureParamNumArgs(pname)")}), 239 "glSamplerParameterIiv": LogSpec({1: enum("TextureParameter"), 2: pointer(size = "getTextureParamNumArgs(pname)")}), 240 "glSamplerParameterIuiv": LogSpec({1: enum("TextureParameter"), 2: pointer(size = "getTextureParamNumArgs(pname)")}), 241 "glTexSubImage1D": LogSpec({0: enum("TextureTarget"), 4: enum("UncompressedTextureFormat"), 5: enum("Type")}), 242 "glTexSubImage2D": LogSpec({0: enum("TextureTarget"), 6: enum("UncompressedTextureFormat"), 7: enum("Type")}), 243 "glTexSubImage3D": LogSpec({0: enum("TextureTarget"), 8: enum("UncompressedTextureFormat"), 9: enum("Type")}), 244 "glUniform1fv": LogSpec({2: pointer(size = "(count * 1)")}), 245 "glUniform1iv": LogSpec({2: pointer(size = "(count * 1)")}), 246 "glUniform1uiv": LogSpec({2: pointer(size = "(count * 1)")}), 247 "glUniform2fv": LogSpec({2: pointer(size = "(count * 2)")}), 248 "glUniform2iv": LogSpec({2: pointer(size = "(count * 2)")}), 249 "glUniform2uiv": LogSpec({2: pointer(size = "(count * 2)")}), 250 "glUniform3fv": LogSpec({2: pointer(size = "(count * 3)")}), 251 "glUniform3iv": LogSpec({2: pointer(size = "(count * 3)")}), 252 "glUniform3uiv": LogSpec({2: pointer(size = "(count * 3)")}), 253 "glUniform4fv": LogSpec({2: pointer(size = "(count * 4)")}), 254 "glUniform4iv": LogSpec({2: pointer(size = "(count * 4)")}), 255 "glUniform4uiv": LogSpec({2: pointer(size = "(count * 4)")}), 256 "glUniformMatrix2fv": LogSpec({3: pointer(size = "(count * 2*2)")}), 257 "glUniformMatrix3fv": LogSpec({3: pointer(size = "(count * 3*3)")}), 258 "glUniformMatrix4fv": LogSpec({3: pointer(size = "(count * 4*4)")}), 259 "glUniformMatrix2x3fv": LogSpec({3: pointer(size = "(count * 2*3)")}), 260 "glUniformMatrix2x4fv": LogSpec({3: pointer(size = "(count * 2*4)")}), 261 "glUniformMatrix3x2fv": LogSpec({3: pointer(size = "(count * 3*2)")}), 262 "glUniformMatrix3x4fv": LogSpec({3: pointer(size = "(count * 3*4)")}), 263 "glUniformMatrix4x2fv": LogSpec({3: pointer(size = "(count * 4*2)")}), 264 "glUniformMatrix4x3fv": LogSpec({3: pointer(size = "(count * 4*3)")}), 265 "glUseProgramStages": LogSpec({1: enum("ShaderTypeMask")}), 266 "glPatchParameteri": LogSpec({0: enum("PatchParam")}), 267 "glProgramParameteri": LogSpec({1: enum("ProgramParam")}), 268 "glProgramUniform1fv": LogSpec({3: pointer(size = "(count * 1)")}), 269 "glProgramUniform1iv": LogSpec({3: pointer(size = "(count * 1)")}), 270 "glProgramUniform1uiv": LogSpec({3: pointer(size = "(count * 1)")}), 271 "glProgramUniform2fv": LogSpec({3: pointer(size = "(count * 2)")}), 272 "glProgramUniform2iv": LogSpec({3: pointer(size = "(count * 2)")}), 273 "glProgramUniform2uiv": LogSpec({3: pointer(size = "(count * 2)")}), 274 "glProgramUniform3fv": LogSpec({3: pointer(size = "(count * 3)")}), 275 "glProgramUniform3iv": LogSpec({3: pointer(size = "(count * 3)")}), 276 "glProgramUniform3uiv": LogSpec({3: pointer(size = "(count * 3)")}), 277 "glProgramUniform4fv": LogSpec({3: pointer(size = "(count * 4)")}), 278 "glProgramUniform4iv": LogSpec({3: pointer(size = "(count * 4)")}), 279 "glProgramUniform4uiv": LogSpec({3: pointer(size = "(count * 4)")}), 280 "glProgramUniformMatrix2fv": LogSpec({4: pointer(size = "(count * 2*2)")}), 281 "glProgramUniformMatrix3fv": LogSpec({4: pointer(size = "(count * 3*3)")}), 282 "glProgramUniformMatrix4fv": LogSpec({4: pointer(size = "(count * 4*4)")}), 283 "glProgramUniformMatrix2x3fv": LogSpec({4: pointer(size = "(count * 2*3)")}), 284 "glProgramUniformMatrix2x4fv": LogSpec({4: pointer(size = "(count * 2*4)")}), 285 "glProgramUniformMatrix3x2fv": LogSpec({4: pointer(size = "(count * 3*2)")}), 286 "glProgramUniformMatrix3x4fv": LogSpec({4: pointer(size = "(count * 3*4)")}), 287 "glProgramUniformMatrix4x3fv": LogSpec({4: pointer(size = "(count * 4*3)")}), 288 "glProgramUniformMatrix4x2fv": LogSpec({4: pointer(size = "(count * 4*2)")}), 289 "glProvokingVertex": LogSpec({0: enum("ProvokingVertex")}), 290 "glVertexAttrib1fv": LogSpec({1: pointer(size = "1")}), 291 "glVertexAttrib2fv": LogSpec({1: pointer(size = "2")}), 292 "glVertexAttrib3fv": LogSpec({1: pointer(size = "3")}), 293 "glVertexAttrib4fv": LogSpec({1: pointer(size = "4")}), 294 "glVertexAttrib1sv": LogSpec({1: pointer(size = "1")}), 295 "glVertexAttrib2sv": LogSpec({1: pointer(size = "2")}), 296 "glVertexAttrib3sv": LogSpec({1: pointer(size = "3")}), 297 "glVertexAttrib4sv": LogSpec({1: pointer(size = "4")}), 298 "glVertexAttrib1dv": LogSpec({1: pointer(size = "1")}), 299 "glVertexAttrib2dv": LogSpec({1: pointer(size = "2")}), 300 "glVertexAttrib3dv": LogSpec({1: pointer(size = "3")}), 301 "glVertexAttrib4dv": LogSpec({1: pointer(size = "4")}), 302 "glVertexAttrib4bv": LogSpec({1: pointer(size = "4")}), 303 "glVertexAttrib4iv": LogSpec({1: pointer(size = "4")}), 304 "glVertexAttrib4ubv": LogSpec({1: pointer(size = "4")}), 305 "glVertexAttrib4usv": LogSpec({1: pointer(size = "4")}), 306 "glVertexAttrib4uiv": LogSpec({1: pointer(size = "4")}), 307 "glVertexAttrib4Nbv": LogSpec({1: pointer(size = "4")}), 308 "glVertexAttrib4Nsv": LogSpec({1: pointer(size = "4")}), 309 "glVertexAttrib4Niv": LogSpec({1: pointer(size = "4")}), 310 "glVertexAttrib4Nubv": LogSpec({1: pointer(size = "4")}), 311 "glVertexAttrib4Nusv": LogSpec({1: pointer(size = "4")}), 312 "glVertexAttrib4Nuiv": LogSpec({1: pointer(size = "4")}), 313 "glVertexAttribI1iv": LogSpec({1: pointer(size = "1")}), 314 "glVertexAttribI2iv": LogSpec({1: pointer(size = "2")}), 315 "glVertexAttribI3iv": LogSpec({1: pointer(size = "3")}), 316 "glVertexAttribI4iv": LogSpec({1: pointer(size = "4")}), 317 "glVertexAttribI1uiv": LogSpec({1: pointer(size = "1")}), 318 "glVertexAttribI2uiv": LogSpec({1: pointer(size = "2")}), 319 "glVertexAttribI3uiv": LogSpec({1: pointer(size = "3")}), 320 "glVertexAttribI4uiv": LogSpec({1: pointer(size = "4")}), 321 "glVertexAttribI4bv": LogSpec({1: pointer(size = "4")}), 322 "glVertexAttribI4sv": LogSpec({1: pointer(size = "4")}), 323 "glVertexAttribI4ubv": LogSpec({1: pointer(size = "4")}), 324 "glVertexAttribI4usv": LogSpec({1: pointer(size = "4")}), 325 "glVertexAttribPointer": LogSpec({2: enum("Type")}), 326 "glVertexAttribIPointer": LogSpec({2: enum("Type")}), 327 "glVertexAttribFormat": LogSpec({2: enum("Type")}), 328 "glVertexAttribIFormat": LogSpec({2: enum("Type")}), 329 "glInvalidateFramebuffer": LogSpec({0: enum("FramebufferTarget"), 2: enumPointer("InvalidateAttachment", "numAttachments")}), 330 "glInvalidateSubFramebuffer": LogSpec({0: enum("FramebufferTarget"), 2: enumPointer("InvalidateAttachment", "numAttachments")}), 331 "glMapBufferRange": LogSpec({0: enum("BufferTarget"), 3: enum("BufferMapFlags")}), 332 "glUnmapBuffer": LogSpec({0: enum("BufferTarget")}), 333 "glFlushMappedBufferRange": LogSpec({0: enum("BufferTarget")}), 334 "glMemoryBarrier": LogSpec({0: enum("MemoryBarrierFlags")}), 335 "glBindImageTexture": LogSpec({5: enum("ImageAccess"), 6: enum("UncompressedTextureFormat")}), 336 "glGetProgramResourceIndex": LogSpec({1: enum("ProgramInterface")}), 337 "glGetProgramResourceiv": 338 LogSpec( 339 { 340 1: enum("ProgramInterface"), 341 4: enumPointer("ProgramResourceProperty", "propCount") 342 }, 343 argOutPrints = 344 { 345 6: pointer(size = "1"), 346 7: pointer(size = "((length == DE_NULL) ? (bufSize) : ((bufSize < *length) ? (bufSize) : (*length)))") 347 }), 348 "glDebugMessageInsert": LogSpec({0: enum("DebugMessageSource"), 1: enum("DebugMessageType"), 3: enum("DebugMessageSeverity")}), 349 "glDebugMessageControl": LogSpec({0: enum("DebugMessageSource"), 1: enum("DebugMessageType"), 2: enum("DebugMessageSeverity"), 4: pointer(size = "(count)")}), 350 "glDebugMessageCallback": LogSpec({0: fnPointer, 1: voidPointer}), 351 "glPushDebugGroup": LogSpec({0: enum("DebugMessageSource")}), 352 "glTexBuffer": LogSpec({0: enum("BufferTarget"), 1: enum("UncompressedTextureFormat")}), 353 "glTexBufferRange": LogSpec({0: enum("BufferTarget"), 1: enum("UncompressedTextureFormat")}), 354 } 355 356 def glwPrefix (string): 357 return re.sub(r'\bGL', 'glw::GL', string) 358 359 def prefixedParams (command): 360 if len(command.params) > 0: 361 return ", ".join(glwPrefix(param.declaration) for param in command.params) 362 else: 363 return "void" 364 365 def commandLogWrapperMemberDecl (command): 366 return "%s\t%s\t(%s);" % (glwPrefix(command.type), command.name, prefixedParams(command)) 367 368 def getVarDefaultPrint (type, varName): 369 if re.match(r'^const +GLchar *\*$', type): 370 return "getStringStr(%s)" % varName 371 elif re.match(r'(GLubyte|GLbyte|GLenum|GLushort|GLbitfield|\*)$', type): 372 return "toHex(%s)" % varName 373 elif type == 'GLboolean': 374 return "getBooleanStr(%s)" % varName 375 elif re.match(r'^(const +)?.+ *\*$', type) and not re.match(r'^(const +)?void *\*$', type): 376 # non-void pointer type, always cast to void* to avoid unforeseen consequences of 377 # implicit assumptions (such as char* should be printed as a zero-terminated string) 378 # \note use static_cast to break the build if function pointer is supplied 379 return "toHex(reinterpret_cast<deUintptr>(static_cast<const void*>(%s)))" % varName 380 else: 381 return varName 382 383 def commandLogWrapperMemberDef (command): 384 src = "" 385 try: 386 logSpec = CALL_LOG_SPECS[command.name] 387 except KeyError: 388 logSpec = None 389 390 src += "\n" 391 src += "%s CallLogWrapper::%s (%s)\n{\n" % (glwPrefix(command.type), command.name, prefixedParams(command)) 392 393 # Append paramemetrs 394 callPrintItems = ["\"%s(\"" % command.name] 395 for paramNdx, param in enumerate(command.params): 396 if paramNdx > 0: 397 callPrintItems.append("\", \"") 398 399 if logSpec and paramNdx in logSpec.argInPrints: 400 callPrintItems.append(logSpec.argInPrints[paramNdx](param.name)) 401 else: 402 callPrintItems.append(getVarDefaultPrint(param.type, param.name)) 403 404 callPrintItems += ["\");\"", "TestLog::EndMessage"] 405 406 src += "\tif (m_enableLog)\n" 407 src += "\t\tm_log << TestLog::Message << %s;\n" % " << ".join(callPrintItems) 408 409 callStr = "m_gl.%s(%s)" % (getFunctionMemberName(command.name), ", ".join([p.name for p in command.params])) 410 411 isVoid = command.type == 'void' 412 if isVoid: 413 src += "\t%s;\n" % callStr 414 else: 415 src += "\t%s returnValue = %s;\n" % (glwPrefix(command.type), callStr) 416 417 if logSpec and len(logSpec.argOutPrints) > 0: 418 # Print values returned in pointers 419 src += "\tif (m_enableLog)\n" 420 printouts = "" 421 numPrintouts = 0 422 423 for paramNdx, param in enumerate(command.params): 424 if paramNdx in logSpec.argOutPrints: 425 printouts += "\t\tm_log << TestLog::Message << \"// %s = \" << %s << TestLog::EndMessage;\n" % (param.name, logSpec.argOutPrints[paramNdx](param.name)) 426 numPrintouts += 1 427 428 # If print handlers do not match the actual command, that is very likely an error. Check 429 # print handlers is a subset of all arguments. 430 if numPrintouts == 0 or len(set(logSpec.argOutPrints.keys()) - set(range(len(command.params)))) > 0: 431 raise Exception("Invalid print handlers when processing command %s" % command.name) 432 433 if numPrintouts != 1: 434 src += "\t{\n" 435 src += printouts 436 if numPrintouts != 1: 437 src += "\t}\n" 438 439 if not isVoid: 440 # Print return value 441 returnPrint = getVarDefaultPrint(command.type, "returnValue") 442 if logSpec and logSpec.returnPrint: 443 returnPrint = logSpec.returnPrint("returnValue") 444 445 src += "\tif (m_enableLog)\n" 446 src += "\t\tm_log << TestLog::Message << \"// \" << %s << \" returned\" << TestLog::EndMessage;\n" % returnPrint 447 src += "\treturn returnValue;\n" 448 449 src += "}" 450 return src 451 452 def genCallLogWrapper (iface): 453 genCommandList(iface, commandLogWrapperMemberDecl, OPENGL_DIR, "gluCallLogWrapperApi.inl", True) 454 genCommandList(iface, commandLogWrapperMemberDef, OPENGL_DIR, "gluCallLogWrapper.inl", False) 455 456 if __name__ == "__main__": 457 genCallLogWrapper(getHybridInterface()) 458