trace.cpp revision 1f8363329cd6b00c4f8e6f1f97bb3e76071d124a
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
25a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include <cutils/log.h>
26a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
2716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define ATRACE_TAG ATRACE_TAG_GRAPHICS
2816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#include <utils/Trace.h>
2916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
3016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#include <utils/CallStack.h>
3116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
321cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian#include "egl_tls.h"
33a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "hooks.h"
34a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
35a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
36a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichnamespace android {
37a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
38a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
39a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstruct GLenumString {
404774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall    // The GL_TIMEOUT_IGNORED "enum" doesn't fit in a GLenum, so use GLuint64
414774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall    GLuint64 e;
42a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    const char* s;
43a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
44a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
45a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENUM
46a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define GL_ENUM(VAL,NAME) {VAL, #NAME},
47a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
48a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic GLenumString g_enumnames[] = {
49a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "enums.in"
50a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
51a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENUM
52a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
53a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic int compareGLEnum(const void* a, const void* b) {
54a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    return ((const GLenumString*) a)->e - ((const GLenumString*) b)->e;
55a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
56a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
57a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic const char* GLEnumToString(GLenum e) {
58a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    GLenumString key = {e, ""};
59a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    const GLenumString* result = (const GLenumString*) bsearch(
60a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        &key, g_enumnames,
61a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        sizeof(g_enumnames) / sizeof(g_enumnames[0]),
62a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        sizeof(g_enumnames[0]), compareGLEnum);
63a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    if (result) {
64a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        return result->s;
65a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
66a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    return NULL;
67a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
68a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
696132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic const char* GLbooleanToString(GLboolean arg) {
706132b3703da76389e81d26b0023846a78b008603Jack Palevich    return arg ? "GL_TRUE" : "GL_FALSE";
716132b3703da76389e81d26b0023846a78b008603Jack Palevich}
726132b3703da76389e81d26b0023846a78b008603Jack Palevich
73a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic GLenumString g_bitfieldNames[] = {
74a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {0x00004000, "GL_COLOR_BUFFER_BIT"},
75a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {0x00000400, "GL_STENCIL_BUFFER_BIT"},
76a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {0x00000100, "GL_DEPTH_BUFFER_BIT"}
77a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
78a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
796132b3703da76389e81d26b0023846a78b008603Jack Palevichclass StringBuilder {
806132b3703da76389e81d26b0023846a78b008603Jack Palevich    static const int lineSize = 500;
816132b3703da76389e81d26b0023846a78b008603Jack Palevich    char line[lineSize];
826132b3703da76389e81d26b0023846a78b008603Jack Palevich    int line_index;
836132b3703da76389e81d26b0023846a78b008603Jack Palevichpublic:
846132b3703da76389e81d26b0023846a78b008603Jack Palevich    StringBuilder() {
856132b3703da76389e81d26b0023846a78b008603Jack Palevich        line_index = 0;
866132b3703da76389e81d26b0023846a78b008603Jack Palevich        line[0] = '\0';
876132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
886132b3703da76389e81d26b0023846a78b008603Jack Palevich    void append(const char* fmt, ...) {
896132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_list argp;
906132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_start(argp, fmt);
916132b3703da76389e81d26b0023846a78b008603Jack Palevich        line_index += vsnprintf(line + line_index, lineSize-line_index, fmt, argp);
926132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_end(argp);
936132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
946132b3703da76389e81d26b0023846a78b008603Jack Palevich    const char* getString() {
956132b3703da76389e81d26b0023846a78b008603Jack Palevich        line_index = 0;
966132b3703da76389e81d26b0023846a78b008603Jack Palevich        line[lineSize-1] = '\0';
976132b3703da76389e81d26b0023846a78b008603Jack Palevich        return line;
986132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
996132b3703da76389e81d26b0023846a78b008603Jack Palevich};
1006132b3703da76389e81d26b0023846a78b008603Jack Palevich
101a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
102a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void TraceGLShaderSource(GLuint shader, GLsizei count,
103a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    const GLchar** string, const GLint* length) {
1049d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("const char* shaderSrc[] = {");
105a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    for (GLsizei i = 0; i < count; i++) {
106a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const char* comma = i < count-1 ? "," : "";
107a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const GLchar* s = string[i];
108a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        if (length) {
109a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            GLint len = length[i];
1109d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block            ALOGD("    \"%*s\"%s", len, s, comma);
111a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else {
1129d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block            ALOGD("    \"%s\"%s", s, comma);
113a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
114a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
1159d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("};");
116a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    if (length) {
1179d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("const GLint* shaderLength[] = {");
118a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        for (GLsizei i = 0; i < count; i++) {
119a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const char* comma = i < count-1 ? "," : "";
120a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            GLint len = length[i];
1219d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block            ALOGD("    \"%d\"%s", len, comma);
122a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
1239d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("};");
1249d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("glShaderSource(%u, %u, shaderSrc, shaderLength);",
125a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            shader, count);
126a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    } else {
1279d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("glShaderSource(%u, %u, shaderSrc, (const GLint*) 0);",
128a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            shader, count);
129a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
130a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
131a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
1326132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic void TraceValue(int elementCount, char type,
1336132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLsizei chunkCount, GLsizei chunkSize, const void* value) {
1346132b3703da76389e81d26b0023846a78b008603Jack Palevich    StringBuilder stringBuilder;
1356132b3703da76389e81d26b0023846a78b008603Jack Palevich    GLsizei count = chunkCount * chunkSize;
1366132b3703da76389e81d26b0023846a78b008603Jack Palevich    bool isFloat = type == 'f';
1376132b3703da76389e81d26b0023846a78b008603Jack Palevich    const char* typeString = isFloat ? "GLfloat" : "GLint";
1389d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("const %s value[] = {", typeString);
1396132b3703da76389e81d26b0023846a78b008603Jack Palevich    for (GLsizei i = 0; i < count; i++) {
1406132b3703da76389e81d26b0023846a78b008603Jack Palevich        StringBuilder builder;
1416132b3703da76389e81d26b0023846a78b008603Jack Palevich        builder.append("    ");
1426132b3703da76389e81d26b0023846a78b008603Jack Palevich        for (int e = 0; e < elementCount; e++) {
1436132b3703da76389e81d26b0023846a78b008603Jack Palevich            const char* comma = ", ";
1446132b3703da76389e81d26b0023846a78b008603Jack Palevich            if (e == elementCount-1) {
1456132b3703da76389e81d26b0023846a78b008603Jack Palevich                if (i == count - 1) {
1466132b3703da76389e81d26b0023846a78b008603Jack Palevich                    comma = "";
1476132b3703da76389e81d26b0023846a78b008603Jack Palevich                } else {
1486132b3703da76389e81d26b0023846a78b008603Jack Palevich                    comma = ",";
1496132b3703da76389e81d26b0023846a78b008603Jack Palevich                }
1506132b3703da76389e81d26b0023846a78b008603Jack Palevich            }
1516132b3703da76389e81d26b0023846a78b008603Jack Palevich            if (isFloat) {
1526132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%g%s", * (GLfloat*) value, comma);
1536132b3703da76389e81d26b0023846a78b008603Jack Palevich                value = (void*) (((GLfloat*) value) + 1);
1546132b3703da76389e81d26b0023846a78b008603Jack Palevich            } else {
1556132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%d%s", * (GLint*) value, comma);
1566132b3703da76389e81d26b0023846a78b008603Jack Palevich                value = (void*) (((GLint*) value) + 1);
1576132b3703da76389e81d26b0023846a78b008603Jack Palevich            }
1586132b3703da76389e81d26b0023846a78b008603Jack Palevich        }
1599d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("%s", builder.getString());
1606132b3703da76389e81d26b0023846a78b008603Jack Palevich        if (chunkSize > 1 && i < count-1
1616132b3703da76389e81d26b0023846a78b008603Jack Palevich                && (i % chunkSize) == (chunkSize-1)) {
1629d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block            ALOGD("%s", ""); // Print a blank line.
1636132b3703da76389e81d26b0023846a78b008603Jack Palevich        }
1646132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
1659d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("};");
1666132b3703da76389e81d26b0023846a78b008603Jack Palevich}
1676132b3703da76389e81d26b0023846a78b008603Jack Palevich
1686132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic void TraceUniformv(int elementCount, char type,
1696132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLuint location, GLsizei count, const void* value) {
1706132b3703da76389e81d26b0023846a78b008603Jack Palevich    TraceValue(elementCount, type, count, 1, value);
1719d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("glUniform%d%c(%u, %u, value);", elementCount, type, location, count);
1726132b3703da76389e81d26b0023846a78b008603Jack Palevich}
1736132b3703da76389e81d26b0023846a78b008603Jack Palevich
1746132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic void TraceUniformMatrix(int matrixSideLength,
1756132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLuint location, GLsizei count, GLboolean transpose, const void* value) {
1766132b3703da76389e81d26b0023846a78b008603Jack Palevich    TraceValue(matrixSideLength, 'f', count, matrixSideLength, value);
1779d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("glUniformMatrix%dfv(%u, %u, %s, value);", matrixSideLength, location, count,
1786132b3703da76389e81d26b0023846a78b008603Jack Palevich            GLbooleanToString(transpose));
1796132b3703da76389e81d26b0023846a78b008603Jack Palevich}
1806132b3703da76389e81d26b0023846a78b008603Jack Palevich
181a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void TraceGL(const char* name, int numArgs, ...) {
182a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    va_list argp;
183a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    va_start(argp, numArgs);
1846132b3703da76389e81d26b0023846a78b008603Jack Palevich    int nameLen = strlen(name);
1856132b3703da76389e81d26b0023846a78b008603Jack Palevich
1866132b3703da76389e81d26b0023846a78b008603Jack Palevich    // glShaderSource
1876132b3703da76389e81d26b0023846a78b008603Jack Palevich    if (nameLen == 14 && strcmp(name, "glShaderSource") == 0) {
188a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
189a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        GLuint shader = va_arg(argp, GLuint);
190a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
191a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        GLsizei count = va_arg(argp, GLsizei);
192a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
193a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const GLchar** string = (const GLchar**) va_arg(argp, void*);
194a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
195a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const GLint* length = (const GLint*) va_arg(argp, void*);
1966132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_end(argp);
197a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        TraceGLShaderSource(shader, count, string, length);
1986132b3703da76389e81d26b0023846a78b008603Jack Palevich        return;
1996132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
2006132b3703da76389e81d26b0023846a78b008603Jack Palevich
2016132b3703da76389e81d26b0023846a78b008603Jack Palevich    // glUniformXXv
2026132b3703da76389e81d26b0023846a78b008603Jack Palevich
2036132b3703da76389e81d26b0023846a78b008603Jack Palevich    if (nameLen == 12 && strncmp(name, "glUniform", 9) == 0 && name[11] == 'v') {
2046132b3703da76389e81d26b0023846a78b008603Jack Palevich        int elementCount = name[9] - '0'; // 1..4
2056132b3703da76389e81d26b0023846a78b008603Jack Palevich        char type = name[10]; // 'f' or 'i'
2066132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2076132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLuint location = va_arg(argp, GLuint);
2086132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2096132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLsizei count = va_arg(argp, GLsizei);
2106132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2116132b3703da76389e81d26b0023846a78b008603Jack Palevich        const void* value = (const void*) va_arg(argp, void*);
212a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_end(argp);
2136132b3703da76389e81d26b0023846a78b008603Jack Palevich        TraceUniformv(elementCount, type, location, count, value);
214a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        return;
215a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
2166132b3703da76389e81d26b0023846a78b008603Jack Palevich
2176132b3703da76389e81d26b0023846a78b008603Jack Palevich    // glUniformMatrixXfv
2186132b3703da76389e81d26b0023846a78b008603Jack Palevich
2196132b3703da76389e81d26b0023846a78b008603Jack Palevich    if (nameLen == 18 && strncmp(name, "glUniformMatrix", 15) == 0
2206132b3703da76389e81d26b0023846a78b008603Jack Palevich            && name[16] == 'f' && name[17] == 'v') {
2216132b3703da76389e81d26b0023846a78b008603Jack Palevich        int matrixSideLength = name[15] - '0'; // 2..4
2226132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2236132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLuint location = va_arg(argp, GLuint);
2246132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2256132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLsizei count = va_arg(argp, GLsizei);
2266132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2276132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLboolean transpose = (GLboolean) va_arg(argp, int);
2286132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2296132b3703da76389e81d26b0023846a78b008603Jack Palevich        const void* value = (const void*) va_arg(argp, void*);
2306132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_end(argp);
2316132b3703da76389e81d26b0023846a78b008603Jack Palevich        TraceUniformMatrix(matrixSideLength, location, count, transpose, value);
2326132b3703da76389e81d26b0023846a78b008603Jack Palevich        return;
2336132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
2346132b3703da76389e81d26b0023846a78b008603Jack Palevich
2356132b3703da76389e81d26b0023846a78b008603Jack Palevich    StringBuilder builder;
2366132b3703da76389e81d26b0023846a78b008603Jack Palevich    builder.append("%s(", name);
237a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    for (int i = 0; i < numArgs; i++) {
238a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        if (i > 0) {
2396132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append(", ");
240a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
241a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const char* type = va_arg(argp, const char*);
242a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        bool isPtr = type[strlen(type)-1] == '*'
243a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            || strcmp(type, "GLeglImageOES") == 0;
244a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        if (isPtr) {
245a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const void* arg = va_arg(argp, const void*);
2466132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("(%s) 0x%08x", type, (size_t) arg);
247a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLbitfield") == 0) {
248a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            size_t arg = va_arg(argp, size_t);
249a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            bool first = true;
250a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            for (size_t i = 0; i < sizeof(g_bitfieldNames) / sizeof(g_bitfieldNames[0]); i++) {
251a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                const GLenumString* b = &g_bitfieldNames[i];
252a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                if (b->e & arg) {
253a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    if (first) {
254a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                        first = false;
255a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    } else {
2566132b3703da76389e81d26b0023846a78b008603Jack Palevich                        builder.append(" | ");
257a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    }
2586132b3703da76389e81d26b0023846a78b008603Jack Palevich                    builder.append("%s", b->s);
259a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    arg &= ~b->e;
260a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                }
261a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
262a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (first || arg != 0) {
263a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                if (!first) {
2646132b3703da76389e81d26b0023846a78b008603Jack Palevich                    builder.append(" | ");
265a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                }
2666132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("0x%08x", arg);
267a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
268a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLboolean") == 0) {
2696132b3703da76389e81d26b0023846a78b008603Jack Palevich            GLboolean arg = va_arg(argp, int);
2706132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%s", GLbooleanToString(arg));
271a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLclampf") == 0) {
272a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            double arg = va_arg(argp, double);
2736132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%g", arg);
274a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLenum") == 0) {
275a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            GLenum arg = va_arg(argp, int);
276a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const char* s = GLEnumToString(arg);
277a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (s) {
2786132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%s", s);
279a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            } else {
2806132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("0x%x", arg);
281a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
282a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLfixed") == 0) {
283a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, int);
2846132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("0x%08x", arg);
285a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLfloat") == 0) {
286a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            double arg = va_arg(argp, double);
2876132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%g", arg);
288a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLint") == 0) {
289a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, int);
290a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const char* s = NULL;
291a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (strcmp(name, "glTexParameteri") == 0) {
292a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                s = GLEnumToString(arg);
293a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
294a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (s) {
2956132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%s", s);
296a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            } else {
2976132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%d", arg);
298a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
299a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLintptr") == 0) {
300a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, unsigned int);
3016132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%u", arg);
302a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLsizei") == 0) {
303a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, size_t);
3046132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%u", arg);
305a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLsizeiptr") == 0) {
306a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, size_t);
3076132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%u", arg);
308a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLuint") == 0) {
309a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, unsigned int);
3106132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%u", arg);
311a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else {
3126132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("/* ??? %s */", type);
313a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            break;
314a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
315a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
3166132b3703da76389e81d26b0023846a78b008603Jack Palevich    builder.append(");");
3179d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("%s", builder.getString());
318a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    va_end(argp);
319a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
320a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
32116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy///////////////////////////////////////////////////////////////////////////
32216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy// Log trace
32316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy///////////////////////////////////////////////////////////////////////////
32416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
325a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL_VOID
326a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL
327a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
328a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define TRACE_GL_VOID(_api, _args, _argList, ...)                         \
329a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void Tracing_ ## _api _args {                                      \
330a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    TraceGL(#_api, __VA_ARGS__);                                          \
331a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
332a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    _c->_api _argList;                                                    \
333a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
334a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
335a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define TRACE_GL(_type, _api, _args, _argList, ...)                       \
336a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic _type Tracing_ ## _api _args {                                     \
3372f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    TraceGL(#_api, __VA_ARGS__);                                        \
338a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
339a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    return _c->_api _argList;                                             \
340a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
341a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
342a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichextern "C" {
343a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "../trace.in"
344a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
3452f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
346a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL_VOID
347a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL
348a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
349a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define GL_ENTRY(_r, _api, ...) Tracing_ ## _api,
350a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack PalevichEGLAPI gl_hooks_t gHooksTrace = {
351a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {
352a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        #include "entries.in"
353a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    },
354a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {
355a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        {0}
356a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
357a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
358a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENTRY
359a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
3602f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL_VOID
3612f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL
3622f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
3632f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li// define the ES 1.0 Debug_gl* functions as Tracing_gl functions
3642f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#define TRACE_GL_VOID(_api, _args, _argList, ...)                         \
3652f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Listatic void Debug_ ## _api _args {                                      \
3662f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    TraceGL(#_api, __VA_ARGS__);                                          \
3672f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
3682f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    _c->_api _argList;                                                    \
3692f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li}
3702f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
3712f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#define TRACE_GL(_type, _api, _args, _argList, ...)                       \
3722f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Listatic _type Debug_ ## _api _args {                                     \
3732f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    TraceGL(#_api, __VA_ARGS__);                                        \
3742f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
3752f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    return _c->_api _argList;                                             \
3762f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li}
3772f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
3782f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Liextern "C" {
3792f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#include "../debug.in"
3802f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li}
3812f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
38216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy///////////////////////////////////////////////////////////////////////////
38316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy// Systrace
38416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy///////////////////////////////////////////////////////////////////////////
38516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
38616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL_VOID
38716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL
38816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
38916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define TRACE_GL_VOID(_api, _args, _argList, ...)                         \
39016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guystatic void Systrace_ ## _api _args {                                     \
39116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    ATRACE_NAME(#_api);                                                   \
39216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
39316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    _c->_api _argList;                                                    \
39416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy}
39516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
39616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define TRACE_GL(_type, _api, _args, _argList, ...)                       \
39716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guystatic _type Systrace_ ## _api _args {                                    \
39816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    ATRACE_NAME(#_api);                                                   \
39916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
40016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    return _c->_api _argList;                                             \
40116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy}
40216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
40316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guyextern "C" {
40416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#include "../trace.in"
40516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy}
40616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
40716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL_VOID
40816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL
40916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
41016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define GL_ENTRY(_r, _api, ...) Systrace_ ## _api,
41116928bfeca8858a0acae6942fc68c14a040b92ffRomain GuyEGLAPI gl_hooks_t gHooksSystrace = {
41216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    {
41316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        #include "entries.in"
41416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    },
41516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    {
41616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        {0}
41716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    }
41816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy};
41916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef GL_ENTRY
42016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
42116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy///////////////////////////////////////////////////////////////////////////
42216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy//
42316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy///////////////////////////////////////////////////////////////////////////
42416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
42516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL_VOID
42616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL
42716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
42816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define CHECK_ERROR(_c, _api)                                             \
42916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    GLenum status = GL_NO_ERROR;                                          \
43016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    bool error = false;                                                   \
43116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    while ((status = _c->glGetError()) != GL_NO_ERROR) {                  \
43216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        ALOGD("[" #_api "] 0x%x", status);                                \
43316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        error = true;                                                     \
43416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    }                                                                     \
43516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    if (error) {                                                          \
43616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        CallStack s;                                                      \
43716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        s.update();                                                       \
4381f8363329cd6b00c4f8e6f1f97bb3e76071d124aIgor Murashkin        s.log("glGetError:" #_api);                                       \
43916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    }                                                                     \
44016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
44116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define TRACE_GL_VOID(_api, _args, _argList, ...)                         \
44216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guystatic void ErrorTrace_ ## _api _args {                                   \
44316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
44416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    _c->_api _argList;                                                    \
44516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    CHECK_ERROR(_c, _api);                                                \
44616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy}
44716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
44816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define TRACE_GL(_type, _api, _args, _argList, ...)                       \
44916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guystatic _type ErrorTrace_ ## _api _args {                                  \
45016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
45116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    _type _r = _c->_api _argList;                                         \
45216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    CHECK_ERROR(_c, _api);                                                \
45316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    return _r;                                                            \
45416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy}
45516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
45616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guyextern "C" {
45716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#include "../trace.in"
45816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy}
45916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
46016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL_VOID
46116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL
46216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
46316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define GL_ENTRY(_r, _api, ...) ErrorTrace_ ## _api,
46416928bfeca8858a0acae6942fc68c14a040b92ffRomain GuyEGLAPI gl_hooks_t gHooksErrorTrace = {
46516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    {
46616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        #include "entries.in"
46716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    },
46816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    {
46916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        {0}
47016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    }
47116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy};
47216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef GL_ENTRY
47316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef CHECK_ERROR
47416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
4752f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL_VOID
4762f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL
4772f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
478a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
479a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}; // namespace android
480a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
481a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
482a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#endif // EGL_TRACE
483