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