Merge "Fix bug #5753006 Garbled Labels in Maps"
diff --git a/cmds/keystore/keystore.cpp b/cmds/keystore/keystore.cpp
index 4b4b9b9..d8380a5 100644
--- a/cmds/keystore/keystore.cpp
+++ b/cmds/keystore/keystore.cpp
@@ -796,7 +796,7 @@
                 } else {
                     send_code(sock, response);
                 }
-                LOGI("uid: %d action: %c -> %d state: %d -> %d retry: %d",
+                ALOGI("uid: %d action: %c -> %d state: %d -> %d retry: %d",
                      cred.uid,
                      request, response,
                      old_state, keyStore.getState(),
diff --git a/include/utils/ResourceTypes.h b/include/utils/ResourceTypes.h
index e045b2c..46420c1 100644
--- a/include/utils/ResourceTypes.h
+++ b/include/utils/ResourceTypes.h
@@ -1278,7 +1278,7 @@
                     myDelta += requested->screenHeightDp - screenHeightDp;
                     otherDelta += requested->screenHeightDp - o.screenHeightDp;
                 }
-                //LOGI("Comparing this %dx%d to other %dx%d in %dx%d: myDelta=%d otherDelta=%d",
+                //ALOGI("Comparing this %dx%d to other %dx%d in %dx%d: myDelta=%d otherDelta=%d",
                 //    screenWidthDp, screenHeightDp, o.screenWidthDp, o.screenHeightDp,
                 //    requested->screenWidthDp, requested->screenHeightDp, myDelta, otherDelta);
                 return (myDelta <= otherDelta);
@@ -1507,11 +1507,11 @@
         }
         if (screenSizeDp != 0) {
             if (screenWidthDp != 0 && screenWidthDp > settings.screenWidthDp) {
-                //LOGI("Filtering out width %d in requested %d", screenWidthDp, settings.screenWidthDp);
+                //ALOGI("Filtering out width %d in requested %d", screenWidthDp, settings.screenWidthDp);
                 return false;
             }
             if (screenHeightDp != 0 && screenHeightDp > settings.screenHeightDp) {
-                //LOGI("Filtering out height %d in requested %d", screenHeightDp, settings.screenHeightDp);
+                //ALOGI("Filtering out height %d in requested %d", screenHeightDp, settings.screenHeightDp);
                 return false;
             }
         }
@@ -1531,9 +1531,9 @@
                 // For compatibility, we count a request for KEYSHIDDEN_NO as also
                 // matching the more recent KEYSHIDDEN_SOFT.  Basically
                 // KEYSHIDDEN_NO means there is some kind of keyboard available.
-                //LOGI("Matching keysHidden: have=%d, config=%d\n", keysHidden, setKeysHidden);
+                //ALOGI("Matching keysHidden: have=%d, config=%d\n", keysHidden, setKeysHidden);
                 if (keysHidden != KEYSHIDDEN_NO || setKeysHidden != KEYSHIDDEN_SOFT) {
-                    //LOGI("No match!");
+                    //ALOGI("No match!");
                     return false;
                 }
             }
