trace.cpp revision a2dd6cf59962e3a21a47df29b2f243e904839ba7
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
29a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "hooks.h"
30a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
31a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
32a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichnamespace android {
33a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
34a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
35a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstruct GLenumString {
36a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    GLenum e;
37a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    const char* s;
38a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
39a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
40a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENUM
41a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define GL_ENUM(VAL,NAME) {VAL, #NAME},
42a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
43a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic GLenumString g_enumnames[] = {
44a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "enums.in"
45a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
46a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENUM
47a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
48a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic int compareGLEnum(const void* a, const void* b) {
49a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    return ((const GLenumString*) a)->e - ((const GLenumString*) b)->e;
50a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
51a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
52a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic const char* GLEnumToString(GLenum e) {
53a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    GLenumString key = {e, ""};
54a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    const GLenumString* result = (const GLenumString*) bsearch(
55a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        &key, g_enumnames,
56a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        sizeof(g_enumnames) / sizeof(g_enumnames[0]),
57a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        sizeof(g_enumnames[0]), compareGLEnum);
58a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    if (result) {
59a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        return result->s;
60a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
61a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    return NULL;
62a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
63a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
64a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic GLenumString g_bitfieldNames[] = {
65a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {0x00004000, "GL_COLOR_BUFFER_BIT"},
66a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {0x00000400, "GL_STENCIL_BUFFER_BIT"},
67a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {0x00000100, "GL_DEPTH_BUFFER_BIT"}
68a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
69a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
70a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
71a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void TraceGLShaderSource(GLuint shader, GLsizei count,
72a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    const GLchar** string, const GLint* length) {
73a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    LOGD("const char* shaderSrc[] = {");
74a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    for (GLsizei i = 0; i < count; i++) {
75a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const char* comma = i < count-1 ? "," : "";
76a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const GLchar* s = string[i];
77a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        if (length) {
78a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            GLint len = length[i];
79a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            LOGD("    \"%*s\"%s", len, s, comma);
80a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else {
81a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            LOGD("    \"%s\"%s", s, comma);
82a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
83a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
84a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    LOGD("};");
85a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    if (length) {
86a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        LOGD("const GLint* shaderLength[] = {");
87a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        for (GLsizei i = 0; i < count; i++) {
88a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const char* comma = i < count-1 ? "," : "";
89a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            GLint len = length[i];
90a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            LOGD("    \"%d\"%s", len, comma);
91a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
92a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        LOGD("};");
93a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        LOGD("glShaderSource(%u, %u, shaderSrc, shaderLength);",
94a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            shader, count);
95a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    } else {
96a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        LOGD("glShaderSource(%u, %u, shaderSrc, (const GLint*) 0);",
97a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            shader, count);
98a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
99a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
100a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
101a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void TraceGL(const char* name, int numArgs, ...) {
102a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    va_list argp;
103a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    va_start(argp, numArgs);
104a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    if (strcmp(name, "glShaderSource") == 0) {
105a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
106a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        GLuint shader = va_arg(argp, GLuint);
107a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
108a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        GLsizei count = va_arg(argp, GLsizei);
109a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
110a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const GLchar** string = (const GLchar**) va_arg(argp, void*);
111a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_arg(argp, const char*);
112a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const GLint* length = (const GLint*) va_arg(argp, void*);
113a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        TraceGLShaderSource(shader, count, string, length);
114a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        va_end(argp);
115a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        return;
116a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
117a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    const int lineSize = 500;
118a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    char line[lineSize];
119a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    int line_index = 0;
120a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    #define APPEND(...) \
121a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        line_index += snprintf(line + line_index, lineSize-line_index, __VA_ARGS__);
122a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    APPEND("%s(", name);
123a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    for (int i = 0; i < numArgs; i++) {
124a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        if (i > 0) {
125a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            APPEND(", ");
126a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
127a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        const char* type = va_arg(argp, const char*);
128a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        bool isPtr = type[strlen(type)-1] == '*'
129a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            || strcmp(type, "GLeglImageOES") == 0;
130a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        if (isPtr) {
131a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const void* arg = va_arg(argp, const void*);
132a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            APPEND("(%s) 0x%08x", type, (size_t) arg);
133a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLbitfield") == 0) {
134a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            size_t arg = va_arg(argp, size_t);
135a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            bool first = true;
136a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            for (size_t i = 0; i < sizeof(g_bitfieldNames) / sizeof(g_bitfieldNames[0]); i++) {
137a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                const GLenumString* b = &g_bitfieldNames[i];
138a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                if (b->e & arg) {
139a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    if (first) {
140a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                        first = false;
141a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    } else {
142a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                        APPEND(" | ");
143a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    }
144a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    APPEND("%s", b->s);
145a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    arg &= ~b->e;
146a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                }
147a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
148a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (first || arg != 0) {
149a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                if (!first) {
150a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                    APPEND(" | ");
151a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                }
152a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                APPEND("0x%08x", arg);
153a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
154a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLboolean") == 0) {
155a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, int);
156a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            APPEND("%s", arg ? "GL_TRUE" : "GL_FALSE");
157a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLclampf") == 0) {
158a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            double arg = va_arg(argp, double);
159a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            APPEND("%g", arg);
160a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLenum") == 0) {
161a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            GLenum arg = va_arg(argp, int);
162a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const char* s = GLEnumToString(arg);
163a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (s) {
164a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                APPEND("%s", s);
165a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            } else {
166a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                APPEND("0x%x", arg);
167a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
168a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLfixed") == 0) {
169a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, int);
170a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            APPEND("0x%08x", arg);
171a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLfloat") == 0) {
172a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            double arg = va_arg(argp, double);
173a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            APPEND("%g", arg);
174a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLint") == 0) {
175a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, int);
176a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            const char* s = NULL;
177a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (strcmp(name, "glTexParameteri") == 0) {
178a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                s = GLEnumToString(arg);
179a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
180a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            if (s) {
181a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                APPEND("%s", s);
182a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            } else {
183a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich                APPEND("%d", arg);
184a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            }
185a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLintptr") == 0) {
186a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, unsigned int);
187a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            APPEND("%u", arg);
188a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLsizei") == 0) {
189a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, size_t);
190a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            APPEND("%u", arg);
191a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLsizeiptr") == 0) {
192a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, size_t);
193a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            APPEND("%u", arg);
194a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else if (strcmp(type, "GLuint") == 0) {
195a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            int arg = va_arg(argp, unsigned int);
196a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            APPEND("%u", arg);
197a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        } else {
198a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            APPEND("/* ??? %s */", type);
199a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich            break;
200a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        }
201a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
202a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    APPEND(");");
203a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    line[lineSize-1] = '\0';
204a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    LOGD("%s", line);
205a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    va_end(argp);
206a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
207a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
208a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL_VOID
209a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL
210a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
211a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define TRACE_GL_VOID(_api, _args, _argList, ...)                         \
212a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void Tracing_ ## _api _args {                                      \
213a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    TraceGL(#_api, __VA_ARGS__);                                          \
214a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
215a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    _c->_api _argList;                                                    \
216a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
217a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
218a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define TRACE_GL(_type, _api, _args, _argList, ...)                       \
219a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic _type Tracing_ ## _api _args {                                     \
220a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    TraceGL(#_api, __VA_ARGS__);                                          \
221a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl;  \
222a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    return _c->_api _argList;                                             \
223a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
224a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
225a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichextern "C" {
226a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "../trace.in"
227a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}
228a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL_VOID
229a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL
230a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
231a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define GL_ENTRY(_r, _api, ...) Tracing_ ## _api,
232a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
233a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack PalevichEGLAPI gl_hooks_t gHooksTrace = {
234a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {
235a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        #include "entries.in"
236a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    },
237a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    {
238a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich        {0}
239a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich    }
240a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich};
241a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENTRY
242a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
243a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
244a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}; // namespace android
245a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ----------------------------------------------------------------------------
246a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich
247a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#endif // EGL_TRACE
248