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
2916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define ATRACE_TAG ATRACE_TAG_GRAPHICS
3016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#include <utils/Trace.h>
3116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
3216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#include <utils/CallStack.h>
3316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
341cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian#include "egl_tls.h"
35a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "hooks.h"
36a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
37a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
38a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichnamespace android {
39a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
40a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
41a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstruct GLenumString {
42a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    GLenum e;
43a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    const char* s;
44a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
45a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
46a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENUM
47a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define GL_ENUM(VAL,NAME) {VAL, #NAME},
48a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
49a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic GLenumString g_enumnames[] = {
50a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "enums.in"
51a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
52a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENUM
53a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
54a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic int compareGLEnum(const void* a, const void* b) {
55a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    return ((const GLenumString*) a)->e - ((const GLenumString*) b)->e;
56a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
57a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
58a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic const char* GLEnumToString(GLenum e) {
59a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    GLenumString key = {e, ""};
60a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    const GLenumString* result = (const GLenumString*) bsearch(
61a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        &key, g_enumnames,
62a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        sizeof(g_enumnames) / sizeof(g_enumnames[0]),
63a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        sizeof(g_enumnames[0]), compareGLEnum);
64a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    if (result) {
65a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        return result->s;
66a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
67a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    return NULL;
68a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
69a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
706132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic const char* GLbooleanToString(GLboolean arg) {
716132b3703da76389e81d26b0023846a78b008603Jack Palevich    return arg ? "GL_TRUE" : "GL_FALSE";
726132b3703da76389e81d26b0023846a78b008603Jack Palevich}
736132b3703da76389e81d26b0023846a78b008603Jack Palevich
74a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic GLenumString g_bitfieldNames[] = {
75a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {0x00004000, "GL_COLOR_BUFFER_BIT"},
76a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {0x00000400, "GL_STENCIL_BUFFER_BIT"},
77a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {0x00000100, "GL_DEPTH_BUFFER_BIT"}
78a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
79a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
806132b3703da76389e81d26b0023846a78b008603Jack Palevichclass StringBuilder {
816132b3703da76389e81d26b0023846a78b008603Jack Palevich    static const int lineSize = 500;
826132b3703da76389e81d26b0023846a78b008603Jack Palevich    char line[lineSize];
836132b3703da76389e81d26b0023846a78b008603Jack Palevich    int line_index;
846132b3703da76389e81d26b0023846a78b008603Jack Palevichpublic:
856132b3703da76389e81d26b0023846a78b008603Jack Palevich    StringBuilder() {
866132b3703da76389e81d26b0023846a78b008603Jack Palevich        line_index = 0;
876132b3703da76389e81d26b0023846a78b008603Jack Palevich        line[0] = '\0';
886132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
896132b3703da76389e81d26b0023846a78b008603Jack Palevich    void append(const char* fmt, ...) {
906132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_list argp;
916132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_start(argp, fmt);
926132b3703da76389e81d26b0023846a78b008603Jack Palevich        line_index += vsnprintf(line + line_index, lineSize-line_index, fmt, argp);
936132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_end(argp);
946132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
956132b3703da76389e81d26b0023846a78b008603Jack Palevich    const char* getString() {
966132b3703da76389e81d26b0023846a78b008603Jack Palevich        line_index = 0;
976132b3703da76389e81d26b0023846a78b008603Jack Palevich        line[lineSize-1] = '\0';
986132b3703da76389e81d26b0023846a78b008603Jack Palevich        return line;
996132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
1006132b3703da76389e81d26b0023846a78b008603Jack Palevich};
1016132b3703da76389e81d26b0023846a78b008603Jack Palevich
102a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
103a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void TraceGLShaderSource(GLuint shader, GLsizei count,
104a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    const GLchar** string, const GLint* length) {
1059d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("const char* shaderSrc[] = {");
106a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    for (GLsizei i = 0; i < count; i++) {
107a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const char* comma = i < count-1 ? "," : "";
108a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const GLchar* s = string[i];
109a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        if (length) {
110a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            GLint len = length[i];
1119d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block            ALOGD("    \"%*s\"%s", len, s, comma);
112a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else {
1139d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block            ALOGD("    \"%s\"%s", s, comma);
114a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
115a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
1169d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("};");
117a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    if (length) {
1189d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("const GLint* shaderLength[] = {");
119a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        for (GLsizei i = 0; i < count; i++) {
120a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const char* comma = i < count-1 ? "," : "";
121a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            GLint len = length[i];
1229d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block            ALOGD("    \"%d\"%s", len, comma);
123a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
1249d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("};");
1259d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("glShaderSource(%u, %u, shaderSrc, shaderLength);",
126a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            shader, count);
127a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    } else {
1289d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("glShaderSource(%u, %u, shaderSrc, (const GLint*) 0);",
129a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            shader, count);
130a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
131a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
132a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
1336132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic void TraceValue(int elementCount, char type,
1346132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLsizei chunkCount, GLsizei chunkSize, const void* value) {
1356132b3703da76389e81d26b0023846a78b008603Jack Palevich    StringBuilder stringBuilder;
1366132b3703da76389e81d26b0023846a78b008603Jack Palevich    GLsizei count = chunkCount * chunkSize;
1376132b3703da76389e81d26b0023846a78b008603Jack Palevich    bool isFloat = type == 'f';
1386132b3703da76389e81d26b0023846a78b008603Jack Palevich    const char* typeString = isFloat ? "GLfloat" : "GLint";
1399d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("const %s value[] = {", typeString);
1406132b3703da76389e81d26b0023846a78b008603Jack Palevich    for (GLsizei i = 0; i < count; i++) {
1416132b3703da76389e81d26b0023846a78b008603Jack Palevich        StringBuilder builder;
1426132b3703da76389e81d26b0023846a78b008603Jack Palevich        builder.append("    ");
1436132b3703da76389e81d26b0023846a78b008603Jack Palevich        for (int e = 0; e < elementCount; e++) {
1446132b3703da76389e81d26b0023846a78b008603Jack Palevich            const char* comma = ", ";
1456132b3703da76389e81d26b0023846a78b008603Jack Palevich            if (e == elementCount-1) {
1466132b3703da76389e81d26b0023846a78b008603Jack Palevich                if (i == count - 1) {
1476132b3703da76389e81d26b0023846a78b008603Jack Palevich                    comma = "";
1486132b3703da76389e81d26b0023846a78b008603Jack Palevich                } else {
1496132b3703da76389e81d26b0023846a78b008603Jack Palevich                    comma = ",";
1506132b3703da76389e81d26b0023846a78b008603Jack Palevich                }
1516132b3703da76389e81d26b0023846a78b008603Jack Palevich            }
1526132b3703da76389e81d26b0023846a78b008603Jack Palevich            if (isFloat) {
1536132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%g%s", * (GLfloat*) value, comma);
1546132b3703da76389e81d26b0023846a78b008603Jack Palevich                value = (void*) (((GLfloat*) value) + 1);
1556132b3703da76389e81d26b0023846a78b008603Jack Palevich            } else {
1566132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%d%s", * (GLint*) value, comma);
1576132b3703da76389e81d26b0023846a78b008603Jack Palevich                value = (void*) (((GLint*) value) + 1);
1586132b3703da76389e81d26b0023846a78b008603Jack Palevich            }
1596132b3703da76389e81d26b0023846a78b008603Jack Palevich        }
1609d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        ALOGD("%s", builder.getString());
1616132b3703da76389e81d26b0023846a78b008603Jack Palevich        if (chunkSize > 1 && i < count-1
1626132b3703da76389e81d26b0023846a78b008603Jack Palevich                && (i % chunkSize) == (chunkSize-1)) {
1639d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block            ALOGD("%s", ""); // Print a blank line.
1646132b3703da76389e81d26b0023846a78b008603Jack Palevich        }
1656132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
1669d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("};");
1676132b3703da76389e81d26b0023846a78b008603Jack Palevich}
1686132b3703da76389e81d26b0023846a78b008603Jack Palevich
1696132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic void TraceUniformv(int elementCount, char type,
1706132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLuint location, GLsizei count, const void* value) {
1716132b3703da76389e81d26b0023846a78b008603Jack Palevich    TraceValue(elementCount, type, count, 1, value);
1729d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("glUniform%d%c(%u, %u, value);", elementCount, type, location, count);
1736132b3703da76389e81d26b0023846a78b008603Jack Palevich}
1746132b3703da76389e81d26b0023846a78b008603Jack Palevich
1756132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic void TraceUniformMatrix(int matrixSideLength,
1766132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLuint location, GLsizei count, GLboolean transpose, const void* value) {
1776132b3703da76389e81d26b0023846a78b008603Jack Palevich    TraceValue(matrixSideLength, 'f', count, matrixSideLength, value);
1789d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("glUniformMatrix%dfv(%u, %u, %s, value);", matrixSideLength, location, count,
1796132b3703da76389e81d26b0023846a78b008603Jack Palevich            GLbooleanToString(transpose));
1806132b3703da76389e81d26b0023846a78b008603Jack Palevich}
1816132b3703da76389e81d26b0023846a78b008603Jack Palevich
182a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void TraceGL(const char* name, int numArgs, ...) {
183a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    va_list argp;
184a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    va_start(argp, numArgs);
1856132b3703da76389e81d26b0023846a78b008603Jack Palevich    int nameLen = strlen(name);
1866132b3703da76389e81d26b0023846a78b008603Jack Palevich
1876132b3703da76389e81d26b0023846a78b008603Jack Palevich    // glShaderSource
1886132b3703da76389e81d26b0023846a78b008603Jack Palevich    if (nameLen == 14 && strcmp(name, "glShaderSource") == 0) {
189a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
190a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        GLuint shader = va_arg(argp, GLuint);
191a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
192a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        GLsizei count = va_arg(argp, GLsizei);
193a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
194a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const GLchar** string = (const GLchar**) va_arg(argp, void*);
195a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
196a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const GLint* length = (const GLint*) va_arg(argp, void*);
1976132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_end(argp);
198a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        TraceGLShaderSource(shader, count, string, length);
1996132b3703da76389e81d26b0023846a78b008603Jack Palevich        return;
2006132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
2016132b3703da76389e81d26b0023846a78b008603Jack Palevich
2026132b3703da76389e81d26b0023846a78b008603Jack Palevich    // glUniformXXv
2036132b3703da76389e81d26b0023846a78b008603Jack Palevich
2046132b3703da76389e81d26b0023846a78b008603Jack Palevich    if (nameLen == 12 && strncmp(name, "glUniform", 9) == 0 && name[11] == 'v') {
2056132b3703da76389e81d26b0023846a78b008603Jack Palevich        int elementCount = name[9] - '0'; // 1..4
2066132b3703da76389e81d26b0023846a78b008603Jack Palevich        char type = name[10]; // 'f' or 'i'
2076132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2086132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLuint location = va_arg(argp, GLuint);
2096132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2106132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLsizei count = va_arg(argp, GLsizei);
2116132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2126132b3703da76389e81d26b0023846a78b008603Jack Palevich        const void* value = (const void*) va_arg(argp, void*);
213a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_end(argp);
2146132b3703da76389e81d26b0023846a78b008603Jack Palevich        TraceUniformv(elementCount, type, location, count, value);
215a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        return;
216a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
2176132b3703da76389e81d26b0023846a78b008603Jack Palevich
2186132b3703da76389e81d26b0023846a78b008603Jack Palevich    // glUniformMatrixXfv
2196132b3703da76389e81d26b0023846a78b008603Jack Palevich
2206132b3703da76389e81d26b0023846a78b008603Jack Palevich    if (nameLen == 18 && strncmp(name, "glUniformMatrix", 15) == 0
2216132b3703da76389e81d26b0023846a78b008603Jack Palevich            && name[16] == 'f' && name[17] == 'v') {
2226132b3703da76389e81d26b0023846a78b008603Jack Palevich        int matrixSideLength = name[15] - '0'; // 2..4
2236132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2246132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLuint location = va_arg(argp, GLuint);
2256132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2266132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLsizei count = va_arg(argp, GLsizei);
2276132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2286132b3703da76389e81d26b0023846a78b008603Jack Palevich        GLboolean transpose = (GLboolean) va_arg(argp, int);
2296132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_arg(argp, const char*);
2306132b3703da76389e81d26b0023846a78b008603Jack Palevich        const void* value = (const void*) va_arg(argp, void*);
2316132b3703da76389e81d26b0023846a78b008603Jack Palevich        va_end(argp);
2326132b3703da76389e81d26b0023846a78b008603Jack Palevich        TraceUniformMatrix(matrixSideLength, location, count, transpose, value);
2336132b3703da76389e81d26b0023846a78b008603Jack Palevich        return;
2346132b3703da76389e81d26b0023846a78b008603Jack Palevich    }
2356132b3703da76389e81d26b0023846a78b008603Jack Palevich
2366132b3703da76389e81d26b0023846a78b008603Jack Palevich    StringBuilder builder;
2376132b3703da76389e81d26b0023846a78b008603Jack Palevich    builder.append("%s(", name);
238a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    for (int i = 0; i < numArgs; i++) {
239a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        if (i > 0) {
2406132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append(", ");
241a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
242a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const char* type = va_arg(argp, const char*);
243a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        bool isPtr = type[strlen(type)-1] == '*'
244a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            || strcmp(type, "GLeglImageOES") == 0;
245a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        if (isPtr) {
246a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const void* arg = va_arg(argp, const void*);
2476132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("(%s) 0x%08x", type, (size_t) arg);
248a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLbitfield") == 0) {
249a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            size_t arg = va_arg(argp, size_t);
250a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            bool first = true;
251a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            for (size_t i = 0; i < sizeof(g_bitfieldNames) / sizeof(g_bitfieldNames[0]); i++) {
252a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                const GLenumString* b = &g_bitfieldNames[i];
253a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                if (b->e & arg) {
254a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    if (first) {
255a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                        first = false;
256a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    } else {
2576132b3703da76389e81d26b0023846a78b008603Jack Palevich                        builder.append(" | ");
258a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    }
2596132b3703da76389e81d26b0023846a78b008603Jack Palevich                    builder.append("%s", b->s);
260a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    arg &= ~b->e;
261a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                }
262a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
263a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (first || arg != 0) {
264a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                if (!first) {
2656132b3703da76389e81d26b0023846a78b008603Jack Palevich                    builder.append(" | ");
266a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                }
2676132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("0x%08x", arg);
268a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
269a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLboolean") == 0) {
2706132b3703da76389e81d26b0023846a78b008603Jack Palevich            GLboolean arg = va_arg(argp, int);
2716132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%s", GLbooleanToString(arg));
272a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLclampf") == 0) {
273a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            double arg = va_arg(argp, double);
2746132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%g", arg);
275a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLenum") == 0) {
276a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            GLenum arg = va_arg(argp, int);
277a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const char* s = GLEnumToString(arg);
278a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (s) {
2796132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%s", s);
280a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            } else {
2816132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("0x%x", arg);
282a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
283a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLfixed") == 0) {
284a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, int);
2856132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("0x%08x", arg);
286a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLfloat") == 0) {
287a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            double arg = va_arg(argp, double);
2886132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%g", arg);
289a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLint") == 0) {
290a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, int);
291a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const char* s = NULL;
292a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (strcmp(name, "glTexParameteri") == 0) {
293a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                s = GLEnumToString(arg);
294a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
295a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (s) {
2966132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%s", s);
297a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            } else {
2986132b3703da76389e81d26b0023846a78b008603Jack Palevich                builder.append("%d", arg);
299a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
300a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLintptr") == 0) {
301a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, unsigned int);
3026132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%u", arg);
303a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLsizei") == 0) {
304a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, size_t);
3056132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%u", arg);
306a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLsizeiptr") == 0) {
307a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, size_t);
3086132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%u", arg);
309a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLuint") == 0) {
310a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, unsigned int);
3116132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("%u", arg);
312a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else {
3136132b3703da76389e81d26b0023846a78b008603Jack Palevich            builder.append("/* ??? %s */", type);
314a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            break;
315a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
316a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
3176132b3703da76389e81d26b0023846a78b008603Jack Palevich    builder.append(");");
3189d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    ALOGD("%s", builder.getString());
319a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    va_end(argp);
320a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
321a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
32216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy///////////////////////////////////////////////////////////////////////////
32316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy// Log trace
32416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy///////////////////////////////////////////////////////////////////////////
32516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
326a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL_VOID
327a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL
328a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
329a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define TRACE_GL_VOID(_api, _args, _argList, ...)                         \
330a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void Tracing_ ## _api _args {                                      \
331a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    TraceGL(#_api, __VA_ARGS__);                                          \
332a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
333a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    _c->_api _argList;                                                    \
334a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
335a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
336a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define TRACE_GL(_type, _api, _args, _argList, ...)                       \
337a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic _type Tracing_ ## _api _args {                                     \
3382f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    TraceGL(#_api, __VA_ARGS__);                                        \
339a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
340a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    return _c->_api _argList;                                             \
341a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
342a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
343a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichextern "C" {
344a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "../trace.in"
345a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
3462f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
347a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL_VOID
348a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL
349a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
350a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define GL_ENTRY(_r, _api, ...) Tracing_ ## _api,
351a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack PalevichEGLAPI gl_hooks_t gHooksTrace = {
352a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {
353a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        #include "entries.in"
354a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    },
355a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {
356a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        {0}
357a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
358a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
359a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENTRY
360a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
3612f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL_VOID
3622f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL
3632f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
3642f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li// define the ES 1.0 Debug_gl* functions as Tracing_gl functions
3652f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#define TRACE_GL_VOID(_api, _args, _argList, ...)                         \
3662f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Listatic void Debug_ ## _api _args {                                      \
3672f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    TraceGL(#_api, __VA_ARGS__);                                          \
3682f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
3692f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    _c->_api _argList;                                                    \
3702f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li}
3712f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
3722f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#define TRACE_GL(_type, _api, _args, _argList, ...)                       \
3732f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Listatic _type Debug_ ## _api _args {                                     \
3742f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    TraceGL(#_api, __VA_ARGS__);                                        \
3752f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
3762f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li    return _c->_api _argList;                                             \
3772f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li}
3782f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
3792f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Liextern "C" {
3802f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#include "../debug.in"
3812f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li}
3822f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
38316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy///////////////////////////////////////////////////////////////////////////
38416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy// Systrace
38516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy///////////////////////////////////////////////////////////////////////////
38616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
38716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL_VOID
38816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL
38916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
39016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define TRACE_GL_VOID(_api, _args, _argList, ...)                         \
39116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guystatic void Systrace_ ## _api _args {                                     \
39216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    ATRACE_NAME(#_api);                                                   \
39316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
39416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    _c->_api _argList;                                                    \
39516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy}
39616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
39716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define TRACE_GL(_type, _api, _args, _argList, ...)                       \
39816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guystatic _type Systrace_ ## _api _args {                                    \
39916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    ATRACE_NAME(#_api);                                                   \
40016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
40116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    return _c->_api _argList;                                             \
40216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy}
40316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
40416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guyextern "C" {
40516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#include "../trace.in"
40616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy}
40716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
40816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL_VOID
40916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL
41016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
41116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define GL_ENTRY(_r, _api, ...) Systrace_ ## _api,
41216928bfeca8858a0acae6942fc68c14a040b92ffRomain GuyEGLAPI gl_hooks_t gHooksSystrace = {
41316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    {
41416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        #include "entries.in"
41516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    },
41616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    {
41716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        {0}
41816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    }
41916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy};
42016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef GL_ENTRY
42116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
42216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy///////////////////////////////////////////////////////////////////////////
42316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy//
42416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy///////////////////////////////////////////////////////////////////////////
42516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
42616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL_VOID
42716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL
42816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
42916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define CHECK_ERROR(_c, _api)                                             \
43016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    GLenum status = GL_NO_ERROR;                                          \
43116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    bool error = false;                                                   \
43216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    while ((status = _c->glGetError()) != GL_NO_ERROR) {                  \
43316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        ALOGD("[" #_api "] 0x%x", status);                                \
43416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        error = true;                                                     \
43516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    }                                                                     \
43616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    if (error) {                                                          \
43716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        CallStack s;                                                      \
43816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        s.update();                                                       \
43916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        s.dump("glGetError:" #_api);                                      \
44016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    }                                                                     \
44116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
44216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define TRACE_GL_VOID(_api, _args, _argList, ...)                         \
44316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guystatic void ErrorTrace_ ## _api _args {                                   \
44416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
44516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    _c->_api _argList;                                                    \
44616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    CHECK_ERROR(_c, _api);                                                \
44716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy}
44816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
44916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define TRACE_GL(_type, _api, _args, _argList, ...)                       \
45016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guystatic _type ErrorTrace_ ## _api _args {                                  \
45116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
45216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    _type _r = _c->_api _argList;                                         \
45316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    CHECK_ERROR(_c, _api);                                                \
45416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    return _r;                                                            \
45516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy}
45616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
45716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guyextern "C" {
45816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#include "../trace.in"
45916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy}
46016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
46116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL_VOID
46216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef TRACE_GL
46316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
46416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#define GL_ENTRY(_r, _api, ...) ErrorTrace_ ## _api,
46516928bfeca8858a0acae6942fc68c14a040b92ffRomain GuyEGLAPI gl_hooks_t gHooksErrorTrace = {
46616928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    {
46716928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        #include "entries.in"
46816928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    },
46916928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    {
47016928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy        {0}
47116928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy    }
47216928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy};
47316928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef GL_ENTRY
47416928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy#undef CHECK_ERROR
47516928bfeca8858a0acae6942fc68c14a040b92ffRomain Guy
4762f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL_VOID
4772f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL
4782f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li
479a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
480a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}; // namespace android
481a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
482a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
483a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#endif // EGL_TRACE
484