diff --git a/libs/binder/IMemory.cpp b/libs/binder/IMemory.cpp
index 1ace8f8..2111fe8 100644
--- a/libs/binder/IMemory.cpp
+++ b/libs/binder/IMemory.cpp
@@ -244,7 +244,7 @@
                 sp<IBinder> binder = const_cast<BpMemoryHeap*>(this)->asBinder();
 
                 if (VERBOSE) {
-                    LOGD("UNMAPPING binder=%p, heap=%p, size=%d, fd=%d",
+                    ALOGD("UNMAPPING binder=%p, heap=%p, size=%d, fd=%d",
                             binder.get(), this, mSize, mHeapId);
                     CallStack stack;
                     stack.update();
@@ -393,7 +393,7 @@
 
 void HeapCache::binderDied(const wp<IBinder>& binder)
 {
-    //LOGD("binderDied binder=%p", binder.unsafe_get());
+    //ALOGD("binderDied binder=%p", binder.unsafe_get());
     free_heap(binder);
 }
 
@@ -403,7 +403,7 @@
     ssize_t i = mHeapCache.indexOfKey(binder);
     if (i>=0) {
         heap_info_t& info = mHeapCache.editValueAt(i);
-        LOGD_IF(VERBOSE,
+        ALOGD_IF(VERBOSE,
                 "found binder=%p, heap=%p, size=%d, fd=%d, count=%d",
                 binder.get(), info.heap.get(),
                 static_cast<BpMemoryHeap*>(info.heap.get())->mSize,
@@ -415,7 +415,7 @@
         heap_info_t info;
         info.heap = interface_cast<IMemoryHeap>(binder);
         info.count = 1;
-        //LOGD("adding binder=%p, heap=%p, count=%d",
+        //ALOGD("adding binder=%p, heap=%p, count=%d",
         //      binder.get(), info.heap.get(), info.count);
         mHeapCache.add(binder, info);
         return info.heap;
@@ -436,7 +436,7 @@
             heap_info_t& info(mHeapCache.editValueAt(i));
             int32_t c = android_atomic_dec(&info.count);
             if (c == 1) {
-                LOGD_IF(VERBOSE,
+                ALOGD_IF(VERBOSE,
                         "removing binder=%p, heap=%p, size=%d, fd=%d, count=%d",
                         binder.unsafe_get(), info.heap.get(),
                         static_cast<BpMemoryHeap*>(info.heap.get())->mSize,
@@ -468,7 +468,7 @@
     for (int i=0 ; i<c ; i++) {
         const heap_info_t& info = mHeapCache.valueAt(i);
         BpMemoryHeap const* h(static_cast<BpMemoryHeap const *>(info.heap.get()));
-        LOGD("hey=%p, heap=%p, count=%d, (fd=%d, base=%p, size=%d)",
+        ALOGD("hey=%p, heap=%p, count=%d, (fd=%d, base=%p, size=%d)",
                 mHeapCache.keyAt(i).unsafe_get(),
                 info.heap.get(), info.count,
                 h->mHeapId, h->mBase, h->mSize);
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp
index 641134a..a42c336 100644
--- a/libs/binder/IPCThreadState.cpp
+++ b/libs/binder/IPCThreadState.cpp
@@ -493,7 +493,7 @@
 
 void IPCThreadState::stopProcess(bool immediate)
 {
-    //LOGI("**** STOPPING PROCESS");
+    //ALOGI("**** STOPPING PROCESS");
     flushCommands();
     int fd = mProcess->mDriverFD;
     mProcess->mDriverFD = -1;
@@ -530,9 +530,9 @@
     if ((flags & TF_ONE_WAY) == 0) {
         #if 0
         if (code == 4) { // relayout
-            LOGI(">>>>>> CALLING transaction 4");
+            ALOGI(">>>>>> CALLING transaction 4");
         } else {
-            LOGI(">>>>>> CALLING transaction %d", code);
+            ALOGI(">>>>>> CALLING transaction %d", code);
         }
         #endif
         if (reply) {
@@ -543,9 +543,9 @@
         }
         #if 0
         if (code == 4) { // relayout
-            LOGI("<<<<<< RETURNING transaction 4");
+            ALOGI("<<<<<< RETURNING transaction 4");
         } else {
-            LOGI("<<<<<< RETURNING transaction %d", code);
+            ALOGI("<<<<<< RETURNING transaction %d", code);
         }
         #endif
         
@@ -1009,7 +1009,7 @@
                 }
             }
 
-            //LOGI(">>>> TRANSACT from pid %d uid %d\n", mCallingPid, mCallingUid);
+            //ALOGI(">>>> TRANSACT from pid %d uid %d\n", mCallingPid, mCallingUid);
             
             Parcel reply;
             IF_LOG_TRANSACTIONS() {
@@ -1033,7 +1033,7 @@
                 if (error < NO_ERROR) reply.setError(error);
             }
             
-            //LOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n",
+            //ALOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n",
             //     mCallingPid, origPid, origUid);
             
             if ((tr.flags & TF_ONE_WAY) == 0) {
@@ -1110,7 +1110,7 @@
                                 const size_t* objects, size_t objectsSize,
                                 void* cookie)
 {
-    //LOGI("Freeing parcel %p", &parcel);
+    //ALOGI("Freeing parcel %p", &parcel);
     IF_LOG_COMMANDS() {
         alog << "Writing BC_FREE_BUFFER for " << data << endl;
     }
diff --git a/libs/binder/IServiceManager.cpp b/libs/binder/IServiceManager.cpp
index 1fa4c35..1c1b546 100644
--- a/libs/binder/IServiceManager.cpp
+++ b/libs/binder/IServiceManager.cpp
@@ -78,7 +78,7 @@
             bool res = pc->checkPermission(permission, pid, uid);
             if (res) {
                 if (startTime != 0) {
-                    LOGI("Check passed after %d seconds for %s from uid=%d pid=%d",
+                    ALOGI("Check passed after %d seconds for %s from uid=%d pid=%d",
                             (int)((uptimeMillis()-startTime)/1000),
                             String8(permission).string(), uid, pid);
                 }
@@ -106,7 +106,7 @@
             // Wait for the permission controller to come back...
             if (startTime == 0) {
                 startTime = uptimeMillis();
-                LOGI("Waiting to check permission %s from uid=%d pid=%d",
+                ALOGI("Waiting to check permission %s from uid=%d pid=%d",
                         String8(permission).string(), uid, pid);
             }
             sleep(1);
@@ -136,7 +136,7 @@
         for (n = 0; n < 5; n++){
             sp<IBinder> svc = checkService(name);
             if (svc != NULL) return svc;
-            LOGI("Waiting for service %s...\n", String8(name).string());
+            ALOGI("Waiting for service %s...\n", String8(name).string());
             sleep(1);
         }
         return NULL;
diff --git a/libs/binder/MemoryDealer.cpp b/libs/binder/MemoryDealer.cpp
index fc3e31e..f299924 100644
--- a/libs/binder/MemoryDealer.cpp
+++ b/libs/binder/MemoryDealer.cpp
@@ -415,7 +415,7 @@
 {
     String8 result;
     dump_l(result, what);
-    LOGD("%s", result.string());
+    ALOGD("%s", result.string());
 }
 
 void SimpleBestFitAllocator::dump(String8& result,
diff --git a/libs/binder/MemoryHeapBase.cpp b/libs/binder/MemoryHeapBase.cpp
index bf4a73f..e171374 100644
--- a/libs/binder/MemoryHeapBase.cpp
+++ b/libs/binder/MemoryHeapBase.cpp
@@ -132,7 +132,7 @@
             close(fd);
             return -errno;
         }
-        //LOGD("mmap(fd=%d, base=%p, size=%lu)", fd, base, size);
+        //ALOGD("mmap(fd=%d, base=%p, size=%lu)", fd, base, size);
         mBase = base;
         mNeedUnmap = true;
     } else  {
@@ -155,7 +155,7 @@
     int fd = android_atomic_or(-1, &mFD);
     if (fd >= 0) {
         if (mNeedUnmap) {
-            //LOGD("munmap(fd=%d, base=%p, size=%lu)", fd, mBase, mSize);
+            //ALOGD("munmap(fd=%d, base=%p, size=%lu)", fd, mBase, mSize);
             munmap(mBase, mSize);
         }
         mBase = 0;
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp
index 6cd43aa..e455980 100644
--- a/libs/binder/Parcel.cpp
+++ b/libs/binder/Parcel.cpp
@@ -103,7 +103,7 @@
         }
     }
 
-    LOGD("Invalid object type 0x%08lx", obj.type);
+    ALOGD("Invalid object type 0x%08lx", obj.type);
 }
 
 void release_object(const sp<ProcessState>& proc,
@@ -703,7 +703,7 @@
         err = writeDupFileDescriptor(handle->data[i]);
 
     if (err != NO_ERROR) {
-        LOGD("write native handle, write dup fd failed");
+        ALOGD("write native handle, write dup fd failed");
         return err;
     }
     err = write(handle->data + handle->numFds, sizeof(int)*handle->numInts);
@@ -1096,7 +1096,7 @@
     if (flat) {
         switch (flat->type) {
             case BINDER_TYPE_FD:
-                //LOGI("Returning file descriptor %ld from parcel %p\n", flat->handle, this);
+                //ALOGI("Returning file descriptor %ld from parcel %p\n", flat->handle, this);
                 return flat->handle;
         }        
     }
@@ -1226,14 +1226,14 @@
 {
     size_t i = mObjectsSize;
     if (i > 0) {
-        //LOGI("Closing file descriptors for %d objects...", mObjectsSize);
+        //ALOGI("Closing file descriptors for %d objects...", mObjectsSize);
     }
     while (i > 0) {
         i--;
         const flat_binder_object* flat
             = reinterpret_cast<flat_binder_object*>(mData+mObjects[i]);
         if (flat->type == BINDER_TYPE_FD) {
-            //LOGI("Closing fd: %ld\n", flat->handle);
+            //ALOGI("Closing fd: %ld\n", flat->handle);
             close(flat->handle);
         }
     }
@@ -1266,7 +1266,7 @@
     mError = NO_ERROR;
     mData = const_cast<uint8_t*>(data);
     mDataSize = mDataCapacity = dataSize;
-    //LOGI("setDataReference Setting data size of %p to %lu (pid=%d)\n", this, mDataSize, getpid());
+    //ALOGI("setDataReference Setting data size of %p to %lu (pid=%d)\n", this, mDataSize, getpid());
     mDataPos = 0;
     ALOGV("setDataReference Setting data pos of %p to %d\n", this, mDataPos);
     mObjects = const_cast<size_t*>(objects);
@@ -1340,7 +1340,7 @@
 void Parcel::freeDataNoInit()
 {
     if (mOwner) {
-        //LOGI("Freeing data ref of %p (pid=%d)\n", this, getpid());
+        //ALOGI("Freeing data ref of %p (pid=%d)\n", this, getpid());
         mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
     } else {
         releaseObjects();
@@ -1446,7 +1446,7 @@
         if (objects && mObjects) {
             memcpy(objects, mObjects, objectsSize*sizeof(size_t));
         }
-        //LOGI("Freeing data ref of %p (pid=%d)\n", this, getpid());
+        //ALOGI("Freeing data ref of %p (pid=%d)\n", this, getpid());
         mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
         mOwner = NULL;
 
diff --git a/libs/binder/PermissionCache.cpp b/libs/binder/PermissionCache.cpp
index 7278187..a503be8 100644
--- a/libs/binder/PermissionCache.cpp
+++ b/libs/binder/PermissionCache.cpp
@@ -101,7 +101,7 @@
         nsecs_t t = -systemTime();
         granted = android::checkPermission(permission, pid, uid);
         t += systemTime();
-        LOGD("checking %s for uid=%d => %s (%d us)",
+        ALOGD("checking %s for uid=%d => %s (%d us)",
                 String8(permission).string(), uid,
                 granted?"granted":"denied", (int)ns2us(t));
         pc.cache(permission, uid, granted);
diff --git a/libs/gui/ISurfaceComposer.cpp b/libs/gui/ISurfaceComposer.cpp
index db32827..ca7c8f8 100644
--- a/libs/gui/ISurfaceComposer.cpp
+++ b/libs/gui/ISurfaceComposer.cpp
@@ -40,11 +40,6 @@
 
 // ---------------------------------------------------------------------------
 
-#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
-#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
-
-// ---------------------------------------------------------------------------
-
 namespace android {
 
 class IDisplayEventConnection;
diff --git a/libs/gui/ISurfaceComposerClient.cpp b/libs/gui/ISurfaceComposerClient.cpp
index ace16aa..5ebdbd9 100644
--- a/libs/gui/ISurfaceComposerClient.cpp
+++ b/libs/gui/ISurfaceComposerClient.cpp
@@ -42,9 +42,6 @@
 #define AID_GRAPHICS 1003
 #endif
 
-#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
-#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
-
 // ---------------------------------------------------------------------------
 
 namespace android {
diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp
index 4310bed..104cefb 100644
--- a/libs/gui/SurfaceTexture.cpp
+++ b/libs/gui/SurfaceTexture.cpp
@@ -63,8 +63,8 @@
 
 // Macros for including the SurfaceTexture name in log messages
 #define ST_LOGV(x, ...) ALOGV("[%s] "x, mName.string(), ##__VA_ARGS__)
-#define ST_LOGD(x, ...) LOGD("[%s] "x, mName.string(), ##__VA_ARGS__)
-#define ST_LOGI(x, ...) LOGI("[%s] "x, mName.string(), ##__VA_ARGS__)
+#define ST_LOGD(x, ...) ALOGD("[%s] "x, mName.string(), ##__VA_ARGS__)
+#define ST_LOGI(x, ...) ALOGI("[%s] "x, mName.string(), ##__VA_ARGS__)
 #define ST_LOGW(x, ...) LOGW("[%s] "x, mName.string(), ##__VA_ARGS__)
 #define ST_LOGE(x, ...) LOGE("[%s] "x, mName.string(), ##__VA_ARGS__)
 
diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp
index 691b52d..b6f3c11 100644
--- a/libs/gui/SurfaceTextureClient.cpp
+++ b/libs/gui/SurfaceTextureClient.cpp
@@ -185,13 +185,13 @@
         // a buffer.
         if (mSlots[i] == NULL) {
             if (!dumpedState) {
-                LOGD("getSlotFromBufferLocked: encountered NULL buffer in slot %d "
+                ALOGD("getSlotFromBufferLocked: encountered NULL buffer in slot %d "
                         "looking for buffer %p", i, buffer->handle);
                 for (int j = 0; j < NUM_BUFFER_SLOTS; j++) {
                     if (mSlots[j] == NULL) {
-                        LOGD("getSlotFromBufferLocked:   %02d: NULL", j);
+                        ALOGD("getSlotFromBufferLocked:   %02d: NULL", j);
                     } else {
-                        LOGD("getSlotFromBufferLocked:   %02d: %p", j, mSlots[j]->handle);
+                        ALOGD("getSlotFromBufferLocked:   %02d: %p", j, mSlots[j]->handle);
                     }
                 }
                 dumpedState = true;
diff --git a/libs/ui/GraphicBufferAllocator.cpp b/libs/ui/GraphicBufferAllocator.cpp
index e75415b..b2b70c1 100644
--- a/libs/ui/GraphicBufferAllocator.cpp
+++ b/libs/ui/GraphicBufferAllocator.cpp
@@ -85,7 +85,7 @@
 {
     String8 s;
     GraphicBufferAllocator::getInstance().dump(s);
-    LOGD("%s", s.string());
+    ALOGD("%s", s.string());
 }
 
 status_t GraphicBufferAllocator::alloc(uint32_t w, uint32_t h, PixelFormat format,
diff --git a/libs/ui/Input.cpp b/libs/ui/Input.cpp
index 3de75ba..267a9f7 100644
--- a/libs/ui/Input.cpp
+++ b/libs/ui/Input.cpp
@@ -106,11 +106,11 @@
     path.append("/usr/");
     appendInputDeviceConfigurationFileRelativePath(path, name, type);
 #if DEBUG_PROBE
-    LOGD("Probing for system provided input device configuration file: path='%s'", path.string());
+    ALOGD("Probing for system provided input device configuration file: path='%s'", path.string());
 #endif
     if (!access(path.string(), R_OK)) {
 #if DEBUG_PROBE
-        LOGD("Found");
+        ALOGD("Found");
 #endif
         return path;
     }
@@ -121,18 +121,18 @@
     path.append("/system/devices/");
     appendInputDeviceConfigurationFileRelativePath(path, name, type);
 #if DEBUG_PROBE
-    LOGD("Probing for system user input device configuration file: path='%s'", path.string());
+    ALOGD("Probing for system user input device configuration file: path='%s'", path.string());
 #endif
     if (!access(path.string(), R_OK)) {
 #if DEBUG_PROBE
-        LOGD("Found");
+        ALOGD("Found");
 #endif
         return path;
     }
 
     // Not found.
 #if DEBUG_PROBE
-    LOGD("Probe failed to find input device configuration file: name='%s', type=%d",
+    ALOGD("Probe failed to find input device configuration file: name='%s', type=%d",
             name.string(), type);
 #endif
     return String8();
@@ -782,7 +782,7 @@
     }
 
 #if DEBUG_VELOCITY
-    LOGD("VelocityTracker: addMovement eventTime=%lld, idBits=0x%08x, activePointerId=%d",
+    ALOGD("VelocityTracker: addMovement eventTime=%lld, idBits=0x%08x, activePointerId=%d",
             eventTime, idBits.value, mActivePointerId);
     for (BitSet32 iterBits(idBits); !iterBits.isEmpty(); ) {
         uint32_t id = iterBits.firstMarkedBit();
@@ -790,7 +790,7 @@
         iterBits.clearBit(id);
         Estimator estimator;
         getEstimator(id, DEFAULT_DEGREE, DEFAULT_HORIZON, &estimator);
-        LOGD("  %d: position (%0.3f, %0.3f), "
+        ALOGD("  %d: position (%0.3f, %0.3f), "
                 "estimator (degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f)",
                 id, positions[index].x, positions[index].y,
                 int(estimator.degree),
@@ -903,7 +903,7 @@
 static bool solveLeastSquares(const float* x, const float* y, uint32_t m, uint32_t n,
         float* outB, float* outDet) {
 #if DEBUG_LEAST_SQUARES
-    LOGD("solveLeastSquares: m=%d, n=%d, x=%s, y=%s", int(m), int(n),
+    ALOGD("solveLeastSquares: m=%d, n=%d, x=%s, y=%s", int(m), int(n),
             vectorToString(x, m).string(), vectorToString(y, m).string());
 #endif
 
@@ -916,7 +916,7 @@
         }
     }
 #if DEBUG_LEAST_SQUARES
-    LOGD("  - a=%s", matrixToString(&a[0][0], m, n, false /*rowMajor*/).string());
+    ALOGD("  - a=%s", matrixToString(&a[0][0], m, n, false /*rowMajor*/).string());
 #endif
 
     // Apply the Gram-Schmidt process to A to obtain its QR decomposition.
@@ -937,7 +937,7 @@
         if (norm < 0.000001f) {
             // vectors are linearly dependent or zero so no solution
 #if DEBUG_LEAST_SQUARES
-            LOGD("  - no solution, norm=%f", norm);
+            ALOGD("  - no solution, norm=%f", norm);
 #endif
             return false;
         }
@@ -951,8 +951,8 @@
         }
     }
 #if DEBUG_LEAST_SQUARES
-    LOGD("  - q=%s", matrixToString(&q[0][0], m, n, false /*rowMajor*/).string());
-    LOGD("  - r=%s", matrixToString(&r[0][0], n, n, true /*rowMajor*/).string());
+    ALOGD("  - q=%s", matrixToString(&q[0][0], m, n, false /*rowMajor*/).string());
+    ALOGD("  - r=%s", matrixToString(&r[0][0], n, n, true /*rowMajor*/).string());
 
     // calculate QR, if we factored A correctly then QR should equal A
     float qr[n][m];
@@ -964,7 +964,7 @@
             }
         }
     }
-    LOGD("  - qr=%s", matrixToString(&qr[0][0], m, n, false /*rowMajor*/).string());
+    ALOGD("  - qr=%s", matrixToString(&qr[0][0], m, n, false /*rowMajor*/).string());
 #endif
 
     // Solve R B = Qt Y to find B.  This is easy because R is upper triangular.
@@ -977,7 +977,7 @@
         outB[i] /= r[i][i];
     }
 #if DEBUG_LEAST_SQUARES
-    LOGD("  - b=%s", vectorToString(outB, n).string());
+    ALOGD("  - b=%s", vectorToString(outB, n).string());
 #endif
 
     // Calculate the coefficient of determination as 1 - (SSerr / SStot) where
@@ -1004,9 +1004,9 @@
     }
     *outDet = sstot > 0.000001f ? 1.0f - (sserr / sstot) : 1;
 #if DEBUG_LEAST_SQUARES
-    LOGD("  - sserr=%f", sserr);
-    LOGD("  - sstot=%f", sstot);
-    LOGD("  - det=%f", *outDet);
+    ALOGD("  - sserr=%f", sserr);
+    ALOGD("  - sstot=%f", sstot);
+    ALOGD("  - det=%f", *outDet);
 #endif
     return true;
 }
@@ -1073,7 +1073,7 @@
             outEstimator->degree = degree;
             outEstimator->confidence = xdet * ydet;
 #if DEBUG_LEAST_SQUARES
-            LOGD("estimate: degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f",
+            ALOGD("estimate: degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f",
                     int(outEstimator->degree),
                     vectorToString(outEstimator->xCoeff, n).string(),
                     vectorToString(outEstimator->yCoeff, n).string(),
@@ -1116,7 +1116,7 @@
     if ((deltaX && *deltaX) || (deltaY && *deltaY)) {
         if (eventTime >= mLastMovementTime + STOP_TIME) {
 #if DEBUG_ACCELERATION
-            LOGD("VelocityControl: stopped, last movement was %0.3fms ago",
+            ALOGD("VelocityControl: stopped, last movement was %0.3fms ago",
                     (eventTime - mLastMovementTime) * 0.000001f);
 #endif
             reset();
@@ -1147,7 +1147,7 @@
             }
 
 #if DEBUG_ACCELERATION
-            LOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): "
+            ALOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): "
                     "vx=%0.3f, vy=%0.3f, speed=%0.3f, accel=%0.3f",
                     mParameters.scale, mParameters.lowThreshold, mParameters.highThreshold,
                     mParameters.acceleration,
@@ -1155,7 +1155,7 @@
 #endif
         } else {
 #if DEBUG_ACCELERATION
-            LOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): unknown velocity",
+            ALOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): unknown velocity",
                     mParameters.scale, mParameters.lowThreshold, mParameters.highThreshold,
                     mParameters.acceleration);
 #endif
diff --git a/libs/ui/InputTransport.cpp b/libs/ui/InputTransport.cpp
index 1e602e9..00716d7 100644
--- a/libs/ui/InputTransport.cpp
+++ b/libs/ui/InputTransport.cpp
@@ -55,7 +55,7 @@
         int32_t sendPipeFd) :
         mName(name), mAshmemFd(ashmemFd), mReceivePipeFd(receivePipeFd), mSendPipeFd(sendPipeFd) {
 #if DEBUG_CHANNEL_LIFECYCLE
-    LOGD("Input channel constructed: name='%s', ashmemFd=%d, receivePipeFd=%d, sendPipeFd=%d",
+    ALOGD("Input channel constructed: name='%s', ashmemFd=%d, receivePipeFd=%d, sendPipeFd=%d",
             mName.string(), ashmemFd, receivePipeFd, sendPipeFd);
 #endif
 
@@ -70,7 +70,7 @@
 
 InputChannel::~InputChannel() {
 #if DEBUG_CHANNEL_LIFECYCLE
-    LOGD("Input channel destroyed: name='%s', ashmemFd=%d, receivePipeFd=%d, sendPipeFd=%d",
+    ALOGD("Input channel destroyed: name='%s', ashmemFd=%d, receivePipeFd=%d, sendPipeFd=%d",
             mName.string(), mAshmemFd, mReceivePipeFd, mSendPipeFd);
 #endif
 
@@ -150,13 +150,13 @@
 
     if (nWrite == 1) {
 #if DEBUG_CHANNEL_SIGNALS
-        LOGD("channel '%s' ~ sent signal '%c'", mName.string(), signal);
+        ALOGD("channel '%s' ~ sent signal '%c'", mName.string(), signal);
 #endif
         return OK;
     }
 
 #if DEBUG_CHANNEL_SIGNALS
-    LOGD("channel '%s' ~ error sending signal '%c', errno=%d", mName.string(), signal, errno);
+    ALOGD("channel '%s' ~ error sending signal '%c', errno=%d", mName.string(), signal, errno);
 #endif
     return -errno;
 }
@@ -169,27 +169,27 @@
 
     if (nRead == 1) {
 #if DEBUG_CHANNEL_SIGNALS
-        LOGD("channel '%s' ~ received signal '%c'", mName.string(), *outSignal);
+        ALOGD("channel '%s' ~ received signal '%c'", mName.string(), *outSignal);
 #endif
         return OK;
     }
 
     if (nRead == 0) { // check for EOF
 #if DEBUG_CHANNEL_SIGNALS
-        LOGD("channel '%s' ~ receive signal failed because peer was closed", mName.string());
+        ALOGD("channel '%s' ~ receive signal failed because peer was closed", mName.string());
 #endif
         return DEAD_OBJECT;
     }
 
     if (errno == EAGAIN) {
 #if DEBUG_CHANNEL_SIGNALS
-        LOGD("channel '%s' ~ receive signal failed because no signal available", mName.string());
+        ALOGD("channel '%s' ~ receive signal failed because no signal available", mName.string());
 #endif
         return WOULD_BLOCK;
     }
 
 #if DEBUG_CHANNEL_SIGNALS
-    LOGD("channel '%s' ~ receive signal failed, errno=%d", mName.string(), errno);
+    ALOGD("channel '%s' ~ receive signal failed, errno=%d", mName.string(), errno);
 #endif
     return -errno;
 }
@@ -213,7 +213,7 @@
 
 status_t InputPublisher::initialize() {
 #if DEBUG_TRANSPORT_ACTIONS
-    LOGD("channel '%s' publisher ~ initialize",
+    ALOGD("channel '%s' publisher ~ initialize",
             mChannel->getName().string());
 #endif
 
@@ -242,7 +242,7 @@
 
 status_t InputPublisher::reset() {
 #if DEBUG_TRANSPORT_ACTIONS
-    LOGD("channel '%s' publisher ~ reset",
+    ALOGD("channel '%s' publisher ~ reset",
         mChannel->getName().string());
 #endif
 
@@ -337,7 +337,7 @@
         nsecs_t downTime,
         nsecs_t eventTime) {
 #if DEBUG_TRANSPORT_ACTIONS
-    LOGD("channel '%s' publisher ~ publishKeyEvent: deviceId=%d, source=0x%x, "
+    ALOGD("channel '%s' publisher ~ publishKeyEvent: deviceId=%d, source=0x%x, "
             "action=0x%x, flags=0x%x, keyCode=%d, scanCode=%d, metaState=0x%x, repeatCount=%d,"
             "downTime=%lld, eventTime=%lld",
             mChannel->getName().string(),
@@ -379,7 +379,7 @@
         const PointerProperties* pointerProperties,
         const PointerCoords* pointerCoords) {
 #if DEBUG_TRANSPORT_ACTIONS
-    LOGD("channel '%s' publisher ~ publishMotionEvent: deviceId=%d, source=0x%x, "
+    ALOGD("channel '%s' publisher ~ publishMotionEvent: deviceId=%d, source=0x%x, "
             "action=0x%x, flags=0x%x, edgeFlags=0x%x, metaState=0x%x, buttonState=0x%x, "
             "xOffset=%f, yOffset=%f, "
             "xPrecision=%f, yPrecision=%f, downTime=%lld, eventTime=%lld, "
@@ -439,7 +439,7 @@
         nsecs_t eventTime,
         const PointerCoords* pointerCoords) {
 #if DEBUG_TRANSPORT_ACTIONS
-    LOGD("channel '%s' publisher ~ appendMotionSample: eventTime=%lld",
+    ALOGD("channel '%s' publisher ~ appendMotionSample: eventTime=%lld",
             mChannel->getName().string(), eventTime);
 #endif
 
@@ -457,7 +457,7 @@
 
     if (newBytesUsed > mAshmemSize) {
 #if DEBUG_TRANSPORT_ACTIONS
-        LOGD("channel '%s' publisher ~ Cannot append motion sample because the shared memory "
+        ALOGD("channel '%s' publisher ~ Cannot append motion sample because the shared memory "
                 "buffer is full.  Buffer size: %d bytes, pointers: %d, samples: %d",
                 mChannel->getName().string(),
                 mAshmemSize, mMotionEventPointerCount, mSharedMessage->motion.sampleCount);
@@ -473,7 +473,7 @@
                 // Only possible source of contention is the consumer having consumed (or being in the
                 // process of consuming) the message and left the semaphore count at 0.
 #if DEBUG_TRANSPORT_ACTIONS
-                LOGD("channel '%s' publisher ~ Cannot append motion sample because the message has "
+                ALOGD("channel '%s' publisher ~ Cannot append motion sample because the message has "
                         "already been consumed.", mChannel->getName().string());
 #endif
                 return FAILED_TRANSACTION;
@@ -506,7 +506,7 @@
 
 status_t InputPublisher::sendDispatchSignal() {
 #if DEBUG_TRANSPORT_ACTIONS
-    LOGD("channel '%s' publisher ~ sendDispatchSignal",
+    ALOGD("channel '%s' publisher ~ sendDispatchSignal",
             mChannel->getName().string());
 #endif
 
@@ -516,7 +516,7 @@
 
 status_t InputPublisher::receiveFinishedSignal(bool* outHandled) {
 #if DEBUG_TRANSPORT_ACTIONS
-    LOGD("channel '%s' publisher ~ receiveFinishedSignal",
+    ALOGD("channel '%s' publisher ~ receiveFinishedSignal",
             mChannel->getName().string());
 #endif
 
@@ -552,7 +552,7 @@
 
 status_t InputConsumer::initialize() {
 #if DEBUG_TRANSPORT_ACTIONS
-    LOGD("channel '%s' consumer ~ initialize",
+    ALOGD("channel '%s' consumer ~ initialize",
             mChannel->getName().string());
 #endif
 
@@ -579,7 +579,7 @@
 
 status_t InputConsumer::consume(InputEventFactoryInterface* factory, InputEvent** outEvent) {
 #if DEBUG_TRANSPORT_ACTIONS
-    LOGD("channel '%s' consumer ~ consume",
+    ALOGD("channel '%s' consumer ~ consume",
             mChannel->getName().string());
 #endif
 
@@ -650,7 +650,7 @@
 
 status_t InputConsumer::sendFinishedSignal(bool handled) {
 #if DEBUG_TRANSPORT_ACTIONS
-    LOGD("channel '%s' consumer ~ sendFinishedSignal: handled=%d",
+    ALOGD("channel '%s' consumer ~ sendFinishedSignal: handled=%d",
             mChannel->getName().string(), handled);
 #endif
 
@@ -661,7 +661,7 @@
 
 status_t InputConsumer::receiveDispatchSignal() {
 #if DEBUG_TRANSPORT_ACTIONS
-    LOGD("channel '%s' consumer ~ receiveDispatchSignal",
+    ALOGD("channel '%s' consumer ~ receiveDispatchSignal",
             mChannel->getName().string());
 #endif
 
diff --git a/libs/ui/KeyCharacterMap.cpp b/libs/ui/KeyCharacterMap.cpp
index 77f18de..e1d5e8b 100644
--- a/libs/ui/KeyCharacterMap.cpp
+++ b/libs/ui/KeyCharacterMap.cpp
@@ -109,7 +109,7 @@
             status = parser.parse();
 #if DEBUG_PARSER_PERFORMANCE
             nsecs_t elapsedTime = systemTime(SYSTEM_TIME_MONOTONIC) - startTime;
-            LOGD("Parsed key character map file '%s' %d lines in %0.3fms.",
+            ALOGD("Parsed key character map file '%s' %d lines in %0.3fms.",
                     tokenizer->getFilename().string(), tokenizer->getLineNumber(),
                     elapsedTime / 1000000.0);
 #endif
@@ -135,7 +135,7 @@
         result = key->label;
     }
 #if DEBUG_MAPPING
-    LOGD("getDisplayLabel: keyCode=%d ~ Result %d.", keyCode, result);
+    ALOGD("getDisplayLabel: keyCode=%d ~ Result %d.", keyCode, result);
 #endif
     return result;
 }
@@ -147,7 +147,7 @@
         result = key->number;
     }
 #if DEBUG_MAPPING
-    LOGD("getNumber: keyCode=%d ~ Result %d.", keyCode, result);
+    ALOGD("getNumber: keyCode=%d ~ Result %d.", keyCode, result);
 #endif
     return result;
 }
@@ -160,7 +160,7 @@
         result = behavior->character;
     }
 #if DEBUG_MAPPING
-    LOGD("getCharacter: keyCode=%d, metaState=0x%08x ~ Result %d.", keyCode, metaState, result);
+    ALOGD("getCharacter: keyCode=%d, metaState=0x%08x ~ Result %d.", keyCode, metaState, result);
 #endif
     return result;
 }
@@ -181,7 +181,7 @@
         }
     }
 #if DEBUG_MAPPING
-    LOGD("getFallbackKeyCode: keyCode=%d, metaState=0x%08x ~ Result %s, "
+    ALOGD("getFallbackKeyCode: keyCode=%d, metaState=0x%08x ~ Result %s, "
             "fallback keyCode=%d, fallback metaState=0x%08x.",
             keyCode, metaState, result ? "true" : "false",
             outFallbackAction->keyCode, outFallbackAction->metaState);
@@ -213,7 +213,7 @@
     ExactMatch: ;
     }
 #if DEBUG_MAPPING
-    LOGD("getMatch: keyCode=%d, chars=[%s], metaState=0x%08x ~ Result %d.",
+    ALOGD("getMatch: keyCode=%d, chars=[%s], metaState=0x%08x ~ Result %d.",
             keyCode, toString(chars, numChars).string(), metaState, result);
 #endif
     return result;
@@ -228,7 +228,7 @@
         char16_t ch = chars[i];
         if (!findKey(ch, &keyCode, &metaState)) {
 #if DEBUG_MAPPING
-            LOGD("getEvents: deviceId=%d, chars=[%s] ~ Failed to find mapping for character %d.",
+            ALOGD("getEvents: deviceId=%d, chars=[%s] ~ Failed to find mapping for character %d.",
                     deviceId, toString(chars, numChars).string(), ch);
 #endif
             return false;
@@ -241,10 +241,10 @@
         addMetaKeys(outEvents, deviceId, metaState, false, now, &currentMetaState);
     }
 #if DEBUG_MAPPING
-    LOGD("getEvents: deviceId=%d, chars=[%s] ~ Generated %d events.",
+    ALOGD("getEvents: deviceId=%d, chars=[%s] ~ Generated %d events.",
             deviceId, toString(chars, numChars).string(), int32_t(outEvents.size()));
     for (size_t i = 0; i < outEvents.size(); i++) {
-        LOGD("  Key: keyCode=%d, metaState=0x%08x, %s.",
+        ALOGD("  Key: keyCode=%d, metaState=0x%08x, %s.",
                 outEvents[i].getKeyCode(), outEvents[i].getMetaState(),
                 outEvents[i].getAction() == AKEY_EVENT_ACTION_DOWN ? "down" : "up");
     }
@@ -455,7 +455,7 @@
 status_t KeyCharacterMap::Parser::parse() {
     while (!mTokenizer->isEof()) {
 #if DEBUG_PARSER
-        LOGD("Parsing %s: '%s'.", mTokenizer->getLocation().string(),
+        ALOGD("Parsing %s: '%s'.", mTokenizer->getLocation().string(),
                 mTokenizer->peekRemainderOfLine().string());
 #endif
 
@@ -541,7 +541,7 @@
     }
 
 #if DEBUG_PARSER
-    LOGD("Parsed type: type=%d.", type);
+    ALOGD("Parsed type: type=%d.", type);
 #endif
     mMap->mType = type;
     return NO_ERROR;
@@ -570,7 +570,7 @@
     }
 
 #if DEBUG_PARSER
-    LOGD("Parsed beginning of key: keyCode=%d.", keyCode);
+    ALOGD("Parsed beginning of key: keyCode=%d.", keyCode);
 #endif
     mKeyCode = keyCode;
     mMap->mKeys.add(keyCode, new Key());
@@ -694,7 +694,7 @@
             }
             key->label = behavior.character;
 #if DEBUG_PARSER
-            LOGD("Parsed key label: keyCode=%d, label=%d.", mKeyCode, key->label);
+            ALOGD("Parsed key label: keyCode=%d, label=%d.", mKeyCode, key->label);
 #endif
             break;
         case PROPERTY_NUMBER:
@@ -705,7 +705,7 @@
             }
             key->number = behavior.character;
 #if DEBUG_PARSER
-            LOGD("Parsed key number: keyCode=%d, number=%d.", mKeyCode, key->number);
+            ALOGD("Parsed key number: keyCode=%d, number=%d.", mKeyCode, key->number);
 #endif
             break;
         case PROPERTY_META: {
@@ -721,7 +721,7 @@
             newBehavior->next = key->firstBehavior;
             key->firstBehavior = newBehavior;
 #if DEBUG_PARSER
-            LOGD("Parsed key meta: keyCode=%d, meta=0x%x, char=%d, fallback=%d.", mKeyCode,
+            ALOGD("Parsed key meta: keyCode=%d, meta=0x%x, char=%d, fallback=%d.", mKeyCode,
                     newBehavior->metaState, newBehavior->character, newBehavior->fallbackKeyCode);
 #endif
             break;
diff --git a/libs/ui/KeyLayoutMap.cpp b/libs/ui/KeyLayoutMap.cpp
index 8626a03..7ba654a 100644
--- a/libs/ui/KeyLayoutMap.cpp
+++ b/libs/ui/KeyLayoutMap.cpp
@@ -67,7 +67,7 @@
             status = parser.parse();
 #if DEBUG_PARSER_PERFORMANCE
             nsecs_t elapsedTime = systemTime(SYSTEM_TIME_MONOTONIC) - startTime;
-            LOGD("Parsed key layout map file '%s' %d lines in %0.3fms.",
+            ALOGD("Parsed key layout map file '%s' %d lines in %0.3fms.",
                     tokenizer->getFilename().string(), tokenizer->getLineNumber(),
                     elapsedTime / 1000000.0);
 #endif
@@ -86,7 +86,7 @@
     ssize_t index = mKeys.indexOfKey(scanCode);
     if (index < 0) {
 #if DEBUG_MAPPING
-        LOGD("mapKey: scanCode=%d ~ Failed.", scanCode);
+        ALOGD("mapKey: scanCode=%d ~ Failed.", scanCode);
 #endif
         *keyCode = AKEYCODE_UNKNOWN;
         *flags = 0;
@@ -98,7 +98,7 @@
     *flags = k.flags;
 
 #if DEBUG_MAPPING
-    LOGD("mapKey: scanCode=%d ~ Result keyCode=%d, flags=0x%08x.", scanCode, *keyCode, *flags);
+    ALOGD("mapKey: scanCode=%d ~ Result keyCode=%d, flags=0x%08x.", scanCode, *keyCode, *flags);
 #endif
     return NO_ERROR;
 }
@@ -117,7 +117,7 @@
     ssize_t index = mAxes.indexOfKey(scanCode);
     if (index < 0) {
 #if DEBUG_MAPPING
-        LOGD("mapAxis: scanCode=%d ~ Failed.", scanCode);
+        ALOGD("mapAxis: scanCode=%d ~ Failed.", scanCode);
 #endif
         return NAME_NOT_FOUND;
     }
@@ -125,7 +125,7 @@
     *outAxisInfo = mAxes.valueAt(index);
 
 #if DEBUG_MAPPING
-    LOGD("mapAxis: scanCode=%d ~ Result mode=%d, axis=%d, highAxis=%d, "
+    ALOGD("mapAxis: scanCode=%d ~ Result mode=%d, axis=%d, highAxis=%d, "
             "splitValue=%d, flatOverride=%d.",
             scanCode,
             outAxisInfo->mode, outAxisInfo->axis, outAxisInfo->highAxis,
@@ -147,7 +147,7 @@
 status_t KeyLayoutMap::Parser::parse() {
     while (!mTokenizer->isEof()) {
 #if DEBUG_PARSER
-        LOGD("Parsing %s: '%s'.", mTokenizer->getLocation().string(),
+        ALOGD("Parsing %s: '%s'.", mTokenizer->getLocation().string(),
                 mTokenizer->peekRemainderOfLine().string());
 #endif
 
@@ -228,7 +228,7 @@
     }
 
 #if DEBUG_PARSER
-    LOGD("Parsed key: scanCode=%d, keyCode=%d, flags=0x%08x.", scanCode, keyCode, flags);
+    ALOGD("Parsed key: scanCode=%d, keyCode=%d, flags=0x%08x.", scanCode, keyCode, flags);
 #endif
     Key key;
     key.keyCode = keyCode;
@@ -328,7 +328,7 @@
     }
 
 #if DEBUG_PARSER
-    LOGD("Parsed axis: scanCode=%d, mode=%d, axis=%d, highAxis=%d, "
+    ALOGD("Parsed axis: scanCode=%d, mode=%d, axis=%d, highAxis=%d, "
             "splitValue=%d, flatOverride=%d.",
             scanCode,
             axisInfo.mode, axisInfo.axis, axisInfo.highAxis,
diff --git a/libs/ui/Region.cpp b/libs/ui/Region.cpp
index 5656088..d9ad863 100644
--- a/libs/ui/Region.cpp
+++ b/libs/ui/Region.cpp
@@ -272,7 +272,7 @@
     }
     
     virtual void operator()(const Rect& rect) {
-        //LOGD(">>> %3d, %3d, %3d, %3d", 
+        //ALOGD(">>> %3d, %3d, %3d, %3d",
         //        rect.left, rect.top, rect.right, rect.bottom);
         if (span.size()) {
             if (cur->top != rect.top) {
@@ -457,14 +457,14 @@
     }
     
     if(!same) {
-        LOGD("---\nregion boolean %s failed", name);
+        ALOGD("---\nregion boolean %s failed", name);
         lhs.dump("lhs");
         rhs.dump("rhs");
         dst.dump("dst");
-        LOGD("should be");
+        ALOGD("should be");
         SkRegion::Iterator it(sk_dst);
         while (!it.done()) {
-            LOGD("    [%3d, %3d, %3d, %3d]",
+            ALOGD("    [%3d, %3d, %3d, %3d]",
                 it.rect().fLeft,
                 it.rect().fTop,
                 it.rect().fRight,
@@ -647,9 +647,9 @@
     (void)flags;
     const_iterator head = begin();
     const_iterator const tail = end();
-    LOGD("  Region %s (this=%p, count=%d)\n", what, this, tail-head);
+    ALOGD("  Region %s (this=%p, count=%d)\n", what, this, tail-head);
     while (head != tail) {
-        LOGD("    [%3d, %3d, %3d, %3d]\n",
+        ALOGD("    [%3d, %3d, %3d, %3d]\n",
                 head->left, head->top, head->right, head->bottom);
         head++;
     }
diff --git a/libs/ui/VirtualKeyMap.cpp b/libs/ui/VirtualKeyMap.cpp
index e756cdd..90c092d 100644
--- a/libs/ui/VirtualKeyMap.cpp
+++ b/libs/ui/VirtualKeyMap.cpp
@@ -65,7 +65,7 @@
             status = parser.parse();
 #if DEBUG_PARSER_PERFORMANCE
             nsecs_t elapsedTime = systemTime(SYSTEM_TIME_MONOTONIC) - startTime;
-            LOGD("Parsed key character map file '%s' %d lines in %0.3fms.",
+            ALOGD("Parsed key character map file '%s' %d lines in %0.3fms.",
                     tokenizer->getFilename().string(), tokenizer->getLineNumber(),
                     elapsedTime / 1000000.0);
 #endif
@@ -93,7 +93,7 @@
 status_t VirtualKeyMap::Parser::parse() {
     while (!mTokenizer->isEof()) {
 #if DEBUG_PARSER
-        LOGD("Parsing %s: '%s'.", mTokenizer->getLocation().string(),
+        ALOGD("Parsing %s: '%s'.", mTokenizer->getLocation().string(),
                 mTokenizer->peekRemainderOfLine().string());
 #endif
 
@@ -122,7 +122,7 @@
                 }
 
 #if DEBUG_PARSER
-                LOGD("Parsed virtual key: scanCode=%d, centerX=%d, centerY=%d, "
+                ALOGD("Parsed virtual key: scanCode=%d, centerX=%d, centerY=%d, "
                         "width=%d, height=%d",
                         defn.scanCode, defn.centerX, defn.centerY, defn.width, defn.height);
 #endif
diff --git a/libs/ui/tests/region/region.cpp b/libs/ui/tests/region/region.cpp
index ef15de9..6347294 100644
--- a/libs/ui/tests/region/region.cpp
+++ b/libs/ui/tests/region/region.cpp
@@ -58,7 +58,7 @@
     //reg2.dump("reg2");
     //reg3.dump("reg3");
 
-    LOGD("---");
+    ALOGD("---");
     reg2 = reg0 | reg0.translate(100, 0);
     reg0.dump("reg0");
     reg1.dump("reg1");
diff --git a/libs/utils/Asset.cpp b/libs/utils/Asset.cpp
index 7fd2c87..07693bb 100644
--- a/libs/utils/Asset.cpp
+++ b/libs/utils/Asset.cpp
@@ -89,7 +89,7 @@
   	    gTail->mNext = this;
   	    gTail = this;
   	}
-    //LOGI("Creating Asset %p #%d\n", this, gCount);
+    //ALOGI("Creating Asset %p #%d\n", this, gCount);
 }
 
 Asset::~Asset(void)
@@ -109,7 +109,7 @@
         mPrev->mNext = mNext;
     }
     mNext = mPrev = NULL;
-    //LOGI("Destroying Asset in %p #%d\n", this, gCount);
+    //ALOGI("Destroying Asset in %p #%d\n", this, gCount);
 }
 
 /*
@@ -210,7 +210,7 @@
     offset = ftell(fp);
     fclose(fp);
     if (!scanResult) {
-        LOGD("File '%s' is not in gzip format\n", fileName);
+        ALOGD("File '%s' is not in gzip format\n", fileName);
         ::close(fd);
         return NULL;
     }
@@ -384,12 +384,12 @@
     fileLength = lseek64(fd, 0, SEEK_END);
     if (fileLength == (off64_t) -1) {
         // probably a bad file descriptor
-        LOGD("failed lseek (errno=%d)\n", errno);
+        ALOGD("failed lseek (errno=%d)\n", errno);
         return UNKNOWN_ERROR;
     }
 
     if ((off64_t) (offset + length) > fileLength) {
-        LOGD("start (%ld) + len (%ld) > end (%ld)\n",
+        ALOGD("start (%ld) + len (%ld) > end (%ld)\n",
             (long) offset, (long) length, (long) fileLength);
         return BAD_INDEX;
     }
diff --git a/libs/utils/AssetManager.cpp b/libs/utils/AssetManager.cpp
index 203e6fa..77db3d4 100644
--- a/libs/utils/AssetManager.cpp
+++ b/libs/utils/AssetManager.cpp
@@ -117,14 +117,14 @@
       mCacheMode(cacheMode), mCacheValid(false)
 {
     int count = android_atomic_inc(&gCount)+1;
-    //LOGI("Creating AssetManager %p #%d\n", this, count);
+    //ALOGI("Creating AssetManager %p #%d\n", this, count);
     memset(mConfig, 0, sizeof(ResTable_config));
 }
 
 AssetManager::~AssetManager(void)
 {
     int count = android_atomic_dec(&gCount);
-    //LOGI("Destroying AssetManager in %p #%d\n", this, count);
+    //ALOGI("Destroying AssetManager in %p #%d\n", this, count);
 
     delete mConfig;
     delete mResources;
@@ -283,7 +283,7 @@
 bool AssetManager::createIdmapFileLocked(const String8& originalPath, const String8& overlayPath,
                                          const String8& idmapPath)
 {
-    LOGD("%s: originalPath=%s overlayPath=%s idmapPath=%s\n",
+    ALOGD("%s: originalPath=%s overlayPath=%s idmapPath=%s\n",
          __FUNCTION__, originalPath.string(), overlayPath.string(), idmapPath.string());
     ResTable tables[2];
     const String8* paths[2] = { &originalPath, &overlayPath };
@@ -923,7 +923,7 @@
              */
             if (found) {
                 if (pAsset == NULL)
-                    LOGD("Expected file not found: '%s'\n", path.string());
+                    ALOGD("Expected file not found: '%s'\n", path.string());
                 return pAsset;
             }
         }
@@ -1333,7 +1333,7 @@
                 //printf("+++ no match on '%s'\n", (const char*) match);
             }
 
-            LOGD("HEY: size=%d removing %d\n", (int)pContents->size(), i);
+            ALOGD("HEY: size=%d removing %d\n", (int)pContents->size(), i);
             pContents->removeAt(i);
             i--;        // adjust "for" loop
             count--;    //  and loop limit
@@ -1652,7 +1652,7 @@
 
 #ifdef DO_TIMINGS
     timer.stop();
-    LOGD("Cache scan took %.3fms\n",
+    ALOGD("Cache scan took %.3fms\n",
         timer.durationUsecs() / 1000.0);
 #endif
 
@@ -1780,11 +1780,11 @@
     : mPath(path), mZipFile(NULL), mModWhen(modWhen),
       mResourceTableAsset(NULL), mResourceTable(NULL)
 {
-    //LOGI("Creating SharedZip %p %s\n", this, (const char*)mPath);
+    //ALOGI("Creating SharedZip %p %s\n", this, (const char*)mPath);
     mZipFile = new ZipFileRO;
     ALOGV("+++ opening zip '%s'\n", mPath.string());
     if (mZipFile->open(mPath.string()) != NO_ERROR) {
-        LOGD("failed to open Zip archive '%s'\n", mPath.string());
+        ALOGD("failed to open Zip archive '%s'\n", mPath.string());
         delete mZipFile;
         mZipFile = NULL;
     }
@@ -1858,7 +1858,7 @@
 
 AssetManager::SharedZip::~SharedZip()
 {
-    //LOGI("Destroying SharedZip %p %s\n", this, (const char*)mPath);
+    //ALOGI("Destroying SharedZip %p %s\n", this, (const char*)mPath);
     if (mResourceTable != NULL) {
         delete mResourceTable;
     }
diff --git a/libs/utils/BackupData.cpp b/libs/utils/BackupData.cpp
index 8791263..f956306 100644
--- a/libs/utils/BackupData.cpp
+++ b/libs/utils/BackupData.cpp
@@ -78,7 +78,7 @@
     paddingSize = padding_extra(n);
     if (paddingSize > 0) {
         uint32_t padding = 0xbcbcbcbc;
-        if (DEBUG) LOGI("writing %d padding bytes for %d", paddingSize, n);
+        if (DEBUG) ALOGI("writing %d padding bytes for %d", paddingSize, n);
         amt = write(m_fd, &padding, paddingSize);
         if (amt != paddingSize) {
             m_status = errno;
@@ -112,8 +112,8 @@
         k = key;
     }
     if (DEBUG) {
-        LOGD("Writing header: prefix='%s' key='%s' dataSize=%d", m_keyPrefix.string(), key.string(),
-                dataSize);
+        ALOGD("Writing header: prefix='%s' key='%s' dataSize=%d", m_keyPrefix.string(),
+                key.string(), dataSize);
     }
 
     entity_header_v1 header;
@@ -125,7 +125,7 @@
     header.keyLen = tolel(keyLen);
     header.dataSize = tolel(dataSize);
 
-    if (DEBUG) LOGI("writing entity header, %d bytes", sizeof(entity_header_v1));
+    if (DEBUG) ALOGI("writing entity header, %d bytes", sizeof(entity_header_v1));
     amt = write(m_fd, &header, sizeof(entity_header_v1));
     if (amt != sizeof(entity_header_v1)) {
         m_status = errno;
@@ -133,7 +133,7 @@
     }
     m_pos += amt;
 
-    if (DEBUG) LOGI("writing entity header key, %d bytes", keyLen+1);
+    if (DEBUG) ALOGI("writing entity header key, %d bytes", keyLen+1);
     amt = write(m_fd, k.string(), keyLen+1);
     if (amt != keyLen+1) {
         m_status = errno;
@@ -151,11 +151,11 @@
 status_t
 BackupDataWriter::WriteEntityData(const void* data, size_t size)
 {
-    if (DEBUG) LOGD("Writing data: size=%lu", (unsigned long) size);
+    if (DEBUG) ALOGD("Writing data: size=%lu", (unsigned long) size);
 
     if (m_status != NO_ERROR) {
         if (DEBUG) {
-            LOGD("Not writing data - stream in error state %d (%s)", m_status, strerror(m_status));
+            ALOGD("Not writing data - stream in error state %d (%s)", m_status, strerror(m_status));
         }
         return m_status;
     }
@@ -166,7 +166,7 @@
     ssize_t amt = write(m_fd, data, size);
     if (amt != (ssize_t)size) {
         m_status = errno;
-        if (DEBUG) LOGD("write returned error %d (%s)", m_status, strerror(m_status));
+        if (DEBUG) ALOGD("write returned error %d (%s)", m_status, strerror(m_status));
         return m_status;
     }
     m_pos += amt;
@@ -208,7 +208,7 @@
                 m_done = true; \
             } else { \
                 m_status = errno; \
-                LOGD("CHECK_SIZE(a=%ld e=%ld) failed at line %d m_status='%s'", \
+                ALOGD("CHECK_SIZE(a=%ld e=%ld) failed at line %d m_status='%s'", \
                     long(actual), long(expected), __LINE__, strerror(m_status)); \
             } \
             return m_status; \
@@ -218,7 +218,7 @@
     do { \
         status_t err = skip_padding(); \
         if (err != NO_ERROR) { \
-            LOGD("SKIP_PADDING FAILED at line %d", __LINE__); \
+            ALOGD("SKIP_PADDING FAILED at line %d", __LINE__); \
             m_status = err; \
             return err; \
         } \
@@ -261,7 +261,7 @@
         {
             m_header.entity.keyLen = fromlel(m_header.entity.keyLen);
             if (m_header.entity.keyLen <= 0) {
-                LOGD("Entity header at %d has keyLen<=0: 0x%08x\n", (int)m_pos,
+                ALOGD("Entity header at %d has keyLen<=0: 0x%08x\n", (int)m_pos,
                         (int)m_header.entity.keyLen);
                 m_status = EINVAL;
             }
@@ -285,7 +285,7 @@
             break;
         }
         default:
-            LOGD("Chunk header at %d has invalid type: 0x%08x",
+            ALOGD("Chunk header at %d has invalid type: 0x%08x",
                     (int)(m_pos - sizeof(m_header)), (int)m_header.type);
             m_status = EINVAL;
     }
@@ -339,7 +339,7 @@
         return -1;
     }
     int remaining = m_dataEndPos - m_pos;
-    //LOGD("ReadEntityData size=%d m_pos=0x%x m_dataEndPos=0x%x remaining=%d\n",
+    //ALOGD("ReadEntityData size=%d m_pos=0x%x m_dataEndPos=0x%x remaining=%d\n",
     //        size, m_pos, m_dataEndPos, remaining);
     if (remaining <= 0) {
         return 0;
@@ -347,7 +347,7 @@
     if (((int)size) > remaining) {
         size = remaining;
     }
-    //LOGD("   reading %d bytes", size);
+    //ALOGD("   reading %d bytes", size);
     int amt = read(m_fd, data, size);
     if (amt < 0) {
         m_status = errno;
diff --git a/libs/utils/BackupHelpers.cpp b/libs/utils/BackupHelpers.cpp
index 7ef30f9..882bf71 100644
--- a/libs/utils/BackupHelpers.cpp
+++ b/libs/utils/BackupHelpers.cpp
@@ -74,7 +74,7 @@
 #if TEST_BACKUP_HELPERS
 #define LOGP(f, x...) printf(f "\n", x)
 #else
-#define LOGP(x...) LOGD(x)
+#define LOGP(x...) ALOGD(x)
 #endif
 #endif
 
@@ -628,7 +628,7 @@
 
     // [ 329 : 8 ] and [ 337 : 8 ] devmajor/devminor, not used
 
-    LOGI("   Name: %s", fullname.string());
+    ALOGI("   Name: %s", fullname.string());
 
     // If we're using a pax extended header, build & write that here; lengths are
     // already preflighted
diff --git a/libs/utils/CallStack.cpp b/libs/utils/CallStack.cpp
index c2a5e55..18fd84f 100644
--- a/libs/utils/CallStack.cpp
+++ b/libs/utils/CallStack.cpp
@@ -104,7 +104,7 @@
         char line[MAX_BACKTRACE_LINE_LENGTH];
         format_backtrace_line(i, &mStack[i], &symbols[i],
                 line, MAX_BACKTRACE_LINE_LENGTH);
-        LOGD("%s%s", prefix, line);
+        ALOGD("%s%s", prefix, line);
     }
     free_backtrace_symbols(symbols, mCount);
 }
diff --git a/libs/utils/FileMap.cpp b/libs/utils/FileMap.cpp
index 294f7b6..b2a61f1 100644
--- a/libs/utils/FileMap.cpp
+++ b/libs/utils/FileMap.cpp
@@ -64,12 +64,12 @@
     }
 #ifdef HAVE_POSIX_FILEMAP    
     if (mBasePtr && munmap(mBasePtr, mBaseLength) != 0) {
-        LOGD("munmap(%p, %d) failed\n", mBasePtr, (int) mBaseLength);
+        ALOGD("munmap(%p, %d) failed\n", mBasePtr, (int) mBaseLength);
     }
 #endif
 #ifdef HAVE_WIN32_FILEMAP
     if (mBasePtr && UnmapViewOfFile(mBasePtr) == 0) {
-        LOGD("UnmapViewOfFile(%p) failed, error = %ld\n", mBasePtr, 
+        ALOGD("UnmapViewOfFile(%p) failed, error = %ld\n", mBasePtr,
               GetLastError() );
     }
     if (mFileMapping != INVALID_HANDLE_VALUE) {
diff --git a/libs/utils/Looper.cpp b/libs/utils/Looper.cpp
index b54fb9d..1bc92cf 100644
--- a/libs/utils/Looper.cpp
+++ b/libs/utils/Looper.cpp
@@ -185,7 +185,7 @@
                 int events = response.events;
                 void* data = response.request.data;
 #if DEBUG_POLL_AND_WAKE
-                LOGD("%p ~ pollOnce - returning signalled identifier %d: "
+                ALOGD("%p ~ pollOnce - returning signalled identifier %d: "
                         "fd=%d, events=0x%x, data=%p",
                         this, ident, fd, events, data);
 #endif
@@ -198,7 +198,7 @@
 
         if (result != 0) {
 #if DEBUG_POLL_AND_WAKE
-            LOGD("%p ~ pollOnce - returning result %d", this, result);
+            ALOGD("%p ~ pollOnce - returning result %d", this, result);
 #endif
             if (outFd != NULL) *outFd = 0;
             if (outEvents != NULL) *outEvents = NULL;
@@ -212,7 +212,7 @@
 
 int Looper::pollInner(int timeoutMillis) {
 #if DEBUG_POLL_AND_WAKE
-    LOGD("%p ~ pollOnce - waiting: timeoutMillis=%d", this, timeoutMillis);
+    ALOGD("%p ~ pollOnce - waiting: timeoutMillis=%d", this, timeoutMillis);
 #endif
 
     // Adjust the timeout based on when the next message is due.
@@ -224,7 +224,7 @@
             timeoutMillis = messageTimeoutMillis;
         }
 #if DEBUG_POLL_AND_WAKE
-        LOGD("%p ~ pollOnce - next message in %lldns, adjusted timeout: timeoutMillis=%d",
+        ALOGD("%p ~ pollOnce - next message in %lldns, adjusted timeout: timeoutMillis=%d",
                 this, mNextMessageUptime - now, timeoutMillis);
 #endif
     }
@@ -270,7 +270,7 @@
     // Check for poll timeout.
     if (eventCount == 0) {
 #if DEBUG_POLL_AND_WAKE
-        LOGD("%p ~ pollOnce - timeout", this);
+        ALOGD("%p ~ pollOnce - timeout", this);
 #endif
         result = ALOOPER_POLL_TIMEOUT;
         goto Done;
@@ -278,7 +278,7 @@
 
     // Handle all events.
 #if DEBUG_POLL_AND_WAKE
-    LOGD("%p ~ pollOnce - handling events from %d fds", this, eventCount);
+    ALOGD("%p ~ pollOnce - handling events from %d fds", this, eventCount);
 #endif
 
 #ifdef LOOPER_USES_EPOLL
@@ -353,7 +353,7 @@
                 - milliseconds_to_nanoseconds(timeoutMillis);
     }
     if (mSampledPolls == SAMPLED_POLLS_TO_AGGREGATE) {
-        LOGD("%p ~ poll latency statistics: %0.3fms zero timeout, %0.3fms non-zero timeout", this,
+        ALOGD("%p ~ poll latency statistics: %0.3fms zero timeout, %0.3fms non-zero timeout", this,
                 0.000001f * float(mSampledZeroPollLatencySum) / mSampledZeroPollCount,
                 0.000001f * float(mSampledTimeoutPollLatencySum) / mSampledTimeoutPollCount);
         mSampledPolls = 0;
@@ -382,7 +382,7 @@
                 mLock.unlock();
 
 #if DEBUG_POLL_AND_WAKE || DEBUG_CALLBACKS
-                LOGD("%p ~ pollOnce - sending message: handler=%p, what=%d",
+                ALOGD("%p ~ pollOnce - sending message: handler=%p, what=%d",
                         this, handler.get(), message.what);
 #endif
                 handler->handleMessage(message);
@@ -410,7 +410,7 @@
             int events = response.events;
             void* data = response.request.data;
 #if DEBUG_POLL_AND_WAKE || DEBUG_CALLBACKS
-            LOGD("%p ~ pollOnce - invoking fd event callback %p: fd=%d, events=0x%x, data=%p",
+            ALOGD("%p ~ pollOnce - invoking fd event callback %p: fd=%d, events=0x%x, data=%p",
                     this, callback, fd, events, data);
 #endif
             int callbackResult = callback(fd, events, data);
@@ -451,7 +451,7 @@
 
 void Looper::wake() {
 #if DEBUG_POLL_AND_WAKE
-    LOGD("%p ~ wake", this);
+    ALOGD("%p ~ wake", this);
 #endif
 
 #ifdef LOOPER_STATISTICS
@@ -475,12 +475,12 @@
 
 void Looper::awoken() {
 #if DEBUG_POLL_AND_WAKE
-    LOGD("%p ~ awoken", this);
+    ALOGD("%p ~ awoken", this);
 #endif
 
 #ifdef LOOPER_STATISTICS
     if (mPendingWakeCount == 0) {
-        LOGD("%p ~ awoken: spurious!", this);
+        ALOGD("%p ~ awoken: spurious!", this);
     } else {
         mSampledWakeCycles += 1;
         mSampledWakeCountSum += mPendingWakeCount;
@@ -488,7 +488,7 @@
         mPendingWakeCount = 0;
         mPendingWakeTime = -1;
         if (mSampledWakeCycles == SAMPLED_WAKE_CYCLES_TO_AGGREGATE) {
-            LOGD("%p ~ wake statistics: %0.3fms wake latency, %0.3f wakes per cycle", this,
+            ALOGD("%p ~ wake statistics: %0.3fms wake latency, %0.3f wakes per cycle", this,
                     0.000001f * float(mSampledWakeLatencySum) / mSampledWakeCycles,
                     float(mSampledWakeCountSum) / mSampledWakeCycles);
             mSampledWakeCycles = 0;
@@ -514,7 +514,7 @@
 
 int Looper::addFd(int fd, int ident, int events, ALooper_callbackFunc callback, void* data) {
 #if DEBUG_CALLBACKS
-    LOGD("%p ~ addFd - fd=%d, ident=%d, events=0x%x, callback=%p, data=%p", this, fd, ident,
+    ALOGD("%p ~ addFd - fd=%d, ident=%d, events=0x%x, callback=%p, data=%p", this, fd, ident,
             events, callback, data);
 #endif
 
@@ -598,7 +598,7 @@
 
 int Looper::removeFd(int fd) {
 #if DEBUG_CALLBACKS
-    LOGD("%p ~ removeFd - fd=%d", this, fd);
+    ALOGD("%p ~ removeFd - fd=%d", this, fd);
 #endif
 
 #ifdef LOOPER_USES_EPOLL
@@ -675,7 +675,7 @@
 void Looper::sendMessageAtTime(nsecs_t uptime, const sp<MessageHandler>& handler,
         const Message& message) {
 #if DEBUG_CALLBACKS
-    LOGD("%p ~ sendMessageAtTime - uptime=%lld, handler=%p, what=%d",
+    ALOGD("%p ~ sendMessageAtTime - uptime=%lld, handler=%p, what=%d",
             this, uptime, handler.get(), message.what);
 #endif
 
@@ -708,7 +708,7 @@
 
 void Looper::removeMessages(const sp<MessageHandler>& handler) {
 #if DEBUG_CALLBACKS
-    LOGD("%p ~ removeMessages - handler=%p", this, handler.get());
+    ALOGD("%p ~ removeMessages - handler=%p", this, handler.get());
 #endif
 
     { // acquire lock
@@ -725,7 +725,7 @@
 
 void Looper::removeMessages(const sp<MessageHandler>& handler, int what) {
 #if DEBUG_CALLBACKS
-    LOGD("%p ~ removeMessages - handler=%p, what=%d", this, handler.get(), what);
+    ALOGD("%p ~ removeMessages - handler=%p, what=%d", this, handler.get(), what);
 #endif
 
     { // acquire lock
diff --git a/libs/utils/ObbFile.cpp b/libs/utils/ObbFile.cpp
index 2907b56..11fe1e9 100644
--- a/libs/utils/ObbFile.cpp
+++ b/libs/utils/ObbFile.cpp
@@ -179,14 +179,14 @@
     actual = TEMP_FAILURE_RETRY(read(fd, scanBuf, footerSize));
     // readAmount is guaranteed to be less than kMaxBufSize
     if (actual != (ssize_t)footerSize) {
-        LOGI("couldn't read ObbFile footer: %s\n", strerror(errno));
+        ALOGI("couldn't read ObbFile footer: %s\n", strerror(errno));
         free(scanBuf);
         return false;
     }
 
 #ifdef DEBUG
     for (int i = 0; i < footerSize; ++i) {
-        LOGI("char: 0x%02x\n", scanBuf[i]);
+        ALOGI("char: 0x%02x\n", scanBuf[i]);
     }
 #endif
 
@@ -217,7 +217,7 @@
     free(scanBuf);
 
 #ifdef DEBUG
-    LOGI("Obb scan succeeded: packageName=%s, version=%d\n", mPackageName.string(), mVersion);
+    ALOGI("Obb scan succeeded: packageName=%s, version=%d\n", mPackageName.string(), mVersion);
 #endif
 
     return true;
diff --git a/libs/utils/PropertyMap.cpp b/libs/utils/PropertyMap.cpp
index d472d45..99603ab 100644
--- a/libs/utils/PropertyMap.cpp
+++ b/libs/utils/PropertyMap.cpp
@@ -135,7 +135,7 @@
             status = parser.parse();
 #if DEBUG_PARSER_PERFORMANCE
             nsecs_t elapsedTime = systemTime(SYSTEM_TIME_MONOTONIC) - startTime;
-            LOGD("Parsed property file '%s' %d lines in %0.3fms.",
+            ALOGD("Parsed property file '%s' %d lines in %0.3fms.",
                     tokenizer->getFilename().string(), tokenizer->getLineNumber(),
                     elapsedTime / 1000000.0);
 #endif
@@ -163,7 +163,7 @@
 status_t PropertyMap::Parser::parse() {
     while (!mTokenizer->isEof()) {
 #if DEBUG_PARSER
-        LOGD("Parsing %s: '%s'.", mTokenizer->getLocation().string(),
+        ALOGD("Parsing %s: '%s'.", mTokenizer->getLocation().string(),
                 mTokenizer->peekRemainderOfLine().string());
 #endif
 
diff --git a/libs/utils/RefBase.cpp b/libs/utils/RefBase.cpp
index 959b382..0b7dd92 100644
--- a/libs/utils/RefBase.cpp
+++ b/libs/utils/RefBase.cpp
@@ -103,7 +103,7 @@
             ref_entry* refs = mStrongRefs;
             while (refs) {
                 char inc = refs->ref >= 0 ? '+' : '-';
-                LOGD("\t%c ID %p (ref %d):", inc, refs->id, refs->ref);
+                ALOGD("\t%c ID %p (ref %d):", inc, refs->id, refs->ref);
 #if DEBUG_REFS_CALLSTACK_ENABLED
                 refs->stack.dump();
 #endif
@@ -121,7 +121,7 @@
             ref_entry* refs = mWeakRefs;
             while (refs) {
                 char inc = refs->ref >= 0 ? '+' : '-';
-                LOGD("\t%c ID %p (ref %d):", inc, refs->id, refs->ref);
+                ALOGD("\t%c ID %p (ref %d):", inc, refs->id, refs->ref);
 #if DEBUG_REFS_CALLSTACK_ENABLED
                 refs->stack.dump();
 #endif
@@ -137,13 +137,13 @@
     }
 
     void addStrongRef(const void* id) {
-        //LOGD_IF(mTrackEnabled,
+        //ALOGD_IF(mTrackEnabled,
         //        "addStrongRef: RefBase=%p, id=%p", mBase, id);
         addRef(&mStrongRefs, id, mStrong);
     }
 
     void removeStrongRef(const void* id) {
-        //LOGD_IF(mTrackEnabled,
+        //ALOGD_IF(mTrackEnabled,
         //        "removeStrongRef: RefBase=%p, id=%p", mBase, id);
         if (!mRetain) {
             removeRef(&mStrongRefs, id);
@@ -153,7 +153,7 @@
     }
 
     void renameStrongRefId(const void* old_id, const void* new_id) {
-        //LOGD_IF(mTrackEnabled,
+        //ALOGD_IF(mTrackEnabled,
         //        "renameStrongRefId: RefBase=%p, oid=%p, nid=%p",
         //        mBase, old_id, new_id);
         renameRefsId(mStrongRefs, old_id, new_id);
@@ -203,7 +203,7 @@
             if (rc >= 0) {
                 write(rc, text.string(), text.length());
                 close(rc);
-                LOGD("STACK TRACE for %p saved in %s", this, name);
+                ALOGD("STACK TRACE for %p saved in %s", this, name);
             }
             else LOGE("FAILED TO PRINT STACK TRACE for %p in %s: %s", this,
                       name, strerror(errno));
@@ -270,7 +270,7 @@
             ref = head;
             while (ref) {
                 char inc = ref->ref >= 0 ? '+' : '-';
-                LOGD("\t%c ID %p (ref %d):", inc, ref->id, ref->ref);
+                ALOGD("\t%c ID %p (ref %d):", inc, ref->id, ref->ref);
                 ref = ref->next;
             }
 
@@ -334,7 +334,7 @@
     const int32_t c = android_atomic_inc(&refs->mStrong);
     LOG_ASSERT(c > 0, "incStrong() called on %p after last strong ref", refs);
 #if PRINT_REFS
-    LOGD("incStrong of %p from %p: cnt=%d\n", this, id, c);
+    ALOGD("incStrong of %p from %p: cnt=%d\n", this, id, c);
 #endif
     if (c != INITIAL_STRONG_VALUE)  {
         return;
@@ -350,7 +350,7 @@
     refs->removeStrongRef(id);
     const int32_t c = android_atomic_dec(&refs->mStrong);
 #if PRINT_REFS
-    LOGD("decStrong of %p from %p: cnt=%d\n", this, id, c);
+    ALOGD("decStrong of %p from %p: cnt=%d\n", this, id, c);
 #endif
     LOG_ASSERT(c >= 1, "decStrong() called on %p too many times", refs);
     if (c == 1) {
@@ -372,7 +372,7 @@
     LOG_ASSERT(c >= 0, "forceIncStrong called on %p after ref count underflow",
                refs);
 #if PRINT_REFS
-    LOGD("forceIncStrong of %p from %p: cnt=%d\n", this, id, c);
+    ALOGD("forceIncStrong of %p from %p: cnt=%d\n", this, id, c);
 #endif
 
     switch (c) {
@@ -487,7 +487,7 @@
     impl->addStrongRef(id);
 
 #if PRINT_REFS
-    LOGD("attemptIncStrong of %p from %p: cnt=%d\n", this, id, curCount);
+    ALOGD("attemptIncStrong of %p from %p: cnt=%d\n", this, id, curCount);
 #endif
 
     if (curCount == INITIAL_STRONG_VALUE) {
diff --git a/libs/utils/ResourceTypes.cpp b/libs/utils/ResourceTypes.cpp
index 6a9e91d..3569e32 100644
--- a/libs/utils/ResourceTypes.cpp
+++ b/libs/utils/ResourceTypes.cpp
@@ -1164,7 +1164,7 @@
     : ResXMLParser(*this)
     , mError(NO_INIT), mOwnedData(NULL)
 {
-    //LOGI("Creating ResXMLTree %p #%d\n", this, android_atomic_inc(&gCount)+1);
+    //ALOGI("Creating ResXMLTree %p #%d\n", this, android_atomic_inc(&gCount)+1);
     restart();
 }
 
@@ -1172,13 +1172,13 @@
     : ResXMLParser(*this)
     , mError(NO_INIT), mOwnedData(NULL)
 {
-    //LOGI("Creating ResXMLTree %p #%d\n", this, android_atomic_inc(&gCount)+1);
+    //ALOGI("Creating ResXMLTree %p #%d\n", this, android_atomic_inc(&gCount)+1);
     setTo(data, size, copyData);
 }
 
 ResXMLTree::~ResXMLTree()
 {
-    //LOGI("Destroying ResXMLTree in %p #%d\n", this, android_atomic_dec(&gCount)-1);
+    //ALOGI("Destroying ResXMLTree in %p #%d\n", this, android_atomic_dec(&gCount)-1);
     uninit();
 }
 
@@ -1631,7 +1631,7 @@
 
     mTable.unlock();
 
-    //LOGI("Applying style 0x%08x (force=%d)  theme %p...\n", resID, force, this);
+    //ALOGI("Applying style 0x%08x (force=%d)  theme %p...\n", resID, force, this);
     //dumpToLog();
     
     return NO_ERROR;
@@ -1639,7 +1639,7 @@
 
 status_t ResTable::Theme::setTo(const Theme& other)
 {
-    //LOGI("Setting theme %p from theme %p...\n", this, &other);
+    //ALOGI("Setting theme %p from theme %p...\n", this, &other);
     //dumpToLog();
     //other.dumpToLog();
     
@@ -1670,7 +1670,7 @@
         }
     }
 
-    //LOGI("Final theme:");
+    //ALOGI("Final theme:");
     //dumpToLog();
     
     return NO_ERROR;
@@ -1752,21 +1752,21 @@
 
 void ResTable::Theme::dumpToLog() const
 {
-    LOGI("Theme %p:\n", this);
+    ALOGI("Theme %p:\n", this);
     for (size_t i=0; i<Res_MAXPACKAGE; i++) {
         package_info* pi = mPackages[i];
         if (pi == NULL) continue;
         
-        LOGI("  Package #0x%02x:\n", (int)(i+1));
+        ALOGI("  Package #0x%02x:\n", (int)(i+1));
         for (size_t j=0; j<pi->numTypes; j++) {
             type_info& ti = pi->types[j];
             if (ti.numEntries == 0) continue;
             
-            LOGI("    Type #0x%02x:\n", (int)(j+1));
+            ALOGI("    Type #0x%02x:\n", (int)(j+1));
             for (size_t k=0; k<ti.numEntries; k++) {
                 theme_entry& te = ti.entries[k];
                 if (te.value.dataType == Res_value::TYPE_NULL) continue;
-                LOGI("      0x%08x: t=0x%x, d=0x%08x (block=%d)\n",
+                ALOGI("      0x%08x: t=0x%x, d=0x%08x (block=%d)\n",
                      (int)Res_MAKEID(i, j, k),
                      te.value.dataType, (int)te.value.data, (int)te.stringBlock);
             }
@@ -1779,7 +1779,7 @@
 {
     memset(&mParams, 0, sizeof(mParams));
     memset(mPackageMap, 0, sizeof(mPackageMap));
-    //LOGI("Creating ResTable %p\n", this);
+    //ALOGI("Creating ResTable %p\n", this);
 }
 
 ResTable::ResTable(const void* data, size_t size, void* cookie, bool copyData)
@@ -1789,12 +1789,12 @@
     memset(mPackageMap, 0, sizeof(mPackageMap));
     add(data, size, cookie, copyData);
     LOG_FATAL_IF(mError != NO_ERROR, "Error parsing resource table");
-    //LOGI("Creating ResTable %p\n", this);
+    //ALOGI("Creating ResTable %p\n", this);
 }
 
 ResTable::~ResTable()
 {
-    //LOGI("Destroying ResTable in %p\n", this);
+    //ALOGI("Destroying ResTable in %p\n", this);
     uninit();
 }
 
@@ -1881,7 +1881,7 @@
 
     header->header = (const ResTable_header*)data;
     header->size = dtohl(header->header->header.size);
-    //LOGI("Got size 0x%x, again size 0x%x, raw size 0x%x\n", header->size,
+    //ALOGI("Got size 0x%x, again size 0x%x, raw size 0x%x\n", header->size,
     //     dtohl(header->header->header.size), header->header->header.size);
     LOAD_TABLE_NOISY(LOGV("Loading ResTable @%p:\n", header->header));
     LOAD_TABLE_NOISY(printHexData(2, header->header, header->size < 256 ? header->size : 256,
@@ -2350,7 +2350,7 @@
                         *outTypeSpecFlags = set->typeSpecFlags;
                     }
                     *outBag = (bag_entry*)(set+1);
-                    //LOGI("Found existing bag for: %p\n", (void*)resID);
+                    //ALOGI("Found existing bag for: %p\n", (void*)resID);
                     return set->numAttrs;
                 }
                 LOGW("Attempt to retrieve bag 0x%08x which is invalid or in a cycle.",
@@ -4273,7 +4273,7 @@
             TABLE_GETENTRY(
                 ResTable_config thisConfig;
                 thisConfig.copyFromDtoH(type->config);
-                LOGI("Adding config to type %d: imsi:%d/%d lang:%c%c cnt:%c%c "
+                ALOGI("Adding config to type %d: imsi:%d/%d lang:%c%c cnt:%c%c "
                      "orien:%d touch:%d density:%d key:%d inp:%d nav:%d w:%d h:%d "
                      "swdp:%d wdp:%d hdp:%d\n",
                       type->id,
@@ -4368,7 +4368,7 @@
             }
 #if 0
             if (overlayResID != 0) {
-                LOGD("%s/%s 0x%08x -> 0x%08x\n",
+                ALOGD("%s/%s 0x%08x -> 0x%08x\n",
                      String8(String16(resName.type)).string(),
                      String8(String16(resName.name)).string(),
                      resID, overlayResID);
diff --git a/libs/utils/Static.cpp b/libs/utils/Static.cpp
index ceca435..bfcb2da 100644
--- a/libs/utils/Static.cpp
+++ b/libs/utils/Static.cpp
@@ -57,8 +57,8 @@
     virtual status_t writeLines(const struct iovec& vec, size_t N)
     {
         //android_writevLog(&vec, N);       <-- this is now a no-op
-        if (N != 1) LOGI("WARNING: writeLines N=%d\n", N);
-        LOGI("%.*s", vec.iov_len, (const char*) vec.iov_base);
+        if (N != 1) ALOGI("WARNING: writeLines N=%d\n", N);
+        ALOGI("%.*s", vec.iov_len, (const char*) vec.iov_base);
         return NO_ERROR;
     }
 };
diff --git a/libs/utils/StopWatch.cpp b/libs/utils/StopWatch.cpp
index b5dda2f..595aec3 100644
--- a/libs/utils/StopWatch.cpp
+++ b/libs/utils/StopWatch.cpp
@@ -39,11 +39,11 @@
 {
     nsecs_t elapsed = elapsedTime();
     const int n = mNumLaps;
-    LOGD("StopWatch %s (us): %lld ", mName, ns2us(elapsed));
+    ALOGD("StopWatch %s (us): %lld ", mName, ns2us(elapsed));
     for (int i=0 ; i<n ; i++) {
         const nsecs_t soFar = mLaps[i].soFar;
         const nsecs_t thisLap = mLaps[i].thisLap;
-        LOGD(" [%d: %lld, %lld]", i, ns2us(soFar), ns2us(thisLap));
+        ALOGD(" [%d: %lld, %lld]", i, ns2us(soFar), ns2us(thisLap));
     }
 }
 
diff --git a/libs/utils/SystemClock.cpp b/libs/utils/SystemClock.cpp
index 062e6d7..89a052f 100644
--- a/libs/utils/SystemClock.cpp
+++ b/libs/utils/SystemClock.cpp
@@ -64,7 +64,7 @@
     tv.tv_sec = (time_t) (millis / 1000LL);
     tv.tv_usec = (suseconds_t) ((millis % 1000LL) * 1000LL);
 
-    LOGD("Setting time of day to sec=%d\n", (int) tv.tv_sec);
+    ALOGD("Setting time of day to sec=%d\n", (int) tv.tv_sec);
 
 #ifdef HAVE_ANDROID_OS
     fd = open("/dev/alarm", O_RDWR);
diff --git a/libs/utils/Tokenizer.cpp b/libs/utils/Tokenizer.cpp
index b3445b7..68752b4 100644
--- a/libs/utils/Tokenizer.cpp
+++ b/libs/utils/Tokenizer.cpp
@@ -118,7 +118,7 @@
 
 String8 Tokenizer::nextToken(const char* delimiters) {
 #if DEBUG_TOKENIZER
-    LOGD("nextToken");
+    ALOGD("nextToken");
 #endif
     const char* end = getEnd();
     const char* tokenStart = mCurrent;
@@ -134,7 +134,7 @@
 
 void Tokenizer::nextLine() {
 #if DEBUG_TOKENIZER
-    LOGD("nextLine");
+    ALOGD("nextLine");
 #endif
     const char* end = getEnd();
     while (mCurrent != end) {
@@ -148,7 +148,7 @@
 
 void Tokenizer::skipDelimiters(const char* delimiters) {
 #if DEBUG_TOKENIZER
-    LOGD("skipDelimiters");
+    ALOGD("skipDelimiters");
 #endif
     const char* end = getEnd();
     while (mCurrent != end) {
diff --git a/libs/utils/ZipFileRO.cpp b/libs/utils/ZipFileRO.cpp
index d880f55..6ca9a28 100644
--- a/libs/utils/ZipFileRO.cpp
+++ b/libs/utils/ZipFileRO.cpp
@@ -210,7 +210,7 @@
 
     ssize_t actual = TEMP_FAILURE_RETRY(read(mFd, scanBuf, sizeof(int32_t)));
     if (actual != (ssize_t) sizeof(int32_t)) {
-        LOGI("couldn't read first signature from zip archive: %s", strerror(errno));
+        ALOGI("couldn't read first signature from zip archive: %s", strerror(errno));
         free(scanBuf);
         return false;
     }
@@ -218,7 +218,7 @@
     {
         unsigned int header = get4LE(scanBuf);
         if (header == kEOCDSignature) {
-            LOGI("Found Zip archive, but it looks empty\n");
+            ALOGI("Found Zip archive, but it looks empty\n");
             free(scanBuf);
             return false;
         } else if (header != kLFHSignature) {
@@ -269,7 +269,7 @@
         }
     }
     if (i < 0) {
-        LOGD("Zip: EOCD not found, %s is not zip\n", mFileName);
+        ALOGD("Zip: EOCD not found, %s is not zip\n", mFileName);
         free(scanBuf);
         return false;
     }
@@ -761,7 +761,7 @@
                 (ZD_TYPE) actual, (ZD_TYPE) uncompLen);
             goto unmap;
         } else {
-            LOGI("+++ successful write\n");
+            ALOGI("+++ successful write\n");
         }
     } else {
         if (!inflateBuffer(fd, ptr, uncompLen, compLen))
diff --git a/libs/utils/ZipUtils.cpp b/libs/utils/ZipUtils.cpp
index 76725b4..cc5c68a 100644
--- a/libs/utils/ZipUtils.cpp
+++ b/libs/utils/ZipUtils.cpp
@@ -100,7 +100,7 @@
 
             int cc = read(fd, readBuf, getSize);
             if (cc != (int) getSize) {
-                LOGD("inflate read failed (%d vs %ld)\n",
+                ALOGD("inflate read failed (%d vs %ld)\n",
                     cc, getSize);
                 goto z_bail;
             }
@@ -114,7 +114,7 @@
         /* uncompress the data */
         zerr = inflate(&zstream, Z_NO_FLUSH);
         if (zerr != Z_OK && zerr != Z_STREAM_END) {
-            LOGD("zlib inflate call failed (zerr=%d)\n", zerr);
+            ALOGD("zlib inflate call failed (zerr=%d)\n", zerr);
             goto z_bail;
         }
 
@@ -212,7 +212,7 @@
 
             int cc = fread(readBuf, 1, getSize, fp);
             if (cc != (int) getSize) {
-                LOGD("inflate read failed (%d vs %ld)\n",
+                ALOGD("inflate read failed (%d vs %ld)\n",
                     cc, getSize);
                 goto z_bail;
             }
@@ -226,7 +226,7 @@
         /* uncompress the data */
         zerr = inflate(&zstream, Z_NO_FLUSH);
         if (zerr != Z_OK && zerr != Z_STREAM_END) {
-            LOGD("zlib inflate call failed (zerr=%d)\n", zerr);
+            ALOGD("zlib inflate call failed (zerr=%d)\n", zerr);
             goto z_bail;
         }
 
diff --git a/libs/utils/tests/BasicHashtable_test.cpp b/libs/utils/tests/BasicHashtable_test.cpp
index 764082d..7dcf750 100644
--- a/libs/utils/tests/BasicHashtable_test.cpp
+++ b/libs/utils/tests/BasicHashtable_test.cpp
@@ -156,7 +156,7 @@
 
 template <typename TKey, typename TValue>
 static void dump(BasicHashtable<TKey, key_value_pair_t<TKey, TValue> >& h) {
-    LOGD("hashtable %p, size=%u, capacity=%u, bucketCount=%u",
+    ALOGD("hashtable %p, size=%u, capacity=%u, bucketCount=%u",
             &h, h.size(), h.capacity(), h.bucketCount());
     for (size_t i = 0; i < h.bucketCount(); i++) {
         bool collision, present;
@@ -165,11 +165,11 @@
         if (present) {
             int key, value;
             getKeyValue(h.entryAt(i), &key, &value);
-            LOGD("  [%3u] = collision=%d, present=%d, hash=0x%08x, key=%3d, value=%3d, "
+            ALOGD("  [%3u] = collision=%d, present=%d, hash=0x%08x, key=%3d, value=%3d, "
                     "hash_type(key)=0x%08x",
                     i, collision, present, hash, key, value, hash_type(key));
         } else {
-            LOGD("  [%3u] = collision=%d, present=%d",
+            ALOGD("  [%3u] = collision=%d, present=%d",
                     i, collision, present);
         }
     }
diff --git a/opengl/libagl/Tokenizer.cpp b/opengl/libagl/Tokenizer.cpp
index 9b3ea1a..eac8d6d 100644
--- a/opengl/libagl/Tokenizer.cpp
+++ b/opengl/libagl/Tokenizer.cpp
@@ -163,9 +163,9 @@
 {
     const run_t* ranges = mRanges.array();
     const size_t c = mRanges.size();
-    LOGD("Tokenizer (%p, size = %u)\n", this, c);
+    ALOGD("Tokenizer (%p, size = %u)\n", this, c);
     for (size_t i=0 ; i<c ; i++) {
-        LOGD("%u: (%u, %u)\n", i, ranges[i].first, ranges[i].length);
+        ALOGD("%u: (%u, %u)\n", i, ranges[i].first, ranges[i].length);
     }
 }
 
diff --git a/opengl/libagl/egl.cpp b/opengl/libagl/egl.cpp
index 6d4098c..9ceb5e9 100644
--- a/opengl/libagl/egl.cpp
+++ b/opengl/libagl/egl.cpp
@@ -263,7 +263,7 @@
             return (left>=right || top>=bottom);
         }
         void dump(char const* what) {
-            LOGD("%s { %5d, %5d, w=%5d, h=%5d }", 
+            ALOGD("%s { %5d, %5d, w=%5d, h=%5d }",
                     what, left, top, right-left, bottom-top);
         }
         
diff --git a/opengl/libagl/matrix.cpp b/opengl/libagl/matrix.cpp
index 9520f04..cdeccb3 100644
--- a/opengl/libagl/matrix.cpp
+++ b/opengl/libagl/matrix.cpp
@@ -217,9 +217,9 @@
 void transform_t::dump(const char* what)
 {
     GLfixed const * const m = matrix.m;
-    LOGD("%s:", what);
+    ALOGD("%s:", what);
     for (int i=0 ; i<4 ; i++)
-        LOGD("[%08x %08x %08x %08x] [%f %f %f %f]\n",
+        ALOGD("[%08x %08x %08x %08x] [%f %f %f %f]\n",
             m[I(0,i)], m[I(1,i)], m[I(2,i)], m[I(3,i)],
             fixedToFloat(m[I(0,i)]),
             fixedToFloat(m[I(1,i)]), 
@@ -273,11 +273,11 @@
 }
 
 void matrixf_t::dump(const char* what) {
-    LOGD("%s", what);
-    LOGD("[ %9f %9f %9f %9f ]", m[I(0,0)], m[I(1,0)], m[I(2,0)], m[I(3,0)]);
-    LOGD("[ %9f %9f %9f %9f ]", m[I(0,1)], m[I(1,1)], m[I(2,1)], m[I(3,1)]);
-    LOGD("[ %9f %9f %9f %9f ]", m[I(0,2)], m[I(1,2)], m[I(2,2)], m[I(3,2)]);
-    LOGD("[ %9f %9f %9f %9f ]", m[I(0,3)], m[I(1,3)], m[I(2,3)], m[I(3,3)]);
+    ALOGD("%s", what);
+    ALOGD("[ %9f %9f %9f %9f ]", m[I(0,0)], m[I(1,0)], m[I(2,0)], m[I(3,0)]);
+    ALOGD("[ %9f %9f %9f %9f ]", m[I(0,1)], m[I(1,1)], m[I(2,1)], m[I(3,1)]);
+    ALOGD("[ %9f %9f %9f %9f ]", m[I(0,2)], m[I(1,2)], m[I(2,2)], m[I(3,2)]);
+    ALOGD("[ %9f %9f %9f %9f ]", m[I(0,3)], m[I(1,3)], m[I(2,3)], m[I(3,3)]);
 }
 
 void matrixf_t::loadIdentity() {
diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp
index 8a8898b..561862b 100644
--- a/opengl/libs/EGL/Loader.cpp
+++ b/opengl/libs/EGL/Loader.cpp
@@ -131,7 +131,7 @@
 
     /* Special case for GLES emulation */
     if (checkGlesEmulationStatus() == 0) {
-        LOGD("Emulator without GPU support detected. Fallback to software renderer.");
+        ALOGD("Emulator without GPU support detected. Fallback to software renderer.");
         gConfig.add( entry_t(0, 0, "android") );
         return;
     }
@@ -140,14 +140,14 @@
     FILE* cfg = fopen("/system/lib/egl/egl.cfg", "r");
     if (cfg == NULL) {
         // default config
-        LOGD("egl.cfg not found, using default config");
+        ALOGD("egl.cfg not found, using default config");
         gConfig.add( entry_t(0, 0, "android") );
     } else {
         while (fgets(line, 256, cfg)) {
             int dpy;
             int impl;
             if (sscanf(line, "%u %u %s", &dpy, &impl, tag) == 3) {
-                //LOGD(">>> %u %u %s", dpy, impl, tag);
+                //ALOGD(">>> %u %u %s", dpy, impl, tag);
                 gConfig.add( entry_t(dpy, impl, tag) );
             }
         }
@@ -238,7 +238,7 @@
                 strncpy(scrap, name, index);
                 scrap[index] = 0;
                 f = (__eglMustCastToProperFunctionPointerType)dlsym(dso, scrap);
-                //LOGD_IF(f, "found <%s> instead", scrap);
+                //ALOGD_IF(f, "found <%s> instead", scrap);
             }
         }
         if (f == NULL) {
@@ -247,11 +247,11 @@
             if (index>0 && strcmp(name+index, "OES")) {
                 snprintf(scrap, SIZE, "%sOES", name);
                 f = (__eglMustCastToProperFunctionPointerType)dlsym(dso, scrap);
-                //LOGD_IF(f, "found <%s> instead", scrap);
+                //ALOGD_IF(f, "found <%s> instead", scrap);
             }
         }
         if (f == NULL) {
-            //LOGD("%s", name);
+            //ALOGD("%s", name);
             f = (__eglMustCastToProperFunctionPointerType)gl_unimplemented;
         }
         *curr++ = f;
@@ -282,7 +282,7 @@
         return 0;
     }
 
-    LOGD("loaded %s", driver_absolute_path);
+    ALOGD("loaded %s", driver_absolute_path);
 
     if (mask & EGL) {
         getProcAddress = (getProcAddressType)dlsym(dso, "eglGetProcAddress");
diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp
index 14745b3..da1b397 100644
--- a/opengl/libs/EGL/egl.cpp
+++ b/opengl/libs/EGL/egl.cpp
@@ -84,6 +84,9 @@
     sEGLTraceLevel = propertyLevel > applicationLevel ? propertyLevel : applicationLevel;
 
     property_get("debug.egl.debug_proc", value, "");
+    if (strlen(value) == 0)
+        return;
+
     long pid = getpid();
     char procPath[128] = {};
     sprintf(procPath, "/proc/%ld/cmdline", pid);
@@ -91,8 +94,11 @@
     if (file) {
         char cmdline[256] = {};
         if (fgets(cmdline, sizeof(cmdline) - 1, file)) {
-            if (!strcmp(value, cmdline))
+            if (!strncmp(value, cmdline, strlen(value))) {
+                // set EGL debug if the "debug.egl.debug_proc" property
+                // matches the prefix of this application's command line
                 gEGLDebugLevel = 1;
+            }
         }
         fclose(file);
     }
@@ -259,7 +265,7 @@
             cnx->hooks[GLESv2_INDEX] = &gHooks[GLESv2_INDEX][IMPL_HARDWARE];
             cnx->dso = loader.open(EGL_DEFAULT_DISPLAY, 1, cnx);
         } else {
-            LOGD("3D hardware acceleration is disabled");
+            ALOGD("3D hardware acceleration is disabled");
         }
     }
 
diff --git a/opengl/libs/EGL/eglApi.cpp b/opengl/libs/EGL/eglApi.cpp
index 1dbba3f..fb61397 100644
--- a/opengl/libs/EGL/eglApi.cpp
+++ b/opengl/libs/EGL/eglApi.cpp
@@ -662,7 +662,7 @@
             egl_tls_t::setContext(ctx);
 #if EGL_TRACE
             if (gEGLDebugLevel > 0)
-                GLTrace_eglMakeCurrent(c->version, c->cnx->hooks[c->version]);
+                GLTrace_eglMakeCurrent(c->version, c->cnx->hooks[c->version], ctx);
 #endif
             _c.acquire();
             _r.acquire();
diff --git a/opengl/libs/EGL/egl_display.cpp b/opengl/libs/EGL/egl_display.cpp
index 31119f9..ad5bdfc 100644
--- a/opengl/libs/EGL/egl_display.cpp
+++ b/opengl/libs/EGL/egl_display.cpp
@@ -184,7 +184,7 @@
 
         EGLDisplay idpy = disp[i].dpy;
         if (cnx->egl.eglInitialize(idpy, &cnx->major, &cnx->minor)) {
-            //LOGD("initialized %d dpy=%p, ver=%d.%d, cnx=%p",
+            //ALOGD("initialized %d dpy=%p, ver=%d.%d, cnx=%p",
             //        i, idpy, cnx->major, cnx->minor, cnx);
 
             // display is now initialized
diff --git a/opengl/libs/EGL/trace.cpp b/opengl/libs/EGL/trace.cpp
index bd6c348..52907c1 100644
--- a/opengl/libs/EGL/trace.cpp
+++ b/opengl/libs/EGL/trace.cpp
@@ -97,30 +97,30 @@
 
 static void TraceGLShaderSource(GLuint shader, GLsizei count,
     const GLchar** string, const GLint* length) {
-    LOGD("const char* shaderSrc[] = {");
+    ALOGD("const char* shaderSrc[] = {");
     for (GLsizei i = 0; i < count; i++) {
         const char* comma = i < count-1 ? "," : "";
         const GLchar* s = string[i];
         if (length) {
             GLint len = length[i];
-            LOGD("    \"%*s\"%s", len, s, comma);
+            ALOGD("    \"%*s\"%s", len, s, comma);
         } else {
-            LOGD("    \"%s\"%s", s, comma);
+            ALOGD("    \"%s\"%s", s, comma);
         }
     }
-    LOGD("};");
+    ALOGD("};");
     if (length) {
-        LOGD("const GLint* shaderLength[] = {");
+        ALOGD("const GLint* shaderLength[] = {");
         for (GLsizei i = 0; i < count; i++) {
             const char* comma = i < count-1 ? "," : "";
             GLint len = length[i];
-            LOGD("    \"%d\"%s", len, comma);
+            ALOGD("    \"%d\"%s", len, comma);
         }
-        LOGD("};");
-        LOGD("glShaderSource(%u, %u, shaderSrc, shaderLength);",
+        ALOGD("};");
+        ALOGD("glShaderSource(%u, %u, shaderSrc, shaderLength);",
             shader, count);
     } else {
-        LOGD("glShaderSource(%u, %u, shaderSrc, (const GLint*) 0);",
+        ALOGD("glShaderSource(%u, %u, shaderSrc, (const GLint*) 0);",
             shader, count);
     }
 }
@@ -131,7 +131,7 @@
     GLsizei count = chunkCount * chunkSize;
     bool isFloat = type == 'f';
     const char* typeString = isFloat ? "GLfloat" : "GLint";
-    LOGD("const %s value[] = {", typeString);
+    ALOGD("const %s value[] = {", typeString);
     for (GLsizei i = 0; i < count; i++) {
         StringBuilder builder;
         builder.append("    ");
@@ -152,25 +152,25 @@
                 value = (void*) (((GLint*) value) + 1);
             }
         }
-        LOGD("%s", builder.getString());
+        ALOGD("%s", builder.getString());
         if (chunkSize > 1 && i < count-1
                 && (i % chunkSize) == (chunkSize-1)) {
-            LOGD("%s", ""); // Print a blank line.
+            ALOGD("%s", ""); // Print a blank line.
         }
     }
-    LOGD("};");
+    ALOGD("};");
 }
 
 static void TraceUniformv(int elementCount, char type,
         GLuint location, GLsizei count, const void* value) {
     TraceValue(elementCount, type, count, 1, value);
-    LOGD("glUniform%d%c(%u, %u, value);", elementCount, type, location, count);
+    ALOGD("glUniform%d%c(%u, %u, value);", elementCount, type, location, count);
 }
 
 static void TraceUniformMatrix(int matrixSideLength,
         GLuint location, GLsizei count, GLboolean transpose, const void* value) {
     TraceValue(matrixSideLength, 'f', count, matrixSideLength, value);
-    LOGD("glUniformMatrix%dfv(%u, %u, %s, value);", matrixSideLength, location, count,
+    ALOGD("glUniformMatrix%dfv(%u, %u, %s, value);", matrixSideLength, location, count,
             GLbooleanToString(transpose));
 }
 
@@ -310,7 +310,7 @@
         }
     }
     builder.append(");");
-    LOGD("%s", builder.getString());
+    ALOGD("%s", builder.getString());
     va_end(argp);
 }
 
diff --git a/opengl/libs/GLES2/gl2.cpp b/opengl/libs/GLES2/gl2.cpp
index fee4609..df22b96 100644
--- a/opengl/libs/GLES2/gl2.cpp
+++ b/opengl/libs/GLES2/gl2.cpp
@@ -83,7 +83,7 @@
         _c->_api(__VA_ARGS__); \
         GLenum status = GL_NO_ERROR; \
         while ((status = glGetError()) != GL_NO_ERROR) { \
-            LOGD("[" #_api "] 0x%x", status); \
+            ALOGD("[" #_api "] 0x%x", status); \
         }
 
 #else
diff --git a/opengl/libs/GLES2_dbg/src/caller.cpp b/opengl/libs/GLES2_dbg/src/caller.cpp
index 6b72751..70d23d6 100644
--- a/opengl/libs/GLES2_dbg/src/caller.cpp
+++ b/opengl/libs/GLES2_dbg/src/caller.cpp
@@ -103,7 +103,7 @@
 const int * GenerateCall(DbgContext * const dbg, const glesv2debugger::Message & cmd,
                   glesv2debugger::Message & msg, const int * const prevRet)
 {
-    LOGD("GenerateCall function=%u", cmd.function());
+    ALOGD("GenerateCall function=%u", cmd.function());
     const int * ret = prevRet; // only some functions have return value
     nsecs_t c0 = systemTime(timeMode);
     switch (cmd.function()) {    case glesv2debugger::Message_Function_glActiveTexture:
diff --git a/opengl/libs/GLES2_dbg/src/dbgcontext.cpp b/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
index 41061e1..e525d02 100644
--- a/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
+++ b/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
@@ -242,7 +242,7 @@
 void DbgContext::glUseProgram(GLuint program)
 {
     while (GLenum error = hooks->gl.glGetError())
-        LOGD("DbgContext::glUseProgram(%u): before glGetError() = 0x%.4X",
+        ALOGD("DbgContext::glUseProgram(%u): before glGetError() = 0x%.4X",
              program, error);
     this->program = program;
     maxAttrib = 0;
@@ -286,7 +286,7 @@
     }
     delete name;
     while (GLenum error = hooks->gl.glGetError())
-        LOGD("DbgContext::glUseProgram(%u): after glGetError() = 0x%.4X",
+        ALOGD("DbgContext::glUseProgram(%u): after glGetError() = 0x%.4X",
              program, error);
 }
 
diff --git a/opengl/libs/GLES2_dbg/src/header.h b/opengl/libs/GLES2_dbg/src/header.h
index 49f3847..0ab4890 100644
--- a/opengl/libs/GLES2_dbg/src/header.h
+++ b/opengl/libs/GLES2_dbg/src/header.h
@@ -48,9 +48,9 @@
 #endif
 
 #undef assert
-#define assert(expr) if (!(expr)) { LOGD("\n*\n*\n* assert: %s at %s \n*\n*", #expr, __location__); int * x = 0; *x = 5; }
-//#undef LOGD
-//#define LOGD(...)
+#define assert(expr) if (!(expr)) { ALOGD("\n*\n*\n* assert: %s at %s \n*\n*", #expr, __location__); int * x = 0; *x = 5; }
+//#undef ALOGD
+//#define ALOGD(...)
 
 namespace android
 {
diff --git a/opengl/libs/GLES2_dbg/src/server.cpp b/opengl/libs/GLES2_dbg/src/server.cpp
index 0c711bf..3e93697 100644
--- a/opengl/libs/GLES2_dbg/src/server.cpp
+++ b/opengl/libs/GLES2_dbg/src/server.cpp
@@ -34,7 +34,7 @@
 
 static void Die(const char * msg)
 {
-    LOGD("\n*\n*\n* GLESv2_dbg: Die: %s \n*\n*", msg);
+    ALOGD("\n*\n*\n* GLESv2_dbg: Die: %s \n*\n*", msg);
     StopDebugServer();
     exit(1);
 }
@@ -44,11 +44,11 @@
 {
     MAX_FILE_SIZE = maxFileSize;
 
-    LOGD("GLESv2_dbg: StartDebugServer");
+    ALOGD("GLESv2_dbg: StartDebugServer");
     if (serverSock >= 0 || file)
         return;
 
-    LOGD("GLESv2_dbg: StartDebugServer create socket");
+    ALOGD("GLESv2_dbg: StartDebugServer create socket");
     struct sockaddr_in server = {}, client = {};
 
     /* Create the TCP socket */
@@ -75,7 +75,7 @@
         Die("Failed to listen on server socket");
     }
 
-    LOGD("server started on %d \n", server.sin_port);
+    ALOGD("server started on %d \n", server.sin_port);
 
 
     /* Wait for client connection */
@@ -85,13 +85,13 @@
         Die("Failed to accept client connection");
     }
 
-    LOGD("Client connected: %s\n", inet_ntoa(client.sin_addr));
+    ALOGD("Client connected: %s\n", inet_ntoa(client.sin_addr));
 //    fcntl(clientSock, F_SETFL, O_NONBLOCK);
 }
 
 void StopDebugServer()
 {
-    LOGD("GLESv2_dbg: StopDebugServer");
+    ALOGD("GLESv2_dbg: StopDebugServer");
     if (clientSock > 0) {
         close(clientSock);
         clientSock = -1;
@@ -115,7 +115,7 @@
     if (received < 0)
         Die("Failed to receive response length");
     else if (4 != received) {
-        LOGD("received %dB: %.8X", received, len);
+        ALOGD("received %dB: %.8X", received, len);
         Die("Received length mismatch, expected 4");
     }
     static void * buffer = NULL;
@@ -150,7 +150,7 @@
 
     bool received = false;
     if (FD_ISSET(clientSock, &readSet)) {
-        LOGD("TryReceive: avaiable for read");
+        ALOGD("TryReceive: avaiable for read");
         Receive(cmd);
         return true;
     }
@@ -190,14 +190,14 @@
     int sent = -1;
     sent = send(clientSock, &len, sizeof(len), 0);
     if (sent != sizeof(len)) {
-        LOGD("actual sent=%d expected=%d clientSock=%d", sent, sizeof(len), clientSock);
+        ALOGD("actual sent=%d expected=%d clientSock=%d", sent, sizeof(len), clientSock);
         Die("Failed to send message length");
     }
     nsecs_t c0 = systemTime(timeMode);
     sent = send(clientSock, str.data(), str.length(), 0);
     float t = (float)ns2ms(systemTime(timeMode) - c0);
     if (sent != str.length()) {
-        LOGD("actual sent=%d expected=%d clientSock=%d", sent, str.length(), clientSock);
+        ALOGD("actual sent=%d expected=%d clientSock=%d", sent, str.length(), clientSock);
         Die("Failed to send message");
     }
     // TODO: factor Receive & TryReceive out and into MessageLoop, or add control argument.
@@ -210,9 +210,9 @@
     if (!msg.expect_response()) {
         if (TryReceive(cmd)) {
             if (glesv2debugger::Message_Function_SETPROP == cmd.function())
-                LOGD("Send: TryReceived SETPROP");
+                ALOGD("Send: TryReceived SETPROP");
             else
-                LOGD("Send: TryReceived %u", cmd.function());
+                ALOGD("Send: TryReceived %u", cmd.function());
         }
     } else
         Receive(cmd);
@@ -223,19 +223,19 @@
 {
     switch (cmd.prop()) {
     case glesv2debugger::Message_Prop_CaptureDraw:
-        LOGD("SetProp Message_Prop_CaptureDraw %d", cmd.arg0());
+        ALOGD("SetProp Message_Prop_CaptureDraw %d", cmd.arg0());
         dbg->captureDraw = cmd.arg0();
         break;
     case glesv2debugger::Message_Prop_TimeMode:
-        LOGD("SetProp Message_Prop_TimeMode %d", cmd.arg0());
+        ALOGD("SetProp Message_Prop_TimeMode %d", cmd.arg0());
         timeMode = cmd.arg0();
         break;
     case glesv2debugger::Message_Prop_ExpectResponse:
-        LOGD("SetProp Message_Prop_ExpectResponse %d=%d", cmd.arg0(), cmd.arg1());
+        ALOGD("SetProp Message_Prop_ExpectResponse %d=%d", cmd.arg0(), cmd.arg1());
         dbg->expectResponse.Bit((glesv2debugger::Message_Function)cmd.arg0(), cmd.arg1());
         break;
     case glesv2debugger::Message_Prop_CaptureSwap:
-        LOGD("SetProp CaptureSwap %d", cmd.arg0());
+        ALOGD("SetProp CaptureSwap %d", cmd.arg0());
         dbg->captureSwap = cmd.arg0();
         break;
     default:
@@ -269,7 +269,7 @@
         case glesv2debugger::Message_Function_CONTINUE:
             ret = functionCall(&dbg->hooks->gl, msg);
             while (GLenum error = dbg->hooks->gl.glGetError())
-                LOGD("Function=%u glGetError() = 0x%.4X", function, error);
+                ALOGD("Function=%u glGetError() = 0x%.4X", function, error);
             if (!msg.has_time()) // some has output data copy, so time inside call
                 msg.set_time((systemTime(timeMode) - c0) * 1e-6f);
             msg.set_context_id(reinterpret_cast<int>(dbg));
diff --git a/opengl/libs/GLES2_dbg/src/vertex.cpp b/opengl/libs/GLES2_dbg/src/vertex.cpp
index 28a2420..70c3433 100644
--- a/opengl/libs/GLES2_dbg/src/vertex.cpp
+++ b/opengl/libs/GLES2_dbg/src/vertex.cpp
@@ -72,7 +72,7 @@
             if (dbg->captureDraw > 0) {
                 dbg->captureDraw--;
                 dbg->hooks->gl.glGetIntegerv(GL_VIEWPORT, viewport);
-//                LOGD("glDrawArrays CAPTURE: x=%d y=%d width=%d height=%d format=0x%.4X type=0x%.4X",
+//                ALOGD("glDrawArrays CAPTURE: x=%d y=%d width=%d height=%d format=0x%.4X type=0x%.4X",
 //                     viewport[0], viewport[1], viewport[2], viewport[3], readFormat, readType);
                 pixels = dbg->GetReadPixelsBuffer(viewport[2] * viewport[3] *
                                                   dbg->readBytesPerPixel);
diff --git a/opengl/libs/GLES_trace/gltrace.proto b/opengl/libs/GLES_trace/gltrace.proto
index 12d8e7c..7dde69f 100644
--- a/opengl/libs/GLES_trace/gltrace.proto
+++ b/opengl/libs/GLES_trace/gltrace.proto
@@ -480,9 +480,12 @@
     }
 
     required int32      context_id = 1;                     // GL context ID
-    required Function   function = 2 [default = invalid];   // GL function called
-    repeated DataType   args = 3;                           // GL function's arguments
-    optional DataType   returnValue = 4;                    // GL function's return value
-    optional float      duration = 5;                       // duration of GL call
-    optional FrameBuffer fb = 6;                            // contents of the framebuffer
+    required int64      start_time = 2;                     // time when call was invoked
+    required int32      duration = 3;                       // duration of the call
+
+    required Function   function = 4 [default = invalid];   // GL function called
+    repeated DataType   args = 5;                           // GL function's arguments
+    optional DataType   returnValue = 6;                    // GL function's return value
+
+    optional FrameBuffer fb = 7;                            // contents of the framebuffer
 };
diff --git a/opengl/libs/GLES_trace/src/gltrace.pb.cpp b/opengl/libs/GLES_trace/src/gltrace.pb.cpp
index 6c1bb91..9a90603 100644
--- a/opengl/libs/GLES_trace/src/gltrace.pb.cpp
+++ b/opengl/libs/GLES_trace/src/gltrace.pb.cpp
@@ -1536,10 +1536,11 @@
 
 #ifndef _MSC_VER
 const int GLMessage::kContextIdFieldNumber;
+const int GLMessage::kStartTimeFieldNumber;
+const int GLMessage::kDurationFieldNumber;
 const int GLMessage::kFunctionFieldNumber;
 const int GLMessage::kArgsFieldNumber;
 const int GLMessage::kReturnValueFieldNumber;
-const int GLMessage::kDurationFieldNumber;
 const int GLMessage::kFbFieldNumber;
 #endif  // !_MSC_VER
 
@@ -1562,9 +1563,10 @@
 void GLMessage::SharedCtor() {
   _cached_size_ = 0;
   context_id_ = 0;
+  start_time_ = GOOGLE_LONGLONG(0);
+  duration_ = 0;
   function_ = 3000;
   returnvalue_ = NULL;
-  duration_ = 0;
   fb_ = NULL;
   ::memset(_has_bits_, 0, sizeof(_has_bits_));
 }
@@ -1598,12 +1600,13 @@
 void GLMessage::Clear() {
   if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
     context_id_ = 0;
+    start_time_ = GOOGLE_LONGLONG(0);
+    duration_ = 0;
     function_ = 3000;
-    if (_has_bit(3)) {
+    if (_has_bit(5)) {
       if (returnvalue_ != NULL) returnvalue_->::android::gltrace::GLMessage_DataType::Clear();
     }
-    duration_ = 0;
-    if (_has_bit(5)) {
+    if (_has_bit(6)) {
       if (fb_ != NULL) fb_->::android::gltrace::GLMessage_FrameBuffer::Clear();
     }
   }
@@ -1628,14 +1631,46 @@
         } else {
           goto handle_uninterpreted;
         }
-        if (input->ExpectTag(16)) goto parse_function;
+        if (input->ExpectTag(16)) goto parse_start_time;
         break;
       }
       
-      // required .android.gltrace.GLMessage.Function function = 2 [default = invalid];
+      // required int64 start_time = 2;
       case 2: {
         if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
             ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_start_time:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>(
+                 input, &start_time_)));
+          _set_bit(1);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(24)) goto parse_duration;
+        break;
+      }
+      
+      // required int32 duration = 3;
+      case 3: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_duration:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+                 input, &duration_)));
+          _set_bit(2);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(32)) goto parse_function;
+        break;
+      }
+      
+      // required .android.gltrace.GLMessage.Function function = 4 [default = invalid];
+      case 4: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
          parse_function:
           int value;
           DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
@@ -1647,12 +1682,12 @@
         } else {
           goto handle_uninterpreted;
         }
-        if (input->ExpectTag(26)) goto parse_args;
+        if (input->ExpectTag(42)) goto parse_args;
         break;
       }
       
-      // repeated .android.gltrace.GLMessage.DataType args = 3;
-      case 3: {
+      // repeated .android.gltrace.GLMessage.DataType args = 5;
+      case 5: {
         if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
             ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
          parse_args:
@@ -1661,13 +1696,13 @@
         } else {
           goto handle_uninterpreted;
         }
-        if (input->ExpectTag(26)) goto parse_args;
-        if (input->ExpectTag(34)) goto parse_returnValue;
+        if (input->ExpectTag(42)) goto parse_args;
+        if (input->ExpectTag(50)) goto parse_returnValue;
         break;
       }
       
-      // optional .android.gltrace.GLMessage.DataType returnValue = 4;
-      case 4: {
+      // optional .android.gltrace.GLMessage.DataType returnValue = 6;
+      case 6: {
         if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
             ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
          parse_returnValue:
@@ -1676,28 +1711,12 @@
         } else {
           goto handle_uninterpreted;
         }
-        if (input->ExpectTag(45)) goto parse_duration;
+        if (input->ExpectTag(58)) goto parse_fb;
         break;
       }
       
-      // optional float duration = 5;
-      case 5: {
-        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
-            ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED32) {
-         parse_duration:
-          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
-                   float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>(
-                 input, &duration_)));
-          _set_bit(4);
-        } else {
-          goto handle_uninterpreted;
-        }
-        if (input->ExpectTag(50)) goto parse_fb;
-        break;
-      }
-      
-      // optional .android.gltrace.GLMessage.FrameBuffer fb = 6;
-      case 6: {
+      // optional .android.gltrace.GLMessage.FrameBuffer fb = 7;
+      case 7: {
         if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
             ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
          parse_fb:
@@ -1732,33 +1751,38 @@
     ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->context_id(), output);
   }
   
-  // required .android.gltrace.GLMessage.Function function = 2 [default = invalid];
+  // required int64 start_time = 2;
   if (_has_bit(1)) {
-    ::google::protobuf::internal::WireFormatLite::WriteEnum(
-      2, this->function(), output);
+    ::google::protobuf::internal::WireFormatLite::WriteInt64(2, this->start_time(), output);
   }
   
-  // repeated .android.gltrace.GLMessage.DataType args = 3;
+  // required int32 duration = 3;
+  if (_has_bit(2)) {
+    ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->duration(), output);
+  }
+  
+  // required .android.gltrace.GLMessage.Function function = 4 [default = invalid];
+  if (_has_bit(3)) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      4, this->function(), output);
+  }
+  
+  // repeated .android.gltrace.GLMessage.DataType args = 5;
   for (int i = 0; i < this->args_size(); i++) {
     ::google::protobuf::internal::WireFormatLite::WriteMessage(
-      3, this->args(i), output);
+      5, this->args(i), output);
   }
   
-  // optional .android.gltrace.GLMessage.DataType returnValue = 4;
-  if (_has_bit(3)) {
-    ::google::protobuf::internal::WireFormatLite::WriteMessage(
-      4, this->returnvalue(), output);
-  }
-  
-  // optional float duration = 5;
-  if (_has_bit(4)) {
-    ::google::protobuf::internal::WireFormatLite::WriteFloat(5, this->duration(), output);
-  }
-  
-  // optional .android.gltrace.GLMessage.FrameBuffer fb = 6;
+  // optional .android.gltrace.GLMessage.DataType returnValue = 6;
   if (_has_bit(5)) {
     ::google::protobuf::internal::WireFormatLite::WriteMessage(
-      6, this->fb(), output);
+      6, this->returnvalue(), output);
+  }
+  
+  // optional .android.gltrace.GLMessage.FrameBuffer fb = 7;
+  if (_has_bit(6)) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessage(
+      7, this->fb(), output);
   }
   
 }
@@ -1774,25 +1798,34 @@
           this->context_id());
     }
     
-    // required .android.gltrace.GLMessage.Function function = 2 [default = invalid];
+    // required int64 start_time = 2;
+    if (has_start_time()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int64Size(
+          this->start_time());
+    }
+    
+    // required int32 duration = 3;
+    if (has_duration()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::Int32Size(
+          this->duration());
+    }
+    
+    // required .android.gltrace.GLMessage.Function function = 4 [default = invalid];
     if (has_function()) {
       total_size += 1 +
         ::google::protobuf::internal::WireFormatLite::EnumSize(this->function());
     }
     
-    // optional .android.gltrace.GLMessage.DataType returnValue = 4;
+    // optional .android.gltrace.GLMessage.DataType returnValue = 6;
     if (has_returnvalue()) {
       total_size += 1 +
         ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
           this->returnvalue());
     }
     
-    // optional float duration = 5;
-    if (has_duration()) {
-      total_size += 1 + 4;
-    }
-    
-    // optional .android.gltrace.GLMessage.FrameBuffer fb = 6;
+    // optional .android.gltrace.GLMessage.FrameBuffer fb = 7;
     if (has_fb()) {
       total_size += 1 +
         ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
@@ -1800,7 +1833,7 @@
     }
     
   }
-  // repeated .android.gltrace.GLMessage.DataType args = 3;
+  // repeated .android.gltrace.GLMessage.DataType args = 5;
   total_size += 1 * this->args_size();
   for (int i = 0; i < this->args_size(); i++) {
     total_size +=
@@ -1827,15 +1860,18 @@
       set_context_id(from.context_id());
     }
     if (from._has_bit(1)) {
-      set_function(from.function());
+      set_start_time(from.start_time());
     }
-    if (from._has_bit(3)) {
-      mutable_returnvalue()->::android::gltrace::GLMessage_DataType::MergeFrom(from.returnvalue());
-    }
-    if (from._has_bit(4)) {
+    if (from._has_bit(2)) {
       set_duration(from.duration());
     }
+    if (from._has_bit(3)) {
+      set_function(from.function());
+    }
     if (from._has_bit(5)) {
+      mutable_returnvalue()->::android::gltrace::GLMessage_DataType::MergeFrom(from.returnvalue());
+    }
+    if (from._has_bit(6)) {
       mutable_fb()->::android::gltrace::GLMessage_FrameBuffer::MergeFrom(from.fb());
     }
   }
@@ -1848,7 +1884,7 @@
 }
 
 bool GLMessage::IsInitialized() const {
-  if ((_has_bits_[0] & 0x00000003) != 0x00000003) return false;
+  if ((_has_bits_[0] & 0x0000000f) != 0x0000000f) return false;
   
   for (int i = 0; i < args_size(); i++) {
     if (!this->args(i).IsInitialized()) return false;
@@ -1865,10 +1901,11 @@
 void GLMessage::Swap(GLMessage* other) {
   if (other != this) {
     std::swap(context_id_, other->context_id_);
+    std::swap(start_time_, other->start_time_);
+    std::swap(duration_, other->duration_);
     std::swap(function_, other->function_);
     args_.Swap(&other->args_);
     std::swap(returnvalue_, other->returnvalue_);
-    std::swap(duration_, other->duration_);
     std::swap(fb_, other->fb_);
     std::swap(_has_bits_[0], other->_has_bits_[0]);
     std::swap(_cached_size_, other->_cached_size_);
diff --git a/opengl/libs/GLES_trace/src/gltrace.pb.h b/opengl/libs/GLES_trace/src/gltrace.pb.h
index c39e1b2..5a7a16f 100644
--- a/opengl/libs/GLES_trace/src/gltrace.pb.h
+++ b/opengl/libs/GLES_trace/src/gltrace.pb.h
@@ -1249,17 +1249,31 @@
   inline ::google::protobuf::int32 context_id() const;
   inline void set_context_id(::google::protobuf::int32 value);
   
-  // required .android.gltrace.GLMessage.Function function = 2 [default = invalid];
+  // required int64 start_time = 2;
+  inline bool has_start_time() const;
+  inline void clear_start_time();
+  static const int kStartTimeFieldNumber = 2;
+  inline ::google::protobuf::int64 start_time() const;
+  inline void set_start_time(::google::protobuf::int64 value);
+  
+  // required int32 duration = 3;
+  inline bool has_duration() const;
+  inline void clear_duration();
+  static const int kDurationFieldNumber = 3;
+  inline ::google::protobuf::int32 duration() const;
+  inline void set_duration(::google::protobuf::int32 value);
+  
+  // required .android.gltrace.GLMessage.Function function = 4 [default = invalid];
   inline bool has_function() const;
   inline void clear_function();
-  static const int kFunctionFieldNumber = 2;
+  static const int kFunctionFieldNumber = 4;
   inline ::android::gltrace::GLMessage_Function function() const;
   inline void set_function(::android::gltrace::GLMessage_Function value);
   
-  // repeated .android.gltrace.GLMessage.DataType args = 3;
+  // repeated .android.gltrace.GLMessage.DataType args = 5;
   inline int args_size() const;
   inline void clear_args();
-  static const int kArgsFieldNumber = 3;
+  static const int kArgsFieldNumber = 5;
   inline const ::android::gltrace::GLMessage_DataType& args(int index) const;
   inline ::android::gltrace::GLMessage_DataType* mutable_args(int index);
   inline ::android::gltrace::GLMessage_DataType* add_args();
@@ -1268,24 +1282,17 @@
   inline ::google::protobuf::RepeatedPtrField< ::android::gltrace::GLMessage_DataType >*
       mutable_args();
   
-  // optional .android.gltrace.GLMessage.DataType returnValue = 4;
+  // optional .android.gltrace.GLMessage.DataType returnValue = 6;
   inline bool has_returnvalue() const;
   inline void clear_returnvalue();
-  static const int kReturnValueFieldNumber = 4;
+  static const int kReturnValueFieldNumber = 6;
   inline const ::android::gltrace::GLMessage_DataType& returnvalue() const;
   inline ::android::gltrace::GLMessage_DataType* mutable_returnvalue();
   
-  // optional float duration = 5;
-  inline bool has_duration() const;
-  inline void clear_duration();
-  static const int kDurationFieldNumber = 5;
-  inline float duration() const;
-  inline void set_duration(float value);
-  
-  // optional .android.gltrace.GLMessage.FrameBuffer fb = 6;
+  // optional .android.gltrace.GLMessage.FrameBuffer fb = 7;
   inline bool has_fb() const;
   inline void clear_fb();
-  static const int kFbFieldNumber = 6;
+  static const int kFbFieldNumber = 7;
   inline const ::android::gltrace::GLMessage_FrameBuffer& fb() const;
   inline ::android::gltrace::GLMessage_FrameBuffer* mutable_fb();
   
@@ -1294,16 +1301,17 @@
   mutable int _cached_size_;
   
   ::google::protobuf::int32 context_id_;
+  ::google::protobuf::int64 start_time_;
+  ::google::protobuf::int32 duration_;
   int function_;
   ::google::protobuf::RepeatedPtrField< ::android::gltrace::GLMessage_DataType > args_;
   ::android::gltrace::GLMessage_DataType* returnvalue_;
-  float duration_;
   ::android::gltrace::GLMessage_FrameBuffer* fb_;
   friend void  protobuf_AddDesc_gltrace_2eproto();
   friend void protobuf_AssignDesc_gltrace_2eproto();
   friend void protobuf_ShutdownFile_gltrace_2eproto();
   
-  ::google::protobuf::uint32 _has_bits_[(6 + 31) / 32];
+  ::google::protobuf::uint32 _has_bits_[(7 + 31) / 32];
   
   // WHY DOES & HAVE LOWER PRECEDENCE THAN != !?
   inline bool _has_bit(int index) const {
@@ -1622,24 +1630,56 @@
   context_id_ = value;
 }
 
-// required .android.gltrace.GLMessage.Function function = 2 [default = invalid];
-inline bool GLMessage::has_function() const {
+// required int64 start_time = 2;
+inline bool GLMessage::has_start_time() const {
   return _has_bit(1);
 }
+inline void GLMessage::clear_start_time() {
+  start_time_ = GOOGLE_LONGLONG(0);
+  _clear_bit(1);
+}
+inline ::google::protobuf::int64 GLMessage::start_time() const {
+  return start_time_;
+}
+inline void GLMessage::set_start_time(::google::protobuf::int64 value) {
+  _set_bit(1);
+  start_time_ = value;
+}
+
+// required int32 duration = 3;
+inline bool GLMessage::has_duration() const {
+  return _has_bit(2);
+}
+inline void GLMessage::clear_duration() {
+  duration_ = 0;
+  _clear_bit(2);
+}
+inline ::google::protobuf::int32 GLMessage::duration() const {
+  return duration_;
+}
+inline void GLMessage::set_duration(::google::protobuf::int32 value) {
+  _set_bit(2);
+  duration_ = value;
+}
+
+// required .android.gltrace.GLMessage.Function function = 4 [default = invalid];
+inline bool GLMessage::has_function() const {
+  return _has_bit(3);
+}
 inline void GLMessage::clear_function() {
   function_ = 3000;
-  _clear_bit(1);
+  _clear_bit(3);
 }
 inline ::android::gltrace::GLMessage_Function GLMessage::function() const {
   return static_cast< ::android::gltrace::GLMessage_Function >(function_);
 }
 inline void GLMessage::set_function(::android::gltrace::GLMessage_Function value) {
   GOOGLE_DCHECK(::android::gltrace::GLMessage_Function_IsValid(value));
-  _set_bit(1);
+  _set_bit(3);
   function_ = value;
 }
 
-// repeated .android.gltrace.GLMessage.DataType args = 3;
+// repeated .android.gltrace.GLMessage.DataType args = 5;
 inline int GLMessage::args_size() const {
   return args_.size();
 }
@@ -1664,52 +1704,36 @@
   return &args_;
 }
 
-// optional .android.gltrace.GLMessage.DataType returnValue = 4;
+// optional .android.gltrace.GLMessage.DataType returnValue = 6;
 inline bool GLMessage::has_returnvalue() const {
-  return _has_bit(3);
+  return _has_bit(5);
 }
 inline void GLMessage::clear_returnvalue() {
   if (returnvalue_ != NULL) returnvalue_->::android::gltrace::GLMessage_DataType::Clear();
-  _clear_bit(3);
+  _clear_bit(5);
 }
 inline const ::android::gltrace::GLMessage_DataType& GLMessage::returnvalue() const {
   return returnvalue_ != NULL ? *returnvalue_ : *default_instance_->returnvalue_;
 }
 inline ::android::gltrace::GLMessage_DataType* GLMessage::mutable_returnvalue() {
-  _set_bit(3);
+  _set_bit(5);
   if (returnvalue_ == NULL) returnvalue_ = new ::android::gltrace::GLMessage_DataType;
   return returnvalue_;
 }
 
-// optional float duration = 5;
-inline bool GLMessage::has_duration() const {
-  return _has_bit(4);
-}
-inline void GLMessage::clear_duration() {
-  duration_ = 0;
-  _clear_bit(4);
-}
-inline float GLMessage::duration() const {
-  return duration_;
-}
-inline void GLMessage::set_duration(float value) {
-  _set_bit(4);
-  duration_ = value;
-}
-
-// optional .android.gltrace.GLMessage.FrameBuffer fb = 6;
+// optional .android.gltrace.GLMessage.FrameBuffer fb = 7;
 inline bool GLMessage::has_fb() const {
-  return _has_bit(5);
+  return _has_bit(6);
 }
 inline void GLMessage::clear_fb() {
   if (fb_ != NULL) fb_->::android::gltrace::GLMessage_FrameBuffer::Clear();
-  _clear_bit(5);
+  _clear_bit(6);
 }
 inline const ::android::gltrace::GLMessage_FrameBuffer& GLMessage::fb() const {
   return fb_ != NULL ? *fb_ : *default_instance_->fb_;
 }
 inline ::android::gltrace::GLMessage_FrameBuffer* GLMessage::mutable_fb() {
-  _set_bit(5);
+  _set_bit(6);
   if (fb_ == NULL) fb_ = new ::android::gltrace::GLMessage_FrameBuffer;
   return fb_;
 }
diff --git a/opengl/libs/GLES_trace/src/gltrace_api.cpp b/opengl/libs/GLES_trace/src/gltrace_api.cpp
index 91929f3..c8e820d 100644
--- a/opengl/libs/GLES_trace/src/gltrace_api.cpp
+++ b/opengl/libs/GLES_trace/src/gltrace_api.cpp
@@ -17,6 +17,7 @@
  */
 
 #include <cutils/log.h>
+#include <utils/Timers.h>
 #include <GLES2/gl2.h>
 
 #include "gltrace.pb.h"
@@ -27,14 +28,12 @@
 namespace android {
 namespace gltrace {
 
-
 // Definitions for GL2 APIs
 
 void GLTrace_glActiveTexture(GLenum texture) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glActiveTexture);
 
     // copy argument texture
@@ -44,17 +43,18 @@
     arg_texture->add_intvalue((int)texture);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glActiveTexture(texture);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glAttachShader(GLuint program, GLuint shader) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glAttachShader);
 
     // copy argument program
@@ -70,17 +70,18 @@
     arg_shader->add_intvalue(shader);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glAttachShader(program, shader);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBindAttribLocation(GLuint program, GLuint index, const GLchar* name) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBindAttribLocation);
 
     // copy argument program
@@ -102,17 +103,18 @@
     arg_name->add_intvalue((int)name);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBindAttribLocation(program, index, name);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBindBuffer(GLenum target, GLuint buffer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBindBuffer);
 
     // copy argument target
@@ -128,17 +130,18 @@
     arg_buffer->add_intvalue(buffer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBindBuffer(target, buffer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBindFramebuffer(GLenum target, GLuint framebuffer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBindFramebuffer);
 
     // copy argument target
@@ -154,17 +157,18 @@
     arg_framebuffer->add_intvalue(framebuffer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBindFramebuffer(target, framebuffer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBindRenderbuffer(GLenum target, GLuint renderbuffer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBindRenderbuffer);
 
     // copy argument target
@@ -180,17 +184,18 @@
     arg_renderbuffer->add_intvalue(renderbuffer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBindRenderbuffer(target, renderbuffer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBindTexture(GLenum target, GLuint texture) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBindTexture);
 
     // copy argument target
@@ -206,17 +211,18 @@
     arg_texture->add_intvalue(texture);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBindTexture(target, texture);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBlendColor);
 
     // copy argument red
@@ -244,17 +250,18 @@
     arg_alpha->add_floatvalue(alpha);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBlendColor(red, green, blue, alpha);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBlendEquation(GLenum mode) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBlendEquation);
 
     // copy argument mode
@@ -264,17 +271,18 @@
     arg_mode->add_intvalue((int)mode);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBlendEquation(mode);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBlendEquationSeparate);
 
     // copy argument modeRGB
@@ -290,17 +298,18 @@
     arg_modeAlpha->add_intvalue((int)modeAlpha);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBlendEquationSeparate(modeRGB, modeAlpha);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBlendFunc(GLenum sfactor, GLenum dfactor) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBlendFunc);
 
     // copy argument sfactor
@@ -316,17 +325,18 @@
     arg_dfactor->add_intvalue((int)dfactor);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBlendFunc(sfactor, dfactor);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBlendFuncSeparate);
 
     // copy argument srcRGB
@@ -354,17 +364,18 @@
     arg_dstAlpha->add_intvalue((int)dstAlpha);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBufferData);
 
     // copy argument target
@@ -392,17 +403,18 @@
     arg_usage->add_intvalue((int)usage);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBufferData(target, size, data, usage);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBufferSubData);
 
     // copy argument target
@@ -430,17 +442,18 @@
     arg_data->add_intvalue((int)data);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBufferSubData(target, offset, size, data);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 GLenum GLTrace_glCheckFramebufferStatus(GLenum target) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCheckFramebufferStatus);
 
     // copy argument target
@@ -450,7 +463,9 @@
     arg_target->add_intvalue((int)target);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLenum retValue = glContext->hooks->gl.glCheckFramebufferStatus(target);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -458,8 +473,8 @@
     rt->set_type(GLMessage::DataType::ENUM);
     rt->add_intvalue((int)retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -468,7 +483,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClear);
 
     // copy argument mask
@@ -478,17 +492,18 @@
     arg_mask->add_intvalue(mask);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClear(mask);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClearColor);
 
     // copy argument red
@@ -516,17 +531,18 @@
     arg_alpha->add_floatvalue(alpha);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClearColor(red, green, blue, alpha);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClearDepthf(GLclampf depth) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClearDepthf);
 
     // copy argument depth
@@ -536,17 +552,18 @@
     arg_depth->add_floatvalue(depth);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClearDepthf(depth);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClearStencil(GLint s) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClearStencil);
 
     // copy argument s
@@ -556,17 +573,18 @@
     arg_s->add_intvalue(s);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClearStencil(s);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glColorMask);
 
     // copy argument red
@@ -594,17 +612,18 @@
     arg_alpha->add_boolvalue(alpha);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glColorMask(red, green, blue, alpha);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glCompileShader(GLuint shader) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCompileShader);
 
     // copy argument shader
@@ -614,17 +633,18 @@
     arg_shader->add_intvalue(shader);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glCompileShader(shader);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCompressedTexImage2D);
 
     // copy argument target
@@ -676,17 +696,18 @@
     arg_data->add_intvalue((int)data);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCompressedTexSubImage2D);
 
     // copy argument target
@@ -744,17 +765,18 @@
     arg_data->add_intvalue((int)data);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCopyTexImage2D);
 
     // copy argument target
@@ -806,17 +828,18 @@
     arg_border->add_intvalue(border);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCopyTexSubImage2D);
 
     // copy argument target
@@ -868,21 +891,24 @@
     arg_height->add_intvalue(height);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 GLuint GLTrace_glCreateProgram(void) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCreateProgram);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLuint retValue = glContext->hooks->gl.glCreateProgram();
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -890,8 +916,8 @@
     rt->set_type(GLMessage::DataType::INT);
     rt->add_intvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -900,7 +926,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCreateShader);
 
     // copy argument type
@@ -910,7 +935,9 @@
     arg_type->add_intvalue((int)type);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLuint retValue = glContext->hooks->gl.glCreateShader(type);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -918,8 +945,8 @@
     rt->set_type(GLMessage::DataType::INT);
     rt->add_intvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -928,7 +955,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCullFace);
 
     // copy argument mode
@@ -938,17 +964,18 @@
     arg_mode->add_intvalue((int)mode);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glCullFace(mode);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDeleteBuffers(GLsizei n, const GLuint* buffers) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDeleteBuffers);
 
     // copy argument n
@@ -964,17 +991,18 @@
     arg_buffers->add_intvalue((int)buffers);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDeleteBuffers(n, buffers);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDeleteFramebuffers);
 
     // copy argument n
@@ -990,17 +1018,18 @@
     arg_framebuffers->add_intvalue((int)framebuffers);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDeleteFramebuffers(n, framebuffers);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDeleteProgram(GLuint program) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDeleteProgram);
 
     // copy argument program
@@ -1010,17 +1039,18 @@
     arg_program->add_intvalue(program);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDeleteProgram(program);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDeleteRenderbuffers);
 
     // copy argument n
@@ -1036,17 +1066,18 @@
     arg_renderbuffers->add_intvalue((int)renderbuffers);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDeleteRenderbuffers(n, renderbuffers);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDeleteShader(GLuint shader) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDeleteShader);
 
     // copy argument shader
@@ -1056,17 +1087,18 @@
     arg_shader->add_intvalue(shader);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDeleteShader(shader);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDeleteTextures(GLsizei n, const GLuint* textures) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDeleteTextures);
 
     // copy argument n
@@ -1082,17 +1114,18 @@
     arg_textures->add_intvalue((int)textures);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDeleteTextures(n, textures);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDepthFunc(GLenum func) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDepthFunc);
 
     // copy argument func
@@ -1102,17 +1135,18 @@
     arg_func->add_intvalue((int)func);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDepthFunc(func);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDepthMask(GLboolean flag) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDepthMask);
 
     // copy argument flag
@@ -1122,17 +1156,18 @@
     arg_flag->add_boolvalue(flag);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDepthMask(flag);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDepthRangef(GLclampf zNear, GLclampf zFar) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDepthRangef);
 
     // copy argument zNear
@@ -1148,17 +1183,18 @@
     arg_zFar->add_floatvalue(zFar);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDepthRangef(zNear, zFar);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDetachShader(GLuint program, GLuint shader) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDetachShader);
 
     // copy argument program
@@ -1174,17 +1210,18 @@
     arg_shader->add_intvalue(shader);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDetachShader(program, shader);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDisable(GLenum cap) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDisable);
 
     // copy argument cap
@@ -1194,17 +1231,18 @@
     arg_cap->add_intvalue((int)cap);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDisable(cap);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDisableVertexAttribArray(GLuint index) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDisableVertexAttribArray);
 
     // copy argument index
@@ -1214,17 +1252,18 @@
     arg_index->add_intvalue(index);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDisableVertexAttribArray(index);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDrawArrays(GLenum mode, GLint first, GLsizei count) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDrawArrays);
 
     // copy argument mode
@@ -1246,17 +1285,18 @@
     arg_count->add_intvalue(count);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDrawArrays(mode, first, count);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDrawElements);
 
     // copy argument mode
@@ -1284,17 +1324,18 @@
     arg_indices->add_intvalue((int)indices);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDrawElements(mode, count, type, indices);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glEnable(GLenum cap) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glEnable);
 
     // copy argument cap
@@ -1304,17 +1345,18 @@
     arg_cap->add_intvalue((int)cap);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glEnable(cap);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glEnableVertexAttribArray(GLuint index) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glEnableVertexAttribArray);
 
     // copy argument index
@@ -1324,45 +1366,48 @@
     arg_index->add_intvalue(index);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glEnableVertexAttribArray(index);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFinish(void) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFinish);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFinish();
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFlush(void) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFlush);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFlush();
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFramebufferRenderbuffer);
 
     // copy argument target
@@ -1390,17 +1435,18 @@
     arg_renderbuffer->add_intvalue(renderbuffer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFramebufferTexture2D);
 
     // copy argument target
@@ -1434,17 +1480,18 @@
     arg_level->add_intvalue(level);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFramebufferTexture2D(target, attachment, textarget, texture, level);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFrontFace(GLenum mode) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFrontFace);
 
     // copy argument mode
@@ -1454,17 +1501,18 @@
     arg_mode->add_intvalue((int)mode);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFrontFace(mode);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGenBuffers(GLsizei n, GLuint* buffers) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGenBuffers);
 
     // copy argument n
@@ -1480,17 +1528,18 @@
     arg_buffers->add_intvalue((int)buffers);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGenBuffers(n, buffers);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGenerateMipmap(GLenum target) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGenerateMipmap);
 
     // copy argument target
@@ -1500,17 +1549,18 @@
     arg_target->add_intvalue((int)target);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGenerateMipmap(target);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGenFramebuffers(GLsizei n, GLuint* framebuffers) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGenFramebuffers);
 
     // copy argument n
@@ -1526,17 +1576,18 @@
     arg_framebuffers->add_intvalue((int)framebuffers);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGenFramebuffers(n, framebuffers);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGenRenderbuffers);
 
     // copy argument n
@@ -1552,17 +1603,18 @@
     arg_renderbuffers->add_intvalue((int)renderbuffers);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGenRenderbuffers(n, renderbuffers);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGenTextures(GLsizei n, GLuint* textures) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGenTextures);
 
     // copy argument n
@@ -1578,17 +1630,18 @@
     arg_textures->add_intvalue((int)textures);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGenTextures(n, textures);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetActiveAttrib);
 
     // copy argument program
@@ -1634,17 +1687,18 @@
     arg_name->add_intvalue((int)name);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetActiveAttrib(program, index, bufsize, length, size, type, name);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetActiveUniform);
 
     // copy argument program
@@ -1690,17 +1744,18 @@
     arg_name->add_intvalue((int)name);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetActiveUniform(program, index, bufsize, length, size, type, name);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetAttachedShaders);
 
     // copy argument program
@@ -1728,17 +1783,18 @@
     arg_shaders->add_intvalue((int)shaders);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetAttachedShaders(program, maxcount, count, shaders);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 int GLTrace_glGetAttribLocation(GLuint program, const GLchar* name) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetAttribLocation);
 
     // copy argument program
@@ -1754,7 +1810,9 @@
     arg_name->add_intvalue((int)name);
 
     // call function
+    nsecs_t start_time = systemTime();
     int retValue = glContext->hooks->gl.glGetAttribLocation(program, name);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -1762,8 +1820,8 @@
     rt->set_type(GLMessage::DataType::INT);
     rt->add_intvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -1772,7 +1830,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetBooleanv);
 
     // copy argument pname
@@ -1788,17 +1845,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetBooleanv(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetBufferParameteriv);
 
     // copy argument target
@@ -1820,21 +1878,24 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetBufferParameteriv(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 GLenum GLTrace_glGetError(void) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetError);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLenum retValue = glContext->hooks->gl.glGetError();
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -1842,8 +1903,8 @@
     rt->set_type(GLMessage::DataType::ENUM);
     rt->add_intvalue((int)retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -1852,7 +1913,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetFloatv);
 
     // copy argument pname
@@ -1868,17 +1928,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetFloatv(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetFramebufferAttachmentParameteriv);
 
     // copy argument target
@@ -1906,17 +1967,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetIntegerv(GLenum pname, GLint* params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetIntegerv);
 
     // copy argument pname
@@ -1932,17 +1994,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetIntegerv(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetProgramiv(GLuint program, GLenum pname, GLint* params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetProgramiv);
 
     // copy argument program
@@ -1964,17 +2027,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetProgramiv(program, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetProgramInfoLog);
 
     // copy argument program
@@ -2002,17 +2066,18 @@
     arg_infolog->add_intvalue((int)infolog);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetProgramInfoLog(program, bufsize, length, infolog);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetRenderbufferParameteriv);
 
     // copy argument target
@@ -2034,17 +2099,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetRenderbufferParameteriv(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetShaderiv(GLuint shader, GLenum pname, GLint* params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetShaderiv);
 
     // copy argument shader
@@ -2066,17 +2132,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetShaderiv(shader, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetShaderInfoLog);
 
     // copy argument shader
@@ -2104,17 +2171,18 @@
     arg_infolog->add_intvalue((int)infolog);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetShaderInfoLog(shader, bufsize, length, infolog);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetShaderPrecisionFormat);
 
     // copy argument shadertype
@@ -2142,17 +2210,18 @@
     arg_precision->add_intvalue((int)precision);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetShaderSource);
 
     // copy argument shader
@@ -2180,17 +2249,18 @@
     arg_source->add_intvalue((int)source);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetShaderSource(shader, bufsize, length, source);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 const GLubyte* GLTrace_glGetString(GLenum name) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetString);
 
     // copy argument name
@@ -2200,7 +2270,9 @@
     arg_name->add_intvalue((int)name);
 
     // call function
+    nsecs_t start_time = systemTime();
     const GLubyte* retValue = glContext->hooks->gl.glGetString(name);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -2208,8 +2280,8 @@
     rt->set_type(GLMessage::DataType::INT);
     rt->add_intvalue((int)retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -2218,7 +2290,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetTexParameterfv);
 
     // copy argument target
@@ -2240,17 +2311,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetTexParameterfv(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetTexParameteriv(GLenum target, GLenum pname, GLint* params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetTexParameteriv);
 
     // copy argument target
@@ -2272,17 +2344,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetTexParameteriv(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetUniformfv(GLuint program, GLint location, GLfloat* params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetUniformfv);
 
     // copy argument program
@@ -2304,17 +2377,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetUniformfv(program, location, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetUniformiv(GLuint program, GLint location, GLint* params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetUniformiv);
 
     // copy argument program
@@ -2336,17 +2410,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetUniformiv(program, location, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 int GLTrace_glGetUniformLocation(GLuint program, const GLchar* name) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetUniformLocation);
 
     // copy argument program
@@ -2362,7 +2437,9 @@
     arg_name->add_intvalue((int)name);
 
     // call function
+    nsecs_t start_time = systemTime();
     int retValue = glContext->hooks->gl.glGetUniformLocation(program, name);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -2370,8 +2447,8 @@
     rt->set_type(GLMessage::DataType::INT);
     rt->add_intvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -2380,7 +2457,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetVertexAttribfv);
 
     // copy argument index
@@ -2402,17 +2478,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetVertexAttribfv(index, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetVertexAttribiv);
 
     // copy argument index
@@ -2434,17 +2511,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetVertexAttribiv(index, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetVertexAttribPointerv);
 
     // copy argument index
@@ -2466,17 +2544,18 @@
     arg_pointer->add_intvalue((int)pointer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetVertexAttribPointerv(index, pname, pointer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glHint(GLenum target, GLenum mode) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glHint);
 
     // copy argument target
@@ -2492,17 +2571,18 @@
     arg_mode->add_intvalue((int)mode);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glHint(target, mode);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 GLboolean GLTrace_glIsBuffer(GLuint buffer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glIsBuffer);
 
     // copy argument buffer
@@ -2512,7 +2592,9 @@
     arg_buffer->add_intvalue(buffer);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLboolean retValue = glContext->hooks->gl.glIsBuffer(buffer);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -2520,8 +2602,8 @@
     rt->set_type(GLMessage::DataType::BOOL);
     rt->add_boolvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -2530,7 +2612,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glIsEnabled);
 
     // copy argument cap
@@ -2540,7 +2621,9 @@
     arg_cap->add_intvalue((int)cap);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLboolean retValue = glContext->hooks->gl.glIsEnabled(cap);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -2548,8 +2631,8 @@
     rt->set_type(GLMessage::DataType::BOOL);
     rt->add_boolvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -2558,7 +2641,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glIsFramebuffer);
 
     // copy argument framebuffer
@@ -2568,7 +2650,9 @@
     arg_framebuffer->add_intvalue(framebuffer);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLboolean retValue = glContext->hooks->gl.glIsFramebuffer(framebuffer);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -2576,8 +2660,8 @@
     rt->set_type(GLMessage::DataType::BOOL);
     rt->add_boolvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -2586,7 +2670,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glIsProgram);
 
     // copy argument program
@@ -2596,7 +2679,9 @@
     arg_program->add_intvalue(program);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLboolean retValue = glContext->hooks->gl.glIsProgram(program);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -2604,8 +2689,8 @@
     rt->set_type(GLMessage::DataType::BOOL);
     rt->add_boolvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -2614,7 +2699,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glIsRenderbuffer);
 
     // copy argument renderbuffer
@@ -2624,7 +2708,9 @@
     arg_renderbuffer->add_intvalue(renderbuffer);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLboolean retValue = glContext->hooks->gl.glIsRenderbuffer(renderbuffer);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -2632,8 +2718,8 @@
     rt->set_type(GLMessage::DataType::BOOL);
     rt->add_boolvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -2642,7 +2728,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glIsShader);
 
     // copy argument shader
@@ -2652,7 +2737,9 @@
     arg_shader->add_intvalue(shader);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLboolean retValue = glContext->hooks->gl.glIsShader(shader);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -2660,8 +2747,8 @@
     rt->set_type(GLMessage::DataType::BOOL);
     rt->add_boolvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -2670,7 +2757,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glIsTexture);
 
     // copy argument texture
@@ -2680,7 +2766,9 @@
     arg_texture->add_intvalue(texture);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLboolean retValue = glContext->hooks->gl.glIsTexture(texture);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -2688,8 +2776,8 @@
     rt->set_type(GLMessage::DataType::BOOL);
     rt->add_boolvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -2698,7 +2786,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLineWidth);
 
     // copy argument width
@@ -2708,17 +2795,18 @@
     arg_width->add_floatvalue(width);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLineWidth(width);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLinkProgram(GLuint program) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLinkProgram);
 
     // copy argument program
@@ -2728,17 +2816,18 @@
     arg_program->add_intvalue(program);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLinkProgram(program);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPixelStorei(GLenum pname, GLint param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPixelStorei);
 
     // copy argument pname
@@ -2754,17 +2843,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPixelStorei(pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPolygonOffset(GLfloat factor, GLfloat units) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPolygonOffset);
 
     // copy argument factor
@@ -2780,17 +2870,18 @@
     arg_units->add_floatvalue(units);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPolygonOffset(factor, units);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glReadPixels);
 
     // copy argument x
@@ -2836,31 +2927,33 @@
     arg_pixels->add_intvalue((int)pixels);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glReadPixels(x, y, width, height, format, type, pixels);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glReleaseShaderCompiler(void) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glReleaseShaderCompiler);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glReleaseShaderCompiler();
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glRenderbufferStorage);
 
     // copy argument target
@@ -2888,17 +2981,18 @@
     arg_height->add_intvalue(height);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glRenderbufferStorage(target, internalformat, width, height);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glSampleCoverage(GLclampf value, GLboolean invert) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glSampleCoverage);
 
     // copy argument value
@@ -2914,17 +3008,18 @@
     arg_invert->add_boolvalue(invert);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glSampleCoverage(value, invert);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glScissor(GLint x, GLint y, GLsizei width, GLsizei height) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glScissor);
 
     // copy argument x
@@ -2952,17 +3047,18 @@
     arg_height->add_intvalue(height);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glScissor(x, y, width, height);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glShaderBinary);
 
     // copy argument n
@@ -2996,17 +3092,18 @@
     arg_length->add_intvalue(length);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glShaderBinary(n, shaders, binaryformat, binary, length);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glShaderSource);
 
     // copy argument shader
@@ -3034,17 +3131,18 @@
     arg_length->add_intvalue((int)length);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glShaderSource(shader, count, string, length);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glStencilFunc(GLenum func, GLint ref, GLuint mask) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glStencilFunc);
 
     // copy argument func
@@ -3066,17 +3164,18 @@
     arg_mask->add_intvalue(mask);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glStencilFunc(func, ref, mask);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glStencilFuncSeparate);
 
     // copy argument face
@@ -3104,17 +3203,18 @@
     arg_mask->add_intvalue(mask);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glStencilFuncSeparate(face, func, ref, mask);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glStencilMask(GLuint mask) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glStencilMask);
 
     // copy argument mask
@@ -3124,17 +3224,18 @@
     arg_mask->add_intvalue(mask);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glStencilMask(mask);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glStencilMaskSeparate(GLenum face, GLuint mask) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glStencilMaskSeparate);
 
     // copy argument face
@@ -3150,17 +3251,18 @@
     arg_mask->add_intvalue(mask);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glStencilMaskSeparate(face, mask);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glStencilOp);
 
     // copy argument fail
@@ -3182,17 +3284,18 @@
     arg_zpass->add_intvalue((int)zpass);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glStencilOp(fail, zfail, zpass);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glStencilOpSeparate);
 
     // copy argument face
@@ -3220,17 +3323,18 @@
     arg_zpass->add_intvalue((int)zpass);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glStencilOpSeparate(face, fail, zfail, zpass);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexImage2D);
 
     // copy argument target
@@ -3288,17 +3392,18 @@
     arg_pixels->add_intvalue((int)pixels);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexParameterf(GLenum target, GLenum pname, GLfloat param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexParameterf);
 
     // copy argument target
@@ -3320,17 +3425,18 @@
     arg_param->add_floatvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexParameterf(target, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexParameterfv);
 
     // copy argument target
@@ -3352,17 +3458,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexParameterfv(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexParameteri(GLenum target, GLenum pname, GLint param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexParameteri);
 
     // copy argument target
@@ -3384,17 +3491,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexParameteri(target, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexParameteriv(GLenum target, GLenum pname, const GLint* params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexParameteriv);
 
     // copy argument target
@@ -3416,17 +3524,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexParameteriv(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexSubImage2D);
 
     // copy argument target
@@ -3484,17 +3593,18 @@
     arg_pixels->add_intvalue((int)pixels);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform1f(GLint location, GLfloat x) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform1f);
 
     // copy argument location
@@ -3510,17 +3620,18 @@
     arg_x->add_floatvalue(x);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform1f(location, x);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform1fv(GLint location, GLsizei count, const GLfloat* v) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform1fv);
 
     // copy argument location
@@ -3542,17 +3653,18 @@
     arg_v->add_intvalue((int)v);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform1fv(location, count, v);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform1i(GLint location, GLint x) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform1i);
 
     // copy argument location
@@ -3568,17 +3680,18 @@
     arg_x->add_intvalue(x);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform1i(location, x);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform1iv(GLint location, GLsizei count, const GLint* v) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform1iv);
 
     // copy argument location
@@ -3600,17 +3713,18 @@
     arg_v->add_intvalue((int)v);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform1iv(location, count, v);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform2f(GLint location, GLfloat x, GLfloat y) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform2f);
 
     // copy argument location
@@ -3632,17 +3746,18 @@
     arg_y->add_floatvalue(y);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform2f(location, x, y);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform2fv(GLint location, GLsizei count, const GLfloat* v) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform2fv);
 
     // copy argument location
@@ -3664,17 +3779,18 @@
     arg_v->add_intvalue((int)v);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform2fv(location, count, v);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform2i(GLint location, GLint x, GLint y) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform2i);
 
     // copy argument location
@@ -3696,17 +3812,18 @@
     arg_y->add_intvalue(y);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform2i(location, x, y);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform2iv(GLint location, GLsizei count, const GLint* v) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform2iv);
 
     // copy argument location
@@ -3728,17 +3845,18 @@
     arg_v->add_intvalue((int)v);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform2iv(location, count, v);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform3f);
 
     // copy argument location
@@ -3766,17 +3884,18 @@
     arg_z->add_floatvalue(z);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform3f(location, x, y, z);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform3fv(GLint location, GLsizei count, const GLfloat* v) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform3fv);
 
     // copy argument location
@@ -3798,17 +3917,18 @@
     arg_v->add_intvalue((int)v);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform3fv(location, count, v);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform3i(GLint location, GLint x, GLint y, GLint z) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform3i);
 
     // copy argument location
@@ -3836,17 +3956,18 @@
     arg_z->add_intvalue(z);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform3i(location, x, y, z);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform3iv(GLint location, GLsizei count, const GLint* v) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform3iv);
 
     // copy argument location
@@ -3868,17 +3989,18 @@
     arg_v->add_intvalue((int)v);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform3iv(location, count, v);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform4f);
 
     // copy argument location
@@ -3912,17 +4034,18 @@
     arg_w->add_floatvalue(w);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform4f(location, x, y, z, w);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform4fv(GLint location, GLsizei count, const GLfloat* v) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform4fv);
 
     // copy argument location
@@ -3944,17 +4067,18 @@
     arg_v->add_intvalue((int)v);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform4fv(location, count, v);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform4i);
 
     // copy argument location
@@ -3988,17 +4112,18 @@
     arg_w->add_intvalue(w);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform4i(location, x, y, z, w);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniform4iv(GLint location, GLsizei count, const GLint* v) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniform4iv);
 
     // copy argument location
@@ -4020,17 +4145,18 @@
     arg_v->add_intvalue((int)v);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniform4iv(location, count, v);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniformMatrix2fv);
 
     // copy argument location
@@ -4058,17 +4184,18 @@
     arg_value->add_intvalue((int)value);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniformMatrix2fv(location, count, transpose, value);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniformMatrix3fv);
 
     // copy argument location
@@ -4096,17 +4223,18 @@
     arg_value->add_intvalue((int)value);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniformMatrix3fv(location, count, transpose, value);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUniformMatrix4fv);
 
     // copy argument location
@@ -4134,17 +4262,18 @@
     arg_value->add_intvalue((int)value);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUniformMatrix4fv(location, count, transpose, value);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glUseProgram(GLuint program) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUseProgram);
 
     // copy argument program
@@ -4154,17 +4283,18 @@
     arg_program->add_intvalue(program);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glUseProgram(program);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glValidateProgram(GLuint program) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glValidateProgram);
 
     // copy argument program
@@ -4174,17 +4304,18 @@
     arg_program->add_intvalue(program);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glValidateProgram(program);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glVertexAttrib1f(GLuint indx, GLfloat x) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glVertexAttrib1f);
 
     // copy argument indx
@@ -4200,17 +4331,18 @@
     arg_x->add_floatvalue(x);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glVertexAttrib1f(indx, x);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glVertexAttrib1fv(GLuint indx, const GLfloat* values) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glVertexAttrib1fv);
 
     // copy argument indx
@@ -4226,17 +4358,18 @@
     arg_values->add_intvalue((int)values);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glVertexAttrib1fv(indx, values);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glVertexAttrib2f);
 
     // copy argument indx
