• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3
4#
5# Copyright 2011, The Android Open Source Project
6#
7# Licensed under the Apache License, Version 2.0 (the "License");
8# you may not use this file except in compliance with the License.
9# You may obtain a copy of the License at
10#
11#     http://www.apache.org/licenses/LICENSE-2.0
12#
13# Unless required by applicable law or agreed to in writing, software
14# distributed under the License is distributed on an "AS IS" BASIS,
15# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16# See the License for the specific language governing permissions and
17# limitations under the License.
18#
19
20import os
21import sys
22
23def RemoveAnnotation(line):
24    if line.find(":") >= 0:
25        annotation = line[line.find(":"): line.find(" ", line.find(":"))]
26        return line.replace(annotation, "*")
27    else:
28        return line
29
30if __name__ == "__main__":
31    externs = []
32    lines = open("../../../frameworks/base/opengl/libs/GLES2_dbg/gl2_api_annotated.in").readlines()
33    output = open("src/com/android/glesv2debugger/MessageFormatter.java", "w")
34
35    i = 0
36    output.write(
37"""/*
38 ** Copyright 2011, The Android Open Source Project
39 **
40 ** Licensed under the Apache License, Version 2.0 (the "License");
41 ** you may not use this file except in compliance with the License.
42 ** You may obtain a copy of the License at
43 **
44 **     http://www.apache.org/licenses/LICENSE-2.0
45 **
46 ** Unless required by applicable law or agreed to in writing, software
47 ** distributed under the License is distributed on an "AS IS" BASIS,
48 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
49 ** See the License for the specific language governing permissions and
50 ** limitations under the License.
51 */
52
53// auto generated by generate_MessageFormatter_java.py"
54
55package com.android.glesv2debugger;
56
57import java.nio.ByteBuffer;
58
59public class MessageFormatter {
60
61    static String formatFloats(int count, final ByteBuffer data) {
62        if (data.remaining() == 0)
63            return "{}";
64        data.order(SampleView.targetByteOrder);
65        String ret = "{";
66        for (int i = 0; i < count; i++) {
67            ret += Float.intBitsToFloat(data.getInt());
68            if (i < count - 1)
69                ret += ", ";
70        }
71        return ret + "}";
72    }
73
74    static String formatInts(int count, final ByteBuffer data) {
75        if (data.remaining() == 0)
76            return "{}";
77        data.order(SampleView.targetByteOrder);
78        String ret = "{";
79        for (int i = 0; i < count; i++) {
80            ret += data.getInt();
81            if (i < count - 1)
82                ret += ", ";
83        }
84        return ret + "}";
85    }
86
87    static String formatUInts(int count, final ByteBuffer data) {
88        if (data.remaining() == 0)
89            return "{}";
90        data.order(SampleView.targetByteOrder);
91        String ret = "{";
92        for (int i = 0; i < count; i++) {
93            long bits = data.getInt() & 0xffffffff;
94            ret += bits;
95            if (i < count - 1)
96                ret += ", ";
97        }
98        return ret + "}";
99    }
100
101    static String formatMatrix(int columns, int count, final ByteBuffer data) {
102        if (data.remaining() == 0)
103            return "{}";
104        data.order(SampleView.targetByteOrder);
105        String ret = "{";
106        for (int i = 0; i < count; i++) {
107            ret += Float.intBitsToFloat(data.getInt());
108            if (i < count - 1)
109                ret += ", ";
110            if (i % columns == columns - 1)
111                ret += "\\n                                             ";
112        }
113        return ret + "}";
114    }
115
116    public static String format(final DebuggerMessage.Message msg,
117                                final boolean code) {
118        String str;
119        switch (msg.getFunction()) {
120""")
121    #in source code these turn into program_%d etc.
122    nameReplaces = ["program", "shader", "texture", "buffer", "framebuffer", "renderbuffer"]
123    for line in lines:
124        if line.find("API_ENTRY(") >= 0: # a function prototype
125            returnType = line[0: line.find(" API_ENTRY(")].replace("const ", "")
126            functionName = line[line.find("(") + 1: line.find(")")] #extract GL function name
127            parameterList = line[line.find(")(") + 2: line.find(") {")]
128
129            parameters = parameterList.split(',')
130            paramIndex = 0
131
132            formatString = "%s"
133            formatArgs = ""
134            if returnType != "void":
135                if returnType == "GLenum":
136                    formatArgs += '\
137                    (code ? "%s" : GLEnum.valueOf(msg.getRet()))\n' % (functionName)
138                elif returnType.find("*") >= 0:
139                    formatArgs += '\
140                    (code ? "%s" : "0x" + Integer.toHexString(msg.getRet()))\n' % (functionName)
141                else:
142                    formatArgs += '\
143                    (code ? "%s" : msg.getRet())\n' % (functionName)
144            else:
145                formatArgs += '\
146                    (code ? "%s" : "void")\n' % (functionName)
147
148            formatString += "("
149
150            if parameterList == "void":
151                parameters = []
152            inout = ""
153
154            paramNames = []
155
156            for parameter in parameters:
157                parameter = parameter.replace("const","")
158                parameter = parameter.strip()
159                paramType = parameter.split(' ')[0]
160                paramName = parameter.split(' ')[1]
161                annotation = ""
162
163                formatString += "%s%s"
164                formatArgs += '\
165                    , (code ? "/*%s*/ " : "%s=")\n' % (paramName, paramName)
166                if parameter.find(":") >= 0:
167                    assert inout == "" # only one parameter should be annotated
168                    inout = paramType.split(":")[2]
169                    annotation = paramType.split(":")[1]
170                    paramType = paramType.split(":")[0]
171                    count = 1
172                    countArg = ""
173                    if annotation.find("*") >= 0: # [1,n] * param
174                        count = int(annotation.split("*")[0])
175                        countArg = annotation.split("*")[1]
176                        assert countArg in paramNames
177                    elif annotation in paramNames:
178                        count = 1
179                        countArg = annotation
180                    elif annotation == "GLstring":
181                        annotation = annotation
182                    else:
183                        count = int(annotation)
184                    dataFormatter = ""
185                    if paramType == "GLfloat":
186                        dataFormatter = "formatFloats"
187                    elif paramType == "GLint":
188                        dataFormatter = "formatInts"
189                    elif paramType == "GLuint":
190                        dataFormatter = "formatUInts"
191                    elif annotation == "GLstring":
192                        assert paramType == "GLchar"
193                    elif paramType.find("void") >= 0:
194                        assert 1
195                    else:
196                        assert 0
197                    if functionName.find("Matrix") >= 0:
198                        columns = int(functionName[functionName.find("fv") - 1: functionName.find("fv")])
199                        assert columns * columns == count
200                        assert countArg != ""
201                        assert paramType == "GLfloat"
202                        formatArgs += '\
203                    , (code ? "(GLfloat [])" : "") + formatMatrix(%d, %d * msg.getArg%d(), msg.getData().asReadOnlyByteBuffer())' % (
204                        columns, count, paramNames.index(countArg))
205                    elif annotation == "GLstring":
206                        formatArgs += '\
207                    , (code ? "\\"" : "") + msg.getData().toStringUtf8() + (code ? "\\"" : "")'
208                    elif paramType.find("void") >= 0:
209                        formatArgs += '\
210                    , (code ? "arg%d" : "0x" + Integer.toHexString(msg.getArg%d()))' % (paramIndex, paramIndex)
211                    elif countArg == "":
212                        formatArgs += '\
213                    , (code ? "(%s [])" : "") + %s(%d, msg.getData().asReadOnlyByteBuffer())' % (
214                        paramType, dataFormatter, count)
215                    else:
216                        formatArgs += '\
217                    , (code ? "(%s [])" : "") +  %s(%d * msg.getArg%d(), msg.getData().asReadOnlyByteBuffer())' % (
218                        paramType, dataFormatter, count, paramNames.index(countArg))
219                else:
220                    if paramType == "GLfloat" or paramType == "GLclampf":
221                        formatArgs += "\
222                    , Float.intBitsToFloat(msg.getArg%d())" % (paramIndex)
223                    elif paramType == "GLenum":
224                        formatArgs += "\
225                    , GLEnum.valueOf(msg.getArg%d())" % (paramIndex)
226                    elif paramType.find("*") >= 0:
227                        formatArgs += '\
228                    , (code ? "arg%d" : "0x" + Integer.toHexString(msg.getArg%d()))' % (paramIndex, paramIndex)
229                    elif paramName in nameReplaces:
230                        formatArgs += '\
231                    , (code ? "%s_" : "") + msg.getArg%d()' % (paramName, paramIndex)
232                    else:
233                        formatArgs += "\
234                    , msg.getArg%d()" % (paramIndex)
235                if paramIndex < len(parameters) - 1:
236                    formatString += ", "
237                    formatArgs += '\n'
238                paramNames.append(paramName)
239                paramIndex += 1
240
241
242            formatString += ")"
243
244            output.write("            case %s:\n" % (functionName))
245            if line.find("*") >= 0 and (line.find("*") < line.find(":") or line.find("*") > line.rfind(":")):
246                sys.stderr.write(line)
247                output.write("                // FIXME: this function uses pointers, debugger may send data in msg.data\n")
248            output.write('\
249                str = String.format("%s",\n%s);\n\
250                break;\n' % (formatString, formatArgs))
251
252
253    output.write("""            default:
254                str = msg.toString();
255        }
256        return str;
257    }
258}""")
259
260'''    print """/*
261package GLESv2Debugger;
262
263public class MessageFormatterCustom {
264
265    public static String format(final DebuggerMessage.Message msg) {
266        String str;
267        switch (msg.getFunction()) {"""
268
269    for extern in externs:
270        print "        case %s" % (extern)
271        print "            // TODO:"
272
273print """        default:
274            str = msg.toString();
275        }
276        return str;
277    }
278}
279*/"""    '''
280
281
282