trace.cpp revision 9d4536835248525f32f1504a3d28d5bbfa0a2910
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 291cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian#include "egl_tls.h" 30a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "hooks.h" 31a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 32a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ---------------------------------------------------------------------------- 33a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichnamespace android { 34a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ---------------------------------------------------------------------------- 35a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 36a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstruct GLenumString { 37a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich GLenum e; 38a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich const char* s; 39a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}; 40a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 41a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENUM 42a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define GL_ENUM(VAL,NAME) {VAL, #NAME}, 43a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 44a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic GLenumString g_enumnames[] = { 45a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "enums.in" 46a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}; 47a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENUM 48a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 49a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic int compareGLEnum(const void* a, const void* b) { 50a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich return ((const GLenumString*) a)->e - ((const GLenumString*) b)->e; 51a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich} 52a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 53a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic const char* GLEnumToString(GLenum e) { 54a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich GLenumString key = {e, ""}; 55a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich const GLenumString* result = (const GLenumString*) bsearch( 56a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich &key, g_enumnames, 57a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich sizeof(g_enumnames) / sizeof(g_enumnames[0]), 58a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich sizeof(g_enumnames[0]), compareGLEnum); 59a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich if (result) { 60a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich return result->s; 61a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 62a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich return NULL; 63a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich} 64a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 656132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic const char* GLbooleanToString(GLboolean arg) { 666132b3703da76389e81d26b0023846a78b008603Jack Palevich return arg ? "GL_TRUE" : "GL_FALSE"; 676132b3703da76389e81d26b0023846a78b008603Jack Palevich} 686132b3703da76389e81d26b0023846a78b008603Jack Palevich 69a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic GLenumString g_bitfieldNames[] = { 70a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich {0x00004000, "GL_COLOR_BUFFER_BIT"}, 71a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich {0x00000400, "GL_STENCIL_BUFFER_BIT"}, 72a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich {0x00000100, "GL_DEPTH_BUFFER_BIT"} 73a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}; 74a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 756132b3703da76389e81d26b0023846a78b008603Jack Palevichclass StringBuilder { 766132b3703da76389e81d26b0023846a78b008603Jack Palevich static const int lineSize = 500; 776132b3703da76389e81d26b0023846a78b008603Jack Palevich char line[lineSize]; 786132b3703da76389e81d26b0023846a78b008603Jack Palevich int line_index; 796132b3703da76389e81d26b0023846a78b008603Jack Palevichpublic: 806132b3703da76389e81d26b0023846a78b008603Jack Palevich StringBuilder() { 816132b3703da76389e81d26b0023846a78b008603Jack Palevich line_index = 0; 826132b3703da76389e81d26b0023846a78b008603Jack Palevich line[0] = '\0'; 836132b3703da76389e81d26b0023846a78b008603Jack Palevich } 846132b3703da76389e81d26b0023846a78b008603Jack Palevich void append(const char* fmt, ...) { 856132b3703da76389e81d26b0023846a78b008603Jack Palevich va_list argp; 866132b3703da76389e81d26b0023846a78b008603Jack Palevich va_start(argp, fmt); 876132b3703da76389e81d26b0023846a78b008603Jack Palevich line_index += vsnprintf(line + line_index, lineSize-line_index, fmt, argp); 886132b3703da76389e81d26b0023846a78b008603Jack Palevich va_end(argp); 896132b3703da76389e81d26b0023846a78b008603Jack Palevich } 906132b3703da76389e81d26b0023846a78b008603Jack Palevich const char* getString() { 916132b3703da76389e81d26b0023846a78b008603Jack Palevich line_index = 0; 926132b3703da76389e81d26b0023846a78b008603Jack Palevich line[lineSize-1] = '\0'; 936132b3703da76389e81d26b0023846a78b008603Jack Palevich return line; 946132b3703da76389e81d26b0023846a78b008603Jack Palevich } 956132b3703da76389e81d26b0023846a78b008603Jack Palevich}; 966132b3703da76389e81d26b0023846a78b008603Jack Palevich 97a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 98a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void TraceGLShaderSource(GLuint shader, GLsizei count, 99a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich const GLchar** string, const GLint* length) { 1009d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("const char* shaderSrc[] = {"); 101a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich for (GLsizei i = 0; i < count; i++) { 102a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich const char* comma = i < count-1 ? "," : ""; 103a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich const GLchar* s = string[i]; 104a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich if (length) { 105a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich GLint len = length[i]; 1069d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD(" \"%*s\"%s", len, s, comma); 107a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else { 1089d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD(" \"%s\"%s", s, comma); 109a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 110a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 1119d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("};"); 112a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich if (length) { 1139d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("const GLint* shaderLength[] = {"); 114a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich for (GLsizei i = 0; i < count; i++) { 115a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich const char* comma = i < count-1 ? "," : ""; 116a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich GLint len = length[i]; 1179d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD(" \"%d\"%s", len, comma); 118a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 1199d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("};"); 1209d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("glShaderSource(%u, %u, shaderSrc, shaderLength);", 121a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich shader, count); 122a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else { 1239d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("glShaderSource(%u, %u, shaderSrc, (const GLint*) 0);", 124a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich shader, count); 125a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 126a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich} 127a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 1286132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic void TraceValue(int elementCount, char type, 1296132b3703da76389e81d26b0023846a78b008603Jack Palevich GLsizei chunkCount, GLsizei chunkSize, const void* value) { 1306132b3703da76389e81d26b0023846a78b008603Jack Palevich StringBuilder stringBuilder; 1316132b3703da76389e81d26b0023846a78b008603Jack Palevich GLsizei count = chunkCount * chunkSize; 1326132b3703da76389e81d26b0023846a78b008603Jack Palevich bool isFloat = type == 'f'; 1336132b3703da76389e81d26b0023846a78b008603Jack Palevich const char* typeString = isFloat ? "GLfloat" : "GLint"; 1349d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("const %s value[] = {", typeString); 1356132b3703da76389e81d26b0023846a78b008603Jack Palevich for (GLsizei i = 0; i < count; i++) { 1366132b3703da76389e81d26b0023846a78b008603Jack Palevich StringBuilder builder; 1376132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append(" "); 1386132b3703da76389e81d26b0023846a78b008603Jack Palevich for (int e = 0; e < elementCount; e++) { 1396132b3703da76389e81d26b0023846a78b008603Jack Palevich const char* comma = ", "; 1406132b3703da76389e81d26b0023846a78b008603Jack Palevich if (e == elementCount-1) { 1416132b3703da76389e81d26b0023846a78b008603Jack Palevich if (i == count - 1) { 1426132b3703da76389e81d26b0023846a78b008603Jack Palevich comma = ""; 1436132b3703da76389e81d26b0023846a78b008603Jack Palevich } else { 1446132b3703da76389e81d26b0023846a78b008603Jack Palevich comma = ","; 1456132b3703da76389e81d26b0023846a78b008603Jack Palevich } 1466132b3703da76389e81d26b0023846a78b008603Jack Palevich } 1476132b3703da76389e81d26b0023846a78b008603Jack Palevich if (isFloat) { 1486132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("%g%s", * (GLfloat*) value, comma); 1496132b3703da76389e81d26b0023846a78b008603Jack Palevich value = (void*) (((GLfloat*) value) + 1); 1506132b3703da76389e81d26b0023846a78b008603Jack Palevich } else { 1516132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("%d%s", * (GLint*) value, comma); 1526132b3703da76389e81d26b0023846a78b008603Jack Palevich value = (void*) (((GLint*) value) + 1); 1536132b3703da76389e81d26b0023846a78b008603Jack Palevich } 1546132b3703da76389e81d26b0023846a78b008603Jack Palevich } 1559d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("%s", builder.getString()); 1566132b3703da76389e81d26b0023846a78b008603Jack Palevich if (chunkSize > 1 && i < count-1 1576132b3703da76389e81d26b0023846a78b008603Jack Palevich && (i % chunkSize) == (chunkSize-1)) { 1589d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("%s", ""); // Print a blank line. 1596132b3703da76389e81d26b0023846a78b008603Jack Palevich } 1606132b3703da76389e81d26b0023846a78b008603Jack Palevich } 1619d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("};"); 1626132b3703da76389e81d26b0023846a78b008603Jack Palevich} 1636132b3703da76389e81d26b0023846a78b008603Jack Palevich 1646132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic void TraceUniformv(int elementCount, char type, 1656132b3703da76389e81d26b0023846a78b008603Jack Palevich GLuint location, GLsizei count, const void* value) { 1666132b3703da76389e81d26b0023846a78b008603Jack Palevich TraceValue(elementCount, type, count, 1, value); 1679d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("glUniform%d%c(%u, %u, value);", elementCount, type, location, count); 1686132b3703da76389e81d26b0023846a78b008603Jack Palevich} 1696132b3703da76389e81d26b0023846a78b008603Jack Palevich 1706132b3703da76389e81d26b0023846a78b008603Jack Palevichstatic void TraceUniformMatrix(int matrixSideLength, 1716132b3703da76389e81d26b0023846a78b008603Jack Palevich GLuint location, GLsizei count, GLboolean transpose, const void* value) { 1726132b3703da76389e81d26b0023846a78b008603Jack Palevich TraceValue(matrixSideLength, 'f', count, matrixSideLength, value); 1739d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("glUniformMatrix%dfv(%u, %u, %s, value);", matrixSideLength, location, count, 1746132b3703da76389e81d26b0023846a78b008603Jack Palevich GLbooleanToString(transpose)); 1756132b3703da76389e81d26b0023846a78b008603Jack Palevich} 1766132b3703da76389e81d26b0023846a78b008603Jack Palevich 177a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void TraceGL(const char* name, int numArgs, ...) { 178a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich va_list argp; 179a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich va_start(argp, numArgs); 1806132b3703da76389e81d26b0023846a78b008603Jack Palevich int nameLen = strlen(name); 1816132b3703da76389e81d26b0023846a78b008603Jack Palevich 1826132b3703da76389e81d26b0023846a78b008603Jack Palevich // glShaderSource 1836132b3703da76389e81d26b0023846a78b008603Jack Palevich if (nameLen == 14 && strcmp(name, "glShaderSource") == 0) { 184a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich va_arg(argp, const char*); 185a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich GLuint shader = va_arg(argp, GLuint); 186a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich va_arg(argp, const char*); 187a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich GLsizei count = va_arg(argp, GLsizei); 188a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich va_arg(argp, const char*); 189a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich const GLchar** string = (const GLchar**) va_arg(argp, void*); 190a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich va_arg(argp, const char*); 191a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich const GLint* length = (const GLint*) va_arg(argp, void*); 1926132b3703da76389e81d26b0023846a78b008603Jack Palevich va_end(argp); 193a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich TraceGLShaderSource(shader, count, string, length); 1946132b3703da76389e81d26b0023846a78b008603Jack Palevich return; 1956132b3703da76389e81d26b0023846a78b008603Jack Palevich } 1966132b3703da76389e81d26b0023846a78b008603Jack Palevich 1976132b3703da76389e81d26b0023846a78b008603Jack Palevich // glUniformXXv 1986132b3703da76389e81d26b0023846a78b008603Jack Palevich 1996132b3703da76389e81d26b0023846a78b008603Jack Palevich if (nameLen == 12 && strncmp(name, "glUniform", 9) == 0 && name[11] == 'v') { 2006132b3703da76389e81d26b0023846a78b008603Jack Palevich int elementCount = name[9] - '0'; // 1..4 2016132b3703da76389e81d26b0023846a78b008603Jack Palevich char type = name[10]; // 'f' or 'i' 2026132b3703da76389e81d26b0023846a78b008603Jack Palevich va_arg(argp, const char*); 2036132b3703da76389e81d26b0023846a78b008603Jack Palevich GLuint location = va_arg(argp, GLuint); 2046132b3703da76389e81d26b0023846a78b008603Jack Palevich va_arg(argp, const char*); 2056132b3703da76389e81d26b0023846a78b008603Jack Palevich GLsizei count = va_arg(argp, GLsizei); 2066132b3703da76389e81d26b0023846a78b008603Jack Palevich va_arg(argp, const char*); 2076132b3703da76389e81d26b0023846a78b008603Jack Palevich const void* value = (const void*) va_arg(argp, void*); 208a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich va_end(argp); 2096132b3703da76389e81d26b0023846a78b008603Jack Palevich TraceUniformv(elementCount, type, location, count, value); 210a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich return; 211a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 2126132b3703da76389e81d26b0023846a78b008603Jack Palevich 2136132b3703da76389e81d26b0023846a78b008603Jack Palevich // glUniformMatrixXfv 2146132b3703da76389e81d26b0023846a78b008603Jack Palevich 2156132b3703da76389e81d26b0023846a78b008603Jack Palevich if (nameLen == 18 && strncmp(name, "glUniformMatrix", 15) == 0 2166132b3703da76389e81d26b0023846a78b008603Jack Palevich && name[16] == 'f' && name[17] == 'v') { 2176132b3703da76389e81d26b0023846a78b008603Jack Palevich int matrixSideLength = name[15] - '0'; // 2..4 2186132b3703da76389e81d26b0023846a78b008603Jack Palevich va_arg(argp, const char*); 2196132b3703da76389e81d26b0023846a78b008603Jack Palevich GLuint location = va_arg(argp, GLuint); 2206132b3703da76389e81d26b0023846a78b008603Jack Palevich va_arg(argp, const char*); 2216132b3703da76389e81d26b0023846a78b008603Jack Palevich GLsizei count = va_arg(argp, GLsizei); 2226132b3703da76389e81d26b0023846a78b008603Jack Palevich va_arg(argp, const char*); 2236132b3703da76389e81d26b0023846a78b008603Jack Palevich GLboolean transpose = (GLboolean) va_arg(argp, int); 2246132b3703da76389e81d26b0023846a78b008603Jack Palevich va_arg(argp, const char*); 2256132b3703da76389e81d26b0023846a78b008603Jack Palevich const void* value = (const void*) va_arg(argp, void*); 2266132b3703da76389e81d26b0023846a78b008603Jack Palevich va_end(argp); 2276132b3703da76389e81d26b0023846a78b008603Jack Palevich TraceUniformMatrix(matrixSideLength, location, count, transpose, value); 2286132b3703da76389e81d26b0023846a78b008603Jack Palevich return; 2296132b3703da76389e81d26b0023846a78b008603Jack Palevich } 2306132b3703da76389e81d26b0023846a78b008603Jack Palevich 2316132b3703da76389e81d26b0023846a78b008603Jack Palevich StringBuilder builder; 2326132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("%s(", name); 233a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich for (int i = 0; i < numArgs; i++) { 234a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich if (i > 0) { 2356132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append(", "); 236a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 237a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich const char* type = va_arg(argp, const char*); 238a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich bool isPtr = type[strlen(type)-1] == '*' 239a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich || strcmp(type, "GLeglImageOES") == 0; 240a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich if (isPtr) { 241a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich const void* arg = va_arg(argp, const void*); 2426132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("(%s) 0x%08x", type, (size_t) arg); 243a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else if (strcmp(type, "GLbitfield") == 0) { 244a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich size_t arg = va_arg(argp, size_t); 245a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich bool first = true; 246a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich for (size_t i = 0; i < sizeof(g_bitfieldNames) / sizeof(g_bitfieldNames[0]); i++) { 247a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich const GLenumString* b = &g_bitfieldNames[i]; 248a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich if (b->e & arg) { 249a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich if (first) { 250a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich first = false; 251a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else { 2526132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append(" | "); 253a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 2546132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("%s", b->s); 255a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich arg &= ~b->e; 256a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 257a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 258a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich if (first || arg != 0) { 259a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich if (!first) { 2606132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append(" | "); 261a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 2626132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("0x%08x", arg); 263a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 264a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else if (strcmp(type, "GLboolean") == 0) { 2656132b3703da76389e81d26b0023846a78b008603Jack Palevich GLboolean arg = va_arg(argp, int); 2666132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("%s", GLbooleanToString(arg)); 267a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else if (strcmp(type, "GLclampf") == 0) { 268a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich double arg = va_arg(argp, double); 2696132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("%g", arg); 270a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else if (strcmp(type, "GLenum") == 0) { 271a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich GLenum arg = va_arg(argp, int); 272a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich const char* s = GLEnumToString(arg); 273a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich if (s) { 2746132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("%s", s); 275a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else { 2766132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("0x%x", arg); 277a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 278a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else if (strcmp(type, "GLfixed") == 0) { 279a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich int arg = va_arg(argp, int); 2806132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("0x%08x", arg); 281a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else if (strcmp(type, "GLfloat") == 0) { 282a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich double arg = va_arg(argp, double); 2836132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("%g", arg); 284a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else if (strcmp(type, "GLint") == 0) { 285a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich int arg = va_arg(argp, int); 286a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich const char* s = NULL; 287a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich if (strcmp(name, "glTexParameteri") == 0) { 288a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich s = GLEnumToString(arg); 289a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 290a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich if (s) { 2916132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("%s", s); 292a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else { 2936132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("%d", arg); 294a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 295a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else if (strcmp(type, "GLintptr") == 0) { 296a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich int arg = va_arg(argp, unsigned int); 2976132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("%u", arg); 298a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else if (strcmp(type, "GLsizei") == 0) { 299a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich int arg = va_arg(argp, size_t); 3006132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("%u", arg); 301a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else if (strcmp(type, "GLsizeiptr") == 0) { 302a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich int arg = va_arg(argp, size_t); 3036132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("%u", arg); 304a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else if (strcmp(type, "GLuint") == 0) { 305a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich int arg = va_arg(argp, unsigned int); 3066132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("%u", arg); 307a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } else { 3086132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append("/* ??? %s */", type); 309a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich break; 310a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 311a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 3126132b3703da76389e81d26b0023846a78b008603Jack Palevich builder.append(");"); 3139d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("%s", builder.getString()); 314a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich va_end(argp); 315a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich} 316a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 317a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL_VOID 318a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL 319a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 320a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define TRACE_GL_VOID(_api, _args, _argList, ...) \ 321a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic void Tracing_ ## _api _args { \ 322a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich TraceGL(#_api, __VA_ARGS__); \ 323a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl; \ 324a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich _c->_api _argList; \ 325a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich} 326a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 327a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define TRACE_GL(_type, _api, _args, _argList, ...) \ 328a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichstatic _type Tracing_ ## _api _args { \ 3292f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li TraceGL(#_api, __VA_ARGS__); \ 330a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl; \ 331a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich return _c->_api _argList; \ 332a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich} 333a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 334a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevichextern "C" { 335a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#include "../trace.in" 336a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich} 3372f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li 338a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL_VOID 339a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef TRACE_GL 340a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 341a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#define GL_ENTRY(_r, _api, ...) Tracing_ ## _api, 342a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack PalevichEGLAPI gl_hooks_t gHooksTrace = { 343a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich { 344a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich #include "entries.in" 345a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich }, 346a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich { 347a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich {0} 348a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich } 349a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}; 350a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#undef GL_ENTRY 351a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 3522f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li 3532f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL_VOID 3542f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL 3552f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li 3562f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li// define the ES 1.0 Debug_gl* functions as Tracing_gl functions 3572f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#define TRACE_GL_VOID(_api, _args, _argList, ...) \ 3582f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Listatic void Debug_ ## _api _args { \ 3592f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li TraceGL(#_api, __VA_ARGS__); \ 3602f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl; \ 3612f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li _c->_api _argList; \ 3622f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li} 3632f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li 3642f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#define TRACE_GL(_type, _api, _args, _argList, ...) \ 3652f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Listatic _type Debug_ ## _api _args { \ 3662f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li TraceGL(#_api, __VA_ARGS__); \ 3672f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li gl_hooks_t::gl_t const * const _c = &getGLTraceThreadSpecific()->gl; \ 3682f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li return _c->_api _argList; \ 3692f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li} 3702f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li 3712f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Liextern "C" { 3722f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#include "../debug.in" 3732f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li} 3742f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li 3752f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL_VOID 3762f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li#undef TRACE_GL 3772f5a6557ef6a7b9fd33077cfd8a037904d41e3bdDavid Li 378a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ---------------------------------------------------------------------------- 379a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich}; // namespace android 380a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich// ---------------------------------------------------------------------------- 381a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich 382a2dd6cf59962e3a21a47df29b2f243e904839ba7Jack Palevich#endif // EGL_TRACE 383