@@ -4258,17 +4391,18 @@
     arg_y->add_floatvalue(y);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glVertexAttrib2f(indx, x, y);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glVertexAttrib2fv(GLuint indx, const GLfloat* values) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glVertexAttrib2fv);
 
     // copy argument indx
@@ -4284,17 +4418,18 @@
     arg_values->add_intvalue((int)values);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glVertexAttrib2fv(indx, values);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glVertexAttrib3f);
 
     // copy argument indx
@@ -4322,17 +4457,18 @@
     arg_z->add_floatvalue(z);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glVertexAttrib3f(indx, x, y, z);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glVertexAttrib3fv(GLuint indx, const GLfloat* values) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glVertexAttrib3fv);
 
     // copy argument indx
@@ -4348,17 +4484,18 @@
     arg_values->add_intvalue((int)values);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glVertexAttrib3fv(indx, values);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glVertexAttrib4f);
 
     // copy argument indx
@@ -4392,17 +4529,18 @@
     arg_w->add_floatvalue(w);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glVertexAttrib4f(indx, x, y, z, w);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glVertexAttrib4fv(GLuint indx, const GLfloat* values) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glVertexAttrib4fv);
 
     // copy argument indx
@@ -4418,17 +4556,18 @@
     arg_values->add_intvalue((int)values);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glVertexAttrib4fv(indx, values);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glVertexAttribPointer);
 
     // copy argument indx
