Testing updates pushed from the GL thread
diff --git a/src/VirtualDisplay.cpp b/src/VirtualDisplay.cpp
index 369d271..7a95042 100644
--- a/src/VirtualDisplay.cpp
+++ b/src/VirtualDisplay.cpp
@@ -23,9 +23,9 @@
 
 #include <gui/SurfaceComposerClient.h>
 
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
 #include <GLES3/gl3.h>
+#include <GLES3/gl3ext.h>
+#include <GLES2/gl2ext.h>
 
 #include <ui/Rect.h>
 
@@ -186,8 +186,9 @@
         mEventCond.wait(mMutex);
         ALOGD("Awake, frame available");
         void* ptr = processFrame_l();
-        const Event ev(EVENT_BUFFER_READY, ptr);
-        mQueue->enqueue(ev);
+
+        //const Event ev(EVENT_BUFFER_READY, ptr);
+        //mQueue->enqueue(ev);
     }
 
     ALOGV("VDS thread stopping");
@@ -223,7 +224,7 @@
     }
 
     mBufSize = mWidth * mHeight * kGlBytesPerPixel;
-    
+
     // pixel buffer for image copy
     mPBO = new GLuint[NUM_PBO];
     glGenBuffers(NUM_PBO, mPBO);
@@ -256,6 +257,9 @@
     mGlConsumer->updateTexImage();
     mGlConsumer->getTransformMatrix(texMatrix);
 
+    int64_t startWhen, blitWhen, readWhen, mapWhen, memcpyWhen, markWhen;
+    startWhen = systemTime(CLOCK_MONOTONIC);
+
     // The data is in an external texture, so we need to render it to the
     // pbuffer to get access to RGB pixel data.  We also want to flip it
     // upside-down for easy conversion to a bitmap.
@@ -263,6 +267,8 @@
     int height = mEglWindow.getHeight();
     mExtTexProgram.blit(mExtTextureName, texMatrix, 0, 0, mWidth, mHeight, true);
 
+    blitWhen = systemTime(CLOCK_MONOTONIC);
+
     GLenum glErr;
     glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO[mIndex]);
     glReadPixels(0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, 0);
@@ -271,13 +277,28 @@
         return NULL;
     }
 
-    glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO[mIndex]);
+    readWhen = systemTime(CLOCK_MONOTONIC);
+
     void* ptr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, mBufSize, GL_MAP_READ_BIT);
+    mapWhen = systemTime(CLOCK_MONOTONIC);
+    //memcpy(mVNCScreen->frameBuffer, ptr, mBufSize);
+    mVNCScreen->frameBuffer = (char *)ptr;
+    memcpyWhen = systemTime(CLOCK_MONOTONIC);
+    rfbMarkRectAsModified(mVNCScreen, 0, 0, mWidth, mHeight);
+    markWhen = systemTime(CLOCK_MONOTONIC);
+
     glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
     glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
 
-    mIndex = (mIndex + 1) % NUM_PBO; 
-    return ptr;
+    ALOGV("processFrame: blit=%.3fms read=%.3fms map=%.3fms memcpy=%.3fms mark=%.3fms",
+            (blitWhen - startWhen) / 1000000.0,
+            (readWhen - blitWhen) / 1000000.0,
+            (mapWhen - readWhen) / 1000000.0,
+            (memcpyWhen - mapWhen) / 1000000.0,
+            (markWhen - memcpyWhen) / 1000000.0);
+
+    mIndex = (mIndex + 1) % NUM_PBO;
+    return mVNCScreen->frameBuffer;
 }
 
 void VirtualDisplay::release_l() {