blob: dfbf2eacfa7ed5f40b3531c964146fa82a523f9d [file] [log] [blame]
#!/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;
}
}
*/""" '''