@@ -4468,17 +4607,18 @@
     arg_ptr->add_intvalue((int)ptr);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glViewport(GLint x, GLint y, GLsizei width, GLsizei height) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glViewport);
 
     // copy argument x
@@ -4506,10 +4646,12 @@
     arg_height->add_intvalue(height);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glViewport(x, y, width, height);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 
@@ -4519,7 +4661,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glEGLImageTargetTexture2DOES);
 
     // copy argument target
@@ -4535,17 +4676,18 @@
     arg_image->add_intvalue((int)image);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glEGLImageTargetTexture2DOES(target, image);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glEGLImageTargetRenderbufferStorageOES);
 
     // copy argument target
@@ -4561,17 +4703,18 @@
     arg_image->add_intvalue((int)image);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glEGLImageTargetRenderbufferStorageOES(target, image);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetProgramBinaryOES);
 
     // copy argument program
@@ -4605,17 +4748,18 @@
     arg_binary->add_intvalue((int)binary);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetProgramBinaryOES(program, bufSize, length, binaryFormat, binary);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glProgramBinaryOES(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glProgramBinaryOES);
 
     // copy argument program
@@ -4643,17 +4787,18 @@
     arg_length->add_intvalue(length);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glProgramBinaryOES(program, binaryFormat, binary, length);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void* GLTrace_glMapBufferOES(GLenum target, GLenum access) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMapBufferOES);
 
     // copy argument target
