#!/usr/bin/python # -*- coding: utf-8 -*- # # Copyright 2011, 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. # import os import sys def RemoveAnnotation(line): if line.find(":") >= 0: annotation = line[line.find(":"): line.find(" ", line.find(":"))] return line.replace(annotation, "*") else: return line if __name__ == "__main__": externs = [] lines = open("../../../frameworks/base/opengl/libs/GLES2_dbg/gl2_api_annotated.in").readlines() output = open("src/com/android/glesv2debugger/MessageFormatter.java", "w") i = 0 output.write( """/* ** Copyright 2011, 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. */ // auto generated by generate_MessageFormatter_java.py" package com.android.glesv2debugger; import java.nio.ByteBuffer; public class MessageFormatter { static String formatFloats(int count, final ByteBuffer data) { if (data.remaining() == 0) return "{}"; data.order(SampleView.targetByteOrder); String ret = "{"; for (int i = 0; i < count; i++) { ret += Float.intBitsToFloat(data.getInt()); if (i < count - 1) ret += ", "; } return ret + "}"; } static String formatInts(int count, final ByteBuffer data) { if (data.remaining() == 0) return "{}"; data.order(SampleView.targetByteOrder); String ret = "{"; for (int i = 0; i < count; i++) { ret += data.getInt(); if (i < count - 1) ret += ", "; } return ret + "}"; } static String formatUInts(int count, final ByteBuffer data) { if (data.remaining() == 0) return "{}"; data.order(SampleView.targetByteOrder); String ret = "{"; for (int i = 0; i < count; i++) { long bits = data.getInt() & 0xffffffff; ret += bits; if (i < count - 1) ret += ", "; } return ret + "}"; } static String formatMatrix(int columns, int count, final ByteBuffer data) { if (data.remaining() == 0) return "{}"; data.order(SampleView.targetByteOrder); String ret = "{"; for (int i = 0; i < count; i++) { ret += Float.intBitsToFloat(data.getInt()); if (i < count - 1) ret += ", "; if (i % columns == columns - 1) ret += "\\n "; } return ret + "}"; } public static String format(final DebuggerMessage.Message msg, final boolean code) { String str; switch (msg.getFunction()) { """) #in source code these turn into program_%d etc. nameReplaces = ["program", "shader", "texture", "buffer", "framebuffer", "renderbuffer"] for line in lines: if line.find("API_ENTRY(") >= 0: # a function prototype returnType = line[0: line.find(" API_ENTRY(")].replace("const ", "") functionName = line[line.find("(") + 1: line.find(")")] #extract GL function name parameterList = line[line.find(")(") + 2: line.find(") {")] parameters = parameterList.split(',') paramIndex = 0 formatString = "%s" formatArgs = "" if returnType != "void": if returnType == "GLenum": formatArgs += '\ (code ? "%s" : GLEnum.valueOf(msg.getRet()))\n' % (functionName) elif returnType.find("*") >= 0: formatArgs += '\ (code ? "%s" : "0x" + Integer.toHexString(msg.getRet()))\n' % (functionName) else: formatArgs += '\ (code ? "%s" : msg.getRet())\n' % (functionName) else: formatArgs += '\ (code ? "%s" : "void")\n' % (functionName) formatString += "(" if parameterList == "void": parameters = [] inout = "" paramNames = [] for parameter in parameters: parameter = parameter.replace("const","") parameter = parameter.strip() paramType = parameter.split(' ')[0] paramName = parameter.split(' ')[1] annotation = "" formatString += "%s%s" formatArgs += '\ , (code ? "/*%s*/ " : "%s=")\n' % (paramName, paramName) if parameter.find(":") >= 0: assert inout == "" # only one parameter should be annotated inout = paramType.split(":")[2] annotation = paramType.split(":")[1] paramType = paramType.split(":")[0] count = 1 countArg = "" if annotation.find("*") >= 0: # [1,n] * param count = int(annotation.split("*")[0]) countArg = annotation.split("*")[1] assert countArg in paramNames elif annotation in paramNames: count = 1 countArg = annotation elif annotation == "GLstring": annotation = annotation else: count = int(annotation) dataFormatter = "" if paramType == "GLfloat": dataFormatter = "formatFloats" elif paramType == "GLint": dataFormatter = "formatInts" elif paramType == "GLuint": dataFormatter = "formatUInts" elif annotation == "GLstring": assert paramType == "GLchar" elif paramType.find("void") >= 0: assert 1 else: assert 0 if functionName.find("Matrix") >= 0: columns = int(functionName[functionName.find("fv") - 1: functionName.find("fv")]) assert columns * columns == count assert countArg != "" assert paramType == "GLfloat" formatArgs += '\ , (code ? "(GLfloat [])" : "") + formatMatrix(%d, %d * msg.getArg%d(), msg.getData().asReadOnlyByteBuffer())' % ( columns, count, paramNames.index(countArg)) elif annotation == "GLstring": formatArgs += '\ , (code ? "\\"" : "") + msg.getData().toStringUtf8() + (code ? "\\"" : "")' elif paramType.find("void") >= 0: formatArgs += '\ , (code ? "arg%d" : "0x" + Integer.toHexString(msg.getArg%d()))' % (paramIndex, paramIndex) elif countArg == "": formatArgs += '\ , (code ? "(%s [])" : "") + %s(%d, msg.getData().asReadOnlyByteBuffer())' % ( paramType, dataFormatter, count) else: formatArgs += '\ , (code ? "(%s [])" : "") + %s(%d * msg.getArg%d(), msg.getData().asReadOnlyByteBuffer())' % ( paramType, dataFormatter, count, paramNames.index(countArg)) else: if paramType == "GLfloat" or paramType == "GLclampf": formatArgs += "\ , Float.intBitsToFloat(msg.getArg%d())" % (paramIndex) elif paramType == "GLenum": formatArgs += "\ , GLEnum.valueOf(msg.getArg%d())" % (paramIndex) elif paramType.find("*") >= 0: formatArgs += '\ , (code ? "arg%d" : "0x" + Integer.toHexString(msg.getArg%d()))' % (paramIndex, paramIndex) elif paramName in nameReplaces: formatArgs += '\ , (code ? "%s_" : "") + msg.getArg%d()' % (paramName, paramIndex) else: formatArgs += "\ , msg.getArg%d()" % (paramIndex) if paramIndex < len(parameters) - 1: formatString += ", " formatArgs += '\n' paramNames.append(paramName) paramIndex += 1 formatString += ")" output.write(" case %s:\n" % (functionName)) if line.find("*") >= 0 and (line.find("*") < line.find(":") or line.find("*") > line.rfind(":")): sys.stderr.write(line) output.write(" // FIXME: this function uses pointers, debugger may send data in msg.data\n") output.write('\ str = String.format("%s",\n%s);\n\ break;\n' % (formatString, formatArgs)) output.write(""" default: str = msg.toString(); } return str; } }""") ''' print """/* package GLESv2Debugger; public class MessageFormatterCustom { public static String format(final DebuggerMessage.Message msg) { String str; switch (msg.getFunction()) {""" for extern in externs: print " case %s" % (extern) print " // TODO:" print """ default: str = msg.toString(); } return str; } } */""" '''