10469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy/* 20469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy * Copyright 2011, The Android Open Source Project 30469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy * 40469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy * Licensed under the Apache License, Version 2.0 (the "License"); 50469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy * you may not use this file except in compliance with the License. 60469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy * You may obtain a copy of the License at 70469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy * 80469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy * http://www.apache.org/licenses/LICENSE-2.0 90469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy * 100469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy * Unless required by applicable law or agreed to in writing, software 110469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy * distributed under the License is distributed on an "AS IS" BASIS, 120469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy * See the License for the specific language governing permissions and 140469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy * limitations under the License. 150469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy */ 160469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 170469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy#include <cutils/log.h> 183ef9e9671c224af82d2efec1a1e9a275fb9acf44Siva Velusamy#include <EGL/egldefs.h> 1988e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy#include <GLES/gl.h> 2088e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy#include <GLES/glext.h> 210469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy#include <GLES2/gl2.h> 2288e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy#include <GLES2/gl2ext.h> 230469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 240469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy#include "gltrace.pb.h" 2588e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy#include "gltrace_api.h" 260469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy#include "gltrace_context.h" 270469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy#include "gltrace_fixup.h" 280469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 290469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamynamespace android { 300469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamynamespace gltrace { 310469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 3216d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben ClaytonGLint glGetInteger(GLTraceContext *context, GLenum param) { 3316d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton GLint x; 3416d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton context->hooks->gl.glGetIntegerv(param, &x); 3516d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton return x; 3616d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton} 3716d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton 3816d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben ClaytonGLint glGetVertexAttrib(GLTraceContext *context, GLuint index, GLenum pname) { 3916d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton GLint x; 4016d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton context->hooks->gl.glGetVertexAttribiv(index, pname, &x); 4116d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton return x; 4216d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton} 4316d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton 4416d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Claytonbool isUsingPixelBuffers(GLTraceContext *context) { 4516d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton if (context->getVersionMajor() < 3) { 4616d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton return false; // PBOs not supported prior to GLES 3.0 4716d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton } 4816d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton return glGetInteger(context, GL_PIXEL_UNPACK_BUFFER_BINDING) != 0; 4916d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton} 5016d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton 5116d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Claytonbool isUsingArrayBuffers(GLTraceContext *context) { 5216d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton return glGetInteger(context, GL_ARRAY_BUFFER_BINDING) != 0; 5316d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton} 5416d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton 5516d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Claytonbool isUsingElementArrayBuffers(GLTraceContext *context) { 5616d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton return glGetInteger(context, GL_ELEMENT_ARRAY_BUFFER_BINDING) != 0; 5716d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton} 5816d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton 590469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamyunsigned getBytesPerTexel(const GLenum format, const GLenum type) { 600469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* 610469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy Description from glTexImage2D spec: 620469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 630469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy Data is read from data as a sequence of unsigned bytes or shorts, depending on type. 640469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy When type is GL_UNSIGNED_BYTE, each of the bytes is interpreted as one color component. 650469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy When type is one of GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_SHORT_4_4_4_4, or 660469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GL_UNSIGNED_SHORT_5_5_5_1, each unsigned short value is interpreted as containing all 670469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy the components for a single texel, with the color components arranged according to 680469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy format. Color components are treated as groups of one, two, three, or four values, 690469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy again based on format. Groups of components are referred to as texels. 700469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 710469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy width × height texels are read from memory, starting at location data. By default, 720469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy these texels are taken from adjacent memory locations, except that after all width 730469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy texels are read, the read pointer is advanced to the next four-byte boundary. 740469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy The four-byte row alignment is specified by glPixelStorei with argument 750469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GL_UNPACK_ALIGNMENT, and it can be set to one, two, four, or eight bytes. 760469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy */ 770469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 780469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy switch (type) { 790469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GL_UNSIGNED_SHORT_5_6_5: 800469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GL_UNSIGNED_SHORT_4_4_4_4: 810469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GL_UNSIGNED_SHORT_5_5_5_1: 820469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy return 2; 830469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GL_UNSIGNED_BYTE: 840469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 850469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy default: 86e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("GetBytesPerPixel: unknown type %x", type); 870469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy } 880469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 890469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy switch (format) { 900469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GL_ALPHA: 910469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GL_LUMINANCE: 920469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy return 1; 930469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GL_LUMINANCE_ALPHA: 940469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy return 2; 950469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GL_RGB: 960469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy return 3; 970469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GL_RGBA: 980469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case 0x80E1: // GL_BGRA_EXT 990469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy return 4; 1000469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy default: 101e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("GetBytesPerPixel: unknown format %x", format); 1020469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy } 1030469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 1040469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy return 1; // in doubt... 1050469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy} 1060469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 1079801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamyvoid fixup_GenericFloatArray(int argIndex, int nFloats, GLMessage *glmsg, void *src) { 1089801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy GLMessage_DataType *arg_floatarray = glmsg->mutable_args(argIndex); 1099801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy GLfloat *floatp = (GLfloat *)src; 1109801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy 1119801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy if (floatp == NULL) { 1129801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy return; 1139801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy } 1149801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy 1159801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy arg_floatarray->set_type(GLMessage::DataType::FLOAT); 1169801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy arg_floatarray->set_isarray(true); 1179801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy arg_floatarray->clear_floatvalue(); 1189801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy 1199801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy for (int i = 0; i < nFloats; i++, floatp++) { 1209801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy arg_floatarray->add_floatvalue(*floatp); 1219801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy } 1229801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy} 1239801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy 1249801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamyvoid fixup_GenericIntArray(int argIndex, int nInts, GLMessage *glmsg, void *src) { 1259801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy GLMessage_DataType *arg_intarray = glmsg->mutable_args(argIndex); 1269801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy GLint *intp = (GLint *)src; 1279801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy 1289801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy if (intp == NULL) { 1299801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy return; 1309801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy } 1319801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy 1329801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy arg_intarray->set_type(GLMessage::DataType::INT); 1339801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy arg_intarray->set_isarray(true); 1349801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy arg_intarray->clear_intvalue(); 1359801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy 1369801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy for (int i = 0; i < nInts; i++, intp++) { 1379801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy arg_intarray->add_intvalue(*intp); 1389801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy } 1399801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy} 1409801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy 1419801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamyvoid fixup_GenericEnumArray(int argIndex, int nEnums, GLMessage *glmsg, void *src) { 1429801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy // fixup as if they were ints 1439801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_GenericIntArray(argIndex, nEnums, glmsg, src); 1449801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy 1459801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy // and then set the data type to be enum 1469801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy GLMessage_DataType *arg_enumarray = glmsg->mutable_args(argIndex); 1479801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy arg_enumarray->set_type(GLMessage::DataType::ENUM); 1489801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy} 1499801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy 1500469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy/** Generic helper function: extract pointer at argIndex and 1510469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy replace it with the C style string at *pointer */ 1529801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamyvoid fixup_CStringPtr(int argIndex, GLMessage *glmsg, void *src) { 1530469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLMessage_DataType *arg = glmsg->mutable_args(argIndex); 1549801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy GLchar *ptr = (GLchar *) src; 1550469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 1560469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg->set_type(GLMessage::DataType::CHAR); 1570469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg->set_isarray(true); 1580469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg->add_charvalue(ptr); 1590469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy} 1600469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 1619801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamyvoid fixup_glGetString(GLMessage *glmsg, void *pointersToFixup[]) { 1620469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* const GLubyte* GLTrace_glGetString(GLenum name) */ 1630469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLMessage_DataType *ret = glmsg->mutable_returnvalue(); 1649801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy GLchar *ptr = (GLchar *) pointersToFixup[0]; 1650469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 1660469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy if (ptr != NULL) { 1670469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy ret->set_type(GLMessage::DataType::CHAR); 1680469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy ret->set_isarray(true); 1690469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy ret->add_charvalue(ptr); 1700469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy } 1710469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy} 1720469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 173a8cfde8897c840ce6a491a054ade806b41df2a70Siva Velusamy/* Add the contents of the framebuffer to the protobuf message */ 17493a826f78f6313db791e6fc880439189897651b3Siva Velusamyvoid fixup_addFBContents(GLTraceContext *context, GLMessage *glmsg, FBBinding fbToRead) { 175a8cfde8897c840ce6a491a054ade806b41df2a70Siva Velusamy void *fbcontents; 1760469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy unsigned fbsize, fbwidth, fbheight; 17793a826f78f6313db791e6fc880439189897651b3Siva Velusamy context->getCompressedFB(&fbcontents, &fbsize, &fbwidth, &fbheight, fbToRead); 1780469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 179a8cfde8897c840ce6a491a054ade806b41df2a70Siva Velusamy GLMessage_FrameBuffer *fb = glmsg->mutable_fb(); 180a8cfde8897c840ce6a491a054ade806b41df2a70Siva Velusamy fb->set_width(fbwidth); 181a8cfde8897c840ce6a491a054ade806b41df2a70Siva Velusamy fb->set_height(fbheight); 182a8cfde8897c840ce6a491a054ade806b41df2a70Siva Velusamy fb->add_contents(fbcontents, fbsize); 1830469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy} 1840469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 18534c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy/** Common fixup routing for glTexImage2D & glTexSubImage2D. */ 18616d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Claytonvoid fixup_glTexImage(GLTraceContext *context, int widthIndex, int heightIndex, GLMessage *glmsg, 18716d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton void *dataSrc) { 18834c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLMessage_DataType arg_width = glmsg->args(widthIndex); 18934c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLMessage_DataType arg_height = glmsg->args(heightIndex); 19034c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy 1910469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLMessage_DataType arg_format = glmsg->args(6); 1920469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLMessage_DataType arg_type = glmsg->args(7); 1930469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLMessage_DataType *arg_data = glmsg->mutable_args(8); 1940469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 1950469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLsizei width = arg_width.intvalue(0); 1960469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLsizei height = arg_height.intvalue(0); 1970469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLenum format = arg_format.intvalue(0); 1980469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLenum type = arg_type.intvalue(0); 1999801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy void *data = (void *) dataSrc; 2000469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 2010469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy int bytesPerTexel = getBytesPerTexel(format, type); 2020469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 2030469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_data->set_type(GLMessage::DataType::BYTE); 2040469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_data->clear_rawbytes(); 2050469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 20616d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton if (data != NULL && !isUsingPixelBuffers(context)) { 20734c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy arg_data->set_isarray(true); 2080469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_data->add_rawbytes(data, bytesPerTexel * width * height); 2090469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy } else { 21034c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy arg_data->set_isarray(false); 2110469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_data->set_type(GLMessage::DataType::VOID); 2120469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy } 2130469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy} 2140469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 21534c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy 21616d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Claytonvoid fixup_glTexImage2D(GLTraceContext *context, GLMessage *glmsg, void *pointersToFixup[]) { 21734c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy /* void glTexImage2D(GLenum target, 21834c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLint level, 21934c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLint internalformat, 22034c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLsizei width, 22134c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLsizei height, 22234c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLint border, 22334c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLenum format, 22434c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLenum type, 22550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy const GLvoid *data); 22634c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy */ 22734c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy int widthIndex = 3; 22834c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy int heightIndex = 4; 22916d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton fixup_glTexImage(context, widthIndex, heightIndex, glmsg, pointersToFixup[0]); 23034c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy} 23134c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy 23216d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Claytonvoid fixup_glTexSubImage2D(GLTraceContext *context, GLMessage *glmsg, void *pointersToFixup[]) { 23334c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy /* 23434c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy void glTexSubImage2D(GLenum target, 23534c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLint level, 23634c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLint xoffset, 23734c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLint yoffset, 23834c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLsizei width, 23934c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLsizei height, 24034c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLenum format, 24134c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLenum type, 24234c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy const GLvoid * data); 24334c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy */ 24434c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy int widthIndex = 4; 24534c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy int heightIndex = 5; 24616d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton fixup_glTexImage(context, widthIndex, heightIndex, glmsg, pointersToFixup[0]); 24734c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy} 24834c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy 24916d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Claytonvoid fixup_glCompressedTexImage2D(GLTraceContext *context, GLMessage *glmsg, 25016d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton void *pointersToFixup[]) { 2513d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton /* void glCompressedTexImage2D(GLenum target, 2523d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLint level, 2533d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLenum internalformat, 2543d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLsizei width, 2553d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLsizei height, 2563d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLint border, 2573d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLsizei imageSize, 2583d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton const GLvoid* data); 2593d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton */ 2603d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLsizei size = glmsg->args(6).intvalue(0); 2613d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton void *data = pointersToFixup[0]; 2623d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton 2633d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLMessage_DataType *arg_data = glmsg->mutable_args(7); 2643d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton arg_data->set_type(GLMessage::DataType::BYTE); 2653d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton arg_data->clear_rawbytes(); 2663d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton 26716d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton if (data != NULL && !isUsingPixelBuffers(context)) { 2683d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton arg_data->set_isarray(true); 2693d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton arg_data->add_rawbytes(data, size); 2703d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton } else { 2713d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton arg_data->set_isarray(false); 2723d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton arg_data->set_type(GLMessage::DataType::VOID); 2733d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton } 2743d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton} 2753d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton 27616d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Claytonvoid fixup_glCompressedTexSubImage2D(GLTraceContext *context, GLMessage *glmsg, 27716d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton void *pointersToFixup[]) { 2783d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton /* void glCompressedTexSubImage2D(GLenum target, 2793d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLint level, 2803d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLint xoffset, 2813d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLint yoffset, 2823d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLsizei width, 2833d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLsizei height, 2843d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLenum format, 2853d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLsizei imageSize, 2863d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton const GLvoid* data); 2873d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton */ 2883d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLsizei size = glmsg->args(7).intvalue(0); 2893d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton void *data = pointersToFixup[0]; 2903d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton 2913d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton GLMessage_DataType *arg_data = glmsg->mutable_args(8); 2923d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton arg_data->set_type(GLMessage::DataType::BYTE); 2933d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton arg_data->clear_rawbytes(); 2943d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton 29516d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton if (data != NULL && !isUsingPixelBuffers(context)) { 2963d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton arg_data->set_isarray(true); 2973d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton arg_data->add_rawbytes(data, size); 2983d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton } else { 2993d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton arg_data->set_isarray(false); 3003d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton arg_data->set_type(GLMessage::DataType::VOID); 3013d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton } 3023d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton} 3033d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton 3049801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamyvoid fixup_glShaderSource(GLMessage *glmsg, void *pointersToFixup[]) { 30550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy /* void glShaderSource(GLuint shader, GLsizei count, const GLchar** string, 3060469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy const GLint* length) */ 3070469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLMessage_DataType arg_count = glmsg->args(1); 3080469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLMessage_DataType arg_lenp = glmsg->args(3); 3090469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLMessage_DataType *arg_strpp = glmsg->mutable_args(2); 3100469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 3110469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLsizei count = arg_count.intvalue(0); 3129801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy GLchar **stringpp = (GLchar **) pointersToFixup[0]; 3139801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy GLint *lengthp = (GLint *) pointersToFixup[1]; 3140469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 3150469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_strpp->set_type(GLMessage::DataType::CHAR); 3160469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_strpp->set_isarray(true); 3170469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_strpp->clear_charvalue(); 3180469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 3190469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy ::std::string src = ""; 3200469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy for (int i = 0; i < count; i++) { 3210469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy if (lengthp != NULL) 322090503a01c457feb6e64facfc7eb50c1f5612c6bSiva Velusamy src.append(*stringpp++, *lengthp++); 3230469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy else 324090503a01c457feb6e64facfc7eb50c1f5612c6bSiva Velusamy src.append(*stringpp++); // assume null terminated 3250469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy } 3260469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 3270469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_strpp->add_charvalue(src); 3280469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy} 3290469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 3307b3f48d2efc83094de70c24520bafacda3749a20Ben Claytonvoid fixup_glUniformGenericInteger(int argIndex, int nElemsPerVector, GLMessage *glmsg, 3319801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy void *pointersToFixup[]) { 33288e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy /* void glUniform?iv(GLint location, GLsizei count, const GLint *value); */ 3337b3f48d2efc83094de70c24520bafacda3749a20Ben Clayton GLMessage_DataType arg_count = glmsg->args(1); 3347b3f48d2efc83094de70c24520bafacda3749a20Ben Clayton int n_vectors = arg_count.intvalue(0); 3357b3f48d2efc83094de70c24520bafacda3749a20Ben Clayton fixup_GenericIntArray(argIndex, nElemsPerVector * n_vectors, glmsg, pointersToFixup[0]); 33688e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy} 33788e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy 3387b3f48d2efc83094de70c24520bafacda3749a20Ben Claytonvoid fixup_glUniformGeneric(int argIndex, int nElemsPerVector, GLMessage *glmsg, void *src) { 3397b3f48d2efc83094de70c24520bafacda3749a20Ben Clayton GLMessage_DataType arg_count = glmsg->args(1); 3407b3f48d2efc83094de70c24520bafacda3749a20Ben Clayton int n_vectors = arg_count.intvalue(0); 3417b3f48d2efc83094de70c24520bafacda3749a20Ben Clayton fixup_GenericFloatArray(argIndex, nElemsPerVector * n_vectors, glmsg, src); 3420469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy} 3430469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 3449801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamyvoid fixup_glUniformMatrixGeneric(int matrixSize, GLMessage *glmsg, void *pointersToFixup[]) { 34550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy /* void glUniformMatrix?fv(GLint location, GLsizei count, GLboolean transpose, 3460469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy const GLfloat* value) */ 3470469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLMessage_DataType arg_count = glmsg->args(1); 3480469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy int n_matrices = arg_count.intvalue(0); 3499801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glUniformGeneric(3, matrixSize * matrixSize * n_matrices, glmsg, pointersToFixup[0]); 3500469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy} 3510469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 3529801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamyvoid fixup_glGenGeneric(GLMessage *glmsg, void *pointersToFixup[]) { 3530469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* void glGen*(GLsizei n, GLuint * buffers); */ 3540469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLMessage_DataType arg_n = glmsg->args(0); 3550469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLsizei n = arg_n.intvalue(0); 3560469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 3579801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_GenericIntArray(1, n, glmsg, pointersToFixup[0]); 3580469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy} 3590469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 3609801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamyvoid fixup_glDeleteGeneric(GLMessage *glmsg, void *pointersToFixup[]) { 36134c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy /* void glDelete*(GLsizei n, GLuint *buffers); */ 36234c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLMessage_DataType arg_n = glmsg->args(0); 36334c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy GLsizei n = arg_n.intvalue(0); 36434c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy 3659801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_GenericIntArray(1, n, glmsg, pointersToFixup[0]); 36634c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy} 36734c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy 3689801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamyvoid fixup_glGetBooleanv(GLMessage *glmsg, void *pointersToFixup[]) { 3690469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* void glGetBooleanv(GLenum pname, GLboolean *params); */ 3700469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLMessage_DataType *arg_params = glmsg->mutable_args(1); 3719801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy GLboolean *src = (GLboolean*) pointersToFixup[0]; 3720469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 3730469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_params->set_type(GLMessage::DataType::BOOL); 3740469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_params->set_isarray(true); 3750469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_params->clear_boolvalue(); 3760469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_params->add_boolvalue(*src); 3770469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy} 3780469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 3799801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamyvoid fixup_glGetFloatv(GLMessage *glmsg, void *pointersToFixup[]) { 3800469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* void glGetFloatv(GLenum pname, GLfloat *params); */ 3810469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy GLMessage_DataType *arg_params = glmsg->mutable_args(1); 3829801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy GLfloat *src = (GLfloat*) pointersToFixup[0]; 3830469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 3840469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_params->set_type(GLMessage::DataType::FLOAT); 3850469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_params->set_isarray(true); 3860469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_params->clear_floatvalue(); 3870469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy arg_params->add_floatvalue(*src); 3880469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy} 3890469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 39088e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamyvoid fixup_glLinkProgram(GLMessage *glmsg) { 39188e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy /* void glLinkProgram(GLuint program); */ 39288e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLuint program = glmsg->args(0).intvalue(0); 39388e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy 39488e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy /* We don't have to fixup this call, but as soon as a program is linked, 39588e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy we obtain information about all active attributes and uniforms to 39688e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy pass on to the debugger. Note that in order to pass this info to 39788e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy the debugger, all we need to do is call the trace versions of the 39888e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy necessary calls. */ 39988e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy 40088e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLint n, maxNameLength; 40188e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLchar *name; 40288e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLint size; 40388e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLenum type; 40488e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy 40588e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy // obtain info regarding active attributes 40688e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLTrace_glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &n); 40788e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLTrace_glGetProgramiv(program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxNameLength); 40888e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy 40988e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy name = (GLchar *) malloc(maxNameLength); 41088e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy for (int i = 0; i < n; i++) { 41188e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLTrace_glGetActiveAttrib(program, i, maxNameLength, NULL, &size, &type, name); 41288e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy } 41388e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy free(name); 41488e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy 41588e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy // obtain info regarding active uniforms 41688e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLTrace_glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &n); 41788e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLTrace_glGetProgramiv(program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxNameLength); 41888e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy 41988e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy name = (GLchar *) malloc(maxNameLength); 42088e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy for (int i = 0; i < n; i++) { 42188e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLTrace_glGetActiveUniform(program, i, maxNameLength, NULL, &size, &type, name); 42288e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy } 42388e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy free(name); 42488e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy} 42588e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy 42688e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy/** Given a glGetActive[Uniform|Attrib] call, obtain the location 4279801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy * of the variable of given name in the call. 42888e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy */ 429300ad09822db1013d9f28c4bca3680f865533ab6Andrew HsiehGLint getShaderVariableLocation(GLTraceContext *context, GLMessage *glmsg, GLchar *name) { 43088e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLMessage_Function func = glmsg->function(); 43188e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy if (func != GLMessage::glGetActiveAttrib && func != GLMessage::glGetActiveUniform) { 43288e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy return -1; 43388e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy } 43488e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy 43588e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy int program = glmsg->args(0).intvalue(0); 43688e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy 43788e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy if (func == GLMessage::glGetActiveAttrib) { 43888e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy return context->hooks->gl.glGetAttribLocation(program, name); 43988e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy } else { 44088e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy return context->hooks->gl.glGetUniformLocation(program, name); 44188e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy } 44288e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy} 44388e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy 44450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamyvoid fixup_glGetActiveAttribOrUniform(GLTraceContext *context, GLMessage *glmsg, 4459801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy void *pointersToFixup[]) { 44688e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy /* void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, 44788e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLsizei* length, GLint* size, GLenum* type, GLchar* name); */ 44888e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy /* void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, 44988e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLsizei* length, GLint* size, GLenum* type, GLchar* name) */ 45088e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy 4519801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_GenericIntArray(3, 1, glmsg, pointersToFixup[0]); // length 4529801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_GenericIntArray(4, 1, glmsg, pointersToFixup[1]); // size 4539801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_GenericEnumArray(5, 1, glmsg, pointersToFixup[2]); // type 4549801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_CStringPtr(6, glmsg, pointersToFixup[3]); // name 45588e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy 45688e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy // The index argument in the glGetActive[Attrib|Uniform] functions 45788e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy // does not correspond to the actual location index as used in 45888e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy // glUniform*() or glVertexAttrib*() to actually upload the data. 45988e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy // In order to make things simpler for the debugger, we also pass 46088e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy // a hidden location argument that stores the actual location. 46188e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy // append the location value to the end of the argument list 462300ad09822db1013d9f28c4bca3680f865533ab6Andrew Hsieh GLint location = getShaderVariableLocation(context, glmsg, (GLchar*)pointersToFixup[3]); 46388e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy GLMessage_DataType *arg_location = glmsg->add_args(); 46488e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy arg_location->set_isarray(false); 46588e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy arg_location->set_type(GLMessage::DataType::INT); 46688e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy arg_location->add_intvalue(location); 46788e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy} 46888e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy 46950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy/** Copy @len bytes of data from @src into the @dataIndex'th argument of the message. */ 47050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamyvoid addGlBufferData(GLMessage *glmsg, int dataIndex, GLvoid *src, GLsizeiptr len) { 47150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLMessage_DataType *arg_datap = glmsg->mutable_args(dataIndex); 47250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_datap->set_type(GLMessage::DataType::VOID); 47350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_datap->set_isarray(true); 47450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_datap->clear_intvalue(); 47550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_datap->add_rawbytes(src, len); 47650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy} 47750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 47850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamyvoid fixup_glBufferData(GLTraceContext *context, GLMessage *glmsg, void *pointersToFixup[]) { 47950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy /* void glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage) */ 48050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLsizeiptr size = glmsg->args(1).intvalue(0); 48150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLvoid *datap = (GLvoid *) pointersToFixup[0]; 48250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 48350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // Save element array buffers for future use to fixup glVertexAttribPointers 48450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // when a glDrawElements() call is performed. 48550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLenum target = glmsg->args(0).intvalue(0); 48650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy if (target == GL_ELEMENT_ARRAY_BUFFER) { 48750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLint bufferId = glGetInteger(context, GL_ELEMENT_ARRAY_BUFFER_BINDING); 48850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy context->bindBuffer(bufferId, datap, size); 48950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 49050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 49150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // add buffer data to the protobuf message 49250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy if (datap != NULL) { 49350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy addGlBufferData(glmsg, 2, datap, size); 49450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 49550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy} 49650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 49750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamyvoid fixup_glBufferSubData(GLTraceContext *context, GLMessage *glmsg, void *pointersToFixup[]) { 49850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy /* void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data) */ 49950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLenum target = glmsg->args(0).intvalue(0); 50050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLintptr offset = glmsg->args(1).intvalue(0); 50150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLsizeiptr size = glmsg->args(2).intvalue(0); 50250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLvoid *datap = (GLvoid *) pointersToFixup[0]; 50350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy if (target == GL_ELEMENT_ARRAY_BUFFER) { 50450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLint bufferId = glGetInteger(context, GL_ELEMENT_ARRAY_BUFFER_BINDING); 50550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy context->updateBufferSubData(bufferId, offset, datap, size); 50650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 50750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 50850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // add buffer data to the protobuf message 50950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy addGlBufferData(glmsg, 3, datap, size); 51050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy} 51150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 51250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy/** Obtain the size of each vertex attribute. */ 51350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamyint vertexAttribSize(GLenum type, GLsizei numComponents) { 51450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy int sizePerComponent; 51550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 51650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy switch(type) { 51750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy case GL_BYTE: 51850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy case GL_UNSIGNED_BYTE: 51950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy sizePerComponent = 1; 52050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy break; 52150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy case GL_SHORT: 52250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy case GL_UNSIGNED_SHORT: 52350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy sizePerComponent = 2; 52450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy break; 52550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy case GL_FIXED: 52650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy case GL_FLOAT: 52750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy default: 52850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy sizePerComponent = 4; 52950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy break; 53050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 53150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 53250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy return sizePerComponent * numComponents; 53350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy} 53450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 53550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy/** Create and send a glVertexAttribPointerData trace message to the host. */ 53650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamyvoid trace_glVertexAttribPointerData(GLTraceContext *context, 53750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLuint indx, GLint size, GLenum type, 53850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLboolean normalized, GLsizei stride, const GLvoid* ptr, 53950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLuint minIndex, GLuint maxIndex, nsecs_t startTime) { 54050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy /* void glVertexAttribPointerData(GLuint indx, GLint size, GLenum type, 54150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLboolean normalized, GLsizei stride, const GLvoid* ptr, 54250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy int minIndex, int maxIndex) */ 54350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLMessage glmsg; 54450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLTraceContext *glContext = context; 54550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 54650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy glmsg.set_function(GLMessage::glVertexAttribPointerData); 54750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 54850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // copy argument indx 54950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLMessage_DataType *arg_indx = glmsg.add_args(); 55050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_indx->set_isarray(false); 55150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_indx->set_type(GLMessage::DataType::INT); 55250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_indx->add_intvalue(indx); 55350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 55450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // copy argument size 55550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLMessage_DataType *arg_size = glmsg.add_args(); 55650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_size->set_isarray(false); 55750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_size->set_type(GLMessage::DataType::INT); 55850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_size->add_intvalue(size); 55950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 56050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // copy argument type 56150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLMessage_DataType *arg_type = glmsg.add_args(); 56250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_type->set_isarray(false); 56350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_type->set_type(GLMessage::DataType::ENUM); 56450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_type->add_intvalue((int)type); 56550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 56650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // copy argument normalized 56750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLMessage_DataType *arg_normalized = glmsg.add_args(); 56850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_normalized->set_isarray(false); 56950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_normalized->set_type(GLMessage::DataType::BOOL); 57050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_normalized->add_boolvalue(normalized); 57150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 57250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // copy argument stride 57350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLMessage_DataType *arg_stride = glmsg.add_args(); 57450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_stride->set_isarray(false); 57550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_stride->set_type(GLMessage::DataType::INT); 57650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_stride->add_intvalue(stride); 57750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 57850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // copy argument ptr 57950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLMessage_DataType *arg_ptr = glmsg.add_args(); 58050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_ptr->set_isarray(true); 58150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_ptr->set_type(GLMessage::DataType::BYTE); 58250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy int perVertexSize = vertexAttribSize(type, size); 58350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLchar *p = (GLchar*) ptr; 58450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy std::string data; 58550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy for (GLuint i = minIndex; i < maxIndex; i++) { 58650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy data.append(p, perVertexSize); 58750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy p += stride == 0 ? perVertexSize : stride; 58850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 58950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_ptr->add_rawbytes(data); 59050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 59150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // copy argument min index 59250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLMessage_DataType *arg_min = glmsg.add_args(); 59350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_min->set_isarray(false); 59450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_min->set_type(GLMessage::DataType::INT); 59550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_min->add_intvalue(minIndex); 59650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 59750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // copy argument max index 59850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLMessage_DataType *arg_max = glmsg.add_args(); 59950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_max->set_isarray(false); 60050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_max->set_type(GLMessage::DataType::INT); 60150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_max->add_intvalue(maxIndex); 60250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 60350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy glmsg.set_context_id(context->getId()); 60450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy glmsg.set_start_time(startTime); 60550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy glmsg.set_threadtime(0); 60650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy glmsg.set_duration(0); 60750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 60850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy context->traceGLMessage(&glmsg); 60950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy} 61050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 61150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamyvoid findMinAndMaxIndices(GLvoid *indices, GLsizei count, GLenum type, 61250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLuint *minIndex, GLuint *maxIndex) { 61350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLuint index; 61450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy *minIndex = UINT_MAX; 61550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy *maxIndex = 0; 61650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 61750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy if (indices == NULL) { 61850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy return; 61950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 62050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 62150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy for (GLsizei i = 0; i < count; i++) { 62250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy if (type == GL_UNSIGNED_BYTE) { 62350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy index = *((GLubyte*) indices + i); 62450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } else { 62550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy index = *((GLushort*) indices + i); 62650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 62750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 62850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy if (index < *minIndex) *minIndex = index; 62950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy if (index > *maxIndex) *maxIndex = index; 63050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 63150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy} 63250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 63350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamyvoid trace_VertexAttribPointerData(GLTraceContext *context, 63450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLuint minIndex, GLuint maxIndex, nsecs_t time) { 63550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLuint maxAttribs = glGetInteger(context, GL_MAX_VERTEX_ATTRIBS); 63650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy for (GLuint index = 0; index < maxAttribs; index++) { 63750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy if (!glGetVertexAttrib(context, index, GL_VERTEX_ATTRIB_ARRAY_ENABLED)) { 63850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // vertex array disabled 63950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy continue; 64050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 64150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 64250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy if (glGetVertexAttrib(context, index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)) { 64350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // vbo 64450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy continue; 64550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 64650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 64750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLint size = glGetVertexAttrib(context, index, GL_VERTEX_ATTRIB_ARRAY_SIZE); 64850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLenum type = glGetVertexAttrib(context, index, GL_VERTEX_ATTRIB_ARRAY_TYPE); 64950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLboolean norm = glGetVertexAttrib(context, index, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED); 65050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLsizei stride = glGetVertexAttrib(context, index, GL_VERTEX_ATTRIB_ARRAY_STRIDE); 65150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLvoid* ptr; 65250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy context->hooks->gl.glGetVertexAttribPointerv(index, GL_VERTEX_ATTRIB_ARRAY_POINTER, &ptr); 65350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 65450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy trace_glVertexAttribPointerData(context, 65550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy index, size, type, norm, stride, ptr, 65650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy minIndex, maxIndex, time); 65750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 65850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy} 65950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 66050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamyvoid trace_VertexAttribPointerDataForGlDrawArrays(GLTraceContext *context, GLMessage *glmsg) { 6613ef9e9671c224af82d2efec1a1e9a275fb9acf44Siva Velusamy if (context->getVersion() == egl_connection_t::GLESv1_INDEX) { 6623ef9e9671c224af82d2efec1a1e9a275fb9acf44Siva Velusamy // only supported for GLES2 and above 6633ef9e9671c224af82d2efec1a1e9a275fb9acf44Siva Velusamy return; 6643ef9e9671c224af82d2efec1a1e9a275fb9acf44Siva Velusamy } 6653ef9e9671c224af82d2efec1a1e9a275fb9acf44Siva Velusamy 66650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy /* void glDrawArrays(GLenum mode, GLint first, GLsizei count) */ 66750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLsizei count = glmsg->args(2).intvalue(0); 66850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 66950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // Vertex attrib pointer data patchup calls should appear as if 67050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // they occurred right before the draw call. 67150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy nsecs_t time = glmsg->start_time() - 1; 67250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 67350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy trace_VertexAttribPointerData(context, 0, count, time); 67450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy} 67550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 67650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamyvoid trace_VertexAttribPointerDataForGlDrawElements(GLTraceContext *context, GLMessage *glmsg, 67750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLvoid *indices) { 6783ef9e9671c224af82d2efec1a1e9a275fb9acf44Siva Velusamy if (context->getVersion() == egl_connection_t::GLESv1_INDEX) { 6793ef9e9671c224af82d2efec1a1e9a275fb9acf44Siva Velusamy // only supported for GLES2 and above 6803ef9e9671c224af82d2efec1a1e9a275fb9acf44Siva Velusamy return; 6813ef9e9671c224af82d2efec1a1e9a275fb9acf44Siva Velusamy } 6823ef9e9671c224af82d2efec1a1e9a275fb9acf44Siva Velusamy 68350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy /* void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) */ 68450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLsizei count = glmsg->args(1).intvalue(0); 68550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLenum type = glmsg->args(2).intvalue(0); 68650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLuint index; 68750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 68850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLuint minIndex, maxIndex; 68950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 69050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // The index buffer is either passed in as an argument to the glDrawElements() call, 69150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // or it is stored in the current GL_ELEMENT_ARRAY_BUFFER. 69250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLvoid *indexBuffer; 69350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy if (isUsingElementArrayBuffers(context)) { 69450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLsizeiptr eaBufferSize; 69550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLuint bufferId = glGetInteger(context, GL_ELEMENT_ARRAY_BUFFER_BINDING); 69650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy context->getBuffer(bufferId, &indexBuffer, &eaBufferSize); 69750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } else { 69850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy indexBuffer = indices; 69950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 70050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 70150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // Rather than sending vertex attribute data that corresponds to the indices 70250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // being drawn, we send the vertex attribute data for the entire range of 70350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // indices being drawn, including the ones not drawn. The min & max indices 70450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // provide the range of indices being drawn. 70550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy findMinAndMaxIndices(indexBuffer, count, type, &minIndex, &maxIndex); 70650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 70750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // Vertex attrib pointer data patchup calls should appear as if 70850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // they occurred right before the draw call. 70950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy nsecs_t time = glmsg->start_time() - 1; 71050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 71150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy trace_VertexAttribPointerData(context, minIndex, maxIndex + 1, time); 71250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy} 71350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 71450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamyvoid fixup_glDrawArrays(GLTraceContext *context, GLMessage *glmsg) { 71550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // Trace all vertex attribute data stored in client space. 71650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy trace_VertexAttribPointerDataForGlDrawArrays(context, glmsg); 71750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 71850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // Attach the FB if requested 71950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy if (context->getGlobalTraceState()->shouldCollectFbOnGlDraw()) { 72050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy fixup_addFBContents(context, glmsg, CURRENTLY_BOUND_FB); 72150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 72250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy} 72350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 72450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamyvoid fixup_glDrawElements(GLTraceContext *context, GLMessage *glmsg, void *pointersToFixup[]) { 72550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy /* void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) */ 72650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLvoid *indices = pointersToFixup[0]; 72750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLenum type = glmsg->args(2).intvalue(0); 72850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLsizei count = glmsg->args(1).intvalue(0); 72950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLuint index; 73050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 73150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // Trace all vertex attribute data stored in client space. 73250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy trace_VertexAttribPointerDataForGlDrawElements(context, glmsg, indices); 73350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 73450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // Fixup indices argument 73550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy if (!isUsingElementArrayBuffers(context)) { 73650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy GLMessage_DataType *arg_indices = glmsg->mutable_args(3); 73750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_indices->set_isarray(true); 73850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_indices->clear_intvalue(); 73950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_indices->set_type(GLMessage::DataType::INT); 74050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy for (GLsizei i = 0; i < count; i++) { 74150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy if (type == GL_UNSIGNED_BYTE) { 74250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy index = *((GLubyte*) indices + i); 74350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } else { 74450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy index = *((GLushort*) indices + i); 74550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 74650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy arg_indices->add_intvalue(index); 74750129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 74850129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 74950129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 75050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy // Attach the FB if requested 75150129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy if (context->getGlobalTraceState()->shouldCollectFbOnGlDraw()) { 75250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy fixup_addFBContents(context, glmsg, CURRENTLY_BOUND_FB); 75350129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy } 75450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy} 75550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy 75605df4504e57657994a89e424b6881ee26d0f313cSiva Velusamyvoid fixupGLMessage(GLTraceContext *context, nsecs_t wallStart, nsecs_t wallEnd, 75705df4504e57657994a89e424b6881ee26d0f313cSiva Velusamy nsecs_t threadStart, nsecs_t threadEnd, 7589801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy GLMessage *glmsg, void *pointersToFixup[]) { 75993a826f78f6313db791e6fc880439189897651b3Siva Velusamy // for all messages, set the current context id 76093a826f78f6313db791e6fc880439189897651b3Siva Velusamy glmsg->set_context_id(context->getId()); 76193a826f78f6313db791e6fc880439189897651b3Siva Velusamy 76256ac6ff9bdc3c117e820c5a361ab45049c8b03f8Siva Velusamy // set start time and duration 76305df4504e57657994a89e424b6881ee26d0f313cSiva Velusamy glmsg->set_start_time(wallStart); 76405df4504e57657994a89e424b6881ee26d0f313cSiva Velusamy glmsg->set_duration((unsigned)(wallEnd - wallStart)); 76505df4504e57657994a89e424b6881ee26d0f313cSiva Velusamy glmsg->set_threadtime((unsigned)(threadEnd - threadStart)); 76656ac6ff9bdc3c117e820c5a361ab45049c8b03f8Siva Velusamy 76793a826f78f6313db791e6fc880439189897651b3Siva Velusamy // do any custom message dependent processing 7680469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy switch (glmsg->function()) { 76934c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy case GLMessage::glDeleteBuffers: /* glDeleteBuffers(GLsizei n, GLuint *buffers); */ 77034c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy case GLMessage::glDeleteFramebuffers: /* glDeleteFramebuffers(GLsizei n, GLuint *buffers); */ 77134c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy case GLMessage::glDeleteRenderbuffers:/* glDeleteRenderbuffers(GLsizei n, GLuint *buffers); */ 77234c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy case GLMessage::glDeleteTextures: /* glDeleteTextures(GLsizei n, GLuint *textures); */ 7739801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glDeleteGeneric(glmsg, pointersToFixup); 77434c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy break; 77534c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy case GLMessage::glGenBuffers: /* void glGenBuffers(GLsizei n, GLuint *buffers); */ 77634c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy case GLMessage::glGenFramebuffers: /* void glGenFramebuffers(GLsizei n, GLuint *buffers); */ 77734c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy case GLMessage::glGenRenderbuffers: /* void glGenFramebuffers(GLsizei n, GLuint *buffers); */ 77834c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy case GLMessage::glGenTextures: /* void glGenTextures(GLsizei n, GLuint *textures); */ 7799801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glGenGeneric(glmsg, pointersToFixup); 7800469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 78188e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy case GLMessage::glLinkProgram: /* void glLinkProgram(GLuint program); */ 78288e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy fixup_glLinkProgram(glmsg); 78388e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy break; 78488e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy case GLMessage::glGetActiveAttrib: 7859801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glGetActiveAttribOrUniform(context, glmsg, pointersToFixup); 78688e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy break; 78788e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy case GLMessage::glGetActiveUniform: 7889801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glGetActiveAttribOrUniform(context, glmsg, pointersToFixup); 78988e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy break; 79088e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy case GLMessage::glBindAttribLocation: 79188e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy /* void glBindAttribLocation(GLuint program, GLuint index, const GLchar* name); */ 7929801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_CStringPtr(2, glmsg, pointersToFixup[0]); 79388e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy break; 79450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy case GLMessage::glGetAttribLocation: 79550129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy case GLMessage::glGetUniformLocation: 7960469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* int glGetAttribLocation(GLuint program, const GLchar* name) */ 7970469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* int glGetUniformLocation(GLuint program, const GLchar* name) */ 7989801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_CStringPtr(1, glmsg, pointersToFixup[0]); 7990469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 8000469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GLMessage::glGetBooleanv: 8019801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glGetBooleanv(glmsg, pointersToFixup); 8020469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 8030469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GLMessage::glGetFloatv: 8049801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glGetFloatv(glmsg, pointersToFixup); 8050469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 8060469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GLMessage::glGetIntegerv: /* void glGetIntegerv(GLenum pname, GLint *params); */ 8079801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_GenericIntArray(1, 1, glmsg, pointersToFixup[0]); 8080469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 8090469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GLMessage::glGetProgramiv: 8100469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GLMessage::glGetRenderbufferParameteriv: 8110469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GLMessage::glGetShaderiv: 8120469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* void glGetProgramiv(GLuint program, GLenum pname, GLint* params) */ 8130469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) */ 8140469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* void glGetShaderiv(GLuint shader, GLenum pname, GLint* params) */ 8159801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_GenericIntArray(2, 1, glmsg, pointersToFixup[0]); 8160469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 8170469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GLMessage::glGetString: 8189801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glGetString(glmsg, pointersToFixup); 8190469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 8200469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GLMessage::glTexImage2D: 8213f194e6e3a62cbb846e8948eac8e4ce9aa7444a6Siva Velusamy if (context->getGlobalTraceState()->shouldCollectTextureDataOnGlTexImage()) { 82216d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton fixup_glTexImage2D(context, glmsg, pointersToFixup); 8233f194e6e3a62cbb846e8948eac8e4ce9aa7444a6Siva Velusamy } 8240469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 82534c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy case GLMessage::glTexSubImage2D: 82634c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy if (context->getGlobalTraceState()->shouldCollectTextureDataOnGlTexImage()) { 82716d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton fixup_glTexSubImage2D(context, glmsg, pointersToFixup); 82834c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy } 82934c726efb54a941a97a6d7252e7c1442d2eded56Siva Velusamy break; 8303d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton case GLMessage::glCompressedTexImage2D: 8313d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton if (context->getGlobalTraceState()->shouldCollectTextureDataOnGlTexImage()) { 83216d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton fixup_glCompressedTexImage2D(context, glmsg, pointersToFixup); 8333d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton } 8343d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton break; 8353d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton case GLMessage::glCompressedTexSubImage2D: 8363d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton if (context->getGlobalTraceState()->shouldCollectTextureDataOnGlTexImage()) { 83716d7b6a8bb6f22ddd9252c6c0aefa84a53b65d53Ben Clayton fixup_glCompressedTexSubImage2D(context, glmsg, pointersToFixup); 8383d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton } 8393d3c125423ab922e705c3f563c689bd7c4a04bacBen Clayton break; 8400469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GLMessage::glShaderSource: 8419801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glShaderSource(glmsg, pointersToFixup); 8420469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 84388e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy case GLMessage::glUniform1iv: 84488e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy /* void glUniform1iv(GLint location, GLsizei count, const GLint *value); */ 8459801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glUniformGenericInteger(2, 1, glmsg, pointersToFixup); 84688e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy break; 84788e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy case GLMessage::glUniform2iv: 84888e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy /* void glUniform2iv(GLint location, GLsizei count, const GLint *value); */ 8499801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glUniformGenericInteger(2, 2, glmsg, pointersToFixup); 85088e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy break; 85188e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy case GLMessage::glUniform3iv: 85288e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy /* void glUniform3iv(GLint location, GLsizei count, const GLint *value); */ 8539801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glUniformGenericInteger(2, 3, glmsg, pointersToFixup); 85488e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy break; 85588e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy case GLMessage::glUniform4iv: 85688e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy /* void glUniform4iv(GLint location, GLsizei count, const GLint *value); */ 8579801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glUniformGenericInteger(2, 4, glmsg, pointersToFixup); 85888e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy break; 85988e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy case GLMessage::glUniform1fv: 86088e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy /* void glUniform1fv(GLint location, GLsizei count, const GLfloat *value); */ 8619801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glUniformGeneric(2, 1, glmsg, pointersToFixup[0]); 86288e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy break; 86388e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy case GLMessage::glUniform2fv: 86488e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy /* void glUniform2fv(GLint location, GLsizei count, const GLfloat *value); */ 8659801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glUniformGeneric(2, 2, glmsg, pointersToFixup[0]); 86688e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy break; 86788e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy case GLMessage::glUniform3fv: 86888e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy /* void glUniform3fv(GLint location, GLsizei count, const GLfloat *value); */ 8699801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glUniformGeneric(2, 3, glmsg, pointersToFixup[0]); 87088e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy break; 87188e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy case GLMessage::glUniform4fv: 87288e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy /* void glUniform4fv(GLint location, GLsizei count, const GLfloat *value); */ 8739801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glUniformGeneric(2, 4, glmsg, pointersToFixup[0]); 87488e8e5a3f16f0003bd2b43142241b8e1a9a46abeSiva Velusamy break; 8750469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GLMessage::glUniformMatrix2fv: 8760469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, 8770469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy const GLfloat* value) */ 8789801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glUniformMatrixGeneric(2, glmsg, pointersToFixup); 8790469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 8800469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GLMessage::glUniformMatrix3fv: 8810469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, 8820469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy const GLfloat* value) */ 8839801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glUniformMatrixGeneric(3, glmsg, pointersToFixup); 8840469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 8850469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GLMessage::glUniformMatrix4fv: 8860469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, 8870469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy const GLfloat* value) */ 8889801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_glUniformMatrixGeneric(4, glmsg, pointersToFixup); 8890469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 8909291da97cbb5f8d3ae5eb9e8d5415ef85916d982Siva Velusamy case GLMessage::glBufferData: 8919291da97cbb5f8d3ae5eb9e8d5415ef85916d982Siva Velusamy /* void glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage) */ 89250129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy fixup_glBufferData(context, glmsg, pointersToFixup); 8939291da97cbb5f8d3ae5eb9e8d5415ef85916d982Siva Velusamy break; 8949291da97cbb5f8d3ae5eb9e8d5415ef85916d982Siva Velusamy case GLMessage::glBufferSubData: 8959291da97cbb5f8d3ae5eb9e8d5415ef85916d982Siva Velusamy /* void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data) */ 89650129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy fixup_glBufferSubData(context, glmsg, pointersToFixup); 8979291da97cbb5f8d3ae5eb9e8d5415ef85916d982Siva Velusamy break; 8980469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy case GLMessage::glDrawArrays: 8990469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* void glDrawArrays(GLenum mode, GLint first, GLsizei count) */ 90050129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy fixup_glDrawArrays(context, glmsg); 9013f194e6e3a62cbb846e8948eac8e4ce9aa7444a6Siva Velusamy break; 9023f194e6e3a62cbb846e8948eac8e4ce9aa7444a6Siva Velusamy case GLMessage::glDrawElements: 9030469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy /* void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) */ 90450129e4ae2777dfbe0738f0f69b17f4d8f9400e2Siva Velusamy fixup_glDrawElements(context, glmsg, pointersToFixup); 9050469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 906a7167f364737c12e621d836f470cf328c6e111cdSiva Velusamy case GLMessage::glPushGroupMarkerEXT: 907a7167f364737c12e621d836f470cf328c6e111cdSiva Velusamy /* void PushGroupMarkerEXT(sizei length, const char *marker); */ 9089801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_CStringPtr(1, glmsg, pointersToFixup[0]); 909a7167f364737c12e621d836f470cf328c6e111cdSiva Velusamy break; 910a7167f364737c12e621d836f470cf328c6e111cdSiva Velusamy case GLMessage::glInsertEventMarkerEXT: 911a7167f364737c12e621d836f470cf328c6e111cdSiva Velusamy /* void InsertEventMarkerEXT(sizei length, const char *marker); */ 9129801142afbe3d906259b634ef3bc8bebdafe0083Siva Velusamy fixup_CStringPtr(1, glmsg, pointersToFixup[0]); 913a7167f364737c12e621d836f470cf328c6e111cdSiva Velusamy break; 9140469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy default: 9150469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy break; 9160469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy } 9170469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy} 9180469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy 9190469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy}; 9200469dd6d55fa331bfd7de9431da98b6340d82271Siva Velusamy}; 921