trace.cpp revision 9d4536835248525f32f1504a3d28d5bbfa0a2910
1a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich/*
2a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich ** Copyright 2010, The Android Open Source Project
3a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich **
4a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich ** Licensed under the Apache License, Version 2.0 (the "License");
5a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich ** you may not use this file except in compliance with the License.
6a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich ** You may obtain a copy of the License at
7a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich **
8a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich **     http://www.apache.org/licenses/LICENSE-2.0
9a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich **
10a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich ** Unless required by applicable law or agreed to in writing, software
11a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich ** distributed under the License is distributed on an "AS IS" BASIS,
12a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich ** See the License for the specific language governing permissions and
14a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich ** limitations under the License.
15a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich */
16a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
17a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#if EGL_TRACE
18a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
19a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include <stdarg.h>
20a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include <stdlib.h>
21a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
22a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include <EGL/egl.h>
23a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include <EGL/eglext.h>
24a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include <GLES/gl.h>
25a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include <GLES/glext.h>
26a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
27a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include <cutils/log.h>
28a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
291cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian#include "egl_tls.h"
30a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "hooks.h"
31a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
32a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
33a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichnamespace android {
34a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
35a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
36a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstruct GLenumString {
37a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    GLenum e;
38a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    const char* s;
39a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
40a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
41a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENUM
42a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define GL_ENUM(VAL,NAME) {VAL, #NAME},
43a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
44a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic GLenumString g_enumnames[] = {
45a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "enums.in"
46a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
47a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENUM
48a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
49a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic int compareGLEnum(const void* a, const void* b) {
50a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    return ((const GLenumString*) a)->e - ((const GLenumString*) b)->e;
51a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
52a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
53a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic const char* GLEnumToString(GLenum e) {
54a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    GLenumString key = {e, ""};
55a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    const GLenumString* result = (const GLenumString*) bsearch(
56a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        &key, g_enumnames,
57a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        sizeof(g_enumnames) / sizeof(g_enumnames[0]),
58a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        sizeof(g_enumnames[0]), compareGLEnum);
59a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    if (result) {
60a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        return result->s;
61a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
62a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    return NULL;
63a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
64a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
656132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic const char* GLbooleanToString(GLboolean arg) {
666132b3703da76389e81d26b0023846a78b008603Jack Palevich    return arg ? "GL_TRUE" : "GL_FALSE";
676132b3703da76389e81d26b0023846a78b008603Jack Palevich}
686132b3703da76389e81d26b0023846a78b008603Jack Palevich
69a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic GLenumString g_bitfieldNames[] = {
70a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {0x00004000, "GL_COLOR_BUFFER_BIT"},
71a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {0x00000400, "GL_STENCIL_BUFFER_BIT"},
72a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {0x00000100, "GL_DEPTH_BUFFER_BIT"}
73a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
74a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
756132b3703da76389e81d26b0023846a78b008603Jack Palevichclass StringBuilder {
766132b3703da76389e81d26b0023846a78b008603Jack Palevich    static const int lineSize = 500;
776132b3703da76389e81d26b0023846a78b008603Jack Palevich    char line[lineSize];
786132b3703da76389e81d26b0023846a78b008603Jack Palevich    int line_index;
796132b3703da76389e81d26b0023846a78b008603Jack Palevichpublic:
806132b3703da76389e81d26b0023846a78b008603Jack Palevich    StringBuilder() {
816132b3703da76389e81d26b0023846a78b008603Jack Palevich        line_index = 0;
826132b3703da76389e81d26b0023846a78b008603Jack Palevich        line[0] = '\0';
836132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
846132b3703da76389e81d26b0023846a78b008603Jack Palevich    void append(const char* fmt, ...) {
856132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_list argp;
866132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_start(argp, fmt);
876132b3703da76389e81d26b0023846a78b008603Jack Palevich        line_index += vsnprintf(line + line_index, lineSize-line_index, fmt, argp);
886132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_end(argp);
896132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
906132b3703da76389e81d26b0023846a78b008603Jack Palevich    const char* getString() {
916132b3703da76389e81d26b0023846a78b008603Jack Palevich        line_index = 0;
926132b3703da76389e81d26b0023846a78b008603Jack Palevich        line[lineSize-1] = '\0';
936132b3703da76389e81d26b0023846a78b008603Jack Palevich        return line;
946132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
956132b3703da76389e81d26b0023846a78b008603Jack Palevich};
966132b3703da76389e81d26b0023846a78b008603Jack Palevich
97a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
98a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void TraceGLShaderSource(GLuint shader, GLsizei count,
99a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    const GLchar** string, const GLint* length) {
1009d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("const char* shaderSrc[] = {");
101a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    for (GLsizei i = 0; i < count; i++) {
102a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const char* comma = i < count-1 ? "," : "";
103a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const GLchar* s = string[i];
104a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        if (length) {
105a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            GLint len = length[i];
1069d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block            ALOGD("    \"%*s\"%s", len, s, comma);
107a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else {
1089d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block            ALOGD("    \"%s\"%s", s, comma);
109a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
110a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
1119d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("};");
112a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    if (length) {
1139d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("const GLint* shaderLength[] = {");
114a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        for (GLsizei i = 0; i < count; i++) {
115a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const char* comma = i < count-1 ? "," : "";
116a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            GLint len = length[i];
1179d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block            ALOGD("    \"%d\"%s", len, comma);
118a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
1199d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("};");
1209d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("glShaderSource(%u, %u, shaderSrc, shaderLength);",
121a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            shader, count);
122a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    } else {
1239d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("glShaderSource(%u, %u, shaderSrc, (const GLint*) 0);",
124a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            shader, count);
125a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
126a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
127a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
1286132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic void TraceValue(int elementCount, char type,
1296132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLsizei chunkCount, GLsizei chunkSize, const void* value) {
1306132b3703da76389e81d26b0023846a78b008603Jack Palevich    StringBuilder stringBuilder;
1316132b3703da76389e81d26b0023846a78b008603Jack Palevich    GLsizei count = chunkCount * chunkSize;
1326132b3703da76389e81d26b0023846a78b008603Jack Palevich    bool isFloat = type == 'f';
1336132b3703da76389e81d26b0023846a78b008603Jack Palevich    const char* typeString = isFloat ? "GLfloat" : "GLint";
1349d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("const %s value[] = {", typeString);
1356132b3703da76389e81d26b0023846a78b008603Jack Palevich    for (GLsizei i = 0; i < count; i++) {
1366132b3703da76389e81d26b0023846a78b008603Jack Palevich        StringBuilder builder;
1376132b3703da76389e81d26b0023846a78b008603Jack Palevich        builder.append("    ");
1386132b3703da76389e81d26b0023846a78b008603Jack Palevich        for (int e = 0; e < elementCount; e++) {
1396132b3703da76389e81d26b0023846a78b008603Jack Palevich            const char* comma = ", ";
1406132b3703da76389e81d26b0023846a78b008603Jack Palevich            if (e == elementCount-1) {
1416132b3703da76389e81d26b0023846a78b008603Jack Palevich                if (i == count - 1) {
1426132b3703da76389e81d26b0023846a78b008603Jack Palevich                    comma = "";
1436132b3703da76389e81d26b0023846a78b008603Jack Palevich                } else {
1446132b3703da76389e81d26b0023846a78b008603Jack Palevich                    comma = ",";
1456132b3703da76389e81d26b0023846a78b008603Jack Palevich                }
1466132b3703da76389e81d26b0023846a78b008603Jack Palevich            }
1476132b3703da76389e81d26b0023846a78b008603Jack Palevich            if (isFloat) {
1486132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%g%s", * (GLfloat*) value, comma);
1496132b3703da76389e81d26b0023846a78b008603Jack Palevich                value = (void*) (((GLfloat*) value) + 1);
1506132b3703da76389e81d26b0023846a78b008603Jack Palevich            } else {
1516132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%d%s", * (GLint*) value, comma);
1526132b3703da76389e81d26b0023846a78b008603Jack Palevich                value = (void*) (((GLint*) value) + 1);
1536132b3703da76389e81d26b0023846a78b008603Jack Palevich            }
1546132b3703da76389e81d26b0023846a78b008603Jack Palevich        }
1559d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("%s", builder.getString());
1566132b3703da76389e81d26b0023846a78b008603Jack Palevich        if (chunkSize > 1 && i < count-1
1576132b3703da76389e81d26b0023846a78b008603Jack Palevich                && (i % chunkSize) == (chunkSize-1)) {
1589d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block            ALOGD("%s", ""); // Print a blank line.
1596132b3703da76389e81d26b0023846a78b008603Jack Palevich        }
1606132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
1619d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("};");
1626132b3703da76389e81d26b0023846a78b008603Jack Palevich}
1636132b3703da76389e81d26b0023846a78b008603Jack Palevich
1646132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic void TraceUniformv(int elementCount, char type,
1656132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLuint location, GLsizei count, const void* value) {
1666132b3703da76389e81d26b0023846a78b008603Jack Palevich    TraceValue(elementCount, type, count, 1, value);
1679d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("glUniform%d%c(%u, %u, value);", elementCount, type, location, count);
1686132b3703da76389e81d26b0023846a78b008603Jack Palevich}
1696132b3703da76389e81d26b0023846a78b008603Jack Palevich
1706132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic void TraceUniformMatrix(int matrixSideLength,
1716132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLuint location, GLsizei count, GLboolean transpose, const void* value) {
1726132b3703da76389e81d26b0023846a78b008603Jack Palevich    TraceValue(matrixSideLength, 'f', count, matrixSideLength, value);
1739d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("glUniformMatrix%dfv(%u, %u, %s, value);", matrixSideLength, location, count,
1746132b3703da76389e81d26b0023846a78b008603Jack Palevich            GLbooleanToString(transpose));
1756132b3703da76389e81d26b0023846a78b008603Jack Palevich}
1766132b3703da76389e81d26b0023846a78b008603Jack Palevich
177a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void TraceGL(const char* name, int numArgs, ...) {
178a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    va_list argp;
179a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    va_start(argp, numArgs);
1806132b3703da76389e81d26b0023846a78b008603Jack Palevich    int nameLen = strlen(name);
1816132b3703da76389e81d26b0023846a78b008603Jack Palevich
1826132b3703da76389e81d26b0023846a78b008603Jack Palevich    // glShaderSource
1836132b3703da76389e81d26b0023846a78b008603Jack Palevich    if (nameLen == 14 && strcmp(name, "glShaderSource") == 0) {
184a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
185a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        GLuint shader = va_arg(argp, GLuint);
186a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
187a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        GLsizei count = va_arg(argp, GLsizei);
188a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
189a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const GLchar** string = (const GLchar**) va_arg(argp, void*);
190a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
191a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const GLint* length = (const GLint*) va_arg(argp, void*);
1926132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_end(argp);
193a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        TraceGLShaderSource(shader, count, string, length);
1946132b3703da76389e81d26b0023846a78b008603Jack Palevich        return;
1956132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
1966132b3703da76389e81d26b0023846a78b008603Jack Palevich
1976132b3703da76389e81d26b0023846a78b008603Jack Palevich    // glUniformXXv
1986132b3703da76389e81d26b0023846a78b008603Jack Palevich
1996132b3703da76389e81d26b0023846a78b008603Jack Palevich    if (nameLen == 12 && strncmp(name, "glUniform", 9) == 0 && name[11] == 'v') {
2006132b3703da76389e81d26b0023846a78b008603Jack Palevich        int elementCount = name[9] - '0'; // 1..4
2016132b3703da76389e81d26b0023846a78b008603Jack Palevich        char type = name[10]; // 'f' or 'i'
2026132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2036132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLuint location = va_arg(argp, GLuint);
2046132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2056132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLsizei count = va_arg(argp, GLsizei);
2066132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2076132b3703da76389e81d26b0023846a78b008603Jack Palevich        const void* value = (const void*) va_arg(argp, void*);
208a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_end(argp);
2096132b3703da76389e81d26b0023846a78b008603Jack Palevich        TraceUniformv(elementCount, type, location, count, value);
210a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        return;
211a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
2126132b3703da76389e81d26b0023846a78b008603Jack Palevich
2136132b3703da76389e81d26b0023846a78b008603Jack Palevich    // glUniformMatrixXfv
2146132b3703da76389e81d26b0023846a78b008603Jack Palevich
2156132b3703da76389e81d26b0023846a78b008603Jack Palevich    if (nameLen == 18 && strncmp(name, "glUniformMatrix", 15) == 0
2166132b3703da76389e81d26b0023846a78b008603Jack Palevich            && name[16] == 'f' && name[17] == 'v') {
2176132b3703da76389e81d26b0023846a78b008603Jack Palevich        int matrixSideLength = name[15] - '0'; // 2..4
2186132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2196132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLuint location = va_arg(argp, GLuint);
2206132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2216132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLsizei count = va_arg(argp, GLsizei);
2226132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2236132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLboolean transpose = (GLboolean) va_arg(argp, int);
2246132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2256132b3703da76389e81d26b0023846a78b008603Jack Palevich        const void* value = (const void*) va_arg(argp, void*);
2266132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_end(argp);
2276132b3703da76389e81d26b0023846a78b008603Jack Palevich        TraceUniformMatrix(matrixSideLength, location, count, transpose, value);
2286132b3703da76389e81d26b0023846a78b008603Jack Palevich        return;
2296132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
2306132b3703da76389e81d26b0023846a78b008603Jack Palevich
2316132b3703da76389e81d26b0023846a78b008603Jack Palevich    StringBuilder builder;
2326132b3703da76389e81d26b0023846a78b008603Jack Palevich    builder.append("%s(", name);
233a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    for (int i = 0; i < numArgs; i++) {
234a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        if (i > 0) {
2356132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append(", ");
236a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
237a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const char* type = va_arg(argp, const char*);
238a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        bool isPtr = type[strlen(type)-1] == '*'
239a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            || strcmp(type, "GLeglImageOES") == 0;
240a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        if (isPtr) {
241a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const void* arg = va_arg(argp, const void*);
2426132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("(%s) 0x%08x", type, (size_t) arg);
243a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLbitfield") == 0) {
244a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            size_t arg = va_arg(argp, size_t);
245a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            bool first = true;
246a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            for (size_t i = 0; i < sizeof(g_bitfieldNames) / sizeof(g_bitfieldNames[0]); i++) {
247a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                const GLenumString* b = &g_bitfieldNames[i];
248a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                if (b->e & arg) {
249a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    if (first) {
250a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                        first = false;
251a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    } else {
2526132b3703da76389e81d26b0023846a78b008603Jack Palevich                        builder.append(" | ");
253a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    }
2546132b3703da76389e81d26b0023846a78b008603Jack Palevich                    builder.append("%s", b->s);
255a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    arg &= ~b->e;
256a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                }
257a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
258a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (first || arg != 0) {
259a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                if (!first) {
2606132b3703da76389e81d26b0023846a78b008603Jack Palevich                    builder.append(" | ");
261a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                }
2626132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("0x%08x", arg);
263a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
264a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLboolean") == 0) {
2656132b3703da76389e81d26b0023846a78b008603Jack Palevich            GLboolean arg = va_arg(argp, int);
2666132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%s", GLbooleanToString(arg));
267a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLclampf") == 0) {
268a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            double arg = va_arg(argp, double);
2696132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%g", arg);
270a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLenum") == 0) {
271a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            GLenum arg = va_arg(argp, int);
272a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const char* s = GLEnumToString(arg);
273a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (s) {
2746132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%s", s);
275a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            } else {
2766132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("0x%x", arg);
277a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
278a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLfixed") == 0) {
279a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, int);
2806132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("0x%08x", arg);
281a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLfloat") == 0) {
282a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            double arg = va_arg(argp, double);
2836132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%g", arg);
284a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLint") == 0) {
285a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, int);
286a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const char* s = NULL;
287a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (strcmp(name, "glTexParameteri") == 0) {
288a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                s = GLEnumToString(arg);
289a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
290a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (s) {
2916132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%s", s);
292a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            } else {
2936132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%d", arg);
294a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
295a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLintptr") == 0) {
296a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, unsigned int);
2976132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%u", arg);
298a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLsizei") == 0) {
299a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, size_t);
3006132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%u", arg);
301a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLsizeiptr") == 0) {
302a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, size_t);
3036132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%u", arg);
304a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLuint") == 0) {
305a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, unsigned int);
3066132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%u", arg);
307a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else {
3086132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("/* ??? %s */", type);
309a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            break;
310a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
311a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
3126132b3703da76389e81d26b0023846a78b008603Jack Palevich    builder.append(");");
3139d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("%s", builder.getString());
314a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    va_end(argp);
315a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
316a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
317a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL_VOID
318a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL
319a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
320a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define TRACE_GL_VOID(_api, _args, _argList, ...)                         \
321a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void Tracing_ ## _api _args {                                      \
322a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    TraceGL(#_api, __VA_ARGS__);                                          \
323a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
324a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    _c->_api _argList;                                                    \
325a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
326a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
327a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define TRACE_GL(_type, _api, _args, _argList, ...)                       \
328a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic _type Tracing_ ## _api _args {                                     \
3292f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    TraceGL(#_api, __VA_ARGS__);                                        \
330a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
331a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    return _c->_api _argList;                                             \
332a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
333a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
334a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichextern "C" {
335a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "../trace.in"
336a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
3372f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
338a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL_VOID
339a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL
340a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
341a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define GL_ENTRY(_r, _api, ...) Tracing_ ## _api,
342a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack PalevichEGLAPI gl_hooks_t gHooksTrace = {
343a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {
344a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        #include "entries.in"
345a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    },
346a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {
347a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        {0}
348a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
349a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
350a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENTRY
351a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
3522f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
3532f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL_VOID
3542f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL
3552f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
3562f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li// define the ES 1.0 Debug_gl* functions as Tracing_gl functions
3572f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#define TRACE_GL_VOID(_api, _args, _argList, ...)                         \
3582f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Listatic void Debug_ ## _api _args {                                      \
3592f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    TraceGL(#_api, __VA_ARGS__);                                          \
3602f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
3612f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    _c->_api _argList;                                                    \
3622f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li}
3632f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
3642f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#define TRACE_GL(_type, _api, _args, _argList, ...)                       \
3652f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Listatic _type Debug_ ## _api _args {                                     \
3662f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    TraceGL(#_api, __VA_ARGS__);                                        \
3672f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
3682f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    return _c->_api _argList;                                             \
3692f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li}
3702f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
3712f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Liextern "C" {
3722f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#include "../debug.in"
3732f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li}
3742f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
3752f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL_VOID
3762f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL
3772f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
378a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
379a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}; // namespace android
380a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
381a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
382a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#endif // EGL_TRACE
383