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