@@ -4669,7 +4814,9 @@
     arg_access->add_intvalue((int)access);
 
     // call function
+    nsecs_t start_time = systemTime();
     void* retValue = glContext->hooks->gl.glMapBufferOES(target, access);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -4677,8 +4824,8 @@
     rt->set_type(GLMessage::DataType::INT);
     rt->add_intvalue((int)retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -4687,7 +4834,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glUnmapBufferOES);
 
     // copy argument target
@@ -4697,7 +4843,9 @@
     arg_target->add_intvalue((int)target);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLboolean retValue = glContext->hooks->gl.glUnmapBufferOES(target);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -4705,8 +4853,8 @@
     rt->set_type(GLMessage::DataType::BOOL);
     rt->add_boolvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -4715,7 +4863,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetBufferPointervOES);
 
     // copy argument target
@@ -4737,17 +4884,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetBufferPointervOES(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexImage3DOES);
 
     // copy argument target
@@ -4811,17 +4959,18 @@
     arg_pixels->add_intvalue((int)pixels);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexImage3DOES(target, level, internalformat, width, height, depth, border, format, type, pixels);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexSubImage3DOES);
 
     // copy argument target
@@ -4891,17 +5040,18 @@
     arg_pixels->add_intvalue((int)pixels);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glCopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCopyTexSubImage3DOES);
 
     // copy argument target
@@ -4959,17 +5109,18 @@
     arg_height->add_intvalue(height);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glCopyTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glCompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCompressedTexImage3DOES);
 
     // copy argument target
@@ -5027,17 +5178,18 @@
     arg_data->add_intvalue((int)data);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glCompressedTexImage3DOES(target, level, internalformat, width, height, depth, border, imageSize, data);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glCompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCompressedTexSubImage3DOES);
 
     // copy argument target
@@ -5107,17 +5259,18 @@
     arg_data->add_intvalue((int)data);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glCompressedTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFramebufferTexture3DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFramebufferTexture3DOES);
 
     // copy argument target
@@ -5157,17 +5310,18 @@
     arg_zoffset->add_intvalue(zoffset);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFramebufferTexture3DOES(target, attachment, textarget, texture, level, zoffset);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBindVertexArrayOES(GLuint array) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBindVertexArrayOES);
 
     // copy argument array
@@ -5177,17 +5331,18 @@
     arg_array->add_intvalue(array);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBindVertexArrayOES(array);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDeleteVertexArraysOES(GLsizei n, const GLuint *arrays) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDeleteVertexArraysOES);
 
     // copy argument n
@@ -5203,17 +5358,18 @@
     arg_arrays->add_intvalue((int)arrays);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDeleteVertexArraysOES(n, arrays);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGenVertexArraysOES(GLsizei n, GLuint *arrays) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGenVertexArraysOES);
 
     // copy argument n
@@ -5229,17 +5385,18 @@
     arg_arrays->add_intvalue((int)arrays);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGenVertexArraysOES(n, arrays);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 GLboolean GLTrace_glIsVertexArrayOES(GLuint array) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glIsVertexArrayOES);
 
     // copy argument array
@@ -5249,7 +5406,9 @@
     arg_array->add_intvalue(array);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLboolean retValue = glContext->hooks->gl.glIsVertexArrayOES(array);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -5257,8 +5416,8 @@
     rt->set_type(GLMessage::DataType::BOOL);
     rt->add_boolvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -5267,7 +5426,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetPerfMonitorGroupsAMD);
 
     // copy argument numGroups
@@ -5289,17 +5447,18 @@
     arg_groups->add_intvalue((int)groups);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetPerfMonitorGroupsAMD(numGroups, groupsSize, groups);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetPerfMonitorCountersAMD(GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetPerfMonitorCountersAMD);
 
     // copy argument group
@@ -5333,17 +5492,18 @@
     arg_counters->add_intvalue((int)counters);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetPerfMonitorCountersAMD(group, numCounters, maxActiveCounters, counterSize, counters);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetPerfMonitorGroupStringAMD(GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetPerfMonitorGroupStringAMD);
 
     // copy argument group
@@ -5371,17 +5531,18 @@
     arg_groupString->add_intvalue((int)groupString);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetPerfMonitorGroupStringAMD(group, bufSize, length, groupString);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetPerfMonitorCounterStringAMD(GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetPerfMonitorCounterStringAMD);
 
     // copy argument group
@@ -5415,17 +5576,18 @@
     arg_counterString->add_intvalue((int)counterString);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetPerfMonitorCounterStringAMD(group, counter, bufSize, length, counterString);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetPerfMonitorCounterInfoAMD(GLuint group, GLuint counter, GLenum pname, GLvoid *data) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetPerfMonitorCounterInfoAMD);
 
     // copy argument group
@@ -5453,17 +5615,18 @@
     arg_data->add_intvalue((int)data);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetPerfMonitorCounterInfoAMD(group, counter, pname, data);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGenPerfMonitorsAMD(GLsizei n, GLuint *monitors) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGenPerfMonitorsAMD);
 
     // copy argument n
@@ -5479,17 +5642,18 @@
     arg_monitors->add_intvalue((int)monitors);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGenPerfMonitorsAMD(n, monitors);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDeletePerfMonitorsAMD(GLsizei n, GLuint *monitors) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDeletePerfMonitorsAMD);
 
     // copy argument n
@@ -5505,17 +5669,18 @@
     arg_monitors->add_intvalue((int)monitors);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDeletePerfMonitorsAMD(n, monitors);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glSelectPerfMonitorCountersAMD(GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glSelectPerfMonitorCountersAMD);
 
     // copy argument monitor
@@ -5549,17 +5714,18 @@
     arg_countersList->add_intvalue((int)countersList);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glSelectPerfMonitorCountersAMD(monitor, enable, group, numCounters, countersList);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBeginPerfMonitorAMD(GLuint monitor) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBeginPerfMonitorAMD);
 
     // copy argument monitor
@@ -5569,17 +5735,18 @@
     arg_monitor->add_intvalue(monitor);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBeginPerfMonitorAMD(monitor);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glEndPerfMonitorAMD(GLuint monitor) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glEndPerfMonitorAMD);
 
     // copy argument monitor
@@ -5589,17 +5756,18 @@
     arg_monitor->add_intvalue(monitor);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glEndPerfMonitorAMD(monitor);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetPerfMonitorCounterDataAMD(GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetPerfMonitorCounterDataAMD);
 
     // copy argument monitor
@@ -5633,17 +5801,18 @@
     arg_bytesWritten->add_intvalue((int)bytesWritten);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetPerfMonitorCounterDataAMD(monitor, pname, dataSize, data, bytesWritten);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum *attachments) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDiscardFramebufferEXT);
 
     // copy argument target
@@ -5665,17 +5834,18 @@
     arg_attachments->add_intvalue((int)attachments);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDiscardFramebufferEXT(target, numAttachments, attachments);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMultiDrawArraysEXT(GLenum mode, GLint *first, GLsizei *count, GLsizei primcount) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMultiDrawArraysEXT);
 
     // copy argument mode
@@ -5703,17 +5873,18 @@
     arg_primcount->add_intvalue(primcount);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMultiDrawArraysEXT(mode, first, count, primcount);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMultiDrawElementsEXT(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMultiDrawElementsEXT);
 
     // copy argument mode
@@ -5747,17 +5918,18 @@
     arg_primcount->add_intvalue(primcount);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMultiDrawElementsEXT(mode, count, type, indices, primcount);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glRenderbufferStorageMultisampleIMG(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glRenderbufferStorageMultisampleIMG);
 
     // copy argument target
@@ -5791,17 +5963,18 @@
     arg_height->add_intvalue(height);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glRenderbufferStorageMultisampleIMG(target, samples, internalformat, width, height);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFramebufferTexture2DMultisampleIMG(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFramebufferTexture2DMultisampleIMG);
 
     // copy argument target
@@ -5841,17 +6014,18 @@
     arg_samples->add_intvalue(samples);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFramebufferTexture2DMultisampleIMG(target, attachment, textarget, texture, level, samples);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDeleteFencesNV(GLsizei n, const GLuint *fences) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDeleteFencesNV);
 
     // copy argument n
@@ -5867,17 +6041,18 @@
     arg_fences->add_intvalue((int)fences);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDeleteFencesNV(n, fences);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGenFencesNV(GLsizei n, GLuint *fences) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGenFencesNV);
 
     // copy argument n
@@ -5893,17 +6068,18 @@
     arg_fences->add_intvalue((int)fences);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGenFencesNV(n, fences);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 GLboolean GLTrace_glIsFenceNV(GLuint fence) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glIsFenceNV);
 
     // copy argument fence
@@ -5913,7 +6089,9 @@
     arg_fence->add_intvalue(fence);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLboolean retValue = glContext->hooks->gl.glIsFenceNV(fence);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -5921,8 +6099,8 @@
     rt->set_type(GLMessage::DataType::BOOL);
     rt->add_boolvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -5931,7 +6109,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTestFenceNV);
 
     // copy argument fence
@@ -5941,7 +6118,9 @@
     arg_fence->add_intvalue(fence);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLboolean retValue = glContext->hooks->gl.glTestFenceNV(fence);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -5949,8 +6128,8 @@
     rt->set_type(GLMessage::DataType::BOOL);
     rt->add_boolvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -5959,7 +6138,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetFenceivNV);
 
     // copy argument fence
@@ -5981,17 +6159,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetFenceivNV(fence, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFinishFenceNV(GLuint fence) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFinishFenceNV);
 
     // copy argument fence
@@ -6001,17 +6180,18 @@
     arg_fence->add_intvalue(fence);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFinishFenceNV(fence);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glSetFenceNV(GLuint fence, GLenum condition) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glSetFenceNV);
 
     // copy argument fence
@@ -6027,17 +6207,18 @@
     arg_condition->add_intvalue((int)condition);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glSetFenceNV(fence, condition);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glCoverageMaskNV(GLboolean mask) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCoverageMaskNV);
 
     // copy argument mask
@@ -6047,17 +6228,18 @@
     arg_mask->add_boolvalue(mask);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glCoverageMaskNV(mask);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glCoverageOperationNV(GLenum operation) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCoverageOperationNV);
 
     // copy argument operation
@@ -6067,17 +6249,18 @@
     arg_operation->add_intvalue((int)operation);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glCoverageOperationNV(operation);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetDriverControlsQCOM(GLint *num, GLsizei size, GLuint *driverControls) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetDriverControlsQCOM);
 
     // copy argument num
@@ -6099,17 +6282,18 @@
     arg_driverControls->add_intvalue((int)driverControls);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetDriverControlsQCOM(num, size, driverControls);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetDriverControlStringQCOM(GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetDriverControlStringQCOM);
 
     // copy argument driverControl
@@ -6137,17 +6321,18 @@
     arg_driverControlString->add_intvalue((int)driverControlString);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetDriverControlStringQCOM(driverControl, bufSize, length, driverControlString);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glEnableDriverControlQCOM(GLuint driverControl) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glEnableDriverControlQCOM);
 
     // copy argument driverControl
@@ -6157,17 +6342,18 @@
     arg_driverControl->add_intvalue(driverControl);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glEnableDriverControlQCOM(driverControl);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDisableDriverControlQCOM(GLuint driverControl) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDisableDriverControlQCOM);
 
     // copy argument driverControl
@@ -6177,17 +6363,18 @@
     arg_driverControl->add_intvalue(driverControl);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDisableDriverControlQCOM(driverControl);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glExtGetTexturesQCOM(GLuint *textures, GLint maxTextures, GLint *numTextures) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glExtGetTexturesQCOM);
 
     // copy argument textures
@@ -6209,17 +6396,18 @@
     arg_numTextures->add_intvalue((int)numTextures);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glExtGetTexturesQCOM(textures, maxTextures, numTextures);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glExtGetBuffersQCOM(GLuint *buffers, GLint maxBuffers, GLint *numBuffers) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glExtGetBuffersQCOM);
 
     // copy argument buffers
@@ -6241,17 +6429,18 @@
     arg_numBuffers->add_intvalue((int)numBuffers);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glExtGetBuffersQCOM(buffers, maxBuffers, numBuffers);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glExtGetRenderbuffersQCOM(GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glExtGetRenderbuffersQCOM);
 
     // copy argument renderbuffers
@@ -6273,17 +6462,18 @@
     arg_numRenderbuffers->add_intvalue((int)numRenderbuffers);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glExtGetRenderbuffersQCOM(renderbuffers, maxRenderbuffers, numRenderbuffers);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glExtGetFramebuffersQCOM(GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glExtGetFramebuffersQCOM);
 
     // copy argument framebuffers
@@ -6305,17 +6495,18 @@
     arg_numFramebuffers->add_intvalue((int)numFramebuffers);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glExtGetFramebuffersQCOM(framebuffers, maxFramebuffers, numFramebuffers);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glExtGetTexLevelParameterivQCOM(GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glExtGetTexLevelParameterivQCOM);
 
     // copy argument texture
@@ -6349,17 +6540,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glExtGetTexLevelParameterivQCOM(texture, face, level, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glExtTexObjectStateOverrideiQCOM(GLenum target, GLenum pname, GLint param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glExtTexObjectStateOverrideiQCOM);
 
     // copy argument target
@@ -6381,17 +6573,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glExtTexObjectStateOverrideiQCOM(target, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glExtGetTexSubImageQCOM(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *texels) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glExtGetTexSubImageQCOM);
 
     // copy argument target
@@ -6461,17 +6654,18 @@
     arg_texels->add_intvalue((int)texels);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glExtGetTexSubImageQCOM(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texels);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glExtGetBufferPointervQCOM(GLenum target, GLvoid **params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glExtGetBufferPointervQCOM);
 
     // copy argument target
@@ -6487,17 +6681,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glExtGetBufferPointervQCOM(target, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glExtGetShadersQCOM(GLuint *shaders, GLint maxShaders, GLint *numShaders) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glExtGetShadersQCOM);
 
     // copy argument shaders
@@ -6519,17 +6714,18 @@
     arg_numShaders->add_intvalue((int)numShaders);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glExtGetShadersQCOM(shaders, maxShaders, numShaders);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glExtGetProgramsQCOM(GLuint *programs, GLint maxPrograms, GLint *numPrograms) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glExtGetProgramsQCOM);
 
     // copy argument programs
@@ -6551,17 +6747,18 @@
     arg_numPrograms->add_intvalue((int)numPrograms);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glExtGetProgramsQCOM(programs, maxPrograms, numPrograms);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 GLboolean GLTrace_glExtIsProgramBinaryQCOM(GLuint program) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glExtIsProgramBinaryQCOM);
 
     // copy argument program
@@ -6571,7 +6768,9 @@
     arg_program->add_intvalue(program);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLboolean retValue = glContext->hooks->gl.glExtIsProgramBinaryQCOM(program);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -6579,8 +6778,8 @@
     rt->set_type(GLMessage::DataType::BOOL);
     rt->add_boolvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -6589,7 +6788,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glExtGetProgramBinarySourceQCOM);
 
     // copy argument program
@@ -6617,17 +6815,18 @@
     arg_length->add_intvalue((int)length);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glExtGetProgramBinarySourceQCOM(program, shadertype, source, length);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glStartTilingQCOM(GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glStartTilingQCOM);
 
     // copy argument x
@@ -6661,17 +6860,18 @@
     arg_preserveMask->add_intvalue(preserveMask);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glStartTilingQCOM(x, y, width, height, preserveMask);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glEndTilingQCOM(GLbitfield preserveMask) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glEndTilingQCOM);
 
     // copy argument preserveMask
@@ -6681,10 +6881,12 @@
     arg_preserveMask->add_intvalue(preserveMask);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glEndTilingQCOM(preserveMask);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 
@@ -6694,7 +6896,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glAlphaFunc);
 
     // copy argument func
@@ -6710,17 +6911,18 @@
     arg_ref->add_floatvalue(ref);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glAlphaFunc(func, ref);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClipPlanef(GLenum plane, const GLfloat *equation) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClipPlanef);
 
     // copy argument plane
@@ -6736,17 +6938,18 @@
     arg_equation->add_intvalue((int)equation);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClipPlanef(plane, equation);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glColor4f);
 
     // copy argument red
@@ -6774,17 +6977,18 @@
     arg_alpha->add_floatvalue(alpha);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glColor4f(red, green, blue, alpha);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFogf(GLenum pname, GLfloat param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFogf);
 
     // copy argument pname
@@ -6800,17 +7004,18 @@
     arg_param->add_floatvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFogf(pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFogfv(GLenum pname, const GLfloat *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFogfv);
 
     // copy argument pname
@@ -6826,17 +7031,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFogfv(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFrustumf(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFrustumf);
 
     // copy argument left
@@ -6876,17 +7082,18 @@
     arg_zFar->add_floatvalue(zFar);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFrustumf(left, right, bottom, top, zNear, zFar);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetClipPlanef(GLenum pname, GLfloat eqn[4]) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetClipPlanef);
 
     // copy argument pname
@@ -6902,17 +7109,18 @@
     arg_eqn->add_intvalue((int)eqn);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetClipPlanef(pname, eqn);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetLightfv(GLenum light, GLenum pname, GLfloat *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetLightfv);
 
     // copy argument light
@@ -6934,17 +7142,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetLightfv(light, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetMaterialfv);
 
     // copy argument face
@@ -6966,17 +7175,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetMaterialfv(face, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetTexEnvfv(GLenum env, GLenum pname, GLfloat *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetTexEnvfv);
 
     // copy argument env
@@ -6998,17 +7208,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetTexEnvfv(env, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLightModelf(GLenum pname, GLfloat param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLightModelf);
 
     // copy argument pname
@@ -7024,17 +7235,18 @@
     arg_param->add_floatvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLightModelf(pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLightModelfv(GLenum pname, const GLfloat *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLightModelfv);
 
     // copy argument pname
@@ -7050,17 +7262,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLightModelfv(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLightf(GLenum light, GLenum pname, GLfloat param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLightf);
 
     // copy argument light
@@ -7082,17 +7295,18 @@
     arg_param->add_floatvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLightf(light, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLightfv(GLenum light, GLenum pname, const GLfloat *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLightfv);
 
     // copy argument light
@@ -7114,17 +7328,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLightfv(light, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLoadMatrixf(const GLfloat *m) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLoadMatrixf);
 
     // copy argument m
@@ -7134,17 +7349,18 @@
     arg_m->add_intvalue((int)m);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLoadMatrixf(m);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMaterialf(GLenum face, GLenum pname, GLfloat param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMaterialf);
 
     // copy argument face
@@ -7166,17 +7382,18 @@
     arg_param->add_floatvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMaterialf(face, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMaterialfv(GLenum face, GLenum pname, const GLfloat *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMaterialfv);
 
     // copy argument face
@@ -7198,17 +7415,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMaterialfv(face, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMultMatrixf(const GLfloat *m) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMultMatrixf);
 
     // copy argument m
@@ -7218,17 +7436,18 @@
     arg_m->add_intvalue((int)m);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMultMatrixf(m);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMultiTexCoord4f);
 
     // copy argument target
@@ -7262,17 +7481,18 @@
     arg_q->add_floatvalue(q);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMultiTexCoord4f(target, s, t, r, q);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glNormal3f);
 
     // copy argument nx
@@ -7294,17 +7514,18 @@
     arg_nz->add_floatvalue(nz);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glNormal3f(nx, ny, nz);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glOrthof(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glOrthof);
 
     // copy argument left
@@ -7344,17 +7565,18 @@
     arg_zFar->add_floatvalue(zFar);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glOrthof(left, right, bottom, top, zNear, zFar);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPointParameterf(GLenum pname, GLfloat param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPointParameterf);
 
     // copy argument pname
@@ -7370,17 +7592,18 @@
     arg_param->add_floatvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPointParameterf(pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPointParameterfv(GLenum pname, const GLfloat *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPointParameterfv);
 
     // copy argument pname
@@ -7396,17 +7619,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPointParameterfv(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPointSize(GLfloat size) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPointSize);
 
     // copy argument size
@@ -7416,17 +7640,18 @@
     arg_size->add_floatvalue(size);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPointSize(size);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glRotatef);
 
     // copy argument angle
@@ -7454,17 +7679,18 @@
     arg_z->add_floatvalue(z);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glRotatef(angle, x, y, z);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glScalef(GLfloat x, GLfloat y, GLfloat z) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glScalef);
 
     // copy argument x
@@ -7486,17 +7712,18 @@
     arg_z->add_floatvalue(z);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glScalef(x, y, z);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexEnvf(GLenum target, GLenum pname, GLfloat param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexEnvf);
 
     // copy argument target
@@ -7518,17 +7745,18 @@
     arg_param->add_floatvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexEnvf(target, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexEnvfv);
 
     // copy argument target
@@ -7550,17 +7778,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexEnvfv(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTranslatef(GLfloat x, GLfloat y, GLfloat z) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTranslatef);
 
     // copy argument x
@@ -7582,17 +7811,18 @@
     arg_z->add_floatvalue(z);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTranslatef(x, y, z);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glAlphaFuncx(GLenum func, GLclampx ref) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glAlphaFuncx);
 
     // copy argument func
@@ -7608,17 +7838,18 @@
     arg_ref->add_intvalue(ref);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glAlphaFuncx(func, ref);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClearColorx(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClearColorx);
 
     // copy argument red
@@ -7646,17 +7877,18 @@
     arg_alpha->add_intvalue(alpha);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClearColorx(red, green, blue, alpha);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClearDepthx(GLclampx depth) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClearDepthx);
 
     // copy argument depth
@@ -7666,17 +7898,18 @@
     arg_depth->add_intvalue(depth);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClearDepthx(depth);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClientActiveTexture(GLenum texture) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClientActiveTexture);
 
     // copy argument texture
@@ -7686,17 +7919,18 @@
     arg_texture->add_intvalue((int)texture);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClientActiveTexture(texture);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClipPlanex(GLenum plane, const GLfixed *equation) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClipPlanex);
 
     // copy argument plane
@@ -7712,17 +7946,18 @@
     arg_equation->add_intvalue((int)equation);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClipPlanex(plane, equation);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glColor4ub);
 
     // copy argument red
@@ -7750,17 +7985,18 @@
     arg_alpha->add_intvalue((int)alpha);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glColor4ub(red, green, blue, alpha);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glColor4x(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glColor4x);
 
     // copy argument red
@@ -7788,17 +8024,18 @@
     arg_alpha->add_intvalue(alpha);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glColor4x(red, green, blue, alpha);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glColorPointer);
 
     // copy argument size
@@ -7826,17 +8063,18 @@
     arg_pointer->add_intvalue((int)pointer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glColorPointer(size, type, stride, pointer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDepthRangex(GLclampx zNear, GLclampx zFar) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDepthRangex);
 
     // copy argument zNear
@@ -7852,17 +8090,18 @@
     arg_zFar->add_intvalue(zFar);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDepthRangex(zNear, zFar);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDisableClientState(GLenum array) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDisableClientState);
 
     // copy argument array
@@ -7872,17 +8111,18 @@
     arg_array->add_intvalue((int)array);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDisableClientState(array);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glEnableClientState(GLenum array) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glEnableClientState);
 
     // copy argument array
@@ -7892,17 +8132,18 @@
     arg_array->add_intvalue((int)array);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glEnableClientState(array);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFogx(GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFogx);
 
     // copy argument pname
@@ -7918,17 +8159,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFogx(pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFogxv(GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFogxv);
 
     // copy argument pname
@@ -7944,17 +8186,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFogxv(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFrustumx(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFrustumx);
 
     // copy argument left
@@ -7994,17 +8237,18 @@
     arg_zFar->add_intvalue(zFar);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFrustumx(left, right, bottom, top, zNear, zFar);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetClipPlanex(GLenum pname, GLfixed eqn[4]) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetClipPlanex);
 
     // copy argument pname
@@ -8020,17 +8264,18 @@
     arg_eqn->add_intvalue((int)eqn);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetClipPlanex(pname, eqn);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetFixedv(GLenum pname, GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetFixedv);
 
     // copy argument pname
@@ -8046,17 +8291,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetFixedv(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetLightxv(GLenum light, GLenum pname, GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetLightxv);
 
     // copy argument light
@@ -8078,17 +8324,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetLightxv(light, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetMaterialxv(GLenum face, GLenum pname, GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetMaterialxv);
 
     // copy argument face
@@ -8110,17 +8357,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetMaterialxv(face, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetPointerv(GLenum pname, GLvoid **params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetPointerv);
 
     // copy argument pname
@@ -8136,17 +8384,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetPointerv(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetTexEnviv(GLenum env, GLenum pname, GLint *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetTexEnviv);
 
     // copy argument env
@@ -8168,17 +8417,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetTexEnviv(env, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetTexEnvxv(GLenum env, GLenum pname, GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetTexEnvxv);
 
     // copy argument env
@@ -8200,17 +8450,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetTexEnvxv(env, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetTexParameterxv(GLenum target, GLenum pname, GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetTexParameterxv);
 
     // copy argument target
@@ -8232,17 +8483,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetTexParameterxv(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLightModelx(GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLightModelx);
 
     // copy argument pname
@@ -8258,17 +8510,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLightModelx(pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLightModelxv(GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLightModelxv);
 
     // copy argument pname
@@ -8284,17 +8537,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLightModelxv(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLightx(GLenum light, GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLightx);
 
     // copy argument light
@@ -8316,17 +8570,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLightx(light, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLightxv(GLenum light, GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLightxv);
 
     // copy argument light
@@ -8348,17 +8603,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLightxv(light, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLineWidthx(GLfixed width) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLineWidthx);
 
     // copy argument width
@@ -8368,31 +8624,33 @@
     arg_width->add_intvalue(width);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLineWidthx(width);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLoadIdentity(void) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLoadIdentity);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLoadIdentity();
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLoadMatrixx(const GLfixed *m) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLoadMatrixx);
 
     // copy argument m
@@ -8402,17 +8660,18 @@
     arg_m->add_intvalue((int)m);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLoadMatrixx(m);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLogicOp(GLenum opcode) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLogicOp);
 
     // copy argument opcode
@@ -8422,17 +8681,18 @@
     arg_opcode->add_intvalue((int)opcode);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLogicOp(opcode);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMaterialx(GLenum face, GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMaterialx);
 
     // copy argument face
@@ -8454,17 +8714,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMaterialx(face, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMaterialxv(GLenum face, GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMaterialxv);
 
     // copy argument face
@@ -8486,17 +8747,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMaterialxv(face, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMatrixMode(GLenum mode) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMatrixMode);
 
     // copy argument mode
@@ -8506,17 +8768,18 @@
     arg_mode->add_intvalue((int)mode);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMatrixMode(mode);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMultMatrixx(const GLfixed *m) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMultMatrixx);
 
     // copy argument m
@@ -8526,17 +8789,18 @@
     arg_m->add_intvalue((int)m);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMultMatrixx(m);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMultiTexCoord4x(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMultiTexCoord4x);
 
     // copy argument target
@@ -8570,17 +8834,18 @@
     arg_q->add_intvalue(q);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMultiTexCoord4x(target, s, t, r, q);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glNormal3x(GLfixed nx, GLfixed ny, GLfixed nz) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glNormal3x);
 
     // copy argument nx
@@ -8602,17 +8867,18 @@
     arg_nz->add_intvalue(nz);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glNormal3x(nx, ny, nz);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glNormalPointer);
 
     // copy argument type
@@ -8634,17 +8900,18 @@
     arg_pointer->add_intvalue((int)pointer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glNormalPointer(type, stride, pointer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glOrthox(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glOrthox);
 
     // copy argument left
@@ -8684,17 +8951,18 @@
     arg_zFar->add_intvalue(zFar);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glOrthox(left, right, bottom, top, zNear, zFar);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPointParameterx(GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPointParameterx);
 
     // copy argument pname
@@ -8710,17 +8978,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPointParameterx(pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPointParameterxv(GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPointParameterxv);
 
     // copy argument pname
@@ -8736,17 +9005,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPointParameterxv(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPointSizex(GLfixed size) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPointSizex);
 
     // copy argument size
@@ -8756,17 +9026,18 @@
     arg_size->add_intvalue(size);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPointSizex(size);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPolygonOffsetx(GLfixed factor, GLfixed units) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPolygonOffsetx);
 
     // copy argument factor
@@ -8782,45 +9053,48 @@
     arg_units->add_intvalue(units);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPolygonOffsetx(factor, units);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPopMatrix(void) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPopMatrix);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPopMatrix();
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPushMatrix(void) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPushMatrix);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPushMatrix();
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glRotatex(GLfixed angle, GLfixed x, GLfixed y, GLfixed z) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glRotatex);
 
     // copy argument angle
@@ -8848,17 +9122,18 @@
     arg_z->add_intvalue(z);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glRotatex(angle, x, y, z);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glSampleCoveragex(GLclampx value, GLboolean invert) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glSampleCoveragex);
 
     // copy argument value
@@ -8874,17 +9149,18 @@
     arg_invert->add_boolvalue(invert);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glSampleCoveragex(value, invert);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glScalex(GLfixed x, GLfixed y, GLfixed z) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glScalex);
 
     // copy argument x
@@ -8906,17 +9182,18 @@
     arg_z->add_intvalue(z);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glScalex(x, y, z);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glShadeModel(GLenum mode) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glShadeModel);
 
     // copy argument mode
@@ -8926,17 +9203,18 @@
     arg_mode->add_intvalue((int)mode);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glShadeModel(mode);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexCoordPointer);
 
     // copy argument size
@@ -8964,17 +9242,18 @@
     arg_pointer->add_intvalue((int)pointer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexCoordPointer(size, type, stride, pointer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexEnvi(GLenum target, GLenum pname, GLint param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexEnvi);
 
     // copy argument target
@@ -8996,17 +9275,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexEnvi(target, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexEnvx(GLenum target, GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexEnvx);
 
     // copy argument target
@@ -9028,17 +9308,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexEnvx(target, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexEnviv(GLenum target, GLenum pname, const GLint *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexEnviv);
 
     // copy argument target
@@ -9060,17 +9341,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexEnviv(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexEnvxv(GLenum target, GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexEnvxv);
 
     // copy argument target
@@ -9092,17 +9374,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexEnvxv(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexParameterx(GLenum target, GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexParameterx);
 
     // copy argument target
@@ -9124,17 +9407,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexParameterx(target, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexParameterxv(GLenum target, GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexParameterxv);
 
     // copy argument target
@@ -9156,17 +9440,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexParameterxv(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTranslatex(GLfixed x, GLfixed y, GLfixed z) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTranslatex);
 
     // copy argument x
@@ -9188,17 +9473,18 @@
     arg_z->add_intvalue(z);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTranslatex(x, y, z);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glVertexPointer);
 
     // copy argument size
@@ -9226,17 +9512,18 @@
     arg_pointer->add_intvalue((int)pointer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glVertexPointer(size, type, stride, pointer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPointSizePointerOES(GLenum type, GLsizei stride, const GLvoid *pointer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPointSizePointerOES);
 
     // copy argument type
@@ -9258,10 +9545,12 @@
     arg_pointer->add_intvalue((int)pointer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPointSizePointerOES(type, stride, pointer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 
@@ -9271,7 +9560,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBlendEquationSeparateOES);
 
     // copy argument modeRGB
@@ -9287,17 +9575,18 @@
     arg_modeAlpha->add_intvalue((int)modeAlpha);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBlendEquationSeparateOES(modeRGB, modeAlpha);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBlendFuncSeparateOES(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBlendFuncSeparateOES);
 
     // copy argument srcRGB
@@ -9325,17 +9614,18 @@
     arg_dstAlpha->add_intvalue((int)dstAlpha);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBlendFuncSeparateOES(srcRGB, dstRGB, srcAlpha, dstAlpha);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glBlendEquationOES(GLenum mode) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBlendEquationOES);
 
     // copy argument mode
@@ -9345,17 +9635,18 @@
     arg_mode->add_intvalue((int)mode);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBlendEquationOES(mode);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDrawTexsOES(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDrawTexsOES);
 
     // copy argument x
@@ -9389,17 +9680,18 @@
     arg_height->add_intvalue(height);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDrawTexsOES(x, y, z, width, height);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDrawTexiOES(GLint x, GLint y, GLint z, GLint width, GLint height) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDrawTexiOES);
 
     // copy argument x
@@ -9433,17 +9725,18 @@
     arg_height->add_intvalue(height);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDrawTexiOES(x, y, z, width, height);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDrawTexxOES(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDrawTexxOES);
 
     // copy argument x
@@ -9477,17 +9770,18 @@
     arg_height->add_intvalue(height);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDrawTexxOES(x, y, z, width, height);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDrawTexsvOES(const GLshort *coords) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDrawTexsvOES);
 
     // copy argument coords
@@ -9497,17 +9791,18 @@
     arg_coords->add_intvalue((int)coords);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDrawTexsvOES(coords);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDrawTexivOES(const GLint *coords) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDrawTexivOES);
 
     // copy argument coords
@@ -9517,17 +9812,18 @@
     arg_coords->add_intvalue((int)coords);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDrawTexivOES(coords);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDrawTexxvOES(const GLfixed *coords) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDrawTexxvOES);
 
     // copy argument coords
@@ -9537,17 +9833,18 @@
     arg_coords->add_intvalue((int)coords);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDrawTexxvOES(coords);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDrawTexfOES(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDrawTexfOES);
 
     // copy argument x
@@ -9581,17 +9878,18 @@
     arg_height->add_floatvalue(height);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDrawTexfOES(x, y, z, width, height);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDrawTexfvOES(const GLfloat *coords) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDrawTexfvOES);
 
     // copy argument coords
@@ -9601,17 +9899,18 @@
     arg_coords->add_intvalue((int)coords);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDrawTexfvOES(coords);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glAlphaFuncxOES(GLenum func, GLclampx ref) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glAlphaFuncxOES);
 
     // copy argument func
@@ -9627,17 +9926,18 @@
     arg_ref->add_intvalue(ref);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glAlphaFuncxOES(func, ref);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClearColorxOES(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClearColorxOES);
 
     // copy argument red
@@ -9665,17 +9965,18 @@
     arg_alpha->add_intvalue(alpha);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClearColorxOES(red, green, blue, alpha);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClearDepthxOES(GLclampx depth) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClearDepthxOES);
 
     // copy argument depth
@@ -9685,17 +9986,18 @@
     arg_depth->add_intvalue(depth);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClearDepthxOES(depth);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClipPlanexOES(GLenum plane, const GLfixed *equation) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClipPlanexOES);
 
     // copy argument plane
@@ -9711,17 +10013,18 @@
     arg_equation->add_intvalue((int)equation);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClipPlanexOES(plane, equation);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glColor4xOES(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glColor4xOES);
 
     // copy argument red
@@ -9749,17 +10052,18 @@
     arg_alpha->add_intvalue(alpha);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glColor4xOES(red, green, blue, alpha);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDepthRangexOES(GLclampx zNear, GLclampx zFar) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDepthRangexOES);
 
     // copy argument zNear
@@ -9775,17 +10079,18 @@
     arg_zFar->add_intvalue(zFar);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDepthRangexOES(zNear, zFar);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFogxOES(GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFogxOES);
 
     // copy argument pname
@@ -9801,17 +10106,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFogxOES(pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFogxvOES(GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFogxvOES);
 
     // copy argument pname
@@ -9827,17 +10133,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFogxvOES(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFrustumxOES(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFrustumxOES);
 
     // copy argument left
@@ -9877,17 +10184,18 @@
     arg_zFar->add_intvalue(zFar);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFrustumxOES(left, right, bottom, top, zNear, zFar);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetClipPlanexOES(GLenum pname, GLfixed eqn[4]) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetClipPlanexOES);
 
     // copy argument pname
@@ -9903,17 +10211,18 @@
     arg_eqn->add_intvalue((int)eqn);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetClipPlanexOES(pname, eqn);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetFixedvOES(GLenum pname, GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetFixedvOES);
 
     // copy argument pname
@@ -9929,17 +10238,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetFixedvOES(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetLightxvOES(GLenum light, GLenum pname, GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetLightxvOES);
 
     // copy argument light
@@ -9961,17 +10271,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetLightxvOES(light, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetMaterialxvOES(GLenum face, GLenum pname, GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetMaterialxvOES);
 
     // copy argument face
@@ -9993,17 +10304,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetMaterialxvOES(face, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetTexEnvxvOES(GLenum env, GLenum pname, GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetTexEnvxvOES);
 
     // copy argument env
@@ -10025,17 +10337,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetTexEnvxvOES(env, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetTexParameterxvOES(GLenum target, GLenum pname, GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetTexParameterxvOES);
 
     // copy argument target
@@ -10057,17 +10370,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetTexParameterxvOES(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLightModelxOES(GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLightModelxOES);
 
     // copy argument pname
@@ -10083,17 +10397,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLightModelxOES(pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLightModelxvOES(GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLightModelxvOES);
 
     // copy argument pname
@@ -10109,17 +10424,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLightModelxvOES(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLightxOES(GLenum light, GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLightxOES);
 
     // copy argument light
@@ -10141,17 +10457,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLightxOES(light, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLightxvOES(GLenum light, GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLightxvOES);
 
     // copy argument light
@@ -10173,17 +10490,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLightxvOES(light, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLineWidthxOES(GLfixed width) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLineWidthxOES);
 
     // copy argument width
@@ -10193,17 +10511,18 @@
     arg_width->add_intvalue(width);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLineWidthxOES(width);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLoadMatrixxOES(const GLfixed *m) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLoadMatrixxOES);
 
     // copy argument m
@@ -10213,17 +10532,18 @@
     arg_m->add_intvalue((int)m);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLoadMatrixxOES(m);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMaterialxOES(GLenum face, GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMaterialxOES);
 
     // copy argument face
@@ -10245,17 +10565,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMaterialxOES(face, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMaterialxvOES(GLenum face, GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMaterialxvOES);
 
     // copy argument face
@@ -10277,17 +10598,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMaterialxvOES(face, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMultMatrixxOES(const GLfixed *m) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMultMatrixxOES);
 
     // copy argument m
@@ -10297,17 +10619,18 @@
     arg_m->add_intvalue((int)m);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMultMatrixxOES(m);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMultiTexCoord4xOES(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMultiTexCoord4xOES);
 
     // copy argument target
@@ -10341,17 +10664,18 @@
     arg_q->add_intvalue(q);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMultiTexCoord4xOES(target, s, t, r, q);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glNormal3xOES(GLfixed nx, GLfixed ny, GLfixed nz) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glNormal3xOES);
 
     // copy argument nx
@@ -10373,17 +10697,18 @@
     arg_nz->add_intvalue(nz);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glNormal3xOES(nx, ny, nz);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glOrthoxOES(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glOrthoxOES);
 
     // copy argument left
@@ -10423,17 +10748,18 @@
     arg_zFar->add_intvalue(zFar);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glOrthoxOES(left, right, bottom, top, zNear, zFar);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPointParameterxOES(GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPointParameterxOES);
 
     // copy argument pname
@@ -10449,17 +10775,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPointParameterxOES(pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPointParameterxvOES(GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPointParameterxvOES);
 
     // copy argument pname
@@ -10475,17 +10802,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPointParameterxvOES(pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPointSizexOES(GLfixed size) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPointSizexOES);
 
     // copy argument size
@@ -10495,17 +10823,18 @@
     arg_size->add_intvalue(size);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPointSizexOES(size);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glPolygonOffsetxOES(GLfixed factor, GLfixed units) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glPolygonOffsetxOES);
 
     // copy argument factor
@@ -10521,17 +10850,18 @@
     arg_units->add_intvalue(units);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glPolygonOffsetxOES(factor, units);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glRotatexOES(GLfixed angle, GLfixed x, GLfixed y, GLfixed z) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glRotatexOES);
 
     // copy argument angle
@@ -10559,17 +10889,18 @@
     arg_z->add_intvalue(z);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glRotatexOES(angle, x, y, z);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glSampleCoveragexOES(GLclampx value, GLboolean invert) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glSampleCoveragexOES);
 
     // copy argument value
@@ -10585,17 +10916,18 @@
     arg_invert->add_boolvalue(invert);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glSampleCoveragexOES(value, invert);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glScalexOES(GLfixed x, GLfixed y, GLfixed z) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glScalexOES);
 
     // copy argument x
@@ -10617,17 +10949,18 @@
     arg_z->add_intvalue(z);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glScalexOES(x, y, z);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexEnvxOES(GLenum target, GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexEnvxOES);
 
     // copy argument target
@@ -10649,17 +10982,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexEnvxOES(target, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexEnvxvOES(GLenum target, GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexEnvxvOES);
 
     // copy argument target
@@ -10681,17 +11015,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexEnvxvOES(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexParameterxOES(GLenum target, GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexParameterxOES);
 
     // copy argument target
@@ -10713,17 +11048,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexParameterxOES(target, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexParameterxvOES(GLenum target, GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexParameterxvOES);
 
     // copy argument target
@@ -10745,17 +11081,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexParameterxvOES(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTranslatexOES(GLfixed x, GLfixed y, GLfixed z) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTranslatexOES);
 
     // copy argument x
@@ -10777,17 +11114,18 @@
     arg_z->add_intvalue(z);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTranslatexOES(x, y, z);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 GLboolean GLTrace_glIsRenderbufferOES(GLuint renderbuffer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glIsRenderbufferOES);
 
     // copy argument renderbuffer
@@ -10797,7 +11135,9 @@
     arg_renderbuffer->add_intvalue(renderbuffer);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLboolean retValue = glContext->hooks->gl.glIsRenderbufferOES(renderbuffer);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -10805,8 +11145,8 @@
     rt->set_type(GLMessage::DataType::BOOL);
     rt->add_boolvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -10815,7 +11155,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBindRenderbufferOES);
 
     // copy argument target
@@ -10831,17 +11170,18 @@
     arg_renderbuffer->add_intvalue(renderbuffer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBindRenderbufferOES(target, renderbuffer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDeleteRenderbuffersOES(GLsizei n, const GLuint* renderbuffers) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDeleteRenderbuffersOES);
 
     // copy argument n
@@ -10857,17 +11197,18 @@
     arg_renderbuffers->add_intvalue((int)renderbuffers);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDeleteRenderbuffersOES(n, renderbuffers);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGenRenderbuffersOES(GLsizei n, GLuint* renderbuffers) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGenRenderbuffersOES);
 
     // copy argument n
@@ -10883,17 +11224,18 @@
     arg_renderbuffers->add_intvalue((int)renderbuffers);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGenRenderbuffersOES(n, renderbuffers);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glRenderbufferStorageOES(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glRenderbufferStorageOES);
 
     // copy argument target
@@ -10921,17 +11263,18 @@
     arg_height->add_intvalue(height);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glRenderbufferStorageOES(target, internalformat, width, height);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetRenderbufferParameterivOES(GLenum target, GLenum pname, GLint* params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetRenderbufferParameterivOES);
 
     // copy argument target
@@ -10953,17 +11296,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetRenderbufferParameterivOES(target, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 GLboolean GLTrace_glIsFramebufferOES(GLuint framebuffer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glIsFramebufferOES);
 
     // copy argument framebuffer
@@ -10973,7 +11317,9 @@
     arg_framebuffer->add_intvalue(framebuffer);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLboolean retValue = glContext->hooks->gl.glIsFramebufferOES(framebuffer);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -10981,8 +11327,8 @@
     rt->set_type(GLMessage::DataType::BOOL);
     rt->add_boolvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -10991,7 +11337,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glBindFramebufferOES);
 
     // copy argument target
@@ -11007,17 +11352,18 @@
     arg_framebuffer->add_intvalue(framebuffer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glBindFramebufferOES(target, framebuffer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glDeleteFramebuffersOES(GLsizei n, const GLuint* framebuffers) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDeleteFramebuffersOES);
 
     // copy argument n
@@ -11033,17 +11379,18 @@
     arg_framebuffers->add_intvalue((int)framebuffers);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDeleteFramebuffersOES(n, framebuffers);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGenFramebuffersOES(GLsizei n, GLuint* framebuffers) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGenFramebuffersOES);
 
     // copy argument n
@@ -11059,17 +11406,18 @@
     arg_framebuffers->add_intvalue((int)framebuffers);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGenFramebuffersOES(n, framebuffers);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 GLenum GLTrace_glCheckFramebufferStatusOES(GLenum target) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCheckFramebufferStatusOES);
 
     // copy argument target
@@ -11079,7 +11427,9 @@
     arg_target->add_intvalue((int)target);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLenum retValue = glContext->hooks->gl.glCheckFramebufferStatusOES(target);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -11087,8 +11437,8 @@
     rt->set_type(GLMessage::DataType::ENUM);
     rt->add_intvalue((int)retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -11097,7 +11447,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFramebufferRenderbufferOES);
 
     // copy argument target
@@ -11125,17 +11474,18 @@
     arg_renderbuffer->add_intvalue(renderbuffer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFramebufferRenderbufferOES(target, attachment, renderbuffertarget, renderbuffer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFramebufferTexture2DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFramebufferTexture2DOES);
 
     // copy argument target
@@ -11169,17 +11519,18 @@
     arg_level->add_intvalue(level);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFramebufferTexture2DOES(target, attachment, textarget, texture, level);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetFramebufferAttachmentParameterivOES(GLenum target, GLenum attachment, GLenum pname, GLint* params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetFramebufferAttachmentParameterivOES);
 
     // copy argument target
@@ -11207,17 +11558,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetFramebufferAttachmentParameterivOES(target, attachment, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGenerateMipmapOES(GLenum target) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGenerateMipmapOES);
 
     // copy argument target
@@ -11227,17 +11579,18 @@
     arg_target->add_intvalue((int)target);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGenerateMipmapOES(target);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glCurrentPaletteMatrixOES(GLuint matrixpaletteindex) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glCurrentPaletteMatrixOES);
 
     // copy argument matrixpaletteindex
@@ -11247,31 +11600,33 @@
     arg_matrixpaletteindex->add_intvalue(matrixpaletteindex);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glCurrentPaletteMatrixOES(matrixpaletteindex);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glLoadPaletteFromModelViewMatrixOES(void) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glLoadPaletteFromModelViewMatrixOES);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glLoadPaletteFromModelViewMatrixOES();
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glMatrixIndexPointerOES(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glMatrixIndexPointerOES);
 
     // copy argument size
@@ -11299,17 +11654,18 @@
     arg_pointer->add_intvalue((int)pointer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glMatrixIndexPointerOES(size, type, stride, pointer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glWeightPointerOES(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glWeightPointerOES);
 
     // copy argument size
@@ -11337,17 +11693,18 @@
     arg_pointer->add_intvalue((int)pointer);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glWeightPointerOES(size, type, stride, pointer);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 GLbitfield GLTrace_glQueryMatrixxOES(GLfixed mantissa[16], GLint exponent[16]) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glQueryMatrixxOES);
 
     // copy argument mantissa
@@ -11363,7 +11720,9 @@
     arg_exponent->add_intvalue((int)exponent);
 
     // call function
+    nsecs_t start_time = systemTime();
     GLbitfield retValue = glContext->hooks->gl.glQueryMatrixxOES(mantissa, exponent);
+    nsecs_t end_time = systemTime();
 
     // set return value
     GLMessage_DataType *rt = glmsg.mutable_returnvalue();
@@ -11371,8 +11730,8 @@
     rt->set_type(GLMessage::DataType::INT);
     rt->add_intvalue(retValue);
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 
     return retValue;
 }
@@ -11381,7 +11740,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glDepthRangefOES);
 
     // copy argument zNear
@@ -11397,17 +11755,18 @@
     arg_zFar->add_floatvalue(zFar);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glDepthRangefOES(zNear, zFar);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glFrustumfOES(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glFrustumfOES);
 
     // copy argument left
@@ -11447,17 +11806,18 @@
     arg_zFar->add_floatvalue(zFar);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glFrustumfOES(left, right, bottom, top, zNear, zFar);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glOrthofOES(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glOrthofOES);
 
     // copy argument left
@@ -11497,17 +11857,18 @@
     arg_zFar->add_floatvalue(zFar);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glOrthofOES(left, right, bottom, top, zNear, zFar);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClipPlanefOES(GLenum plane, const GLfloat *equation) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClipPlanefOES);
 
     // copy argument plane
@@ -11523,17 +11884,18 @@
     arg_equation->add_intvalue((int)equation);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClipPlanefOES(plane, equation);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetClipPlanefOES(GLenum pname, GLfloat eqn[4]) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetClipPlanefOES);
 
     // copy argument pname
@@ -11549,17 +11911,18 @@
     arg_eqn->add_intvalue((int)eqn);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetClipPlanefOES(pname, eqn);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClearDepthfOES(GLclampf depth) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClearDepthfOES);
 
     // copy argument depth
@@ -11569,17 +11932,18 @@
     arg_depth->add_floatvalue(depth);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClearDepthfOES(depth);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexGenfOES(GLenum coord, GLenum pname, GLfloat param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexGenfOES);
 
     // copy argument coord
@@ -11601,17 +11965,18 @@
     arg_param->add_floatvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexGenfOES(coord, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexGenfvOES(GLenum coord, GLenum pname, const GLfloat *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexGenfvOES);
 
     // copy argument coord
@@ -11633,17 +11998,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexGenfvOES(coord, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexGeniOES(GLenum coord, GLenum pname, GLint param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexGeniOES);
 
     // copy argument coord
@@ -11665,17 +12031,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexGeniOES(coord, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexGenivOES(GLenum coord, GLenum pname, const GLint *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexGenivOES);
 
     // copy argument coord
@@ -11697,17 +12064,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexGenivOES(coord, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexGenxOES(GLenum coord, GLenum pname, GLfixed param) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexGenxOES);
 
     // copy argument coord
@@ -11729,17 +12097,18 @@
     arg_param->add_intvalue(param);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexGenxOES(coord, pname, param);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glTexGenxvOES(GLenum coord, GLenum pname, const GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glTexGenxvOES);
 
     // copy argument coord
@@ -11761,17 +12130,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glTexGenxvOES(coord, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetTexGenfvOES(GLenum coord, GLenum pname, GLfloat *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetTexGenfvOES);
 
     // copy argument coord
@@ -11793,17 +12163,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetTexGenfvOES(coord, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetTexGenivOES(GLenum coord, GLenum pname, GLint *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetTexGenivOES);
 
     // copy argument coord
@@ -11825,17 +12196,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetTexGenivOES(coord, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glGetTexGenxvOES(GLenum coord, GLenum pname, GLfixed *params) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glGetTexGenxvOES);
 
     // copy argument coord
@@ -11857,17 +12229,18 @@
     arg_params->add_intvalue((int)params);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glGetTexGenxvOES(coord, pname, params);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClipPlanefIMG(GLenum p, const GLfloat *eqn) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClipPlanefIMG);
 
     // copy argument p
@@ -11883,17 +12256,18 @@
     arg_eqn->add_intvalue((int)eqn);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClipPlanefIMG(p, eqn);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 void GLTrace_glClipPlanexIMG(GLenum p, const GLfixed *eqn) {
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::glClipPlanexIMG);
 
     // copy argument p
@@ -11909,13 +12283,14 @@
     arg_eqn->add_intvalue((int)eqn);
 
     // call function
+    nsecs_t start_time = systemTime();
     glContext->hooks->gl.glClipPlanexIMG(p, eqn);
+    nsecs_t end_time = systemTime();
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 }
 
 
-
 }; // namespace gltrace
 }; // namespace android
diff --git a/opengl/libs/GLES_trace/src/gltrace_api.h b/opengl/libs/GLES_trace/src/gltrace_api.h
index a13ede3..71b5a58 100644
--- a/opengl/libs/GLES_trace/src/gltrace_api.h
+++ b/opengl/libs/GLES_trace/src/gltrace_api.h
@@ -16,18 +16,9 @@
  * THIS FILE WAS GENERATED BY A SCRIPT. DO NOT EDIT.
  */
 
-#include <cutils/log.h>
-#include <GLES2/gl2.h>
-
-#include "gltrace.pb.h"
-#include "gltrace_context.h"
-#include "gltrace_fixup.h"
-#include "gltrace_transport.h"
-
 namespace android {
 namespace gltrace {
 
-
 // Declarations for GL2 APIs
 
 void GLTrace_glActiveTexture(GLenum texture);
@@ -416,6 +407,5 @@
 void GLTrace_glClipPlanefIMG(GLenum p, const GLfloat *eqn);
 void GLTrace_glClipPlanexIMG(GLenum p, const GLfixed *eqn);
 
-
 }; // namespace gltrace
 }; // namespace android
diff --git a/opengl/libs/GLES_trace/src/gltrace_context.cpp b/opengl/libs/GLES_trace/src/gltrace_context.cpp
index 8cf5a51..65b7662 100644
--- a/opengl/libs/GLES_trace/src/gltrace_context.cpp
+++ b/opengl/libs/GLES_trace/src/gltrace_context.cpp
@@ -15,6 +15,7 @@
  */
 
 #include <pthread.h>
+#include <cutils/log.h>
 
 extern "C" {
 #include "liblzf/lzf.h"
@@ -42,12 +43,8 @@
     pthread_setspecific(sTLSKey, c);
 }
 
-void initContext(unsigned version, gl_hooks_t *hooks) {
+void setupTraceContextThreadSpecific(GLTraceContext *context) {
     pthread_once(&sPthreadOnceKey, createTLSKey);
-
-    GLTraceContext *context = new GLTraceContext();
-    context->hooks = hooks;
-
     setGLTraceContext(context);
 }
 
@@ -59,9 +56,94 @@
     }
 }
 
-GLTraceContext::GLTraceContext() {
+GLTraceState::GLTraceState(TCPStream *stream) {
+    mTraceContextIds = 0;
+    mStream = stream;
+
+    mCollectFbOnEglSwap = false;
+    mCollectFbOnGlDraw = false;
+    mCollectTextureDataOnGlTexImage = false;
+    pthread_rwlock_init(&mTraceOptionsRwLock, NULL);
+}
+
+GLTraceState::~GLTraceState() {
+    if (mStream) {
+        mStream->closeStream();
+        mStream = NULL;
+    }
+}
+
+TCPStream *GLTraceState::getStream() {
+    return mStream;
+}
+
+void GLTraceState::safeSetValue(bool *ptr, bool value, pthread_rwlock_t *lock) {
+    pthread_rwlock_wrlock(lock);
+    *ptr = value;
+    pthread_rwlock_unlock(lock);
+}
+
+bool GLTraceState::safeGetValue(bool *ptr, pthread_rwlock_t *lock) {
+    pthread_rwlock_rdlock(lock);
+    bool value = *ptr;
+    pthread_rwlock_unlock(lock);
+    return value;
+}
+
+void GLTraceState::setCollectFbOnEglSwap(bool en) {
+    safeSetValue(&mCollectFbOnEglSwap, en, &mTraceOptionsRwLock);
+}
+
+void GLTraceState::setCollectFbOnGlDraw(bool en) {
+    safeSetValue(&mCollectFbOnGlDraw, en, &mTraceOptionsRwLock);
+}
+
+void GLTraceState::setCollectTextureDataOnGlTexImage(bool en) {
+    safeSetValue(&mCollectTextureDataOnGlTexImage, en, &mTraceOptionsRwLock);
+}
+
+bool GLTraceState::shouldCollectFbOnEglSwap() {
+    return safeGetValue(&mCollectFbOnEglSwap, &mTraceOptionsRwLock);
+}
+
+bool GLTraceState::shouldCollectFbOnGlDraw() {
+    return safeGetValue(&mCollectFbOnGlDraw, &mTraceOptionsRwLock);
+}
+
+bool GLTraceState::shouldCollectTextureDataOnGlTexImage() {
+    return safeGetValue(&mCollectTextureDataOnGlTexImage, &mTraceOptionsRwLock);
+}
+
+GLTraceContext *GLTraceState::createTraceContext(int version, EGLContext eglContext) {
+    int id = __sync_fetch_and_add(&mTraceContextIds, 1);
+
+    const size_t DEFAULT_BUFFER_SIZE = 8192;
+    BufferedOutputStream *stream = new BufferedOutputStream(mStream, DEFAULT_BUFFER_SIZE);
+    GLTraceContext *traceContext = new GLTraceContext(id, this, stream);
+    mPerContextState[eglContext] = traceContext;
+
+    return traceContext;
+}
+
+GLTraceContext *GLTraceState::getTraceContext(EGLContext c) {
+    return mPerContextState[c];
+}
+
+GLTraceContext::GLTraceContext(int id, GLTraceState *state, BufferedOutputStream *stream) {
+    mId = id;
+    mState = state;
+
     fbcontents = fbcompressed = NULL;
     fbcontentsSize = 0;
+    mBufferedOutputStream = stream;
+}
+
+int GLTraceContext::getId() {
+    return mId;
+}
+
+GLTraceState *GLTraceContext::getGlobalTraceState() {
+    return mState;
 }
 
 void GLTraceContext::resizeFBMemory(unsigned minSize) {
@@ -82,24 +164,49 @@
 
 /** obtain a pointer to the compressed framebuffer image */
 void GLTraceContext::getCompressedFB(void **fb, unsigned *fbsize, unsigned *fbwidth, 
-                            unsigned *fbheight) {
+                            unsigned *fbheight, FBBinding fbToRead) {
     int viewport[4] = {};
     hooks->gl.glGetIntegerv(GL_VIEWPORT, viewport);
     unsigned fbContentsSize = viewport[2] * viewport[3] * 4;
 
     resizeFBMemory(fbContentsSize);
 
-    //TODO: On eglSwapBuffer, read FB0. For glDraw calls, read currently
-    //      bound FB.
-    //hooks->gl.glGetIntegerv(GL_FRAMEBUFFER_BINDING, &bound_fb);
-    //hooks->gl.glBindFramebuffer(GL_FRAMEBUFFER, 0);
+    // switch current framebuffer binding if necessary
+    GLint currentFb = -1;
+    bool fbSwitched = false;
+    if (fbToRead != CURRENTLY_BOUND_FB) {
+        hooks->gl.glGetIntegerv(GL_FRAMEBUFFER_BINDING, &currentFb);
+
+        if (currentFb != 0) {
+            hooks->gl.glBindFramebuffer(GL_FRAMEBUFFER, 0);
+            fbSwitched = true;
+        }
+    }
+
     hooks->gl.glReadPixels(viewport[0], viewport[1], viewport[2], viewport[3],
                                         GL_RGBA, GL_UNSIGNED_BYTE, fbcontents);
+
+    // switch back to previously bound buffer if necessary
+    if (fbSwitched) {
+        hooks->gl.glBindFramebuffer(GL_FRAMEBUFFER, currentFb);
+    }
+
     *fbsize = lzf_compress(fbcontents, fbContentsSize, fbcompressed, fbContentsSize);
     *fb = fbcompressed;
     *fbwidth = viewport[2];
     *fbheight = viewport[3];
 }
 
+void GLTraceContext::traceGLMessage(GLMessage *msg) {
+    mBufferedOutputStream->send(msg);
+
+    GLMessage_Function func = msg->function();
+    if (func == GLMessage::eglSwapBuffers
+        || func == GLMessage::glDrawArrays
+        || func == GLMessage::glDrawElements) {
+        mBufferedOutputStream->flush();
+    }
+}
+
 }; // namespace gltrace
 }; // namespace android
diff --git a/opengl/libs/GLES_trace/src/gltrace_context.h b/opengl/libs/GLES_trace/src/gltrace_context.h
index 7dbbca4..129116a 100644
--- a/opengl/libs/GLES_trace/src/gltrace_context.h
+++ b/opengl/libs/GLES_trace/src/gltrace_context.h
@@ -17,29 +17,83 @@
 #ifndef __GLTRACE_CONTEXT_H_
 #define __GLTRACE_CONTEXT_H_
 
+#include <map>
+#include <pthread.h>
+
 #include "hooks.h"
+#include "gltrace_transport.h"
 
 namespace android {
 namespace gltrace {
 
 using ::android::gl_hooks_t;
 
+enum FBBinding {CURRENTLY_BOUND_FB, FB0};
+
+class GLTraceState;
+
+/** GL Trace Context info associated with each EGLContext */
 class GLTraceContext {
+    int mId;                    /* unique context id */
+    GLTraceState *mState;       /* parent GL Trace state (for per process GL Trace State Info) */
+
     void *fbcontents;           /* memory area to read framebuffer contents */
     void *fbcompressed;         /* destination for lzf compressed framebuffer */
     unsigned fbcontentsSize;    /* size of fbcontents & fbcompressed buffers */
 
+    BufferedOutputStream *mBufferedOutputStream; /* stream where trace info is sent */
+
     void resizeFBMemory(unsigned minSize);
 public:
     gl_hooks_t *hooks;
 
-    GLTraceContext();
-    void getCompressedFB(void **fb, unsigned *fbsize, unsigned *fbwidth, unsigned *fbheight);
+    GLTraceContext(int id, GLTraceState *state, BufferedOutputStream *stream);
+    int getId();
+    GLTraceState *getGlobalTraceState();
+    void getCompressedFB(void **fb, unsigned *fbsize,
+                            unsigned *fbwidth, unsigned *fbheight,
+                            FBBinding fbToRead);
+    void traceGLMessage(GLMessage *msg);
 };
 
+/** Per process trace state. */
+class GLTraceState {
+    int mTraceContextIds;
+    TCPStream *mStream;
+    std::map<EGLContext, GLTraceContext*> mPerContextState;
+
+    /* Options controlling additional data to be collected on
+       certain trace calls. */
+    bool mCollectFbOnEglSwap;
+    bool mCollectFbOnGlDraw;
+    bool mCollectTextureDataOnGlTexImage;
+    pthread_rwlock_t mTraceOptionsRwLock;
+
+    /* helper methods to get/set values using provided lock for mutual exclusion. */
+    void safeSetValue(bool *ptr, bool value, pthread_rwlock_t *lock);
+    bool safeGetValue(bool *ptr, pthread_rwlock_t *lock);
+public:
+    GLTraceState(TCPStream *stream);
+    ~GLTraceState();
+
+    GLTraceContext *createTraceContext(int version, EGLContext c);
+    GLTraceContext *getTraceContext(EGLContext c);
+
+    TCPStream *getStream();
+
+    /* Methods to set trace options. */
+    void setCollectFbOnEglSwap(bool en);
+    void setCollectFbOnGlDraw(bool en);
+    void setCollectTextureDataOnGlTexImage(bool en);
+
+    /* Methods to retrieve trace options. */
+    bool shouldCollectFbOnEglSwap();
+    bool shouldCollectFbOnGlDraw();
+    bool shouldCollectTextureDataOnGlTexImage();
+};
+
+void setupTraceContextThreadSpecific(GLTraceContext *context);
 GLTraceContext *getGLTraceContext();
-void setGLTraceContext(GLTraceContext *c);
-void initContext(unsigned version, gl_hooks_t *hooks);
 void releaseContext();
 
 };
diff --git a/opengl/libs/GLES_trace/src/gltrace_egl.cpp b/opengl/libs/GLES_trace/src/gltrace_egl.cpp
index 5d1f370..9d1682a 100644
--- a/opengl/libs/GLES_trace/src/gltrace_egl.cpp
+++ b/opengl/libs/GLES_trace/src/gltrace_egl.cpp
@@ -15,6 +15,7 @@
  */
 
 #include <cutils/log.h>
+#include <utils/Timers.h>
 
 #include "gltrace.pb.h"
 #include "gltrace_context.h"
@@ -24,15 +25,69 @@
 namespace android {
 namespace gltrace {
 
+void GLTrace_eglCreateContext(int version, int contextId) {
+    GLMessage glmessage;
+    GLTraceContext *glContext = getGLTraceContext();
+
+    glmessage.set_context_id(contextId);
+    glmessage.set_function(GLMessage::eglCreateContext);
+
+    // copy argument version
+    GLMessage_DataType *arg_version = glmessage.add_args();
+    arg_version->set_isarray(false);
+    arg_version->set_type(GLMessage::DataType::INT);
+    arg_version->add_intvalue(version);
+
+    // copy argument context
+    GLMessage_DataType *arg_context = glmessage.add_args();
+    arg_context->set_isarray(false);
+    arg_context->set_type(GLMessage::DataType::INT);
+    arg_context->add_intvalue(contextId);
+
+    // set start time and duration
+    glmessage.set_start_time(systemTime());
+    glmessage.set_duration(0);
+
+    glContext->traceGLMessage(&glmessage);
+}
+
+void GLTrace_eglMakeCurrent(int contextId) {
+    GLMessage glmessage;
+    GLTraceContext *glContext = getGLTraceContext();
+
+    glmessage.set_context_id(contextId);
+    glmessage.set_function(GLMessage::eglMakeCurrent);
+
+    // copy argument context
+    GLMessage_DataType *arg_context = glmessage.add_args();
+    arg_context->set_isarray(false);
+    arg_context->set_type(GLMessage::DataType::INT);
+    arg_context->add_intvalue(contextId);
+
+    // set start time and duration
+    glmessage.set_start_time(systemTime());
+    glmessage.set_duration(0);
+
+    glContext->traceGLMessage(&glmessage);
+}
+
 void GLTrace_eglSwapBuffers(void *dpy, void *draw) {
     GLMessage glmessage;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmessage.set_context_id(1);
+    glmessage.set_context_id(glContext->getId());
     glmessage.set_function(GLMessage::eglSwapBuffers);
 
-    fixup_addFBContents(&glmessage);
-    traceGLMessage(&glmessage);
+    if (glContext->getGlobalTraceState()->shouldCollectFbOnEglSwap()) {
+        // read FB0 since that is what is displayed on the screen
+        fixup_addFBContents(glContext, &glmessage, FB0);
+    }
+
+    // set start time and duration
+    glmessage.set_start_time(systemTime());
+    glmessage.set_duration(0);
+
+    glContext->traceGLMessage(&glmessage);
 }
 
 };
diff --git a/opengl/libs/GLES_trace/src/gltrace_egl.h b/opengl/libs/GLES_trace/src/gltrace_egl.h
index 27a4837..f4684c5 100644
--- a/opengl/libs/GLES_trace/src/gltrace_egl.h
+++ b/opengl/libs/GLES_trace/src/gltrace_egl.h
@@ -20,6 +20,8 @@
 namespace android {
 namespace gltrace {
 
+void GLTrace_eglCreateContext(int version, int contextId);
+void GLTrace_eglMakeCurrent(int contextId);
 void GLTrace_eglSwapBuffers(void *dpy, void *draw);
 
 };
diff --git a/opengl/libs/GLES_trace/src/gltrace_eglapi.cpp b/opengl/libs/GLES_trace/src/gltrace_eglapi.cpp
index 3fe5f8b..0fe97ce 100644
--- a/opengl/libs/GLES_trace/src/gltrace_eglapi.cpp
+++ b/opengl/libs/GLES_trace/src/gltrace_eglapi.cpp
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include <arpa/inet.h>
 #include <stdlib.h>
 #include <cutils/log.h>
 #include <cutils/properties.h>
@@ -28,16 +29,51 @@
 
 namespace android {
 
-void GLTrace_eglMakeCurrent(const unsigned version, gl_hooks_t *hooks) {
-    gltrace::initContext(version, hooks);
-}
+using gltrace::GLTraceState;
+using gltrace::GLTraceContext;
+using gltrace::TCPStream;
 
-void GLTrace_eglReleaseThread() {
-    gltrace::releaseContext();
-}
+static GLTraceState *sGLTraceState;
+static pthread_t sReceiveThreadId;
 
-void GLTrace_eglCreateContext(int version, EGLContext c) {
-    // TODO
+/**
+ * Task that monitors the control stream from the host and updates
+ * the trace status according to commands received from the host.
+ */
+static void *commandReceiveTask(void *arg) {
+    GLTraceState *state = (GLTraceState *)arg;
+    TCPStream *stream = state->getStream();
+
+    // Currently, there are very few user configurable settings.
+    // As a result, they can be encoded in a single integer.
+    int cmd;
+    enum TraceSettingsMasks {
+        READ_FB_ON_EGLSWAP_MASK = 1 << 0,
+        READ_FB_ON_GLDRAW_MASK = 1 << 1,
+        READ_TEXTURE_DATA_ON_GLTEXIMAGE_MASK = 1 << 2,
+    };
+
+    while (true) {
+        int n = stream->receive(&cmd, 4);
+        if (n != 4) {
+            break;
+        }
+
+        cmd = ntohl(cmd);
+
+        bool collectFbOnEglSwap = (cmd & READ_FB_ON_EGLSWAP_MASK) != 0;
+        bool collectFbOnGlDraw = (cmd & READ_FB_ON_GLDRAW_MASK) != 0;
+        bool collectTextureData = (cmd & READ_TEXTURE_DATA_ON_GLTEXIMAGE_MASK) != 0;
+
+        state->setCollectFbOnEglSwap(collectFbOnEglSwap);
+        state->setCollectFbOnGlDraw(collectFbOnGlDraw);
+        state->setCollectTextureDataOnGlTexImage(collectTextureData);
+
+        ALOGD("trace options: eglswap: %d, gldraw: %d, texImage: %d",
+            collectFbOnEglSwap, collectFbOnGlDraw, collectTextureData);
+    }
+
+    return NULL;
 }
 
 void GLTrace_start() {
@@ -46,19 +82,55 @@
     property_get("debug.egl.debug_port", value, "5039");
     const unsigned short port = (unsigned short)atoi(value);
 
-    gltrace::startServer(port);
+    int clientSocket = gltrace::acceptClientConnection(port);
+    if (clientSocket < 0) {
+        LOGE("Error creating GLTrace server socket. Quitting application.");
+        exit(-1);
+    }
+
+    // create communication channel to the host
+    TCPStream *stream = new TCPStream(clientSocket);
+
+    // initialize tracing state
+    sGLTraceState = new GLTraceState(stream);
+
+    pthread_create(&sReceiveThreadId, NULL, commandReceiveTask, sGLTraceState);
 }
 
 void GLTrace_stop() {
-    gltrace::stopServer();
+    delete sGLTraceState;
+    sGLTraceState = NULL;
 }
 
-gl_hooks_t *GLTrace_getGLHooks() {
-    return gltrace::getGLHooks();
+void GLTrace_eglCreateContext(int version, EGLContext c) {
+    // update trace state for new EGL context
+    GLTraceContext *traceContext = sGLTraceState->createTraceContext(version, c);
+    gltrace::setupTraceContextThreadSpecific(traceContext);
+
+    // trace command through to the host
+    gltrace::GLTrace_eglCreateContext(version, traceContext->getId());
+}
+
+void GLTrace_eglMakeCurrent(const unsigned version, gl_hooks_t *hooks, EGLContext c) {
+    // setup per context state
+    GLTraceContext *traceContext = sGLTraceState->getTraceContext(c);
+    traceContext->hooks = hooks;
+    gltrace::setupTraceContextThreadSpecific(traceContext);
+
+    // trace command through to the host
+    gltrace::GLTrace_eglMakeCurrent(traceContext->getId());
+}
+
+void GLTrace_eglReleaseThread() {
+    gltrace::releaseContext();
 }
 
 void GLTrace_eglSwapBuffers(void *dpy, void *draw) {
     gltrace::GLTrace_eglSwapBuffers(dpy, draw);
 }
 
+gl_hooks_t *GLTrace_getGLHooks() {
+    return gltrace::getGLHooks();
+}
+
 }
diff --git a/opengl/libs/GLES_trace/src/gltrace_fixup.cpp b/opengl/libs/GLES_trace/src/gltrace_fixup.cpp
index c5b0451..5a439e3 100644
--- a/opengl/libs/GLES_trace/src/gltrace_fixup.cpp
+++ b/opengl/libs/GLES_trace/src/gltrace_fixup.cpp
@@ -96,10 +96,10 @@
 }
 
 /* Add the contents of the framebuffer to the protobuf message */
-void fixup_addFBContents(GLMessage *glmsg) {
+void fixup_addFBContents(GLTraceContext *context, GLMessage *glmsg, FBBinding fbToRead) {
     void *fbcontents;
     unsigned fbsize, fbwidth, fbheight;
-    getGLTraceContext()->getCompressedFB(&fbcontents, &fbsize, &fbwidth, &fbheight);
+    context->getCompressedFB(&fbcontents, &fbsize, &fbwidth, &fbheight, fbToRead);
 
     GLMessage_FrameBuffer *fb = glmsg->mutable_fb();
     fb->set_width(fbwidth);
@@ -240,7 +240,15 @@
     arg_params->add_floatvalue(*src);
 }
 
-void fixupGLMessage(GLMessage *glmsg) {
+void fixupGLMessage(GLTraceContext *context, nsecs_t start, nsecs_t end, GLMessage *glmsg) {
+    // for all messages, set the current context id
+    glmsg->set_context_id(context->getId());
+
+    // set start time and duration
+    glmsg->set_start_time(start);
+    glmsg->set_duration((unsigned)(end - start));
+
+    // do any custom message dependent processing
     switch (glmsg->function()) {
     case GLMessage::glGenBuffers:        /* void glGenBuffers(GLsizei n, GLuint * buffers); */
     case GLMessage::glGenFramebuffers:   /* void glGenFramebuffers(GLsizei n, GLuint * buffers); */
@@ -275,7 +283,9 @@
         fixup_glGetString(glmsg);
         break;
     case GLMessage::glTexImage2D:
-        fixup_glTexImage2D(glmsg);
+        if (context->getGlobalTraceState()->shouldCollectTextureDataOnGlTexImage()) {
+            fixup_glTexImage2D(glmsg);
+        }
         break;
     case GLMessage::glShaderSource:
         fixup_glShaderSource(glmsg);
@@ -296,10 +306,16 @@
         fixup_glUniformMatrixGeneric(4, glmsg);
         break;
     case GLMessage::glDrawArrays:
-    case GLMessage::glDrawElements:
         /* void glDrawArrays(GLenum mode, GLint first, GLsizei count) */
+        if (context->getGlobalTraceState()->shouldCollectFbOnGlDraw()) {
+            fixup_addFBContents(context, glmsg, CURRENTLY_BOUND_FB);
+        }
+        break;
+    case GLMessage::glDrawElements:
         /* void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) */
-        fixup_addFBContents(glmsg);
+        if (context->getGlobalTraceState()->shouldCollectFbOnGlDraw()) {
+            fixup_addFBContents(context, glmsg, CURRENTLY_BOUND_FB);
+        }
         break;
     default:
         break;
diff --git a/opengl/libs/GLES_trace/src/gltrace_fixup.h b/opengl/libs/GLES_trace/src/gltrace_fixup.h
index bf15a88..64f7545 100644
--- a/opengl/libs/GLES_trace/src/gltrace_fixup.h
+++ b/opengl/libs/GLES_trace/src/gltrace_fixup.h
@@ -14,16 +14,19 @@
  * limitations under the License.
  */
 
-#include "gltrace.pb.h"
-
 #ifndef __GLTRACE_FIXUP_H_
 #define __GLTRACE_FIXUP_H_
 
+#include <utils/Timers.h>
+
+#include "gltrace.pb.h"
+#include "gltrace_context.h"
+
 namespace android {
 namespace gltrace {
 
-void fixupGLMessage(GLMessage *message);
-void fixup_addFBContents(GLMessage *message);
+void fixupGLMessage(GLTraceContext *curContext, nsecs_t start, nsecs_t end, GLMessage *message);
+void fixup_addFBContents(GLTraceContext *curContext, GLMessage *message, FBBinding fbToRead);
 
 };
 };
diff --git a/opengl/libs/GLES_trace/src/gltrace_transport.cpp b/opengl/libs/GLES_trace/src/gltrace_transport.cpp
index c52ca5f..7758e48 100644
--- a/opengl/libs/GLES_trace/src/gltrace_transport.cpp
+++ b/opengl/libs/GLES_trace/src/gltrace_transport.cpp
@@ -28,85 +28,119 @@
 namespace android {
 namespace gltrace {
 
-int gServerSocket, gClientSocket;
-
-void startServer(int port) {
-    if (gServerSocket > 0) {
-        LOGD("startServer: server socket already open!");
-        return;
-    }
-
-    gServerSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
-    if (gServerSocket < 0) {
+int acceptClientConnection(int serverPort) {
+    int serverSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+    if (serverSocket < 0) {
         LOGE("Error (%d) while creating socket. Check if app has network permissions.",
-                                                                            gServerSocket);
-        exit(-1);
+                                                                            serverSocket);
+        return -1;
     }
 
     struct sockaddr_in server, client;
 
     server.sin_family = AF_INET;
     server.sin_addr.s_addr = htonl(INADDR_ANY);
-    server.sin_port = htons(port);
+    server.sin_port = htons(serverPort);
 
     socklen_t sockaddr_len = sizeof(sockaddr_in);
-    if (bind(gServerSocket, (struct sockaddr *) &server, sizeof(server)) < 0) {
-        close(gServerSocket);
+    if (bind(serverSocket, (struct sockaddr *) &server, sizeof(server)) < 0) {
+        close(serverSocket);
         LOGE("Failed to bind the server socket");
-        exit(-1);
+        return -1;
     }
 
-    if (listen(gServerSocket, 1) < 0) {
-        close(gServerSocket);
+    if (listen(serverSocket, 1) < 0) {
+        close(serverSocket);
         LOGE("Failed to listen on server socket");
-        exit(-1);
+        return -1;
     }
 
-    LOGD("startServer: server started on %d", port);
+    ALOGD("gltrace::waitForClientConnection: server listening @ port %d", serverPort);
 
-    /* Wait for client connection */
-    if ((gClientSocket = accept(gServerSocket, (struct sockaddr *)&client, &sockaddr_len)) < 0) {
-        close(gServerSocket);
+    int clientSocket = accept(serverSocket, (struct sockaddr *)&client, &sockaddr_len);
+    if (clientSocket < 0) {
+        close(serverSocket);
         LOGE("Failed to accept client connection");
-        exit(-1);
+        return -1;
     }
 
-    LOGD("startServer: client connected: %s", inet_ntoa(client.sin_addr));
+    ALOGD("gltrace::waitForClientConnection: client connected: %s", inet_ntoa(client.sin_addr));
+
+    // do not accept any more incoming connections
+    close(serverSocket);
+
+    return clientSocket;
 }
 
-void stopServer() {
-    if (gServerSocket > 0) {
-        close(gServerSocket);
-        close(gClientSocket);
-        gServerSocket = gClientSocket = 0;
+TCPStream::TCPStream(int socket) {
+    mSocket = socket;
+    pthread_mutex_init(&mSocketWriteMutex, NULL);
+}
+
+TCPStream::~TCPStream() {
+    pthread_mutex_destroy(&mSocketWriteMutex);
+}
+
+void TCPStream::closeStream() {
+    if (mSocket > 0) {
+        close(mSocket);
+        mSocket = 0;
     }
 }
 
-/** Send GLMessage to the receiver on the host. */
-void traceGLMessage(GLMessage *call) {
-    if (gClientSocket <= 0) {
-        LOGE("traceGLMessage: Attempt to send while client connection is not established");
-        return;
+int TCPStream::send(void *buf, size_t len) {
+    if (mSocket <= 0) {
+        return -1;
     }
 
-    std::string str;
-    call->SerializeToString(&str);
-    const uint32_t len = str.length();
+    pthread_mutex_lock(&mSocketWriteMutex);
+    int n = write(mSocket, buf, len);
+    pthread_mutex_unlock(&mSocketWriteMutex);
 
-    int n = write(gClientSocket, &len, sizeof len);
-    if (n != sizeof len) {
-        LOGE("traceGLMessage: Error (%d) while writing message length\n", n);
-        stopServer();
-        exit(-1);
+    return n;
+}
+
+int TCPStream::receive(void *data, size_t len) {
+    if (mSocket <= 0) {
+        return -1;
     }
 
-    n = write(gClientSocket, str.data(), str.length());
-    if (n != (int) str.length()) {
-        LOGE("traceGLMessage: Error while writing out message, result = %d, length = %d\n",
-            n, str.length());
-        stopServer();
-        exit(-1);
+    return read(mSocket, data, len);
+}
+
+BufferedOutputStream::BufferedOutputStream(TCPStream *stream, size_t bufferSize) {
+    mStream = stream;
+
+    mBufferSize = bufferSize;
+    mStringBuffer = "";
+    mStringBuffer.reserve(bufferSize);
+}
+
+int BufferedOutputStream::flush() {
+    if (mStringBuffer.size() == 0) {
+        return 0;
     }
+
+    int n = mStream->send((void *)mStringBuffer.data(), mStringBuffer.size());
+    mStringBuffer.clear();
+    return n;
+}
+
+void BufferedOutputStream::enqueueMessage(GLMessage *msg) {
+    const uint32_t len = msg->ByteSize();
+
+    mStringBuffer.append((const char *)&len, sizeof(len));    // append header
+    msg->AppendToString(&mStringBuffer);                      // append message
+}
+
+int BufferedOutputStream::send(GLMessage *msg) {
+    enqueueMessage(msg);
+
+    if (mStringBuffer.size() > mBufferSize) {
+        return flush();
+    }
+
+    return 0;
 }
 
 };  // namespace gltrace
diff --git a/opengl/libs/GLES_trace/src/gltrace_transport.h b/opengl/libs/GLES_trace/src/gltrace_transport.h
index a0d89be..d31df7b 100644
--- a/opengl/libs/GLES_trace/src/gltrace_transport.h
+++ b/opengl/libs/GLES_trace/src/gltrace_transport.h
@@ -17,15 +17,69 @@
 #ifndef __GLTRACE_TRANSPORT_H_
 #define __GLTRACE_TRANSPORT_H_
 
+#include <pthread.h>
+
 #include "gltrace.pb.h"
 
 namespace android {
 namespace gltrace {
 
-void startServer(int port);
-void stopServer();
+/**
+ * TCPStream provides a TCP based communication channel from the device to
+ * the host for transferring GLMessages.
+ */
+class TCPStream {
+    int mSocket;
+    pthread_mutex_t mSocketWriteMutex;
+public:
+    /** Create a TCP based communication channel over @socket */
+    TCPStream(int socket);
+    ~TCPStream();
 
-void traceGLMessage(GLMessage *msg);
+    /** Close the channel. */
+    void closeStream();
+
+    /** Send @data of size @len to host. . Returns -1 on error, 0 on success. */
+    int send(void *data, size_t len);
+
+    /** Receive data into @buf from the remote end. This is a blocking call. */
+    int receive(void *buf, size_t size);
+};
+
+/**
+ * BufferedOutputStream provides buffering of data sent to the underlying
+ * unbuffered channel.
+ */
+class BufferedOutputStream {
+    TCPStream *mStream;
+
+    size_t mBufferSize;
+    std::string mStringBuffer;
+
+    /** Enqueue message into internal buffer. */
+    void enqueueMessage(GLMessage *msg);
+public:
+    /**
+     * Construct a Buffered stream of size @bufferSize, using @stream as
+     * its underlying channel for transport.
+     */
+    BufferedOutputStream(TCPStream *stream, size_t bufferSize);
+
+    /**
+     * Send @msg. The message could be buffered and sent later with a
+     * subsequent message. Returns -1 on error, 0 on success.
+     */
+    int send(GLMessage *msg);
+
+    /** Send any buffered messages, returns -1 on error, 0 on success. */
+    int flush();
+};
+
+/**
+ * Utility method: start a server at @serverPort, and wait for a client
+ * connection. Returns the connected client socket on success, or -1 on failure.
+ */
+int acceptClientConnection(int serverPort);
 
 };
 };
diff --git a/opengl/libs/GLES_trace/tools/genapi.py b/opengl/libs/GLES_trace/tools/genapi.py
index 3c47a5f..9b7a1cf 100755
--- a/opengl/libs/GLES_trace/tools/genapi.py
+++ b/opengl/libs/GLES_trace/tools/genapi.py
@@ -104,7 +104,7 @@
     ('GL1Ext','../GLES_CM/glext_api.in'),
 ]
 
-HEADER_TEXT = """/*
+HEADER_LICENSE = """/*
  * Copyright 2011, The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -121,22 +121,25 @@
  *
  * THIS FILE WAS GENERATED BY A SCRIPT. DO NOT EDIT.
  */
+"""
 
+HEADER_INCLUDES = """
 #include <cutils/log.h>
+#include <utils/Timers.h>
 #include <GLES2/gl2.h>
 
 #include "gltrace.pb.h"
 #include "gltrace_context.h"
 #include "gltrace_fixup.h"
 #include "gltrace_transport.h"
+"""
 
+HEADER_NAMESPACE_START = """
 namespace android {
 namespace gltrace {
-
 """
 
 FOOTER_TEXT = """
-
 }; // namespace gltrace
 }; // namespace android
 """
@@ -146,7 +149,6 @@
     GLMessage glmsg;
     GLTraceContext *glContext = getGLTraceContext();
 
-    glmsg.set_context_id(1);
     glmsg.set_function(GLMessage::$!func!$);
 <!--(if len(parsedArgs) > 0)-->
     <!--(for argname, argtype in parsedArgs)-->
@@ -160,11 +162,13 @@
 <!--(end)-->
 
     // call function
+    nsecs_t start_time = systemTime();
 <!--(if retType != "void")-->
     $!retType!$ retValue = glContext->hooks->gl.$!callsite!$;
 <!--(else)-->
     glContext->hooks->gl.$!callsite!$;
 <!--(end)-->
+    nsecs_t end_time = systemTime();
 <!--(if retType != "void")-->
 
     // set return value
@@ -174,8 +178,8 @@
     rt->$!retDataType.getProtobufCall()!$retValue);
 <!--(end)-->
 
-    fixupGLMessage(&glmsg);
-    traceGLMessage(&glmsg);
+    fixupGLMessage(glContext, start_time, end_time, &glmsg);
+    glContext->traceGLMessage(&glmsg);
 <!--(if retType != "void")-->
 
     return retValue;
@@ -351,7 +355,8 @@
 
 def genHeaders(apis, fname):
     lines = []
-    lines.append(HEADER_TEXT)
+    lines.append(HEADER_LICENSE)
+    lines.append(HEADER_NAMESPACE_START)
     prefix = ""
     for api in apis:
         if prefix != api.prefix:
@@ -366,7 +371,9 @@
 
 def genSrcs(apis, fname):
     lines = []
-    lines.append(HEADER_TEXT)
+    lines.append(HEADER_LICENSE)
+    lines.append(HEADER_INCLUDES)
+    lines.append(HEADER_NAMESPACE_START)
     prefix = ""
     for api in apis:
         if prefix != api.prefix:
diff --git a/opengl/libs/glestrace.h b/opengl/libs/glestrace.h
index 5cfacd4..a08f97b 100644
--- a/opengl/libs/glestrace.h
+++ b/opengl/libs/glestrace.h
@@ -25,7 +25,7 @@
 
 /* Hooks to be called by "interesting" EGL functions. */
 void GLTrace_eglCreateContext(int version, EGLContext c);
-void GLTrace_eglMakeCurrent(unsigned version, gl_hooks_t *hooks);
+void GLTrace_eglMakeCurrent(unsigned version, gl_hooks_t *hooks, EGLContext c);
 void GLTrace_eglReleaseThread();
 void GLTrace_eglSwapBuffers(void*, void*);
 
diff --git a/opengl/tests/gl2_jni/jni/gl_code.cpp b/opengl/tests/gl2_jni/jni/gl_code.cpp
index c2fabe6..f7e7f8d 100644
--- a/opengl/tests/gl2_jni/jni/gl_code.cpp
+++ b/opengl/tests/gl2_jni/jni/gl_code.cpp
@@ -14,13 +14,13 @@
 
 static void printGLString(const char *name, GLenum s) {
     const char *v = (const char *) glGetString(s);
-    LOGI("GL %s = %s\n", name, v);
+    ALOGI("GL %s = %s\n", name, v);
 }
 
 static void checkGlError(const char* op) {
     for (GLint error = glGetError(); error; error
             = glGetError()) {
-        LOGI("after %s() glError (0x%x)\n", op, error);
+        ALOGI("after %s() glError (0x%x)\n", op, error);
     }
 }
 
@@ -107,7 +107,7 @@
     printGLString("Renderer", GL_RENDERER);
     printGLString("Extensions", GL_EXTENSIONS);
 
-    LOGI("setupGraphics(%d, %d)", w, h);
+    ALOGI("setupGraphics(%d, %d)", w, h);
     gProgram = createProgram(gVertexShader, gFragmentShader);
     if (!gProgram) {
         LOGE("Could not create program.");
@@ -115,7 +115,7 @@
     }
     gvPositionHandle = glGetAttribLocation(gProgram, "vPosition");
     checkGlError("glGetAttribLocation");
-    LOGI("glGetAttribLocation(\"vPosition\") = %d\n",
+    ALOGI("glGetAttribLocation(\"vPosition\") = %d\n",
             gvPositionHandle);
 
     glViewport(0, 0, w, h);
diff --git a/opengl/tests/gl_jni/jni/gl_code.cpp b/opengl/tests/gl_jni/jni/gl_code.cpp
index ef66841..cf86020 100644
--- a/opengl/tests/gl_jni/jni/gl_code.cpp
+++ b/opengl/tests/gl_jni/jni/gl_code.cpp
@@ -18,7 +18,7 @@
 
 static void printGLString(const char *name, GLenum s) {
     const char *v = (const char *) glGetString(s);
-    LOGI("GL %s = %s\n", name, v);
+    ALOGI("GL %s = %s\n", name, v);
 }
 
 static void gluLookAt(float eyeX, float eyeY, float eyeZ,
diff --git a/opengl/tests/gl_perf/fill_common.cpp b/opengl/tests/gl_perf/fill_common.cpp
index a069f67..2a425f7 100644
--- a/opengl/tests/gl_perf/fill_common.cpp
+++ b/opengl/tests/gl_perf/fill_common.cpp
@@ -132,7 +132,7 @@
     } else {
         printf("%s, %f, %f\n", gCurrentTestName, mpps, dc60);
     }
-    LOGI("%s, %f, %f\r\n", gCurrentTestName, mpps, dc60);
+    ALOGI("%s, %f, %f\r\n", gCurrentTestName, mpps, dc60);
 }
 
 
diff --git a/opengl/tests/gl_perfapp/jni/gl_code.cpp b/opengl/tests/gl_perfapp/jni/gl_code.cpp
index f993371..c8e4ad5 100644
--- a/opengl/tests/gl_perfapp/jni/gl_code.cpp
+++ b/opengl/tests/gl_perfapp/jni/gl_code.cpp
@@ -43,7 +43,7 @@
     int texSize = ((stateClock >> 1) & 0x1) + 1;
 
     if (testNum >= gFragmentTestCount) {
-       LOGI("done\n");
+       ALOGI("done\n");
        if (fOut) {
            fclose(fOut);
            fOut = NULL;
@@ -52,7 +52,7 @@
        return;
     }
 
-    // LOGI("doTest %d %d %d\n", texCount, extraMath, testSubState);
+    // ALOGI("doTest %d %d %d\n", texCount, extraMath, testSubState);
 
 //        for (uint32_t num = 0; num < gFragmentTestCount; num++) {
     doSingleTest(testNum, texSize);
@@ -74,17 +74,17 @@
             genTextures();
             const char* fileName = "/sdcard/glperf.csv";
             if (fOut != NULL) {
-                 LOGI("Closing partially written output.n");
+                 ALOGI("Closing partially written output.n");
                  fclose(fOut);
                  fOut = NULL;
             }
-            LOGI("Writing to: %s\n",fileName);
+            ALOGI("Writing to: %s\n",fileName);
             fOut = fopen(fileName, "w");
             if (fOut == NULL) {
                 LOGE("Could not open: %s\n", fileName);
             }
 
-            LOGI("\nvarColor, texCount, modulate, extraMath, texSize, blend, Mpps, DC60\n");
+            ALOGI("\nvarColor, texCount, modulate, extraMath, texSize, blend, Mpps, DC60\n");
             if (fOut) fprintf(fOut,"varColor, texCount, modulate, extraMath, texSize, blend, Mpps, DC60\r\n");
     }
 }
diff --git a/opengl/tests/gldual/jni/gl_code.cpp b/opengl/tests/gldual/jni/gl_code.cpp
index f1f0a1f..7ba0571 100644
--- a/opengl/tests/gldual/jni/gl_code.cpp
+++ b/opengl/tests/gldual/jni/gl_code.cpp
@@ -14,13 +14,13 @@
 
 static void printGLString(const char *name, GLenum s) {
     const char *v = (const char *) glGetString(s);
-    LOGI("GL %s = %s\n", name, v);
+    ALOGI("GL %s = %s\n", name, v);
 }
 
 static void checkGlError(const char* op) {
     for (GLint error = glGetError(); error; error
             = glGetError()) {
-        LOGI("after %s() glError (0x%x)\n", op, error);
+        ALOGI("after %s() glError (0x%x)\n", op, error);
     }
 }
 
@@ -107,7 +107,7 @@
     printGLString("Renderer", GL_RENDERER);
     printGLString("Extensions", GL_EXTENSIONS);
 
-    LOGI("setupGraphics(%d, %d)", w, h);
+    ALOGI("setupGraphics(%d, %d)", w, h);
     gProgram = createProgram(gVertexShader, gFragmentShader);
     if (!gProgram) {
         LOGE("Could not create program.");
@@ -115,7 +115,7 @@
     }
     gvPositionHandle = glGetAttribLocation(gProgram, "vPosition");
     checkGlError("glGetAttribLocation");
-    LOGI("glGetAttribLocation(\"vPosition\") = %d\n",
+    ALOGI("glGetAttribLocation(\"vPosition\") = %d\n",
             gvPositionHandle);
 
     glViewport(0, 0, w, h);
diff --git a/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp b/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp
index 3bbc75e..2ffbd1e 100644
--- a/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp
+++ b/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp
@@ -287,22 +287,22 @@
     glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
     glGetIntegerv(GL_MAX_VIEWPORT_DIMS, mMaxViewportDims);
 
-    LOGI("EGL informations:");
-    LOGI("# of configs : %d", numConfigs);
-    LOGI("vendor    : %s", extensions.getEglVendor());
-    LOGI("version   : %s", extensions.getEglVersion());
-    LOGI("extensions: %s", extensions.getEglExtension());
-    LOGI("Client API: %s", eglQueryString(display, EGL_CLIENT_APIS)?:"Not Supported");
-    LOGI("EGLSurface: %d-%d-%d-%d, config=%p", r, g, b, a, config);
+    ALOGI("EGL informations:");
+    ALOGI("# of configs : %d", numConfigs);
+    ALOGI("vendor    : %s", extensions.getEglVendor());
+    ALOGI("version   : %s", extensions.getEglVersion());
+    ALOGI("extensions: %s", extensions.getEglExtension());
+    ALOGI("Client API: %s", eglQueryString(display, EGL_CLIENT_APIS)?:"Not Supported");
+    ALOGI("EGLSurface: %d-%d-%d-%d, config=%p", r, g, b, a, config);
 
-    LOGI("OpenGL informations:");
-    LOGI("vendor    : %s", extensions.getVendor());
-    LOGI("renderer  : %s", extensions.getRenderer());
-    LOGI("version   : %s", extensions.getVersion());
-    LOGI("extensions: %s", extensions.getExtension());
-    LOGI("GL_MAX_TEXTURE_SIZE = %d", mMaxTextureSize);
-    LOGI("GL_MAX_VIEWPORT_DIMS = %d x %d", mMaxViewportDims[0], mMaxViewportDims[1]);
-    LOGI("flags = %08x", mFlags);
+    ALOGI("OpenGL informations:");
+    ALOGI("vendor    : %s", extensions.getVendor());
+    ALOGI("renderer  : %s", extensions.getRenderer());
+    ALOGI("version   : %s", extensions.getVersion());
+    ALOGI("extensions: %s", extensions.getExtension());
+    ALOGI("GL_MAX_TEXTURE_SIZE = %d", mMaxTextureSize);
+    ALOGI("GL_MAX_VIEWPORT_DIMS = %d x %d", mMaxViewportDims[0], mMaxViewportDims[1]);
+    ALOGI("flags = %08x", mFlags);
 
     // Unbind the context from this thread
     eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
diff --git a/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp b/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp
index 3b7c09e..174dcd7 100644
--- a/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp
+++ b/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp
@@ -79,7 +79,7 @@
     LOGW_IF(err<0, "ANDROID_WAIT_FOR_FB_SLEEP failed (%s)", strerror(errno));
     if (err >= 0) {
         sp<SurfaceFlinger> flinger = mFlinger.promote();
-        LOGD("About to give-up screen, flinger = %p", flinger.get());
+        ALOGD("About to give-up screen, flinger = %p", flinger.get());
         if (flinger != 0) {
             mBarrier.close();
             flinger->screenReleased(0);
@@ -94,7 +94,7 @@
     LOGW_IF(err<0, "ANDROID_WAIT_FOR_FB_WAKE failed (%s)", strerror(errno));
     if (err >= 0) {
         sp<SurfaceFlinger> flinger = mFlinger.promote();
-        LOGD("Screen about to return, flinger = %p", flinger.get());
+        ALOGD("Screen about to return, flinger = %p", flinger.get());
         if (flinger != 0)
             flinger->screenAcquired(0);
     }
diff --git a/services/surfaceflinger/EventThread.cpp b/services/surfaceflinger/EventThread.cpp
index dc39f88..9245781 100644
--- a/services/surfaceflinger/EventThread.cpp
+++ b/services/surfaceflinger/EventThread.cpp
@@ -209,7 +209,7 @@
 }
 
 status_t EventThread::readyToRun() {
-    LOGI("EventThread ready to run.");
+    ALOGI("EventThread ready to run.");
     return NO_ERROR;
 }
 
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index d3b0dbf..d4c4b1f 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -350,7 +350,7 @@
 
     if (sizeChanged) {
         // the size changed, we need to ask our client to request a new buffer
-        LOGD_IF(DEBUG_RESIZE,
+        ALOGD_IF(DEBUG_RESIZE,
                 "doTransaction: "
                 "resize (layer=%p), requested (%dx%d), drawing (%d,%d), "
                 "scalingMode=%d",
@@ -485,7 +485,7 @@
                 recomputeVisibleRegions = true;
             }
 
-            LOGD_IF(DEBUG_RESIZE,
+            ALOGD_IF(DEBUG_RESIZE,
                     "lockPageFlip : "
                     "       (layer=%p), buffer (%ux%u, tr=%02x), "
                     "requested (%dx%d)",
diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp
index f04add1..37879f1 100644
--- a/services/surfaceflinger/LayerBase.cpp
+++ b/services/surfaceflinger/LayerBase.cpp
@@ -240,7 +240,7 @@
     for (size_t i=0 ; i<4 ; i++)
         mVertices[i][1] = hw_h - mVertices[i][1];
 
-    if (UNLIKELY(transformed)) {
+    if (CC_UNLIKELY(transformed)) {
         // NOTE: here we could also punt if we have too many rectangles
         // in the transparent region
         if (tr.preserveRects()) {
@@ -416,7 +416,7 @@
     const State& s(drawingState());
 
     GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
-    if (UNLIKELY(s.alpha < 0xFF)) {
+    if (CC_UNLIKELY(s.alpha < 0xFF)) {
         const GLfloat alpha = s.alpha * (1.0f/255.0f);
         if (mPremultipliedAlpha) {
             glColor4f(alpha, alpha, alpha, alpha);
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 014c7e2..e77f08f 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -110,7 +110,7 @@
 
 void SurfaceFlinger::init()
 {
-    LOGI("SurfaceFlinger is starting");
+    ALOGI("SurfaceFlinger is starting");
 
     // debugging stuff...
     char value[PROPERTY_VALUE_MAX];
@@ -127,9 +127,9 @@
         DdmConnection::start(getServiceName());
     }
 
-    LOGI_IF(mDebugRegion,       "showupdates enabled");
-    LOGI_IF(mDebugBackground,   "showbackground enabled");
-    LOGI_IF(mDebugDDMS,         "DDMS debugging enabled");
+    ALOGI_IF(mDebugRegion,       "showupdates enabled");
+    ALOGI_IF(mDebugBackground,   "showbackground enabled");
+    ALOGI_IF(mDebugDDMS,         "DDMS debugging enabled");
 }
 
 SurfaceFlinger::~SurfaceFlinger()
@@ -176,7 +176,7 @@
 {
     const nsecs_t now = systemTime();
     const nsecs_t duration = now - mBootTime;
-    LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
+    ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
     mBootFinished = true;
 
     // wait patiently for the window manager death
@@ -215,7 +215,7 @@
 
 status_t SurfaceFlinger::readyToRun()
 {
-    LOGI(   "SurfaceFlinger's main thread ready to run. "
+    ALOGI(   "SurfaceFlinger's main thread ready to run. "
             "Initializing graphics H/W...");
 
     // we only support one display currently
@@ -404,14 +404,14 @@
     waitForEvent();
 
     // check for transactions
-    if (UNLIKELY(mConsoleSignals)) {
+    if (CC_UNLIKELY(mConsoleSignals)) {
         handleConsoleEvents();
     }
 
     // if we're in a global transaction, don't do anything.
     const uint32_t mask = eTransactionNeeded | eTraversalNeeded;
     uint32_t transactionFlags = peekTransactionFlags(mask);
-    if (UNLIKELY(transactionFlags)) {
+    if (CC_UNLIKELY(transactionFlags)) {
         handleTransaction(transactionFlags);
     }
 
@@ -423,13 +423,13 @@
         return true;
     }
 
-    if (UNLIKELY(mHwWorkListDirty)) {
+    if (CC_UNLIKELY(mHwWorkListDirty)) {
         // build the h/w work list
         handleWorkList();
     }
 
     const DisplayHardware& hw(graphicPlane(0).displayHardware());
-    if (LIKELY(hw.canDraw())) {
+    if (CC_LIKELY(hw.canDraw())) {
         // repaint the framebuffer (if needed)
 
         const int index = hw.getCurrentBufferIndex();
@@ -629,7 +629,7 @@
 
 
         // handle hidden surfaces by setting the visible region to empty
-        if (LIKELY(!(s.flags & ISurfaceComposer::eLayerHidden) && s.alpha)) {
+        if (CC_LIKELY(!(s.flags & ISurfaceComposer::eLayerHidden) && s.alpha)) {
             const bool translucent = !layer->isOpaque();
             const Rect bounds(layer->visibleBounds());
             visibleRegion.set(bounds);
@@ -814,7 +814,7 @@
     // compute the invalid region
     mSwapRegion.orSelf(mDirtyRegion);
 
-    if (UNLIKELY(mDebugRegion)) {
+    if (CC_UNLIKELY(mDebugRegion)) {
         debugFlashRegions();
     }
 
@@ -968,7 +968,7 @@
     HWComposer& hwc(hw.getHwComposer());
 
     const size_t fbLayerCount = hwc.getLayerCount(HWC_FRAMEBUFFER);
-    if (UNLIKELY(fbLayerCount && !mWormholeRegion.isEmpty())) {
+    if (CC_UNLIKELY(fbLayerCount && !mWormholeRegion.isEmpty())) {
         // should never happen unless the window manager has a bug
         // draw something...
         drawWormhole();
@@ -1053,7 +1053,7 @@
     const int32_t width = hw.getWidth();
     const int32_t height = hw.getHeight();
 
-    if (LIKELY(!mDebugBackground)) {
+    if (CC_LIKELY(!mDebugBackground)) {
         glClearColor(0,0,0,0);
         Region::const_iterator it = region.begin();
         Region::const_iterator const end = region.end();
@@ -1257,7 +1257,7 @@
 int SurfaceFlinger::setOrientation(DisplayID dpy,
         int orientation, uint32_t flags)
 {
-    if (UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT))
+    if (CC_UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT))
         return BAD_VALUE;
 
     Mutex::Autolock _l(mStateLock);
@@ -1290,7 +1290,7 @@
         return surfaceHandle;
     }
 
-    //LOGD("createSurface for pid %d (%d x %d)", pid, w, h);
+    //ALOGD("createSurface for pid %d (%d x %d)", pid, w, h);
     sp<Layer> normalLayer;
     switch (flags & eFXSurfaceMask) {
         case eFXSurfaceNormal:
@@ -1356,7 +1356,7 @@
 
     sp<Layer> layer = new Layer(this, display, client);
     status_t err = layer->setBuffers(w, h, format, flags);
-    if (LIKELY(err != NO_ERROR)) {
+    if (CC_LIKELY(err != NO_ERROR)) {
         LOGE("createNormalSurfaceLocked() failed (%s)", strerror(-err));
         layer.clear();
     }
@@ -1676,7 +1676,7 @@
     status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
     if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
         CHECK_INTERFACE(ISurfaceComposer, data, reply);
-        if (UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
+        if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
             IPCThreadState* ipc = IPCThreadState::self();
             const int pid = ipc->getCallingPid();
             const int uid = ipc->getCallingUid();
@@ -2261,7 +2261,7 @@
     status_t result = PERMISSION_DENIED;
 
     // only one display supported for now
-    if (UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT))
+    if (CC_UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT))
         return BAD_VALUE;
 
     if (!GLExtensions::getInstance().haveFramebufferObject())
@@ -2279,7 +2279,7 @@
     sh = (!sh) ? hw_h : sh;
     const size_t size = sw * sh * 4;
 
-    //LOGD("screenshot: sw=%d, sh=%d, minZ=%d, maxZ=%d",
+    //ALOGD("screenshot: sw=%d, sh=%d, minZ=%d, maxZ=%d",
     //        sw, sh, minLayerZ, maxLayerZ);
 
     // make sure to clear all GL error flags
@@ -2370,7 +2370,7 @@
 
     hw.compositionComplete();
 
-    // LOGD("screenshot: result = %s", result<0 ? strerror(result) : "OK");
+    // ALOGD("screenshot: result = %s", result<0 ? strerror(result) : "OK");
 
     return result;
 }
@@ -2383,7 +2383,7 @@
         uint32_t minLayerZ, uint32_t maxLayerZ)
 {
     // only one display supported for now
-    if (UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT))
+    if (CC_UNLIKELY(uint32_t(dpy) >= DISPLAY_COUNT))
         return BAD_VALUE;
 
     if (!GLExtensions::getInstance().haveFramebufferObject())
@@ -2511,7 +2511,7 @@
      const int pid = ipc->getCallingPid();
      const int uid = ipc->getCallingUid();
      const int self_pid = getpid();
-     if (UNLIKELY(pid != self_pid && uid != AID_GRAPHICS && uid != 0)) {
+     if (CC_UNLIKELY(pid != self_pid && uid != AID_GRAPHICS && uid != 0)) {
          // we're called from a different process, do the real check
          if (!PermissionCache::checkCallingPermission(sAccessSurfaceFlinger))
          {
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index 41caee3..ffd3ac9 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -20,6 +20,8 @@
 #include <stdint.h>
 #include <sys/types.h>
 
+#include <cutils/compiler.h>
+
 #include <utils/Atomic.h>
 #include <utils/Errors.h>
 #include <utils/KeyedVector.h>
@@ -53,9 +55,6 @@
 class LayerScreenshot;
 struct surface_flinger_cblk_t;
 
-#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
-#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
-
 // ---------------------------------------------------------------------------
 
 class Client : public BnSurfaceComposerClient
diff --git a/services/surfaceflinger/SurfaceTextureLayer.cpp b/services/surfaceflinger/SurfaceTextureLayer.cpp
index 5020e00..259b937 100644
--- a/services/surfaceflinger/SurfaceTextureLayer.cpp
+++ b/services/surfaceflinger/SurfaceTextureLayer.cpp
@@ -37,7 +37,7 @@
 
 status_t SurfaceTextureLayer::setDefaultBufferSize(uint32_t w, uint32_t h)
 {
-    //LOGD("%s, w=%u, h=%u", __PRETTY_FUNCTION__, w, h);
+    //ALOGD("%s, w=%u, h=%u", __PRETTY_FUNCTION__, w, h);
     return SurfaceTexture::setDefaultBufferSize(w, h);
 }
 
@@ -73,7 +73,7 @@
         if (format == 0)
             format = mDefaultFormat;
         uint32_t effectiveUsage = layer->getEffectiveUsage(usage);
-        //LOGD("%s, w=%u, h=%u, format=%u, usage=%08x, effectiveUsage=%08x",
+        //ALOGD("%s, w=%u, h=%u, format=%u, usage=%08x, effectiveUsage=%08x",
         //        __PRETTY_FUNCTION__, w, h, format, usage, effectiveUsage);
         res = SurfaceTexture::dequeueBuffer(buf, w, h, format, effectiveUsage);
     }
diff --git a/services/surfaceflinger/Transform.cpp b/services/surfaceflinger/Transform.cpp
index ba345ce..ca3fa6e 100644
--- a/services/surfaceflinger/Transform.cpp
+++ b/services/surfaceflinger/Transform.cpp
@@ -344,10 +344,10 @@
     if (mType&TRANSLATE)
         type.append("TRANSLATE ");
 
-    LOGD("%s 0x%08x (%s, %s)", name, mType, flags.string(), type.string());
-    LOGD("%.4f  %.4f  %.4f", m[0][0], m[1][0], m[2][0]);
-    LOGD("%.4f  %.4f  %.4f", m[0][1], m[1][1], m[2][1]);
-    LOGD("%.4f  %.4f  %.4f", m[0][2], m[1][2], m[2][2]);
+    ALOGD("%s 0x%08x (%s, %s)", name, mType, flags.string(), type.string());
+    ALOGD("%.4f  %.4f  %.4f", m[0][0], m[1][0], m[2][0]);
+    ALOGD("%.4f  %.4f  %.4f", m[0][1], m[1][1], m[2][1]);
+    ALOGD("%.4f  %.4f  %.4f", m[0][2], m[1][2], m[2][2]);
 }
 
 // ---------------------------------------------------------------------------
diff --git a/services/surfaceflinger/tests/Transaction_test.cpp b/services/surfaceflinger/tests/Transaction_test.cpp
index afafd8a..396a3fd 100644
--- a/services/surfaceflinger/tests/Transaction_test.cpp
+++ b/services/surfaceflinger/tests/Transaction_test.cpp
@@ -204,11 +204,11 @@
         sc->checkPixel(145, 145,  63,  63, 195);
     }
 
-    LOGD("resizing");
+    ALOGD("resizing");
     SurfaceComposerClient::openGlobalTransaction();
     ASSERT_EQ(NO_ERROR, mFGSurfaceControl->setSize(128, 128));
     SurfaceComposerClient::closeGlobalTransaction(true);
-    LOGD("resized");
+    ALOGD("resized");
     {
         // This should not reflect the new size or color because SurfaceFlinger
         // has not yet received a buffer of the correct size.
@@ -219,10 +219,10 @@
         sc->checkPixel(145, 145,  63,  63, 195);
     }
 
-    LOGD("drawing");
+    ALOGD("drawing");
     fillSurfaceRGBA8(mFGSurfaceControl, 63, 195, 63);
     waitForPostedBuffers();
-    LOGD("drawn");
+    ALOGD("drawn");
     {
         // This should reflect the new size and the new color.
         SCOPED_TRACE("after redraw");