Checksum for GLES messages from host to guest

Add checksum for GLES messages from host to guest. This patch contains
generated code (gl_enc.cpp, gl2_enc.cpp, renderControl_enc.cpp) and
shared code with the host (ChecksumCalculator.cpp,
ChecksumCalculator.h).

(cherry picked from commit eee828509ce3d8fac4f962a68e8d381e83223f8a)

Change-Id: Ie95128c50ad4536ecdcf5f075889313169d677d2
diff --git a/opengl/shared/OpenglCodecCommon/ChecksumCalculator.cpp b/opengl/shared/OpenglCodecCommon/ChecksumCalculator.cpp
index 6dc0316..60940b8 100644
--- a/opengl/shared/OpenglCodecCommon/ChecksumCalculator.cpp
+++ b/opengl/shared/OpenglCodecCommon/ChecksumCalculator.cpp
@@ -100,14 +100,13 @@
     char *checksumPtr = (char *)outputChecksum;
     switch (m_version) {
         case 1: { // protocol v1 is to reverse the packetLen and write it at the end
-            uint32_t val = computeV1Checksum(NULL, m_v1BufferTotalLength);
+            uint32_t val = computeV1Checksum();
             memcpy(checksumPtr, &val, sizeof(val));
             memcpy(checksumPtr+sizeof(val), &m_numWrite, sizeof(m_numWrite));
             break;
         }
     }
     resetChecksum();
-    m_isEncodingChecksum = false;
     m_numWrite++;
     return true;
 }
@@ -121,14 +120,18 @@
     m_isEncodingChecksum = false;
 }
 
-bool ChecksumCalculator::validate(const void* buf, size_t bufLen, const void* expectedChecksum) {
+bool ChecksumCalculator::validate(const void* expectedChecksum, size_t expectedChecksumLen) {
+    size_t checksumSize = checksumByteSize();
+    if (expectedChecksumLen != checksumSize) {
+        m_numRead++;
+        resetChecksum();
+        return false;
+    }
     // buffers for computing the checksum
     unsigned char sChecksumBuffer[kMaxChecksumSize];
-
-    size_t checksumSize = checksumByteSize();
     switch (m_version) {
         case 1: {
-            uint32_t val = computeV1Checksum(buf, bufLen);
+            uint32_t val = computeV1Checksum();
             memcpy(sChecksumBuffer, &val, sizeof(val));
             memcpy(sChecksumBuffer+sizeof(val), &m_numRead, sizeof(m_numRead));
             break;
@@ -136,11 +139,12 @@
     }
     bool isValid = !memcmp(sChecksumBuffer, expectedChecksum, checksumSize);
     m_numRead++;
+    resetChecksum();
     return isValid;
 }
 
-uint32_t ChecksumCalculator::computeV1Checksum(const void* buf, size_t bufLen) {
-    uint32_t revLen = bufLen;
+uint32_t ChecksumCalculator::computeV1Checksum() {
+    uint32_t revLen = m_v1BufferTotalLength;
     revLen = (revLen & 0xffff0000) >> 16 | (revLen & 0x0000ffff) << 16;
     revLen = (revLen & 0xff00ff00) >> 8 | (revLen & 0x00ff00ff) << 8;
     revLen = (revLen & 0xf0f0f0f0) >> 4 | (revLen & 0x0f0f0f0f) << 4;
diff --git a/opengl/shared/OpenglCodecCommon/ChecksumCalculator.h b/opengl/shared/OpenglCodecCommon/ChecksumCalculator.h
index 7884a8d..4cc231a 100644
--- a/opengl/shared/OpenglCodecCommon/ChecksumCalculator.h
+++ b/opengl/shared/OpenglCodecCommon/ChecksumCalculator.h
@@ -35,7 +35,9 @@
 //      (1) take a list of buffers one by one and compute their checksum string,
 //          in this case the checksum should be as the data in those buffers are
 //          concatenated;
-//      (2) take a buffer and a checksum string, tell if they match;
+//      (2) compute the checksum of the buffer list, then either write them into
+//          a buffer provided by user, or compare it against a checksum provided
+//          by user
 //      (3) support different checksum version in future.
 //
 // For backward compatibility, checksum version 0 behaves the same as there is
@@ -48,11 +50,11 @@
 //
 // To evaluate checksums from a list of data buffers buf1, buf2... Please call
 // addBuffer(buf1, buf1len), addBuffer(buf2, buf2len) ... in order.
-// Then allocate a checksum buffer with size checksumByteSize(), and call
+// Then if the checksum needs to be encoded into a buffer, one needs to allocate
+// a checksum buffer with size checksumByteSize(), and call
 // writeChecksum(checksumBuffer) to write the checksum to the buffer.
-//
-// To calculate if a data buffer match its checksum, please call
-// validate(buf, bufLen, checksumBuffer)
+// If the checksum needs to be validated against an existing one, one needs to
+// call validate(existChecksum, existChecksumLen).
 //
 // The checksum generator and validator must be set to the same version, and
 // the validator must check ALL checksums in the order they are generated,
@@ -68,14 +70,15 @@
 //     ChecksumCalculator encoder;
 //     encoder.setVersion(1);
 //     encoder.addBuffer(buf, bufLen);
-//     std::vector<unsigned char> message(bufLen + checksumByteSize());
+//     std::vector<unsigned char> message(bufLen + encoder.checksumByteSize());
 //     memcpy(&message[0], buf, bufLen);
-//     encoder.writeChecksum(&message[0] + bufLen, checksumByteSize());
+//     encoder.writeChecksum(&message[0] + bufLen, encoder.checksumByteSize());
 //
 //     // decoding message
 //     ChecksumCalculator decoder;
 //     decoder.setVersion(1);
-//     return decoder.validate(&message[0], bufLen, &message[0] + bufLen);
+//     decoder.addBuffer(&message[0], bufLen);
+//     return decoder.validate(&message[0] + bufLen, decoder.checksumByteSize());
 // }
 // The return value is true.
 //
@@ -87,28 +90,34 @@
 //     ChecksumCalculator encoder;
 //     encoder.setVersion(1);
 //
-//     std::vector<unsigned char> message1(bufLen1 + checksumByteSize());
-//     std::vector<unsigned char> message2(bufLen2 + checksumByteSize());
+//     std::vector<unsigned char> message1(bufLen1 + encoder.checksumByteSize());
+//     std::vector<unsigned char> message2(bufLen2 + encoder.checksumByteSize());
 //
 //     encoder.addBuffer(buf1, bufLen1);
-//     std::vector<unsigned char> message1(bufLen1 + checksumByteSize());
+//     std::vector<unsigned char> message1(bufLen1 + encoder.checksumByteSize());
 //     memcpy(&message1[0], buf1, bufLen1);
-//     encoder.writeChecksum(&message1[0] + bufLen1, checksumByteSize());
+//     encoder.writeChecksum(&message1[0] + bufLen1, encoder.checksumByteSize());
 //
 //     encoder.addBuffer(buf2, bufLen2);
-//     std::vector<unsigned char> message2(bufLen2 + checksumByteSize());
+//     std::vector<unsigned char> message2(bufLen2 + encoder.checksumByteSize());
 //     memcpy(&message2[0], buf2, bufLen2);
-//     encoder.writeChecksum(&message2[0] + bufLen2, checksumByteSize());
+//     encoder.writeChecksum(&message2[0] + bufLen2, encoder.checksumByteSize());
 //
 //     // decoding messages
 //     ChecksumCalculator decoder;
 //     decoder.setVersion(1);
+//     decoder.addBuffer(&message2[0], bufLen2);
 //     // returns false because the decoding order is not consistent with
 //     // encoding order
-//     if (decoder.validate(&message2[0], bufLen2, &message2[0] + bufLen2) &&
-//          decoder.validate(&message1[0], bufLen1, &message1[0] + bufLen1) ) {
-//          return true;
+//     if (!decoder.validate(&message2[0]+bufLen2, decoder.checksumByteSize())) {
+//         return false;
 //     }
+//
+//     decoder.addBuffer(&message1[0], bufLen1);
+//     if (!decoder.validate(&message1[0]+bufLen1, decoder.checksumByteSize())) {
+//         return false;
+//     }
+//
 //     return false;
 // }
 
@@ -141,18 +150,20 @@
     // the final checksum value and reset its state.
     void addBuffer(const void* buf, size_t bufLen);
     // Write the checksum from the list of buffers to outputChecksum
+    // Will reset the list of buffers by calling resetChecksum.
     // Return false if the buffer is not long enough
     // Please query buffer size from checksumByteSize()
     bool writeChecksum(void* outputChecksum, size_t outputChecksumLen);
     // Restore the states for computing checksums.
-    // Automatically called at the end of writeChecksum.
+    // Automatically called at the end of writeChecksum and validate.
     // Can also be used to abandon the current checksum being calculated.
     // Notes: it doesn't update the internal read / write counter
     void resetChecksum();
 
-    // Calculate the checksum of a packet (with size specified by packetLen),
-    // and compare it with the checksum encoded in expectedChecksum
-    bool validate(const void* buf, size_t bufLen, const void* expectedChecksum);
+    // Calculate the checksum from the list of buffers and
+    // compare it with the checksum encoded in expectedChecksum
+    // Will reset the list of buffers by calling resetChecksum.
+    bool validate(const void* expectedChecksum, size_t expectedChecksumLen);
 protected:
     uint32_t m_version = 0;
     // A temporary state used to compute the total length of a list of buffers,
@@ -164,7 +175,7 @@
 private:
     // Compute a 32bit checksum
     // Used in protocol v1
-    static uint32_t computeV1Checksum(const void* buf, size_t bufLen);
+    uint32_t computeV1Checksum();
     // The buffer used in protocol version 1 to compute checksum.
     uint32_t m_v1BufferTotalLength = 0;
 };
diff --git a/opengl/system/GLESv1_enc/gl_enc.cpp b/opengl/system/GLESv1_enc/gl_enc.cpp
index 6fc3a5b..6206cce 100644
--- a/opengl/system/GLESv1_enc/gl_enc.cpp
+++ b/opengl/system/GLESv1_enc/gl_enc.cpp
@@ -2,6 +2,7 @@
 // generated by 'emugen'
 
 
+#include <memory>
 #include <string.h>
 #include "gl_opcodes.h"
 
@@ -23,6 +24,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -37,8 +39,9 @@
 		memcpy(ptr, &func, 4); ptr += 4;
 		memcpy(ptr, &ref, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClearColor_enc(void *self , GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
@@ -47,6 +50,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -63,8 +67,9 @@
 		memcpy(ptr, &blue, 4); ptr += 4;
 		memcpy(ptr, &alpha, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClearDepthf_enc(void *self , GLclampf depth)
@@ -73,6 +78,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -86,8 +92,9 @@
 
 		memcpy(ptr, &depth, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClipPlanef_enc(void *self , GLenum plane, const GLfloat* equation)
@@ -96,6 +103,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_equation =  (4 * sizeof(float));
 	 unsigned char *ptr;
@@ -112,8 +120,9 @@
 	*(unsigned int *)(ptr) = __size_equation; ptr += 4;
 	memcpy(ptr, equation, __size_equation);ptr += __size_equation;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glColor4f_enc(void *self , GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
@@ -122,6 +131,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -138,8 +148,9 @@
 		memcpy(ptr, &blue, 4); ptr += 4;
 		memcpy(ptr, &alpha, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDepthRangef_enc(void *self , GLclampf zNear, GLclampf zFar)
@@ -148,6 +159,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -162,8 +174,9 @@
 		memcpy(ptr, &zNear, 4); ptr += 4;
 		memcpy(ptr, &zFar, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFogf_enc(void *self , GLenum pname, GLfloat param)
@@ -172,6 +185,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -186,8 +200,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFogfv_enc(void *self , GLenum pname, const GLfloat* params)
@@ -196,6 +211,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -212,8 +228,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFrustumf_enc(void *self , GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
@@ -222,6 +239,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -240,8 +258,9 @@
 		memcpy(ptr, &zNear, 4); ptr += 4;
 		memcpy(ptr, &zFar, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGetClipPlanef_enc(void *self , GLenum pname, GLfloat* eqn)
@@ -250,6 +269,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_eqn =  (4 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -265,9 +285,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_eqn; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(eqn, __size_eqn);
+	if (useChecksum) checksumCalculator->addBuffer(eqn, __size_eqn);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetClipPlanef: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetFloatv_enc(void *self , GLenum pname, GLfloat* params)
@@ -276,6 +306,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -291,9 +322,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetFloatv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetLightfv_enc(void *self , GLenum light, GLenum pname, GLfloat* params)
@@ -302,6 +343,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -318,9 +360,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetLightfv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetMaterialfv_enc(void *self , GLenum face, GLenum pname, GLfloat* params)
@@ -329,6 +381,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -345,9 +398,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetMaterialfv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetTexEnvfv_enc(void *self , GLenum env, GLenum pname, GLfloat* params)
@@ -356,6 +419,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -372,9 +436,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetTexEnvfv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetTexParameterfv_enc(void *self , GLenum target, GLenum pname, GLfloat* params)
@@ -383,6 +457,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -399,9 +474,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetTexParameterfv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glLightModelf_enc(void *self , GLenum pname, GLfloat param)
@@ -410,6 +495,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -424,8 +510,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLightModelfv_enc(void *self , GLenum pname, const GLfloat* params)
@@ -434,6 +521,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -450,8 +538,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLightf_enc(void *self , GLenum light, GLenum pname, GLfloat param)
@@ -460,6 +549,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -475,8 +565,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLightfv_enc(void *self , GLenum light, GLenum pname, const GLfloat* params)
@@ -485,6 +576,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -502,8 +594,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLineWidth_enc(void *self , GLfloat width)
@@ -512,6 +605,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -525,8 +619,9 @@
 
 		memcpy(ptr, &width, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLoadMatrixf_enc(void *self , const GLfloat* m)
@@ -535,6 +630,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_m =  (16 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -550,8 +646,9 @@
 	*(unsigned int *)(ptr) = __size_m; ptr += 4;
 	memcpy(ptr, m, __size_m);ptr += __size_m;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMaterialf_enc(void *self , GLenum face, GLenum pname, GLfloat param)
@@ -560,6 +657,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -575,8 +673,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMaterialfv_enc(void *self , GLenum face, GLenum pname, const GLfloat* params)
@@ -585,6 +684,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -602,8 +702,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMultMatrixf_enc(void *self , const GLfloat* m)
@@ -612,6 +713,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_m =  (16 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -627,8 +729,9 @@
 	*(unsigned int *)(ptr) = __size_m; ptr += 4;
 	memcpy(ptr, m, __size_m);ptr += __size_m;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMultiTexCoord4f_enc(void *self , GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
@@ -637,6 +740,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -654,8 +758,9 @@
 		memcpy(ptr, &r, 4); ptr += 4;
 		memcpy(ptr, &q, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glNormal3f_enc(void *self , GLfloat nx, GLfloat ny, GLfloat nz)
@@ -664,6 +769,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -679,8 +785,9 @@
 		memcpy(ptr, &ny, 4); ptr += 4;
 		memcpy(ptr, &nz, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glOrthof_enc(void *self , GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
@@ -689,6 +796,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -707,8 +815,9 @@
 		memcpy(ptr, &zNear, 4); ptr += 4;
 		memcpy(ptr, &zFar, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPointParameterf_enc(void *self , GLenum pname, GLfloat param)
@@ -717,6 +826,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -731,8 +841,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPointParameterfv_enc(void *self , GLenum pname, const GLfloat* params)
@@ -741,6 +852,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -757,8 +869,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPointSize_enc(void *self , GLfloat size)
@@ -767,6 +880,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -780,8 +894,9 @@
 
 		memcpy(ptr, &size, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPolygonOffset_enc(void *self , GLfloat factor, GLfloat units)
@@ -790,6 +905,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -804,8 +920,9 @@
 		memcpy(ptr, &factor, 4); ptr += 4;
 		memcpy(ptr, &units, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glRotatef_enc(void *self , GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
@@ -814,6 +931,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -830,8 +948,9 @@
 		memcpy(ptr, &y, 4); ptr += 4;
 		memcpy(ptr, &z, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glScalef_enc(void *self , GLfloat x, GLfloat y, GLfloat z)
@@ -840,6 +959,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -855,8 +975,9 @@
 		memcpy(ptr, &y, 4); ptr += 4;
 		memcpy(ptr, &z, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexEnvf_enc(void *self , GLenum target, GLenum pname, GLfloat param)
@@ -865,6 +986,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -880,8 +1002,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexEnvfv_enc(void *self , GLenum target, GLenum pname, const GLfloat* params)
@@ -890,6 +1013,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -907,8 +1031,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexParameterf_enc(void *self , GLenum target, GLenum pname, GLfloat param)
@@ -917,6 +1042,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -932,8 +1058,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexParameterfv_enc(void *self , GLenum target, GLenum pname, const GLfloat* params)
@@ -942,6 +1069,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -959,8 +1087,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTranslatef_enc(void *self , GLfloat x, GLfloat y, GLfloat z)
@@ -969,6 +1098,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -984,8 +1114,9 @@
 		memcpy(ptr, &y, 4); ptr += 4;
 		memcpy(ptr, &z, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glActiveTexture_enc(void *self , GLenum texture)
@@ -994,6 +1125,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1007,8 +1139,9 @@
 
 		memcpy(ptr, &texture, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glAlphaFuncx_enc(void *self , GLenum func, GLclampx ref)
@@ -1017,6 +1150,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1031,8 +1165,9 @@
 		memcpy(ptr, &func, 4); ptr += 4;
 		memcpy(ptr, &ref, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBindBuffer_enc(void *self , GLenum target, GLuint buffer)
@@ -1041,6 +1176,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1055,8 +1191,9 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &buffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBindTexture_enc(void *self , GLenum target, GLuint texture)
@@ -1065,6 +1202,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1079,8 +1217,9 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &texture, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBlendFunc_enc(void *self , GLenum sfactor, GLenum dfactor)
@@ -1089,6 +1228,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1103,8 +1243,9 @@
 		memcpy(ptr, &sfactor, 4); ptr += 4;
 		memcpy(ptr, &dfactor, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBufferData_enc(void *self , GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
@@ -1113,6 +1254,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data = ((data != NULL) ?  size : 0);
 	 unsigned char *ptr;
@@ -1131,8 +1273,9 @@
 	if (data != NULL) memcpy(ptr, data, __size_data);ptr += __size_data;
 		memcpy(ptr, &usage, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBufferSubData_enc(void *self , GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
@@ -1141,6 +1284,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data = ((data != NULL) ?  size : 0);
 	 unsigned char *ptr;
@@ -1159,8 +1303,9 @@
 	*(unsigned int *)(ptr) = __size_data; ptr += 4;
 	if (data != NULL) memcpy(ptr, data, __size_data);ptr += __size_data;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClear_enc(void *self , GLbitfield mask)
@@ -1169,6 +1314,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1182,8 +1328,9 @@
 
 		memcpy(ptr, &mask, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClearColorx_enc(void *self , GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
@@ -1192,6 +1339,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1208,8 +1356,9 @@
 		memcpy(ptr, &blue, 4); ptr += 4;
 		memcpy(ptr, &alpha, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClearDepthx_enc(void *self , GLclampx depth)
@@ -1218,6 +1367,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1231,8 +1381,9 @@
 
 		memcpy(ptr, &depth, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClearStencil_enc(void *self , GLint s)
@@ -1241,6 +1392,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1254,8 +1406,9 @@
 
 		memcpy(ptr, &s, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClientActiveTexture_enc(void *self , GLenum texture)
@@ -1264,6 +1417,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1277,8 +1431,9 @@
 
 		memcpy(ptr, &texture, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glColor4ub_enc(void *self , GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
@@ -1287,6 +1442,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1303,8 +1459,9 @@
 		memcpy(ptr, &blue, 1); ptr += 1;
 		memcpy(ptr, &alpha, 1); ptr += 1;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glColor4x_enc(void *self , GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
@@ -1313,6 +1470,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1329,8 +1487,9 @@
 		memcpy(ptr, &blue, 4); ptr += 4;
 		memcpy(ptr, &alpha, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glColorMask_enc(void *self , GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
@@ -1339,6 +1498,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1355,8 +1515,9 @@
 		memcpy(ptr, &blue, 1); ptr += 1;
 		memcpy(ptr, &alpha, 1); ptr += 1;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glCompressedTexImage2D_enc(void *self , GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data)
@@ -1365,6 +1526,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data = ((data != NULL) ?  imageSize : 0);
 	 unsigned char *ptr;
@@ -1387,8 +1549,9 @@
 	*(unsigned int *)(ptr) = __size_data; ptr += 4;
 	if (data != NULL) memcpy(ptr, data, __size_data);ptr += __size_data;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glCompressedTexSubImage2D_enc(void *self , GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data)
@@ -1397,6 +1560,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data = ((data != NULL) ?  imageSize : 0);
 	 unsigned char *ptr;
@@ -1420,8 +1584,9 @@
 	*(unsigned int *)(ptr) = __size_data; ptr += 4;
 	if (data != NULL) memcpy(ptr, data, __size_data);ptr += __size_data;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glCopyTexImage2D_enc(void *self , GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
@@ -1430,6 +1595,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1450,8 +1616,9 @@
 		memcpy(ptr, &height, 4); ptr += 4;
 		memcpy(ptr, &border, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glCopyTexSubImage2D_enc(void *self , GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
@@ -1460,6 +1627,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1480,8 +1648,9 @@
 		memcpy(ptr, &width, 4); ptr += 4;
 		memcpy(ptr, &height, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glCullFace_enc(void *self , GLenum mode)
@@ -1490,6 +1659,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1503,8 +1673,9 @@
 
 		memcpy(ptr, &mode, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDeleteBuffers_enc(void *self , GLsizei n, const GLuint* buffers)
@@ -1513,6 +1684,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_buffers =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -1529,8 +1701,9 @@
 	*(unsigned int *)(ptr) = __size_buffers; ptr += 4;
 	memcpy(ptr, buffers, __size_buffers);ptr += __size_buffers;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDeleteTextures_enc(void *self , GLsizei n, const GLuint* textures)
@@ -1539,6 +1712,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_textures =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -1555,8 +1729,9 @@
 	*(unsigned int *)(ptr) = __size_textures; ptr += 4;
 	memcpy(ptr, textures, __size_textures);ptr += __size_textures;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDepthFunc_enc(void *self , GLenum func)
@@ -1565,6 +1740,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1578,8 +1754,9 @@
 
 		memcpy(ptr, &func, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDepthMask_enc(void *self , GLboolean flag)
@@ -1588,6 +1765,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1601,8 +1779,9 @@
 
 		memcpy(ptr, &flag, 1); ptr += 1;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDepthRangex_enc(void *self , GLclampx zNear, GLclampx zFar)
@@ -1611,6 +1790,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1625,8 +1805,9 @@
 		memcpy(ptr, &zNear, 4); ptr += 4;
 		memcpy(ptr, &zFar, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDisable_enc(void *self , GLenum cap)
@@ -1635,6 +1816,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1648,8 +1830,9 @@
 
 		memcpy(ptr, &cap, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDisableClientState_enc(void *self , GLenum array)
@@ -1658,6 +1841,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1671,8 +1855,9 @@
 
 		memcpy(ptr, &array, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDrawArrays_enc(void *self , GLenum mode, GLint first, GLsizei count)
@@ -1681,6 +1866,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1696,8 +1882,9 @@
 		memcpy(ptr, &first, 4); ptr += 4;
 		memcpy(ptr, &count, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glEnable_enc(void *self , GLenum cap)
@@ -1706,6 +1893,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1719,8 +1907,9 @@
 
 		memcpy(ptr, &cap, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glEnableClientState_enc(void *self , GLenum array)
@@ -1729,6 +1918,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1742,8 +1932,9 @@
 
 		memcpy(ptr, &array, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFinish_enc(void *self )
@@ -1752,6 +1943,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1764,8 +1956,9 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFlush_enc(void *self )
@@ -1774,6 +1967,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1786,8 +1980,9 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFogx_enc(void *self , GLenum pname, GLfixed param)
@@ -1796,6 +1991,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1810,8 +2006,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFogxv_enc(void *self , GLenum pname, const GLfixed* params)
@@ -1820,6 +2017,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -1836,8 +2034,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFrontFace_enc(void *self , GLenum mode)
@@ -1846,6 +2045,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1859,8 +2059,9 @@
 
 		memcpy(ptr, &mode, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFrustumx_enc(void *self , GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
@@ -1869,6 +2070,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1887,8 +2089,9 @@
 		memcpy(ptr, &zNear, 4); ptr += 4;
 		memcpy(ptr, &zFar, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGetBooleanv_enc(void *self , GLenum pname, GLboolean* params)
@@ -1897,6 +2100,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLboolean));
 	 unsigned char *ptr;
@@ -1912,9 +2116,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetBooleanv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetBufferParameteriv_enc(void *self , GLenum target, GLenum pname, GLint* params)
@@ -1923,6 +2137,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (sizeof(GLint));
 	 unsigned char *ptr;
@@ -1939,9 +2154,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetBufferParameteriv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glClipPlanex_enc(void *self , GLenum pname, const GLfixed* eqn)
@@ -1950,6 +2175,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_eqn =  (4 * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -1966,8 +2192,9 @@
 	*(unsigned int *)(ptr) = __size_eqn; ptr += 4;
 	memcpy(ptr, eqn, __size_eqn);ptr += __size_eqn;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGenBuffers_enc(void *self , GLsizei n, GLuint* buffers)
@@ -1976,6 +2203,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_buffers =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -1991,9 +2219,19 @@
 		memcpy(ptr, &n, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_buffers; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(buffers, __size_buffers);
+	if (useChecksum) checksumCalculator->addBuffer(buffers, __size_buffers);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGenBuffers: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGenTextures_enc(void *self , GLsizei n, GLuint* textures)
@@ -2002,6 +2240,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_textures =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -2017,9 +2256,19 @@
 		memcpy(ptr, &n, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_textures; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(textures, __size_textures);
+	if (useChecksum) checksumCalculator->addBuffer(textures, __size_textures);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGenTextures: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 GLenum glGetError_enc(void *self )
@@ -2028,6 +2277,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2040,11 +2290,21 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLenum retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetError: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -2054,6 +2314,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -2069,9 +2330,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetFixedv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetIntegerv_enc(void *self , GLenum pname, GLint* params)
@@ -2080,6 +2351,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLint));
 	 unsigned char *ptr;
@@ -2095,9 +2367,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetIntegerv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetLightxv_enc(void *self , GLenum light, GLenum pname, GLfixed* params)
@@ -2106,6 +2388,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -2122,9 +2405,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetLightxv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetMaterialxv_enc(void *self , GLenum face, GLenum pname, GLfixed* params)
@@ -2133,6 +2426,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -2149,9 +2443,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetMaterialxv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetTexEnviv_enc(void *self , GLenum env, GLenum pname, GLint* params)
@@ -2160,6 +2464,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLint));
 	 unsigned char *ptr;
@@ -2176,9 +2481,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetTexEnviv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetTexEnvxv_enc(void *self , GLenum env, GLenum pname, GLfixed* params)
@@ -2187,6 +2502,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -2203,9 +2519,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetTexEnvxv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetTexParameteriv_enc(void *self , GLenum target, GLenum pname, GLint* params)
@@ -2214,6 +2540,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (sizeof(GLint));
 	 unsigned char *ptr;
@@ -2230,9 +2557,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetTexParameteriv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetTexParameterxv_enc(void *self , GLenum target, GLenum pname, GLfixed* params)
@@ -2241,6 +2578,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -2257,9 +2595,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetTexParameterxv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glHint_enc(void *self , GLenum target, GLenum mode)
@@ -2268,6 +2616,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2282,8 +2631,9 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &mode, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 GLboolean glIsBuffer_enc(void *self , GLuint buffer)
@@ -2292,6 +2642,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2305,11 +2656,21 @@
 
 		memcpy(ptr, &buffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsBuffer: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -2319,6 +2680,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2332,11 +2694,21 @@
 
 		memcpy(ptr, &cap, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsEnabled: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -2346,6 +2718,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2359,11 +2732,21 @@
 
 		memcpy(ptr, &texture, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsTexture: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -2373,6 +2756,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2387,8 +2771,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLightModelxv_enc(void *self , GLenum pname, const GLfixed* params)
@@ -2397,6 +2782,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -2413,8 +2799,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLightx_enc(void *self , GLenum light, GLenum pname, GLfixed param)
@@ -2423,6 +2810,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2438,8 +2826,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLightxv_enc(void *self , GLenum light, GLenum pname, const GLfixed* params)
@@ -2448,6 +2837,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -2465,8 +2855,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLineWidthx_enc(void *self , GLfixed width)
@@ -2475,6 +2866,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2488,8 +2880,9 @@
 
 		memcpy(ptr, &width, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLoadIdentity_enc(void *self )
@@ -2498,6 +2891,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2510,8 +2904,9 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLoadMatrixx_enc(void *self , const GLfixed* m)
@@ -2520,6 +2915,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_m =  (16 * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -2535,8 +2931,9 @@
 	*(unsigned int *)(ptr) = __size_m; ptr += 4;
 	memcpy(ptr, m, __size_m);ptr += __size_m;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLogicOp_enc(void *self , GLenum opcode)
@@ -2545,6 +2942,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2558,8 +2956,9 @@
 
 		memcpy(ptr, &opcode, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMaterialx_enc(void *self , GLenum face, GLenum pname, GLfixed param)
@@ -2568,6 +2967,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2583,8 +2983,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMaterialxv_enc(void *self , GLenum face, GLenum pname, const GLfixed* params)
@@ -2593,6 +2994,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -2610,8 +3012,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMatrixMode_enc(void *self , GLenum mode)
@@ -2620,6 +3023,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2633,8 +3037,9 @@
 
 		memcpy(ptr, &mode, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMultMatrixx_enc(void *self , const GLfixed* m)
@@ -2643,6 +3048,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_m =  (16 * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -2658,8 +3064,9 @@
 	*(unsigned int *)(ptr) = __size_m; ptr += 4;
 	memcpy(ptr, m, __size_m);ptr += __size_m;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMultiTexCoord4x_enc(void *self , GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
@@ -2668,6 +3075,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2685,8 +3093,9 @@
 		memcpy(ptr, &r, 4); ptr += 4;
 		memcpy(ptr, &q, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glNormal3x_enc(void *self , GLfixed nx, GLfixed ny, GLfixed nz)
@@ -2695,6 +3104,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2710,8 +3120,9 @@
 		memcpy(ptr, &ny, 4); ptr += 4;
 		memcpy(ptr, &nz, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glOrthox_enc(void *self , GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
@@ -2720,6 +3131,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2738,8 +3150,9 @@
 		memcpy(ptr, &zNear, 4); ptr += 4;
 		memcpy(ptr, &zFar, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPixelStorei_enc(void *self , GLenum pname, GLint param)
@@ -2748,6 +3161,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2762,8 +3176,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPointParameterx_enc(void *self , GLenum pname, GLfixed param)
@@ -2772,6 +3187,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2786,8 +3202,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPointParameterxv_enc(void *self , GLenum pname, const GLfixed* params)
@@ -2796,6 +3213,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -2812,8 +3230,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPointSizex_enc(void *self , GLfixed size)
@@ -2822,6 +3241,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2835,8 +3255,9 @@
 
 		memcpy(ptr, &size, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPolygonOffsetx_enc(void *self , GLfixed factor, GLfixed units)
@@ -2845,6 +3266,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2859,8 +3281,9 @@
 		memcpy(ptr, &factor, 4); ptr += 4;
 		memcpy(ptr, &units, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPopMatrix_enc(void *self )
@@ -2869,6 +3292,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2881,8 +3305,9 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPushMatrix_enc(void *self )
@@ -2891,6 +3316,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2903,8 +3329,9 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glReadPixels_enc(void *self , GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)
@@ -2913,6 +3340,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_pixels =  glesv1_enc::pixelDataSize(self, width, height, format, type, 1);
 	 unsigned char *ptr;
@@ -2933,9 +3361,19 @@
 		memcpy(ptr, &type, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_pixels; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(pixels, __size_pixels);
+	if (useChecksum) checksumCalculator->addBuffer(pixels, __size_pixels);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glReadPixels: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glRotatex_enc(void *self , GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
@@ -2944,6 +3382,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2960,8 +3399,9 @@
 		memcpy(ptr, &y, 4); ptr += 4;
 		memcpy(ptr, &z, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glSampleCoverage_enc(void *self , GLclampf value, GLboolean invert)
@@ -2970,6 +3410,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2984,8 +3425,9 @@
 		memcpy(ptr, &value, 4); ptr += 4;
 		memcpy(ptr, &invert, 1); ptr += 1;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glSampleCoveragex_enc(void *self , GLclampx value, GLboolean invert)
@@ -2994,6 +3436,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3008,8 +3451,9 @@
 		memcpy(ptr, &value, 4); ptr += 4;
 		memcpy(ptr, &invert, 1); ptr += 1;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glScalex_enc(void *self , GLfixed x, GLfixed y, GLfixed z)
@@ -3018,6 +3462,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3033,8 +3478,9 @@
 		memcpy(ptr, &y, 4); ptr += 4;
 		memcpy(ptr, &z, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glScissor_enc(void *self , GLint x, GLint y, GLsizei width, GLsizei height)
@@ -3043,6 +3489,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3059,8 +3506,9 @@
 		memcpy(ptr, &width, 4); ptr += 4;
 		memcpy(ptr, &height, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glShadeModel_enc(void *self , GLenum mode)
@@ -3069,6 +3517,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3082,8 +3531,9 @@
 
 		memcpy(ptr, &mode, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glStencilFunc_enc(void *self , GLenum func, GLint ref, GLuint mask)
@@ -3092,6 +3542,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3107,8 +3558,9 @@
 		memcpy(ptr, &ref, 4); ptr += 4;
 		memcpy(ptr, &mask, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glStencilMask_enc(void *self , GLuint mask)
@@ -3117,6 +3569,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3130,8 +3583,9 @@
 
 		memcpy(ptr, &mask, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glStencilOp_enc(void *self , GLenum fail, GLenum zfail, GLenum zpass)
@@ -3140,6 +3594,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3155,8 +3610,9 @@
 		memcpy(ptr, &zfail, 4); ptr += 4;
 		memcpy(ptr, &zpass, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexEnvi_enc(void *self , GLenum target, GLenum pname, GLint param)
@@ -3165,6 +3621,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3180,8 +3637,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexEnvx_enc(void *self , GLenum target, GLenum pname, GLfixed param)
@@ -3190,6 +3648,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3205,8 +3664,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexEnviv_enc(void *self , GLenum target, GLenum pname, const GLint* params)
@@ -3215,6 +3675,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLint));
 	 unsigned char *ptr;
@@ -3232,8 +3693,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexEnvxv_enc(void *self , GLenum target, GLenum pname, const GLfixed* params)
@@ -3242,6 +3704,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -3259,8 +3722,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexImage2D_enc(void *self , GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
@@ -3269,6 +3733,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_pixels = ((pixels != NULL) ?  glesv1_enc::pixelDataSize(self, width, height, format, type, 0) : 0);
 	 unsigned char *ptr;
@@ -3290,16 +3755,17 @@
 		memcpy(ptr, &format, 4); ptr += 4;
 		memcpy(ptr, &type, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
 	stream->flush();
 	stream->writeFully(&__size_pixels,4);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(&__size_pixels,4);
+	if (useChecksum) checksumCalculator->addBuffer(&__size_pixels,4);
 	if (pixels != NULL) {
 		stream->writeFully(pixels, __size_pixels);
-		if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(pixels, __size_pixels);
+		if (useChecksum) checksumCalculator->addBuffer(pixels, __size_pixels);
 	}
 	buf = stream->alloc(checksumSize);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(buf, checksumSize);
+	if (useChecksum) checksumCalculator->writeChecksum(buf, checksumSize);
+
 }
 
 void glTexParameteri_enc(void *self , GLenum target, GLenum pname, GLint param)
@@ -3308,6 +3774,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3323,8 +3790,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexParameterx_enc(void *self , GLenum target, GLenum pname, GLfixed param)
@@ -3333,6 +3801,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3348,8 +3817,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexParameteriv_enc(void *self , GLenum target, GLenum pname, const GLint* params)
@@ -3358,6 +3828,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLint));
 	 unsigned char *ptr;
@@ -3375,8 +3846,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexParameterxv_enc(void *self , GLenum target, GLenum pname, const GLfixed* params)
@@ -3385,6 +3857,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -3402,8 +3875,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexSubImage2D_enc(void *self , GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels)
@@ -3412,6 +3886,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_pixels = ((pixels != NULL) ?  glesv1_enc::pixelDataSize(self, width, height, format, type, 0) : 0);
 	 unsigned char *ptr;
@@ -3433,16 +3908,17 @@
 		memcpy(ptr, &format, 4); ptr += 4;
 		memcpy(ptr, &type, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
 	stream->flush();
 	stream->writeFully(&__size_pixels,4);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(&__size_pixels,4);
+	if (useChecksum) checksumCalculator->addBuffer(&__size_pixels,4);
 	if (pixels != NULL) {
 		stream->writeFully(pixels, __size_pixels);
-		if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(pixels, __size_pixels);
+		if (useChecksum) checksumCalculator->addBuffer(pixels, __size_pixels);
 	}
 	buf = stream->alloc(checksumSize);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(buf, checksumSize);
+	if (useChecksum) checksumCalculator->writeChecksum(buf, checksumSize);
+
 }
 
 void glTranslatex_enc(void *self , GLfixed x, GLfixed y, GLfixed z)
@@ -3451,6 +3927,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3466,8 +3943,9 @@
 		memcpy(ptr, &y, 4); ptr += 4;
 		memcpy(ptr, &z, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glViewport_enc(void *self , GLint x, GLint y, GLsizei width, GLsizei height)
@@ -3476,6 +3954,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3492,8 +3971,9 @@
 		memcpy(ptr, &width, 4); ptr += 4;
 		memcpy(ptr, &height, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glVertexPointerOffset_enc(void *self , GLint size, GLenum type, GLsizei stride, GLuint offset)
@@ -3502,6 +3982,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3518,8 +3999,9 @@
 		memcpy(ptr, &stride, 4); ptr += 4;
 		memcpy(ptr, &offset, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glColorPointerOffset_enc(void *self , GLint size, GLenum type, GLsizei stride, GLuint offset)
@@ -3528,6 +4010,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3544,8 +4027,9 @@
 		memcpy(ptr, &stride, 4); ptr += 4;
 		memcpy(ptr, &offset, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glNormalPointerOffset_enc(void *self , GLenum type, GLsizei stride, GLuint offset)
@@ -3554,6 +4038,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3569,8 +4054,9 @@
 		memcpy(ptr, &stride, 4); ptr += 4;
 		memcpy(ptr, &offset, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPointSizePointerOffset_enc(void *self , GLenum type, GLsizei stride, GLuint offset)
@@ -3579,6 +4065,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3594,8 +4081,9 @@
 		memcpy(ptr, &stride, 4); ptr += 4;
 		memcpy(ptr, &offset, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexCoordPointerOffset_enc(void *self , GLint size, GLenum type, GLsizei stride, GLuint offset)
@@ -3604,6 +4092,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3620,8 +4109,9 @@
 		memcpy(ptr, &stride, 4); ptr += 4;
 		memcpy(ptr, &offset, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glWeightPointerOffset_enc(void *self , GLint size, GLenum type, GLsizei stride, GLuint offset)
@@ -3630,6 +4120,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3646,8 +4137,9 @@
 		memcpy(ptr, &stride, 4); ptr += 4;
 		memcpy(ptr, &offset, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMatrixIndexPointerOffset_enc(void *self , GLint size, GLenum type, GLsizei stride, GLuint offset)
@@ -3656,6 +4148,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3672,8 +4165,9 @@
 		memcpy(ptr, &stride, 4); ptr += 4;
 		memcpy(ptr, &offset, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glVertexPointerData_enc(void *self , GLint size, GLenum type, GLsizei stride, void* data, GLuint datalen)
@@ -3682,6 +4176,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data =  datalen;
 	 unsigned char *ptr;
@@ -3701,8 +4196,9 @@
 	 glUtilsPackPointerData((unsigned char *)ptr, (unsigned char *)data, size, type, stride, datalen);ptr += __size_data;
 		memcpy(ptr, &datalen, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glColorPointerData_enc(void *self , GLint size, GLenum type, GLsizei stride, void* data, GLuint datalen)
@@ -3711,6 +4207,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data =  datalen;
 	 unsigned char *ptr;
@@ -3730,8 +4227,9 @@
 	 glUtilsPackPointerData((unsigned char *)ptr, (unsigned char *)data, size, type, stride, datalen);ptr += __size_data;
 		memcpy(ptr, &datalen, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glNormalPointerData_enc(void *self , GLenum type, GLsizei stride, void* data, GLuint datalen)
@@ -3740,6 +4238,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data =  datalen;
 	 unsigned char *ptr;
@@ -3758,8 +4257,9 @@
 	 glUtilsPackPointerData((unsigned char *)ptr, (unsigned char *)data, 3, type, stride, datalen);ptr += __size_data;
 		memcpy(ptr, &datalen, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexCoordPointerData_enc(void *self , GLint unit, GLint size, GLenum type, GLsizei stride, void* data, GLuint datalen)
@@ -3768,6 +4268,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data =  datalen;
 	 unsigned char *ptr;
@@ -3788,8 +4289,9 @@
 	 glUtilsPackPointerData((unsigned char *)ptr, (unsigned char *)data, size, type, stride, datalen);ptr += __size_data;
 		memcpy(ptr, &datalen, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPointSizePointerData_enc(void *self , GLenum type, GLsizei stride, void* data, GLuint datalen)
@@ -3798,6 +4300,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data =  datalen;
 	 unsigned char *ptr;
@@ -3816,8 +4319,9 @@
 	 glUtilsPackPointerData((unsigned char *)ptr, (unsigned char *)data, 1, type, stride, datalen);ptr += __size_data;
 		memcpy(ptr, &datalen, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glWeightPointerData_enc(void *self , GLint size, GLenum type, GLsizei stride, void* data, GLuint datalen)
@@ -3826,6 +4330,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data =  datalen;
 	 unsigned char *ptr;
@@ -3845,8 +4350,9 @@
 	 glUtilsPackPointerData((unsigned char *)ptr, (unsigned char*)data, size, type, stride, datalen);ptr += __size_data;
 		memcpy(ptr, &datalen, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMatrixIndexPointerData_enc(void *self , GLint size, GLenum type, GLsizei stride, void* data, GLuint datalen)
@@ -3855,6 +4361,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data =  datalen;
 	 unsigned char *ptr;
@@ -3874,8 +4381,9 @@
 	 glUtilsPackPointerData((unsigned char *)ptr, (unsigned char*)data, size, type, stride, datalen);ptr += __size_data;
 		memcpy(ptr, &datalen, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDrawElementsOffset_enc(void *self , GLenum mode, GLsizei count, GLenum type, GLuint offset)
@@ -3884,6 +4392,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3900,8 +4409,9 @@
 		memcpy(ptr, &type, 4); ptr += 4;
 		memcpy(ptr, &offset, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDrawElementsData_enc(void *self , GLenum mode, GLsizei count, GLenum type, void* data, GLuint datalen)
@@ -3910,6 +4420,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data =  datalen;
 	 unsigned char *ptr;
@@ -3929,8 +4440,9 @@
 	memcpy(ptr, data, __size_data);ptr += __size_data;
 		memcpy(ptr, &datalen, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGetCompressedTextureFormats_enc(void *self , int count, GLint* formats)
@@ -3939,6 +4451,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_formats =  (count * sizeof(GLint));
 	 unsigned char *ptr;
@@ -3954,9 +4467,19 @@
 		memcpy(ptr, &count, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_formats; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(formats, __size_formats);
+	if (useChecksum) checksumCalculator->addBuffer(formats, __size_formats);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetCompressedTextureFormats: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 int glFinishRoundTrip_enc(void *self )
@@ -3965,6 +4488,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3977,11 +4501,21 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	int retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glFinishRoundTrip: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -3991,6 +4525,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4005,8 +4540,9 @@
 		memcpy(ptr, &modeRGB, 4); ptr += 4;
 		memcpy(ptr, &modeAlpha, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBlendFuncSeparateOES_enc(void *self , GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
@@ -4015,6 +4551,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4031,8 +4568,9 @@
 		memcpy(ptr, &srcAlpha, 4); ptr += 4;
 		memcpy(ptr, &dstAlpha, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBlendEquationOES_enc(void *self , GLenum mode)
@@ -4041,6 +4579,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4054,8 +4593,9 @@
 
 		memcpy(ptr, &mode, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDrawTexsOES_enc(void *self , GLshort x, GLshort y, GLshort z, GLshort width, GLshort height)
@@ -4064,6 +4604,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4081,8 +4622,9 @@
 		memcpy(ptr, &width, 2); ptr += 2;
 		memcpy(ptr, &height, 2); ptr += 2;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDrawTexiOES_enc(void *self , GLint x, GLint y, GLint z, GLint width, GLint height)
@@ -4091,6 +4633,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4108,8 +4651,9 @@
 		memcpy(ptr, &width, 4); ptr += 4;
 		memcpy(ptr, &height, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDrawTexxOES_enc(void *self , GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height)
@@ -4118,6 +4662,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4135,8 +4680,9 @@
 		memcpy(ptr, &width, 4); ptr += 4;
 		memcpy(ptr, &height, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDrawTexsvOES_enc(void *self , const GLshort* coords)
@@ -4145,6 +4691,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_coords =  (5 * sizeof(GLshort));
 	 unsigned char *ptr;
@@ -4160,8 +4707,9 @@
 	*(unsigned int *)(ptr) = __size_coords; ptr += 4;
 	memcpy(ptr, coords, __size_coords);ptr += __size_coords;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDrawTexivOES_enc(void *self , const GLint* coords)
@@ -4170,6 +4718,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_coords =  (5 * sizeof(GLint));
 	 unsigned char *ptr;
@@ -4185,8 +4734,9 @@
 	*(unsigned int *)(ptr) = __size_coords; ptr += 4;
 	memcpy(ptr, coords, __size_coords);ptr += __size_coords;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDrawTexxvOES_enc(void *self , const GLfixed* coords)
@@ -4195,6 +4745,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_coords =  (5 * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4210,8 +4761,9 @@
 	*(unsigned int *)(ptr) = __size_coords; ptr += 4;
 	memcpy(ptr, coords, __size_coords);ptr += __size_coords;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDrawTexfOES_enc(void *self , GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height)
@@ -4220,6 +4772,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4237,8 +4790,9 @@
 		memcpy(ptr, &width, 4); ptr += 4;
 		memcpy(ptr, &height, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDrawTexfvOES_enc(void *self , const GLfloat* coords)
@@ -4247,6 +4801,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_coords =  (5 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -4262,8 +4817,9 @@
 	*(unsigned int *)(ptr) = __size_coords; ptr += 4;
 	memcpy(ptr, coords, __size_coords);ptr += __size_coords;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glEGLImageTargetTexture2DOES_enc(void *self , GLenum target, GLeglImageOES image)
@@ -4272,6 +4828,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4286,8 +4843,9 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &image, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glEGLImageTargetRenderbufferStorageOES_enc(void *self , GLenum target, GLeglImageOES image)
@@ -4296,6 +4854,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4310,8 +4869,9 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &image, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glAlphaFuncxOES_enc(void *self , GLenum func, GLclampx ref)
@@ -4320,6 +4880,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4334,8 +4895,9 @@
 		memcpy(ptr, &func, 4); ptr += 4;
 		memcpy(ptr, &ref, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClearColorxOES_enc(void *self , GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
@@ -4344,6 +4906,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4360,8 +4923,9 @@
 		memcpy(ptr, &blue, 4); ptr += 4;
 		memcpy(ptr, &alpha, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClearDepthxOES_enc(void *self , GLclampx depth)
@@ -4370,6 +4934,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4383,8 +4948,9 @@
 
 		memcpy(ptr, &depth, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClipPlanexOES_enc(void *self , GLenum plane, const GLfixed* equation)
@@ -4393,6 +4959,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_equation =  (4 * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4409,8 +4976,9 @@
 	*(unsigned int *)(ptr) = __size_equation; ptr += 4;
 	memcpy(ptr, equation, __size_equation);ptr += __size_equation;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClipPlanexIMG_enc(void *self , GLenum plane, const GLfixed* equation)
@@ -4419,6 +4987,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_equation =  (4 * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4435,8 +5004,9 @@
 	*(unsigned int *)(ptr) = __size_equation; ptr += 4;
 	memcpy(ptr, equation, __size_equation);ptr += __size_equation;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glColor4xOES_enc(void *self , GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
@@ -4445,6 +5015,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4461,8 +5032,9 @@
 		memcpy(ptr, &blue, 4); ptr += 4;
 		memcpy(ptr, &alpha, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDepthRangexOES_enc(void *self , GLclampx zNear, GLclampx zFar)
@@ -4471,6 +5043,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4485,8 +5058,9 @@
 		memcpy(ptr, &zNear, 4); ptr += 4;
 		memcpy(ptr, &zFar, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFogxOES_enc(void *self , GLenum pname, GLfixed param)
@@ -4495,6 +5069,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4509,8 +5084,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFogxvOES_enc(void *self , GLenum pname, const GLfixed* params)
@@ -4519,6 +5095,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4535,8 +5112,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFrustumxOES_enc(void *self , GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
@@ -4545,6 +5123,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4563,8 +5142,9 @@
 		memcpy(ptr, &zNear, 4); ptr += 4;
 		memcpy(ptr, &zFar, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGetClipPlanexOES_enc(void *self , GLenum pname, GLfixed* eqn)
@@ -4573,6 +5153,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_eqn =  (4 * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4588,9 +5169,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_eqn; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(eqn, __size_eqn);
+	if (useChecksum) checksumCalculator->addBuffer(eqn, __size_eqn);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetClipPlanexOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetClipPlanex_enc(void *self , GLenum pname, GLfixed* eqn)
@@ -4599,6 +5190,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_eqn =  (4 * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4614,9 +5206,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_eqn; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(eqn, __size_eqn);
+	if (useChecksum) checksumCalculator->addBuffer(eqn, __size_eqn);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetClipPlanex: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetFixedvOES_enc(void *self , GLenum pname, GLfixed* params)
@@ -4625,6 +5227,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4640,9 +5243,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetFixedvOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetLightxvOES_enc(void *self , GLenum light, GLenum pname, GLfixed* params)
@@ -4651,6 +5264,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4667,9 +5281,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetLightxvOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetMaterialxvOES_enc(void *self , GLenum face, GLenum pname, GLfixed* params)
@@ -4678,6 +5302,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4694,9 +5319,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetMaterialxvOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetTexEnvxvOES_enc(void *self , GLenum env, GLenum pname, GLfixed* params)
@@ -4705,6 +5340,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4721,9 +5357,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetTexEnvxvOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetTexParameterxvOES_enc(void *self , GLenum target, GLenum pname, GLfixed* params)
@@ -4732,6 +5378,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4748,9 +5395,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetTexParameterxvOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glLightModelxOES_enc(void *self , GLenum pname, GLfixed param)
@@ -4759,6 +5416,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4773,8 +5431,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLightModelxvOES_enc(void *self , GLenum pname, const GLfixed* params)
@@ -4783,6 +5442,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4799,8 +5459,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLightxOES_enc(void *self , GLenum light, GLenum pname, GLfixed param)
@@ -4809,6 +5470,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4824,8 +5486,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLightxvOES_enc(void *self , GLenum light, GLenum pname, const GLfixed* params)
@@ -4834,6 +5497,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4851,8 +5515,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLineWidthxOES_enc(void *self , GLfixed width)
@@ -4861,6 +5526,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4874,8 +5540,9 @@
 
 		memcpy(ptr, &width, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLoadMatrixxOES_enc(void *self , const GLfixed* m)
@@ -4884,6 +5551,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_m =  (16 * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4899,8 +5567,9 @@
 	*(unsigned int *)(ptr) = __size_m; ptr += 4;
 	memcpy(ptr, m, __size_m);ptr += __size_m;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMaterialxOES_enc(void *self , GLenum face, GLenum pname, GLfixed param)
@@ -4909,6 +5578,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4924,8 +5594,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMaterialxvOES_enc(void *self , GLenum face, GLenum pname, const GLfixed* params)
@@ -4934,6 +5605,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4951,8 +5623,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMultMatrixxOES_enc(void *self , const GLfixed* m)
@@ -4961,6 +5634,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_m =  (16 * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -4976,8 +5650,9 @@
 	*(unsigned int *)(ptr) = __size_m; ptr += 4;
 	memcpy(ptr, m, __size_m);ptr += __size_m;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glMultiTexCoord4xOES_enc(void *self , GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
@@ -4986,6 +5661,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5003,8 +5679,9 @@
 		memcpy(ptr, &r, 4); ptr += 4;
 		memcpy(ptr, &q, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glNormal3xOES_enc(void *self , GLfixed nx, GLfixed ny, GLfixed nz)
@@ -5013,6 +5690,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5028,8 +5706,9 @@
 		memcpy(ptr, &ny, 4); ptr += 4;
 		memcpy(ptr, &nz, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glOrthoxOES_enc(void *self , GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
@@ -5038,6 +5717,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5056,8 +5736,9 @@
 		memcpy(ptr, &zNear, 4); ptr += 4;
 		memcpy(ptr, &zFar, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPointParameterxOES_enc(void *self , GLenum pname, GLfixed param)
@@ -5066,6 +5747,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5080,8 +5762,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPointParameterxvOES_enc(void *self , GLenum pname, const GLfixed* params)
@@ -5090,6 +5773,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -5106,8 +5790,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPointSizexOES_enc(void *self , GLfixed size)
@@ -5116,6 +5801,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5129,8 +5815,9 @@
 
 		memcpy(ptr, &size, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPolygonOffsetxOES_enc(void *self , GLfixed factor, GLfixed units)
@@ -5139,6 +5826,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5153,8 +5841,9 @@
 		memcpy(ptr, &factor, 4); ptr += 4;
 		memcpy(ptr, &units, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glRotatexOES_enc(void *self , GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
@@ -5163,6 +5852,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5179,8 +5869,9 @@
 		memcpy(ptr, &y, 4); ptr += 4;
 		memcpy(ptr, &z, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glSampleCoveragexOES_enc(void *self , GLclampx value, GLboolean invert)
@@ -5189,6 +5880,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5203,8 +5895,9 @@
 		memcpy(ptr, &value, 4); ptr += 4;
 		memcpy(ptr, &invert, 1); ptr += 1;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glScalexOES_enc(void *self , GLfixed x, GLfixed y, GLfixed z)
@@ -5213,6 +5906,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5228,8 +5922,9 @@
 		memcpy(ptr, &y, 4); ptr += 4;
 		memcpy(ptr, &z, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexEnvxOES_enc(void *self , GLenum target, GLenum pname, GLfixed param)
@@ -5238,6 +5933,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5253,8 +5949,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexEnvxvOES_enc(void *self , GLenum target, GLenum pname, const GLfixed* params)
@@ -5263,6 +5960,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -5280,8 +5978,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexParameterxOES_enc(void *self , GLenum target, GLenum pname, GLfixed param)
@@ -5290,6 +5989,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5305,8 +6005,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexParameterxvOES_enc(void *self , GLenum target, GLenum pname, const GLfixed* params)
@@ -5315,6 +6016,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -5332,8 +6034,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTranslatexOES_enc(void *self , GLfixed x, GLfixed y, GLfixed z)
@@ -5342,6 +6045,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5357,8 +6061,9 @@
 		memcpy(ptr, &y, 4); ptr += 4;
 		memcpy(ptr, &z, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 GLboolean glIsRenderbufferOES_enc(void *self , GLuint renderbuffer)
@@ -5367,6 +6072,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5380,11 +6086,21 @@
 
 		memcpy(ptr, &renderbuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsRenderbufferOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -5394,6 +6110,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5408,8 +6125,9 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &renderbuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDeleteRenderbuffersOES_enc(void *self , GLsizei n, const GLuint* renderbuffers)
@@ -5418,6 +6136,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_renderbuffers =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -5434,8 +6153,9 @@
 	*(unsigned int *)(ptr) = __size_renderbuffers; ptr += 4;
 	memcpy(ptr, renderbuffers, __size_renderbuffers);ptr += __size_renderbuffers;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGenRenderbuffersOES_enc(void *self , GLsizei n, GLuint* renderbuffers)
@@ -5444,6 +6164,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_renderbuffers =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -5459,9 +6180,19 @@
 		memcpy(ptr, &n, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_renderbuffers; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(renderbuffers, __size_renderbuffers);
+	if (useChecksum) checksumCalculator->addBuffer(renderbuffers, __size_renderbuffers);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGenRenderbuffersOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glRenderbufferStorageOES_enc(void *self , GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
@@ -5470,6 +6201,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5486,8 +6218,9 @@
 		memcpy(ptr, &width, 4); ptr += 4;
 		memcpy(ptr, &height, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGetRenderbufferParameterivOES_enc(void *self , GLenum target, GLenum pname, GLint* params)
@@ -5496,6 +6229,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLint));
 	 unsigned char *ptr;
@@ -5512,9 +6246,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetRenderbufferParameterivOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 GLboolean glIsFramebufferOES_enc(void *self , GLuint framebuffer)
@@ -5523,6 +6267,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5536,11 +6281,21 @@
 
 		memcpy(ptr, &framebuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsFramebufferOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -5550,6 +6305,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5564,8 +6320,9 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &framebuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDeleteFramebuffersOES_enc(void *self , GLsizei n, const GLuint* framebuffers)
@@ -5574,6 +6331,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_framebuffers =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -5590,8 +6348,9 @@
 	*(unsigned int *)(ptr) = __size_framebuffers; ptr += 4;
 	memcpy(ptr, framebuffers, __size_framebuffers);ptr += __size_framebuffers;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGenFramebuffersOES_enc(void *self , GLsizei n, GLuint* framebuffers)
@@ -5600,6 +6359,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_framebuffers =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -5615,9 +6375,19 @@
 		memcpy(ptr, &n, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_framebuffers; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(framebuffers, __size_framebuffers);
+	if (useChecksum) checksumCalculator->addBuffer(framebuffers, __size_framebuffers);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGenFramebuffersOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 GLenum glCheckFramebufferStatusOES_enc(void *self , GLenum target)
@@ -5626,6 +6396,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5639,11 +6410,21 @@
 
 		memcpy(ptr, &target, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLenum retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glCheckFramebufferStatusOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -5653,6 +6434,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5669,8 +6451,9 @@
 		memcpy(ptr, &renderbuffertarget, 4); ptr += 4;
 		memcpy(ptr, &renderbuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFramebufferTexture2DOES_enc(void *self , GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
@@ -5679,6 +6462,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5696,8 +6480,9 @@
 		memcpy(ptr, &texture, 4); ptr += 4;
 		memcpy(ptr, &level, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGetFramebufferAttachmentParameterivOES_enc(void *self , GLenum target, GLenum attachment, GLenum pname, GLint* params)
@@ -5706,6 +6491,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLint));
 	 unsigned char *ptr;
@@ -5723,9 +6509,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetFramebufferAttachmentParameterivOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGenerateMipmapOES_enc(void *self , GLenum target)
@@ -5734,6 +6530,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5747,8 +6544,9 @@
 
 		memcpy(ptr, &target, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 GLboolean glUnmapBufferOES_enc(void *self , GLenum target)
@@ -5757,6 +6555,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5770,11 +6569,21 @@
 
 		memcpy(ptr, &target, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glUnmapBufferOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -5784,6 +6593,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5797,8 +6607,9 @@
 
 		memcpy(ptr, &matrixpaletteindex, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLoadPaletteFromModelViewMatrixOES_enc(void *self )
@@ -5807,6 +6618,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5819,8 +6631,9 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 GLbitfield glQueryMatrixxOES_enc(void *self , GLfixed* mantissa, GLint* exponent)
@@ -5829,6 +6642,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_mantissa =  (16 * sizeof(GLfixed));
 	const unsigned int __size_exponent =  (16 * sizeof(GLfixed));
@@ -5845,13 +6659,25 @@
 	*(unsigned int *)(ptr) = __size_mantissa; ptr += 4;
 	*(unsigned int *)(ptr) = __size_exponent; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(mantissa, __size_mantissa);
+	if (useChecksum) checksumCalculator->addBuffer(mantissa, __size_mantissa);
 	stream->readback(exponent, __size_exponent);
+	if (useChecksum) checksumCalculator->addBuffer(exponent, __size_exponent);
 
 	GLbitfield retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glQueryMatrixxOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -5861,6 +6687,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5875,8 +6702,9 @@
 		memcpy(ptr, &zNear, 4); ptr += 4;
 		memcpy(ptr, &zFar, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFrustumfOES_enc(void *self , GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
@@ -5885,6 +6713,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5903,8 +6732,9 @@
 		memcpy(ptr, &zNear, 4); ptr += 4;
 		memcpy(ptr, &zFar, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glOrthofOES_enc(void *self , GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
@@ -5913,6 +6743,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -5931,8 +6762,9 @@
 		memcpy(ptr, &zNear, 4); ptr += 4;
 		memcpy(ptr, &zFar, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClipPlanefOES_enc(void *self , GLenum plane, const GLfloat* equation)
@@ -5941,6 +6773,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_equation =  (4 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -5957,8 +6790,9 @@
 	*(unsigned int *)(ptr) = __size_equation; ptr += 4;
 	memcpy(ptr, equation, __size_equation);ptr += __size_equation;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClipPlanefIMG_enc(void *self , GLenum plane, const GLfloat* equation)
@@ -5967,6 +6801,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_equation =  (4 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -5983,8 +6818,9 @@
 	*(unsigned int *)(ptr) = __size_equation; ptr += 4;
 	memcpy(ptr, equation, __size_equation);ptr += __size_equation;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGetClipPlanefOES_enc(void *self , GLenum pname, GLfloat* eqn)
@@ -5993,6 +6829,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_eqn =  (4 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -6008,9 +6845,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_eqn; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(eqn, __size_eqn);
+	if (useChecksum) checksumCalculator->addBuffer(eqn, __size_eqn);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetClipPlanefOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glClearDepthfOES_enc(void *self , GLclampf depth)
@@ -6019,6 +6866,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6032,8 +6880,9 @@
 
 		memcpy(ptr, &depth, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexGenfOES_enc(void *self , GLenum coord, GLenum pname, GLfloat param)
@@ -6042,6 +6891,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6057,8 +6907,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexGenfvOES_enc(void *self , GLenum coord, GLenum pname, const GLfloat* params)
@@ -6067,6 +6918,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -6084,8 +6936,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexGeniOES_enc(void *self , GLenum coord, GLenum pname, GLint param)
@@ -6094,6 +6947,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6109,8 +6963,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexGenivOES_enc(void *self , GLenum coord, GLenum pname, const GLint* params)
@@ -6119,6 +6974,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLint));
 	 unsigned char *ptr;
@@ -6136,8 +6992,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexGenxOES_enc(void *self , GLenum coord, GLenum pname, GLfixed param)
@@ -6146,6 +7003,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6161,8 +7019,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexGenxvOES_enc(void *self , GLenum coord, GLenum pname, const GLfixed* params)
@@ -6171,6 +7030,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -6188,8 +7048,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGetTexGenfvOES_enc(void *self , GLenum coord, GLenum pname, GLfloat* params)
@@ -6198,6 +7059,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -6215,8 +7077,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGetTexGenivOES_enc(void *self , GLenum coord, GLenum pname, GLint* params)
@@ -6225,6 +7088,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLint));
 	 unsigned char *ptr;
@@ -6242,8 +7106,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGetTexGenxvOES_enc(void *self , GLenum coord, GLenum pname, GLfixed* params)
@@ -6252,6 +7117,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfixed));
 	 unsigned char *ptr;
@@ -6269,8 +7135,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBindVertexArrayOES_enc(void *self , GLuint array)
@@ -6279,6 +7146,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6292,8 +7160,9 @@
 
 		memcpy(ptr, &array, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDeleteVertexArraysOES_enc(void *self , GLsizei n, const GLuint* arrays)
@@ -6302,6 +7171,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_arrays =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -6318,8 +7188,9 @@
 	*(unsigned int *)(ptr) = __size_arrays; ptr += 4;
 	memcpy(ptr, arrays, __size_arrays);ptr += __size_arrays;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGenVertexArraysOES_enc(void *self , GLsizei n, GLuint* arrays)
@@ -6328,6 +7199,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_arrays =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -6343,9 +7215,19 @@
 		memcpy(ptr, &n, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_arrays; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(arrays, __size_arrays);
+	if (useChecksum) checksumCalculator->addBuffer(arrays, __size_arrays);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGenVertexArraysOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 GLboolean glIsVertexArrayOES_enc(void *self , GLuint array)
@@ -6354,6 +7236,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6367,11 +7250,21 @@
 
 		memcpy(ptr, &array, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsVertexArrayOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -6381,6 +7274,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_attachments =  (numAttachments * sizeof(const GLenum));
 	 unsigned char *ptr;
@@ -6398,8 +7292,9 @@
 	*(unsigned int *)(ptr) = __size_attachments; ptr += 4;
 	memcpy(ptr, attachments, __size_attachments);ptr += __size_attachments;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glRenderbufferStorageMultisampleIMG_enc(void *self , GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
@@ -6408,6 +7303,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6425,8 +7321,9 @@
 		memcpy(ptr, &width, 4); ptr += 4;
 		memcpy(ptr, &height, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFramebufferTexture2DMultisampleIMG_enc(void *self , GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples)
@@ -6435,6 +7332,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6453,8 +7351,9 @@
 		memcpy(ptr, &level, 4); ptr += 4;
 		memcpy(ptr, &samples, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDeleteFencesNV_enc(void *self , GLsizei n, const GLuint* fences)
@@ -6463,6 +7362,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_fences =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -6479,8 +7379,9 @@
 	*(unsigned int *)(ptr) = __size_fences; ptr += 4;
 	memcpy(ptr, fences, __size_fences);ptr += __size_fences;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGenFencesNV_enc(void *self , GLsizei n, GLuint* fences)
@@ -6489,6 +7390,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_fences =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -6505,8 +7407,9 @@
 	*(unsigned int *)(ptr) = __size_fences; ptr += 4;
 	memcpy(ptr, fences, __size_fences);ptr += __size_fences;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 GLboolean glIsFenceNV_enc(void *self , GLuint fence)
@@ -6515,6 +7418,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6528,11 +7432,21 @@
 
 		memcpy(ptr, &fence, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsFenceNV: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -6542,6 +7456,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6555,11 +7470,21 @@
 
 		memcpy(ptr, &fence, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glTestFenceNV: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -6569,6 +7494,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLint));
 	 unsigned char *ptr;
@@ -6585,9 +7511,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetFenceivNV: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glFinishFenceNV_enc(void *self , GLuint fence)
@@ -6596,6 +7532,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6609,8 +7546,9 @@
 
 		memcpy(ptr, &fence, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glSetFenceNV_enc(void *self , GLuint fence, GLenum condition)
@@ -6619,6 +7557,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6633,8 +7572,9 @@
 		memcpy(ptr, &fence, 4); ptr += 4;
 		memcpy(ptr, &condition, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGetDriverControlsQCOM_enc(void *self , GLint* num, GLsizei size, GLuint* driverControls)
@@ -6643,6 +7583,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_num =  (1 * sizeof(GLint));
 	const unsigned int __size_driverControls =  (size * sizeof(GLuint));
@@ -6660,10 +7601,21 @@
 		memcpy(ptr, &size, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_driverControls; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(num, __size_num);
+	if (useChecksum) checksumCalculator->addBuffer(num, __size_num);
 	stream->readback(driverControls, __size_driverControls);
+	if (useChecksum) checksumCalculator->addBuffer(driverControls, __size_driverControls);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetDriverControlsQCOM: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetDriverControlStringQCOM_enc(void *self , GLuint driverControl, GLsizei bufSize, GLsizei* length, GLchar* driverControlString)
@@ -6672,6 +7624,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_length =  (1 * sizeof(GLsizei));
 	const unsigned int __size_driverControlString =  (1 * sizeof(GLchar));
@@ -6690,10 +7643,21 @@
 	*(unsigned int *)(ptr) = __size_length; ptr += 4;
 	*(unsigned int *)(ptr) = __size_driverControlString; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(length, __size_length);
+	if (useChecksum) checksumCalculator->addBuffer(length, __size_length);
 	stream->readback(driverControlString, __size_driverControlString);
+	if (useChecksum) checksumCalculator->addBuffer(driverControlString, __size_driverControlString);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetDriverControlStringQCOM: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glEnableDriverControlQCOM_enc(void *self , GLuint driverControl)
@@ -6702,6 +7666,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6715,8 +7680,9 @@
 
 		memcpy(ptr, &driverControl, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDisableDriverControlQCOM_enc(void *self , GLuint driverControl)
@@ -6725,6 +7691,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6738,8 +7705,9 @@
 
 		memcpy(ptr, &driverControl, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glExtGetTexturesQCOM_enc(void *self , GLuint* textures, GLint maxTextures, GLint* numTextures)
@@ -6748,6 +7716,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_textures =  (maxTextures * sizeof(GLuint));
 	const unsigned int __size_numTextures =  (1 * sizeof(GLint));
@@ -6765,10 +7734,21 @@
 		memcpy(ptr, &maxTextures, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_numTextures; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(textures, __size_textures);
+	if (useChecksum) checksumCalculator->addBuffer(textures, __size_textures);
 	stream->readback(numTextures, __size_numTextures);
+	if (useChecksum) checksumCalculator->addBuffer(numTextures, __size_numTextures);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glExtGetTexturesQCOM: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glExtGetBuffersQCOM_enc(void *self , GLuint* buffers, GLint maxBuffers, GLint* numBuffers)
@@ -6777,6 +7757,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_buffers =  (maxBuffers * sizeof(GLuint));
 	const unsigned int __size_numBuffers =  (1 * sizeof(GLint));
@@ -6794,10 +7775,21 @@
 		memcpy(ptr, &maxBuffers, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_numBuffers; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(buffers, __size_buffers);
+	if (useChecksum) checksumCalculator->addBuffer(buffers, __size_buffers);
 	stream->readback(numBuffers, __size_numBuffers);
+	if (useChecksum) checksumCalculator->addBuffer(numBuffers, __size_numBuffers);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glExtGetBuffersQCOM: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glExtGetRenderbuffersQCOM_enc(void *self , GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers)
@@ -6806,6 +7798,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_renderbuffers =  (maxRenderbuffers * sizeof(GLuint));
 	const unsigned int __size_numRenderbuffers =  (1 * sizeof(GLint));
@@ -6823,10 +7816,21 @@
 		memcpy(ptr, &maxRenderbuffers, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_numRenderbuffers; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(renderbuffers, __size_renderbuffers);
+	if (useChecksum) checksumCalculator->addBuffer(renderbuffers, __size_renderbuffers);
 	stream->readback(numRenderbuffers, __size_numRenderbuffers);
+	if (useChecksum) checksumCalculator->addBuffer(numRenderbuffers, __size_numRenderbuffers);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glExtGetRenderbuffersQCOM: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glExtGetFramebuffersQCOM_enc(void *self , GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers)
@@ -6835,6 +7839,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_framebuffers =  (maxFramebuffers * sizeof(GLuint));
 	const unsigned int __size_numFramebuffers =  (1 * sizeof(GLint));
@@ -6852,10 +7857,21 @@
 		memcpy(ptr, &maxFramebuffers, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_numFramebuffers; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(framebuffers, __size_framebuffers);
+	if (useChecksum) checksumCalculator->addBuffer(framebuffers, __size_framebuffers);
 	stream->readback(numFramebuffers, __size_numFramebuffers);
+	if (useChecksum) checksumCalculator->addBuffer(numFramebuffers, __size_numFramebuffers);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glExtGetFramebuffersQCOM: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glExtGetTexLevelParameterivQCOM_enc(void *self , GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params)
@@ -6864,6 +7880,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLint));
 	 unsigned char *ptr;
@@ -6882,9 +7899,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glExtGetTexLevelParameterivQCOM: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glExtTexObjectStateOverrideiQCOM_enc(void *self , GLenum target, GLenum pname, GLint param)
@@ -6893,6 +7920,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -6908,8 +7936,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glExtGetTexSubImageQCOM_enc(void *self , GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid* texels)
@@ -6918,6 +7947,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_texels =  (depth * glesv1_enc::pixelDataSize(self, width, height, format, type, 0));
 	 unsigned char *ptr;
@@ -6942,9 +7972,19 @@
 		memcpy(ptr, &type, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_texels; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(texels, __size_texels);
+	if (useChecksum) checksumCalculator->addBuffer(texels, __size_texels);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glExtGetTexSubImageQCOM: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glExtGetShadersQCOM_enc(void *self , GLuint* shaders, GLint maxShaders, GLint* numShaders)
@@ -6953,6 +7993,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_shaders =  (maxShaders * sizeof(GLuint));
 	const unsigned int __size_numShaders =  (1 * sizeof(GLint));
@@ -6970,10 +8011,21 @@
 		memcpy(ptr, &maxShaders, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_numShaders; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(shaders, __size_shaders);
+	if (useChecksum) checksumCalculator->addBuffer(shaders, __size_shaders);
 	stream->readback(numShaders, __size_numShaders);
+	if (useChecksum) checksumCalculator->addBuffer(numShaders, __size_numShaders);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glExtGetShadersQCOM: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glExtGetProgramsQCOM_enc(void *self , GLuint* programs, GLint maxPrograms, GLint* numPrograms)
@@ -6982,6 +8034,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_programs =  (maxPrograms * sizeof(GLuint));
 	const unsigned int __size_numPrograms =  (1 * sizeof(GLint));
@@ -6999,10 +8052,21 @@
 		memcpy(ptr, &maxPrograms, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_numPrograms; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(programs, __size_programs);
+	if (useChecksum) checksumCalculator->addBuffer(programs, __size_programs);
 	stream->readback(numPrograms, __size_numPrograms);
+	if (useChecksum) checksumCalculator->addBuffer(numPrograms, __size_numPrograms);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glExtGetProgramsQCOM: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 GLboolean glExtIsProgramBinaryQCOM_enc(void *self , GLuint program)
@@ -7011,6 +8075,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -7024,11 +8089,21 @@
 
 		memcpy(ptr, &program, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glExtIsProgramBinaryQCOM: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -7038,6 +8113,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -7055,8 +8131,9 @@
 		memcpy(ptr, &height, 4); ptr += 4;
 		memcpy(ptr, &preserveMask, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glEndTilingQCOM_enc(void *self , GLbitfield preserveMask)
@@ -7065,6 +8142,7 @@
 	gl_encoder_context_t *ctx = (gl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -7078,8 +8156,9 @@
 
 		memcpy(ptr, &preserveMask, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 }  // namespace
diff --git a/opengl/system/GLESv2_enc/gl2_enc.cpp b/opengl/system/GLESv2_enc/gl2_enc.cpp
index 91acd88..615dcc1 100644
--- a/opengl/system/GLESv2_enc/gl2_enc.cpp
+++ b/opengl/system/GLESv2_enc/gl2_enc.cpp
@@ -2,6 +2,7 @@
 // generated by 'emugen'
 
 
+#include <memory>
 #include <string.h>
 #include "gl2_opcodes.h"
 
@@ -23,6 +24,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -36,8 +38,9 @@
 
 		memcpy(ptr, &texture, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glAttachShader_enc(void *self , GLuint program, GLuint shader)
@@ -46,6 +49,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -60,8 +64,9 @@
 		memcpy(ptr, &program, 4); ptr += 4;
 		memcpy(ptr, &shader, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBindAttribLocation_enc(void *self , GLuint program, GLuint index, const GLchar* name)
@@ -70,6 +75,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_name =  (strlen(name) + 1);
 	 unsigned char *ptr;
@@ -87,8 +93,9 @@
 	*(unsigned int *)(ptr) = __size_name; ptr += 4;
 	memcpy(ptr, name, __size_name);ptr += __size_name;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBindBuffer_enc(void *self , GLenum target, GLuint buffer)
@@ -97,6 +104,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -111,8 +119,9 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &buffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBindFramebuffer_enc(void *self , GLenum target, GLuint framebuffer)
@@ -121,6 +130,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -135,8 +145,9 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &framebuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBindRenderbuffer_enc(void *self , GLenum target, GLuint renderbuffer)
@@ -145,6 +156,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -159,8 +171,9 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &renderbuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBindTexture_enc(void *self , GLenum target, GLuint texture)
@@ -169,6 +182,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -183,8 +197,9 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &texture, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBlendColor_enc(void *self , GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
@@ -193,6 +208,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -209,8 +225,9 @@
 		memcpy(ptr, &blue, 4); ptr += 4;
 		memcpy(ptr, &alpha, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBlendEquation_enc(void *self , GLenum mode)
@@ -219,6 +236,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -232,8 +250,9 @@
 
 		memcpy(ptr, &mode, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBlendEquationSeparate_enc(void *self , GLenum modeRGB, GLenum modeAlpha)
@@ -242,6 +261,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -256,8 +276,9 @@
 		memcpy(ptr, &modeRGB, 4); ptr += 4;
 		memcpy(ptr, &modeAlpha, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBlendFunc_enc(void *self , GLenum sfactor, GLenum dfactor)
@@ -266,6 +287,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -280,8 +302,9 @@
 		memcpy(ptr, &sfactor, 4); ptr += 4;
 		memcpy(ptr, &dfactor, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBlendFuncSeparate_enc(void *self , GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
@@ -290,6 +313,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -306,8 +330,9 @@
 		memcpy(ptr, &srcAlpha, 4); ptr += 4;
 		memcpy(ptr, &dstAlpha, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBufferData_enc(void *self , GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
@@ -316,6 +341,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data = ((data != NULL) ?  size : 0);
 	 unsigned char *ptr;
@@ -331,21 +357,22 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &size, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
 	stream->flush();
 	stream->writeFully(&__size_data,4);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(&__size_data,4);
+	if (useChecksum) checksumCalculator->addBuffer(&__size_data,4);
 	if (data != NULL) {
 		stream->writeFully(data, __size_data);
-		if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(data, __size_data);
+		if (useChecksum) checksumCalculator->addBuffer(data, __size_data);
 	}
 	buf = stream->alloc(4);
 	ptr = buf;
 		memcpy(ptr, &usage, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
 	buf = stream->alloc(checksumSize);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(buf, checksumSize);
+	if (useChecksum) checksumCalculator->writeChecksum(buf, checksumSize);
+
 }
 
 void glBufferSubData_enc(void *self , GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
@@ -354,6 +381,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data = ((data != NULL) ?  size : 0);
 	 unsigned char *ptr;
@@ -370,16 +398,17 @@
 		memcpy(ptr, &offset, 4); ptr += 4;
 		memcpy(ptr, &size, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
 	stream->flush();
 	stream->writeFully(&__size_data,4);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(&__size_data,4);
+	if (useChecksum) checksumCalculator->addBuffer(&__size_data,4);
 	if (data != NULL) {
 		stream->writeFully(data, __size_data);
-		if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(data, __size_data);
+		if (useChecksum) checksumCalculator->addBuffer(data, __size_data);
 	}
 	buf = stream->alloc(checksumSize);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(buf, checksumSize);
+	if (useChecksum) checksumCalculator->writeChecksum(buf, checksumSize);
+
 }
 
 GLenum glCheckFramebufferStatus_enc(void *self , GLenum target)
@@ -388,6 +417,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -401,11 +431,21 @@
 
 		memcpy(ptr, &target, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLenum retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glCheckFramebufferStatus: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -415,6 +455,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -428,8 +469,9 @@
 
 		memcpy(ptr, &mask, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClearColor_enc(void *self , GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
@@ -438,6 +480,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -454,8 +497,9 @@
 		memcpy(ptr, &blue, 4); ptr += 4;
 		memcpy(ptr, &alpha, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClearDepthf_enc(void *self , GLclampf depth)
@@ -464,6 +508,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -477,8 +522,9 @@
 
 		memcpy(ptr, &depth, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glClearStencil_enc(void *self , GLint s)
@@ -487,6 +533,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -500,8 +547,9 @@
 
 		memcpy(ptr, &s, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glColorMask_enc(void *self , GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
@@ -510,6 +558,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -526,8 +575,9 @@
 		memcpy(ptr, &blue, 1); ptr += 1;
 		memcpy(ptr, &alpha, 1); ptr += 1;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glCompileShader_enc(void *self , GLuint shader)
@@ -536,6 +586,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -549,8 +600,9 @@
 
 		memcpy(ptr, &shader, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glCompressedTexImage2D_enc(void *self , GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data)
@@ -559,6 +611,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data = ((data != NULL) ?  imageSize : 0);
 	 unsigned char *ptr;
@@ -579,16 +632,17 @@
 		memcpy(ptr, &border, 4); ptr += 4;
 		memcpy(ptr, &imageSize, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
 	stream->flush();
 	stream->writeFully(&__size_data,4);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(&__size_data,4);
+	if (useChecksum) checksumCalculator->addBuffer(&__size_data,4);
 	if (data != NULL) {
 		stream->writeFully(data, __size_data);
-		if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(data, __size_data);
+		if (useChecksum) checksumCalculator->addBuffer(data, __size_data);
 	}
 	buf = stream->alloc(checksumSize);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(buf, checksumSize);
+	if (useChecksum) checksumCalculator->writeChecksum(buf, checksumSize);
+
 }
 
 void glCompressedTexSubImage2D_enc(void *self , GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data)
@@ -597,6 +651,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data = ((data != NULL) ?  imageSize : 0);
 	 unsigned char *ptr;
@@ -618,16 +673,17 @@
 		memcpy(ptr, &format, 4); ptr += 4;
 		memcpy(ptr, &imageSize, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
 	stream->flush();
 	stream->writeFully(&__size_data,4);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(&__size_data,4);
+	if (useChecksum) checksumCalculator->addBuffer(&__size_data,4);
 	if (data != NULL) {
 		stream->writeFully(data, __size_data);
-		if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(data, __size_data);
+		if (useChecksum) checksumCalculator->addBuffer(data, __size_data);
 	}
 	buf = stream->alloc(checksumSize);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(buf, checksumSize);
+	if (useChecksum) checksumCalculator->writeChecksum(buf, checksumSize);
+
 }
 
 void glCopyTexImage2D_enc(void *self , GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
@@ -636,6 +692,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -656,8 +713,9 @@
 		memcpy(ptr, &height, 4); ptr += 4;
 		memcpy(ptr, &border, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glCopyTexSubImage2D_enc(void *self , GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
@@ -666,6 +724,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -686,8 +745,9 @@
 		memcpy(ptr, &width, 4); ptr += 4;
 		memcpy(ptr, &height, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 GLuint glCreateProgram_enc(void *self )
@@ -696,6 +756,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -708,11 +769,21 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLuint retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glCreateProgram: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -722,6 +793,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -735,11 +807,21 @@
 
 		memcpy(ptr, &type, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLuint retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glCreateShader: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -749,6 +831,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -762,8 +845,9 @@
 
 		memcpy(ptr, &mode, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDeleteBuffers_enc(void *self , GLsizei n, const GLuint* buffers)
@@ -772,6 +856,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_buffers =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -788,8 +873,9 @@
 	*(unsigned int *)(ptr) = __size_buffers; ptr += 4;
 	memcpy(ptr, buffers, __size_buffers);ptr += __size_buffers;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDeleteFramebuffers_enc(void *self , GLsizei n, const GLuint* framebuffers)
@@ -798,6 +884,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_framebuffers =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -814,8 +901,9 @@
 	*(unsigned int *)(ptr) = __size_framebuffers; ptr += 4;
 	memcpy(ptr, framebuffers, __size_framebuffers);ptr += __size_framebuffers;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDeleteProgram_enc(void *self , GLuint program)
@@ -824,6 +912,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -837,8 +926,9 @@
 
 		memcpy(ptr, &program, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDeleteRenderbuffers_enc(void *self , GLsizei n, const GLuint* renderbuffers)
@@ -847,6 +937,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_renderbuffers =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -863,8 +954,9 @@
 	*(unsigned int *)(ptr) = __size_renderbuffers; ptr += 4;
 	memcpy(ptr, renderbuffers, __size_renderbuffers);ptr += __size_renderbuffers;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDeleteShader_enc(void *self , GLuint shader)
@@ -873,6 +965,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -886,8 +979,9 @@
 
 		memcpy(ptr, &shader, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDeleteTextures_enc(void *self , GLsizei n, const GLuint* textures)
@@ -896,6 +990,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_textures =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -912,8 +1007,9 @@
 	*(unsigned int *)(ptr) = __size_textures; ptr += 4;
 	memcpy(ptr, textures, __size_textures);ptr += __size_textures;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDepthFunc_enc(void *self , GLenum func)
@@ -922,6 +1018,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -935,8 +1032,9 @@
 
 		memcpy(ptr, &func, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDepthMask_enc(void *self , GLboolean flag)
@@ -945,6 +1043,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -958,8 +1057,9 @@
 
 		memcpy(ptr, &flag, 1); ptr += 1;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDepthRangef_enc(void *self , GLclampf zNear, GLclampf zFar)
@@ -968,6 +1068,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -982,8 +1083,9 @@
 		memcpy(ptr, &zNear, 4); ptr += 4;
 		memcpy(ptr, &zFar, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDetachShader_enc(void *self , GLuint program, GLuint shader)
@@ -992,6 +1094,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1006,8 +1109,9 @@
 		memcpy(ptr, &program, 4); ptr += 4;
 		memcpy(ptr, &shader, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDisable_enc(void *self , GLenum cap)
@@ -1016,6 +1120,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1029,8 +1134,9 @@
 
 		memcpy(ptr, &cap, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDisableVertexAttribArray_enc(void *self , GLuint index)
@@ -1039,6 +1145,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1052,8 +1159,9 @@
 
 		memcpy(ptr, &index, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDrawArrays_enc(void *self , GLenum mode, GLint first, GLsizei count)
@@ -1062,6 +1170,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1077,8 +1186,9 @@
 		memcpy(ptr, &first, 4); ptr += 4;
 		memcpy(ptr, &count, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glEnable_enc(void *self , GLenum cap)
@@ -1087,6 +1197,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1100,8 +1211,9 @@
 
 		memcpy(ptr, &cap, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glEnableVertexAttribArray_enc(void *self , GLuint index)
@@ -1110,6 +1222,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1123,8 +1236,9 @@
 
 		memcpy(ptr, &index, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFinish_enc(void *self )
@@ -1133,6 +1247,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1145,8 +1260,9 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFlush_enc(void *self )
@@ -1155,6 +1271,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1167,8 +1284,9 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFramebufferRenderbuffer_enc(void *self , GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
@@ -1177,6 +1295,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1193,8 +1312,9 @@
 		memcpy(ptr, &renderbuffertarget, 4); ptr += 4;
 		memcpy(ptr, &renderbuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFramebufferTexture2D_enc(void *self , GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
@@ -1203,6 +1323,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1220,8 +1341,9 @@
 		memcpy(ptr, &texture, 4); ptr += 4;
 		memcpy(ptr, &level, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glFrontFace_enc(void *self , GLenum mode)
@@ -1230,6 +1352,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1243,8 +1366,9 @@
 
 		memcpy(ptr, &mode, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGenBuffers_enc(void *self , GLsizei n, GLuint* buffers)
@@ -1253,6 +1377,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_buffers =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -1268,9 +1393,19 @@
 		memcpy(ptr, &n, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_buffers; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(buffers, __size_buffers);
+	if (useChecksum) checksumCalculator->addBuffer(buffers, __size_buffers);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGenBuffers: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGenerateMipmap_enc(void *self , GLenum target)
@@ -1279,6 +1414,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1292,8 +1428,9 @@
 
 		memcpy(ptr, &target, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGenFramebuffers_enc(void *self , GLsizei n, GLuint* framebuffers)
@@ -1302,6 +1439,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_framebuffers =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -1317,9 +1455,19 @@
 		memcpy(ptr, &n, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_framebuffers; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(framebuffers, __size_framebuffers);
+	if (useChecksum) checksumCalculator->addBuffer(framebuffers, __size_framebuffers);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGenFramebuffers: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGenRenderbuffers_enc(void *self , GLsizei n, GLuint* renderbuffers)
@@ -1328,6 +1476,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_renderbuffers =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -1343,9 +1492,19 @@
 		memcpy(ptr, &n, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_renderbuffers; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(renderbuffers, __size_renderbuffers);
+	if (useChecksum) checksumCalculator->addBuffer(renderbuffers, __size_renderbuffers);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGenRenderbuffers: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGenTextures_enc(void *self , GLsizei n, GLuint* textures)
@@ -1354,6 +1513,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_textures =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -1369,9 +1529,19 @@
 		memcpy(ptr, &n, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_textures; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(textures, __size_textures);
+	if (useChecksum) checksumCalculator->addBuffer(textures, __size_textures);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGenTextures: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetActiveAttrib_enc(void *self , GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
@@ -1380,6 +1550,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_length = ((length != NULL) ?  (sizeof(GLsizei)) : 0);
 	const unsigned int __size_size = ((size != NULL) ?  (sizeof(GLint)) : 0);
@@ -1403,12 +1574,33 @@
 	*(unsigned int *)(ptr) = __size_type; ptr += 4;
 	*(unsigned int *)(ptr) = __size_name; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
-	if (length != NULL) stream->readback(length, __size_length);
-	if (size != NULL) stream->readback(size, __size_size);
-	if (type != NULL) stream->readback(type, __size_type);
-	if (name != NULL) stream->readback(name, __size_name);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	if (length != NULL) {
+		stream->readback(length, __size_length);
+		if (useChecksum) checksumCalculator->addBuffer(length, __size_length);
+	}
+	if (size != NULL) {
+		stream->readback(size, __size_size);
+		if (useChecksum) checksumCalculator->addBuffer(size, __size_size);
+	}
+	if (type != NULL) {
+		stream->readback(type, __size_type);
+		if (useChecksum) checksumCalculator->addBuffer(type, __size_type);
+	}
+	if (name != NULL) {
+		stream->readback(name, __size_name);
+		if (useChecksum) checksumCalculator->addBuffer(name, __size_name);
+	}
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetActiveAttrib: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetActiveUniform_enc(void *self , GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
@@ -1417,6 +1609,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_length = ((length != NULL) ?  (sizeof(GLsizei)) : 0);
 	const unsigned int __size_size = ((size != NULL) ?  (sizeof(GLint)) : 0);
@@ -1440,12 +1633,33 @@
 	*(unsigned int *)(ptr) = __size_type; ptr += 4;
 	*(unsigned int *)(ptr) = __size_name; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
-	if (length != NULL) stream->readback(length, __size_length);
-	if (size != NULL) stream->readback(size, __size_size);
-	if (type != NULL) stream->readback(type, __size_type);
-	if (name != NULL) stream->readback(name, __size_name);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	if (length != NULL) {
+		stream->readback(length, __size_length);
+		if (useChecksum) checksumCalculator->addBuffer(length, __size_length);
+	}
+	if (size != NULL) {
+		stream->readback(size, __size_size);
+		if (useChecksum) checksumCalculator->addBuffer(size, __size_size);
+	}
+	if (type != NULL) {
+		stream->readback(type, __size_type);
+		if (useChecksum) checksumCalculator->addBuffer(type, __size_type);
+	}
+	if (name != NULL) {
+		stream->readback(name, __size_name);
+		if (useChecksum) checksumCalculator->addBuffer(name, __size_name);
+	}
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetActiveUniform: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetAttachedShaders_enc(void *self , GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
@@ -1454,6 +1668,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_count = ((count != NULL) ?  (sizeof(GLsizei)) : 0);
 	const unsigned int __size_shaders =  (maxcount*sizeof(GLuint));
@@ -1472,10 +1687,23 @@
 	*(unsigned int *)(ptr) = __size_count; ptr += 4;
 	*(unsigned int *)(ptr) = __size_shaders; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
-	if (count != NULL) stream->readback(count, __size_count);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	if (count != NULL) {
+		stream->readback(count, __size_count);
+		if (useChecksum) checksumCalculator->addBuffer(count, __size_count);
+	}
 	stream->readback(shaders, __size_shaders);
+	if (useChecksum) checksumCalculator->addBuffer(shaders, __size_shaders);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetAttachedShaders: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 int glGetAttribLocation_enc(void *self , GLuint program, const GLchar* name)
@@ -1484,6 +1712,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_name =  (strlen(name) + 1);
 	 unsigned char *ptr;
@@ -1500,11 +1729,21 @@
 	*(unsigned int *)(ptr) = __size_name; ptr += 4;
 	memcpy(ptr, name, __size_name);ptr += __size_name;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	int retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetAttribLocation: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -1514,6 +1753,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLboolean));
 	 unsigned char *ptr;
@@ -1529,9 +1769,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetBooleanv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetBufferParameteriv_enc(void *self , GLenum target, GLenum pname, GLint* params)
@@ -1540,6 +1790,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (sizeof(GLint));
 	 unsigned char *ptr;
@@ -1556,9 +1807,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetBufferParameteriv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 GLenum glGetError_enc(void *self )
@@ -1567,6 +1828,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -1579,11 +1841,21 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLenum retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetError: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -1593,6 +1865,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -1608,9 +1881,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetFloatv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetFramebufferAttachmentParameteriv_enc(void *self , GLenum target, GLenum attachment, GLenum pname, GLint* params)
@@ -1619,6 +1902,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (sizeof(GLint));
 	 unsigned char *ptr;
@@ -1636,9 +1920,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetFramebufferAttachmentParameteriv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetIntegerv_enc(void *self , GLenum pname, GLint* params)
@@ -1647,6 +1941,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLint));
 	 unsigned char *ptr;
@@ -1662,9 +1957,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetIntegerv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetProgramiv_enc(void *self , GLuint program, GLenum pname, GLint* params)
@@ -1673,6 +1978,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  sizeof(GLint);
 	 unsigned char *ptr;
@@ -1689,9 +1995,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetProgramiv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetProgramInfoLog_enc(void *self , GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
@@ -1700,6 +2016,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_length = ((length != NULL) ?  sizeof(GLsizei) : 0);
 	const unsigned int __size_infolog =  bufsize;
@@ -1718,10 +2035,23 @@
 	*(unsigned int *)(ptr) = __size_length; ptr += 4;
 	*(unsigned int *)(ptr) = __size_infolog; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
-	if (length != NULL) stream->readback(length, __size_length);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	if (length != NULL) {
+		stream->readback(length, __size_length);
+		if (useChecksum) checksumCalculator->addBuffer(length, __size_length);
+	}
 	stream->readback(infolog, __size_infolog);
+	if (useChecksum) checksumCalculator->addBuffer(infolog, __size_infolog);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetProgramInfoLog: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetRenderbufferParameteriv_enc(void *self , GLenum target, GLenum pname, GLint* params)
@@ -1730,6 +2060,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  sizeof(GLint);
 	 unsigned char *ptr;
@@ -1746,9 +2077,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetRenderbufferParameteriv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetShaderiv_enc(void *self , GLuint shader, GLenum pname, GLint* params)
@@ -1757,6 +2098,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  sizeof(GLint);
 	 unsigned char *ptr;
@@ -1773,9 +2115,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetShaderiv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetShaderInfoLog_enc(void *self , GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
@@ -1784,6 +2136,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_length = ((length != NULL) ?  (sizeof(GLsizei)) : 0);
 	const unsigned int __size_infolog =  bufsize;
@@ -1802,10 +2155,23 @@
 	*(unsigned int *)(ptr) = __size_length; ptr += 4;
 	*(unsigned int *)(ptr) = __size_infolog; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
-	if (length != NULL) stream->readback(length, __size_length);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	if (length != NULL) {
+		stream->readback(length, __size_length);
+		if (useChecksum) checksumCalculator->addBuffer(length, __size_length);
+	}
 	stream->readback(infolog, __size_infolog);
+	if (useChecksum) checksumCalculator->addBuffer(infolog, __size_infolog);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetShaderInfoLog: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetShaderPrecisionFormat_enc(void *self , GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
@@ -1814,6 +2180,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_range =  (2 * sizeof(GLint));
 	const unsigned int __size_precision =  (sizeof(GLint));
@@ -1832,10 +2199,21 @@
 	*(unsigned int *)(ptr) = __size_range; ptr += 4;
 	*(unsigned int *)(ptr) = __size_precision; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(range, __size_range);
+	if (useChecksum) checksumCalculator->addBuffer(range, __size_range);
 	stream->readback(precision, __size_precision);
+	if (useChecksum) checksumCalculator->addBuffer(precision, __size_precision);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetShaderPrecisionFormat: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetShaderSource_enc(void *self , GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
@@ -1844,6 +2222,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_length = ((length != NULL) ?  (sizeof(GLsizei)) : 0);
 	const unsigned int __size_source =  bufsize;
@@ -1862,10 +2241,23 @@
 	*(unsigned int *)(ptr) = __size_length; ptr += 4;
 	*(unsigned int *)(ptr) = __size_source; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
-	if (length != NULL) stream->readback(length, __size_length);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	if (length != NULL) {
+		stream->readback(length, __size_length);
+		if (useChecksum) checksumCalculator->addBuffer(length, __size_length);
+	}
 	stream->readback(source, __size_source);
+	if (useChecksum) checksumCalculator->addBuffer(source, __size_source);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetShaderSource: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetTexParameterfv_enc(void *self , GLenum target, GLenum pname, GLfloat* params)
@@ -1874,6 +2266,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -1890,9 +2283,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetTexParameterfv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetTexParameteriv_enc(void *self , GLenum target, GLenum pname, GLint* params)
@@ -1901,6 +2304,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLint));
 	 unsigned char *ptr;
@@ -1917,9 +2321,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetTexParameteriv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetUniformfv_enc(void *self , GLuint program, GLint location, GLfloat* params)
@@ -1928,6 +2342,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  glSizeof(glesv2_enc::uniformType(self, program, location));
 	 unsigned char *ptr;
@@ -1944,9 +2359,19 @@
 		memcpy(ptr, &location, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetUniformfv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetUniformiv_enc(void *self , GLuint program, GLint location, GLint* params)
@@ -1955,6 +2380,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  glSizeof(glesv2_enc::uniformType(self, program, location));
 	 unsigned char *ptr;
@@ -1971,9 +2397,19 @@
 		memcpy(ptr, &location, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetUniformiv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 int glGetUniformLocation_enc(void *self , GLuint program, const GLchar* name)
@@ -1982,6 +2418,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_name =  (strlen(name) + 1);
 	 unsigned char *ptr;
@@ -1998,11 +2435,21 @@
 	*(unsigned int *)(ptr) = __size_name; ptr += 4;
 	memcpy(ptr, name, __size_name);ptr += __size_name;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	int retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetUniformLocation: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -2012,6 +2459,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -2028,9 +2476,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetVertexAttribfv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glGetVertexAttribiv_enc(void *self , GLuint index, GLenum pname, GLint* params)
@@ -2039,6 +2497,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLint));
 	 unsigned char *ptr;
@@ -2055,9 +2514,19 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(params, __size_params);
+	if (useChecksum) checksumCalculator->addBuffer(params, __size_params);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetVertexAttribiv: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glHint_enc(void *self , GLenum target, GLenum mode)
@@ -2066,6 +2535,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2080,8 +2550,9 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &mode, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 GLboolean glIsBuffer_enc(void *self , GLuint buffer)
@@ -2090,6 +2561,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2103,11 +2575,21 @@
 
 		memcpy(ptr, &buffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsBuffer: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -2117,6 +2599,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2130,11 +2613,21 @@
 
 		memcpy(ptr, &cap, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsEnabled: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -2144,6 +2637,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2157,11 +2651,21 @@
 
 		memcpy(ptr, &framebuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsFramebuffer: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -2171,6 +2675,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2184,11 +2689,21 @@
 
 		memcpy(ptr, &program, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsProgram: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -2198,6 +2713,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2211,11 +2727,21 @@
 
 		memcpy(ptr, &renderbuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsRenderbuffer: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -2225,6 +2751,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2238,11 +2765,21 @@
 
 		memcpy(ptr, &shader, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsShader: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -2252,6 +2789,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2265,11 +2803,21 @@
 
 		memcpy(ptr, &texture, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsTexture: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -2279,6 +2827,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2292,8 +2841,9 @@
 
 		memcpy(ptr, &width, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glLinkProgram_enc(void *self , GLuint program)
@@ -2302,6 +2852,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2315,8 +2866,9 @@
 
 		memcpy(ptr, &program, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPixelStorei_enc(void *self , GLenum pname, GLint param)
@@ -2325,6 +2877,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2339,8 +2892,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glPolygonOffset_enc(void *self , GLfloat factor, GLfloat units)
@@ -2349,6 +2903,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2363,8 +2918,9 @@
 		memcpy(ptr, &factor, 4); ptr += 4;
 		memcpy(ptr, &units, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glReadPixels_enc(void *self , GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)
@@ -2373,6 +2929,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_pixels =  glesv2_enc::pixelDataSize(self, width, height, format, type, 1);
 	 unsigned char *ptr;
@@ -2393,9 +2950,19 @@
 		memcpy(ptr, &type, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_pixels; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(pixels, __size_pixels);
+	if (useChecksum) checksumCalculator->addBuffer(pixels, __size_pixels);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glReadPixels: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glReleaseShaderCompiler_enc(void *self )
@@ -2404,6 +2971,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2416,8 +2984,9 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glRenderbufferStorage_enc(void *self , GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
@@ -2426,6 +2995,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2442,8 +3012,9 @@
 		memcpy(ptr, &width, 4); ptr += 4;
 		memcpy(ptr, &height, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glSampleCoverage_enc(void *self , GLclampf value, GLboolean invert)
@@ -2452,6 +3023,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2466,8 +3038,9 @@
 		memcpy(ptr, &value, 4); ptr += 4;
 		memcpy(ptr, &invert, 1); ptr += 1;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glScissor_enc(void *self , GLint x, GLint y, GLsizei width, GLsizei height)
@@ -2476,6 +3049,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2492,8 +3066,9 @@
 		memcpy(ptr, &width, 4); ptr += 4;
 		memcpy(ptr, &height, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glStencilFunc_enc(void *self , GLenum func, GLint ref, GLuint mask)
@@ -2502,6 +3077,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2517,8 +3093,9 @@
 		memcpy(ptr, &ref, 4); ptr += 4;
 		memcpy(ptr, &mask, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glStencilFuncSeparate_enc(void *self , GLenum face, GLenum func, GLint ref, GLuint mask)
@@ -2527,6 +3104,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2543,8 +3121,9 @@
 		memcpy(ptr, &ref, 4); ptr += 4;
 		memcpy(ptr, &mask, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glStencilMask_enc(void *self , GLuint mask)
@@ -2553,6 +3132,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2566,8 +3146,9 @@
 
 		memcpy(ptr, &mask, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glStencilMaskSeparate_enc(void *self , GLenum face, GLuint mask)
@@ -2576,6 +3157,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2590,8 +3172,9 @@
 		memcpy(ptr, &face, 4); ptr += 4;
 		memcpy(ptr, &mask, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glStencilOp_enc(void *self , GLenum fail, GLenum zfail, GLenum zpass)
@@ -2600,6 +3183,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2615,8 +3199,9 @@
 		memcpy(ptr, &zfail, 4); ptr += 4;
 		memcpy(ptr, &zpass, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glStencilOpSeparate_enc(void *self , GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
@@ -2625,6 +3210,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2641,8 +3227,9 @@
 		memcpy(ptr, &zfail, 4); ptr += 4;
 		memcpy(ptr, &zpass, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexImage2D_enc(void *self , GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
@@ -2651,6 +3238,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_pixels = ((pixels != NULL) ?  glesv2_enc::pixelDataSize(self, width, height, format, type, 0) : 0);
 	 unsigned char *ptr;
@@ -2672,16 +3260,17 @@
 		memcpy(ptr, &format, 4); ptr += 4;
 		memcpy(ptr, &type, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
 	stream->flush();
 	stream->writeFully(&__size_pixels,4);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(&__size_pixels,4);
+	if (useChecksum) checksumCalculator->addBuffer(&__size_pixels,4);
 	if (pixels != NULL) {
 		stream->writeFully(pixels, __size_pixels);
-		if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(pixels, __size_pixels);
+		if (useChecksum) checksumCalculator->addBuffer(pixels, __size_pixels);
 	}
 	buf = stream->alloc(checksumSize);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(buf, checksumSize);
+	if (useChecksum) checksumCalculator->writeChecksum(buf, checksumSize);
+
 }
 
 void glTexParameterf_enc(void *self , GLenum target, GLenum pname, GLfloat param)
@@ -2690,6 +3279,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2705,8 +3295,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexParameterfv_enc(void *self , GLenum target, GLenum pname, const GLfloat* params)
@@ -2715,6 +3306,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -2732,8 +3324,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexParameteri_enc(void *self , GLenum target, GLenum pname, GLint param)
@@ -2742,6 +3335,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2757,8 +3351,9 @@
 		memcpy(ptr, &pname, 4); ptr += 4;
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexParameteriv_enc(void *self , GLenum target, GLenum pname, const GLint* params)
@@ -2767,6 +3362,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_params =  (glUtilsParamSize(pname) * sizeof(GLint));
 	 unsigned char *ptr;
@@ -2784,8 +3380,9 @@
 	*(unsigned int *)(ptr) = __size_params; ptr += 4;
 	memcpy(ptr, params, __size_params);ptr += __size_params;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glTexSubImage2D_enc(void *self , GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels)
@@ -2794,6 +3391,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_pixels = ((pixels != NULL) ?  glesv2_enc::pixelDataSize(self, width, height, format, type, 0) : 0);
 	 unsigned char *ptr;
@@ -2815,16 +3413,17 @@
 		memcpy(ptr, &format, 4); ptr += 4;
 		memcpy(ptr, &type, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
 	stream->flush();
 	stream->writeFully(&__size_pixels,4);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(&__size_pixels,4);
+	if (useChecksum) checksumCalculator->addBuffer(&__size_pixels,4);
 	if (pixels != NULL) {
 		stream->writeFully(pixels, __size_pixels);
-		if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(pixels, __size_pixels);
+		if (useChecksum) checksumCalculator->addBuffer(pixels, __size_pixels);
 	}
 	buf = stream->alloc(checksumSize);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(buf, checksumSize);
+	if (useChecksum) checksumCalculator->writeChecksum(buf, checksumSize);
+
 }
 
 void glUniform1f_enc(void *self , GLint location, GLfloat x)
@@ -2833,6 +3432,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2847,8 +3447,9 @@
 		memcpy(ptr, &location, 4); ptr += 4;
 		memcpy(ptr, &x, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform1fv_enc(void *self , GLint location, GLsizei count, const GLfloat* v)
@@ -2857,6 +3458,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_v =  (count * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -2874,8 +3476,9 @@
 	*(unsigned int *)(ptr) = __size_v; ptr += 4;
 	memcpy(ptr, v, __size_v);ptr += __size_v;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform1i_enc(void *self , GLint location, GLint x)
@@ -2884,6 +3487,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2898,8 +3502,9 @@
 		memcpy(ptr, &location, 4); ptr += 4;
 		memcpy(ptr, &x, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform1iv_enc(void *self , GLint location, GLsizei count, const GLint* v)
@@ -2908,6 +3513,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_v =  (count * sizeof(GLint));
 	 unsigned char *ptr;
@@ -2925,8 +3531,9 @@
 	*(unsigned int *)(ptr) = __size_v; ptr += 4;
 	memcpy(ptr, v, __size_v);ptr += __size_v;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform2f_enc(void *self , GLint location, GLfloat x, GLfloat y)
@@ -2935,6 +3542,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -2950,8 +3558,9 @@
 		memcpy(ptr, &x, 4); ptr += 4;
 		memcpy(ptr, &y, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform2fv_enc(void *self , GLint location, GLsizei count, const GLfloat* v)
@@ -2960,6 +3569,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_v =  (count * 2 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -2977,8 +3587,9 @@
 	*(unsigned int *)(ptr) = __size_v; ptr += 4;
 	memcpy(ptr, v, __size_v);ptr += __size_v;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform2i_enc(void *self , GLint location, GLint x, GLint y)
@@ -2987,6 +3598,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3002,8 +3614,9 @@
 		memcpy(ptr, &x, 4); ptr += 4;
 		memcpy(ptr, &y, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform2iv_enc(void *self , GLint location, GLsizei count, const GLint* v)
@@ -3012,6 +3625,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_v =  (count * 2 * sizeof(GLint));
 	 unsigned char *ptr;
@@ -3029,8 +3643,9 @@
 	*(unsigned int *)(ptr) = __size_v; ptr += 4;
 	memcpy(ptr, v, __size_v);ptr += __size_v;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform3f_enc(void *self , GLint location, GLfloat x, GLfloat y, GLfloat z)
@@ -3039,6 +3654,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3055,8 +3671,9 @@
 		memcpy(ptr, &y, 4); ptr += 4;
 		memcpy(ptr, &z, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform3fv_enc(void *self , GLint location, GLsizei count, const GLfloat* v)
@@ -3065,6 +3682,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_v =  (count * 3 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -3082,8 +3700,9 @@
 	*(unsigned int *)(ptr) = __size_v; ptr += 4;
 	memcpy(ptr, v, __size_v);ptr += __size_v;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform3i_enc(void *self , GLint location, GLint x, GLint y, GLint z)
@@ -3092,6 +3711,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3108,8 +3728,9 @@
 		memcpy(ptr, &y, 4); ptr += 4;
 		memcpy(ptr, &z, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform3iv_enc(void *self , GLint location, GLsizei count, const GLint* v)
@@ -3118,6 +3739,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_v =  (3 * count * sizeof(GLint));
 	 unsigned char *ptr;
@@ -3135,8 +3757,9 @@
 	*(unsigned int *)(ptr) = __size_v; ptr += 4;
 	memcpy(ptr, v, __size_v);ptr += __size_v;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform4f_enc(void *self , GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
@@ -3145,6 +3768,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3162,8 +3786,9 @@
 		memcpy(ptr, &z, 4); ptr += 4;
 		memcpy(ptr, &w, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform4fv_enc(void *self , GLint location, GLsizei count, const GLfloat* v)
@@ -3172,6 +3797,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_v =  (4 * count * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -3189,8 +3815,9 @@
 	*(unsigned int *)(ptr) = __size_v; ptr += 4;
 	memcpy(ptr, v, __size_v);ptr += __size_v;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform4i_enc(void *self , GLint location, GLint x, GLint y, GLint z, GLint w)
@@ -3199,6 +3826,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3216,8 +3844,9 @@
 		memcpy(ptr, &z, 4); ptr += 4;
 		memcpy(ptr, &w, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniform4iv_enc(void *self , GLint location, GLsizei count, const GLint* v)
@@ -3226,6 +3855,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_v =  (4 * count * sizeof(GLint));
 	 unsigned char *ptr;
@@ -3243,8 +3873,9 @@
 	*(unsigned int *)(ptr) = __size_v; ptr += 4;
 	memcpy(ptr, v, __size_v);ptr += __size_v;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniformMatrix2fv_enc(void *self , GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
@@ -3253,6 +3884,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_value =  (count * 4 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -3271,8 +3903,9 @@
 	*(unsigned int *)(ptr) = __size_value; ptr += 4;
 	memcpy(ptr, value, __size_value);ptr += __size_value;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniformMatrix3fv_enc(void *self , GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
@@ -3281,6 +3914,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_value =  (count * 9 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -3299,8 +3933,9 @@
 	*(unsigned int *)(ptr) = __size_value; ptr += 4;
 	memcpy(ptr, value, __size_value);ptr += __size_value;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUniformMatrix4fv_enc(void *self , GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
@@ -3309,6 +3944,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_value =  (count * 16 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -3327,8 +3963,9 @@
 	*(unsigned int *)(ptr) = __size_value; ptr += 4;
 	memcpy(ptr, value, __size_value);ptr += __size_value;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glUseProgram_enc(void *self , GLuint program)
@@ -3337,6 +3974,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3350,8 +3988,9 @@
 
 		memcpy(ptr, &program, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glValidateProgram_enc(void *self , GLuint program)
@@ -3360,6 +3999,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3373,8 +4013,9 @@
 
 		memcpy(ptr, &program, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glVertexAttrib1f_enc(void *self , GLuint indx, GLfloat x)
@@ -3383,6 +4024,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3397,8 +4039,9 @@
 		memcpy(ptr, &indx, 4); ptr += 4;
 		memcpy(ptr, &x, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glVertexAttrib1fv_enc(void *self , GLuint indx, const GLfloat* values)
@@ -3407,6 +4050,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_values =  (sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -3423,8 +4067,9 @@
 	*(unsigned int *)(ptr) = __size_values; ptr += 4;
 	memcpy(ptr, values, __size_values);ptr += __size_values;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glVertexAttrib2f_enc(void *self , GLuint indx, GLfloat x, GLfloat y)
@@ -3433,6 +4078,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3448,8 +4094,9 @@
 		memcpy(ptr, &x, 4); ptr += 4;
 		memcpy(ptr, &y, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glVertexAttrib2fv_enc(void *self , GLuint indx, const GLfloat* values)
@@ -3458,6 +4105,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_values =  (2 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -3474,8 +4122,9 @@
 	*(unsigned int *)(ptr) = __size_values; ptr += 4;
 	memcpy(ptr, values, __size_values);ptr += __size_values;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glVertexAttrib3f_enc(void *self , GLuint indx, GLfloat x, GLfloat y, GLfloat z)
@@ -3484,6 +4133,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3500,8 +4150,9 @@
 		memcpy(ptr, &y, 4); ptr += 4;
 		memcpy(ptr, &z, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glVertexAttrib3fv_enc(void *self , GLuint indx, const GLfloat* values)
@@ -3510,6 +4161,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_values =  (3 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -3526,8 +4178,9 @@
 	*(unsigned int *)(ptr) = __size_values; ptr += 4;
 	memcpy(ptr, values, __size_values);ptr += __size_values;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glVertexAttrib4f_enc(void *self , GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
@@ -3536,6 +4189,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3553,8 +4207,9 @@
 		memcpy(ptr, &z, 4); ptr += 4;
 		memcpy(ptr, &w, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glVertexAttrib4fv_enc(void *self , GLuint indx, const GLfloat* values)
@@ -3563,6 +4218,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_values =  (4 * sizeof(GLfloat));
 	 unsigned char *ptr;
@@ -3579,8 +4235,9 @@
 	*(unsigned int *)(ptr) = __size_values; ptr += 4;
 	memcpy(ptr, values, __size_values);ptr += __size_values;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glViewport_enc(void *self , GLint x, GLint y, GLsizei width, GLsizei height)
@@ -3589,6 +4246,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3605,8 +4263,9 @@
 		memcpy(ptr, &width, 4); ptr += 4;
 		memcpy(ptr, &height, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glEGLImageTargetTexture2DOES_enc(void *self , GLenum target, GLeglImageOES image)
@@ -3615,6 +4274,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3629,8 +4289,9 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &image, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glEGLImageTargetRenderbufferStorageOES_enc(void *self , GLenum target, GLeglImageOES image)
@@ -3639,6 +4300,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3653,8 +4315,9 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &image, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 GLboolean glUnmapBufferOES_enc(void *self , GLenum target)
@@ -3663,6 +4326,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3676,11 +4340,21 @@
 
 		memcpy(ptr, &target, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glUnmapBufferOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -3690,6 +4364,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_pixels = ((pixels != NULL) ?  glesv2_enc::pixelDataSize3D(self, width, height, depth, format, type, 0) : 0);
 	 unsigned char *ptr;
@@ -3712,16 +4387,17 @@
 		memcpy(ptr, &format, 4); ptr += 4;
 		memcpy(ptr, &type, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
 	stream->flush();
 	stream->writeFully(&__size_pixels,4);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(&__size_pixels,4);
+	if (useChecksum) checksumCalculator->addBuffer(&__size_pixels,4);
 	if (pixels != NULL) {
 		stream->writeFully(pixels, __size_pixels);
-		if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(pixels, __size_pixels);
+		if (useChecksum) checksumCalculator->addBuffer(pixels, __size_pixels);
 	}
 	buf = stream->alloc(checksumSize);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(buf, checksumSize);
+	if (useChecksum) checksumCalculator->writeChecksum(buf, checksumSize);
+
 }
 
 void glTexSubImage3DOES_enc(void *self , GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels)
@@ -3730,6 +4406,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_pixels = ((pixels != NULL) ?  glesv2_enc::pixelDataSize3D(self, width, height, depth, format, type, 0) : 0);
 	 unsigned char *ptr;
@@ -3753,16 +4430,17 @@
 		memcpy(ptr, &format, 4); ptr += 4;
 		memcpy(ptr, &type, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
 	stream->flush();
 	stream->writeFully(&__size_pixels,4);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(&__size_pixels,4);
+	if (useChecksum) checksumCalculator->addBuffer(&__size_pixels,4);
 	if (pixels != NULL) {
 		stream->writeFully(pixels, __size_pixels);
-		if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(pixels, __size_pixels);
+		if (useChecksum) checksumCalculator->addBuffer(pixels, __size_pixels);
 	}
 	buf = stream->alloc(checksumSize);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(buf, checksumSize);
+	if (useChecksum) checksumCalculator->writeChecksum(buf, checksumSize);
+
 }
 
 void glCopyTexSubImage3DOES_enc(void *self , GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
@@ -3771,6 +4449,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3792,8 +4471,9 @@
 		memcpy(ptr, &width, 4); ptr += 4;
 		memcpy(ptr, &height, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glCompressedTexImage3DOES_enc(void *self , GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
@@ -3802,6 +4482,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data = ((data != NULL) ?  imageSize : 0);
 	 unsigned char *ptr;
@@ -3823,16 +4504,17 @@
 		memcpy(ptr, &border, 4); ptr += 4;
 		memcpy(ptr, &imageSize, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
 	stream->flush();
 	stream->writeFully(&__size_data,4);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(&__size_data,4);
+	if (useChecksum) checksumCalculator->addBuffer(&__size_data,4);
 	if (data != NULL) {
 		stream->writeFully(data, __size_data);
-		if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(data, __size_data);
+		if (useChecksum) checksumCalculator->addBuffer(data, __size_data);
 	}
 	buf = stream->alloc(checksumSize);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(buf, checksumSize);
+	if (useChecksum) checksumCalculator->writeChecksum(buf, checksumSize);
+
 }
 
 void glCompressedTexSubImage3DOES_enc(void *self , GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
@@ -3841,6 +4523,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data = ((data != NULL) ?  imageSize : 0);
 	 unsigned char *ptr;
@@ -3864,16 +4547,17 @@
 		memcpy(ptr, &format, 4); ptr += 4;
 		memcpy(ptr, &imageSize, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
 	stream->flush();
 	stream->writeFully(&__size_data,4);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(&__size_data,4);
+	if (useChecksum) checksumCalculator->addBuffer(&__size_data,4);
 	if (data != NULL) {
 		stream->writeFully(data, __size_data);
-		if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(data, __size_data);
+		if (useChecksum) checksumCalculator->addBuffer(data, __size_data);
 	}
 	buf = stream->alloc(checksumSize);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(buf, checksumSize);
+	if (useChecksum) checksumCalculator->writeChecksum(buf, checksumSize);
+
 }
 
 void glFramebufferTexture3DOES_enc(void *self , GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
@@ -3882,6 +4566,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3900,8 +4585,9 @@
 		memcpy(ptr, &level, 4); ptr += 4;
 		memcpy(ptr, &zoffset, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glBindVertexArrayOES_enc(void *self , GLuint array)
@@ -3910,6 +4596,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3923,8 +4610,9 @@
 
 		memcpy(ptr, &array, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDeleteVertexArraysOES_enc(void *self , GLsizei n, const GLuint* arrays)
@@ -3933,6 +4621,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_arrays =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -3949,8 +4638,9 @@
 	*(unsigned int *)(ptr) = __size_arrays; ptr += 4;
 	memcpy(ptr, arrays, __size_arrays);ptr += __size_arrays;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGenVertexArraysOES_enc(void *self , GLsizei n, GLuint* arrays)
@@ -3959,6 +4649,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_arrays =  (n * sizeof(GLuint));
 	 unsigned char *ptr;
@@ -3974,9 +4665,19 @@
 		memcpy(ptr, &n, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_arrays; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(arrays, __size_arrays);
+	if (useChecksum) checksumCalculator->addBuffer(arrays, __size_arrays);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGenVertexArraysOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 GLboolean glIsVertexArrayOES_enc(void *self , GLuint array)
@@ -3985,6 +4686,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -3998,11 +4700,21 @@
 
 		memcpy(ptr, &array, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLboolean retval;
 	stream->readback(&retval, 1);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 1);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glIsVertexArrayOES: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -4012,6 +4724,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_attachments =  (numAttachments * sizeof(GLenum));
 	 unsigned char *ptr;
@@ -4029,8 +4742,9 @@
 	*(unsigned int *)(ptr) = __size_attachments; ptr += 4;
 	memcpy(ptr, attachments, __size_attachments);ptr += __size_attachments;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glVertexAttribPointerData_enc(void *self , GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, void* data, GLuint datalen)
@@ -4039,6 +4753,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data =  datalen;
 	 unsigned char *ptr;
@@ -4060,8 +4775,9 @@
 	 glUtilsPackPointerData((unsigned char *)ptr, (unsigned char *)data, size, type, stride, datalen);ptr += __size_data;
 		memcpy(ptr, &datalen, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glVertexAttribPointerOffset_enc(void *self , GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint offset)
@@ -4070,6 +4786,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4088,8 +4805,9 @@
 		memcpy(ptr, &stride, 4); ptr += 4;
 		memcpy(ptr, &offset, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDrawElementsOffset_enc(void *self , GLenum mode, GLsizei count, GLenum type, GLuint offset)
@@ -4098,6 +4816,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4114,8 +4833,9 @@
 		memcpy(ptr, &type, 4); ptr += 4;
 		memcpy(ptr, &offset, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glDrawElementsData_enc(void *self , GLenum mode, GLsizei count, GLenum type, void* data, GLuint datalen)
@@ -4124,6 +4844,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_data =  datalen;
 	 unsigned char *ptr;
@@ -4143,8 +4864,9 @@
 	memcpy(ptr, data, __size_data);ptr += __size_data;
 		memcpy(ptr, &datalen, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void glGetCompressedTextureFormats_enc(void *self , int count, GLint* formats)
@@ -4153,6 +4875,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_formats =  (count * sizeof(GLint));
 	 unsigned char *ptr;
@@ -4168,9 +4891,19 @@
 		memcpy(ptr, &count, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_formats; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(formats, __size_formats);
+	if (useChecksum) checksumCalculator->addBuffer(formats, __size_formats);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glGetCompressedTextureFormats: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 void glShaderString_enc(void *self , GLuint shader, const GLchar* string, GLsizei len)
@@ -4179,6 +4912,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_string =  len;
 	 unsigned char *ptr;
@@ -4196,8 +4930,9 @@
 	memcpy(ptr, string, __size_string);ptr += __size_string;
 		memcpy(ptr, &len, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 int glFinishRoundTrip_enc(void *self )
@@ -4206,6 +4941,7 @@
 	gl2_encoder_context_t *ctx = (gl2_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -4218,11 +4954,21 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	int retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("glFinishRoundTrip: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
diff --git a/opengl/system/renderControl_enc/renderControl_enc.cpp b/opengl/system/renderControl_enc/renderControl_enc.cpp
index 54f1a6d..2021513 100644
--- a/opengl/system/renderControl_enc/renderControl_enc.cpp
+++ b/opengl/system/renderControl_enc/renderControl_enc.cpp
@@ -2,6 +2,7 @@
 // generated by 'emugen'
 
 
+#include <memory>
 #include <string.h>
 #include "renderControl_opcodes.h"
 
@@ -23,6 +24,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -35,11 +37,21 @@
 	memcpy(ptr, &totalSize, 4);  ptr += 4;
 
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	GLint retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcGetRendererVersion: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -49,6 +61,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_major =  sizeof(EGLint);
 	const unsigned int __size_minor =  sizeof(EGLint);
@@ -65,13 +78,25 @@
 	*(unsigned int *)(ptr) = __size_major; ptr += 4;
 	*(unsigned int *)(ptr) = __size_minor; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(major, __size_major);
+	if (useChecksum) checksumCalculator->addBuffer(major, __size_major);
 	stream->readback(minor, __size_minor);
+	if (useChecksum) checksumCalculator->addBuffer(minor, __size_minor);
 
 	EGLint retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcGetEGLVersion: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -81,6 +106,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_buffer =  bufferSize;
 	 unsigned char *ptr;
@@ -97,12 +123,23 @@
 	*(unsigned int *)(ptr) = __size_buffer; ptr += 4;
 		memcpy(ptr, &bufferSize, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(buffer, __size_buffer);
+	if (useChecksum) checksumCalculator->addBuffer(buffer, __size_buffer);
 
 	EGLint retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcQueryEGLString: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -112,6 +149,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_buffer =  bufferSize;
 	 unsigned char *ptr;
@@ -128,12 +166,23 @@
 	*(unsigned int *)(ptr) = __size_buffer; ptr += 4;
 		memcpy(ptr, &bufferSize, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(buffer, __size_buffer);
+	if (useChecksum) checksumCalculator->addBuffer(buffer, __size_buffer);
 
 	EGLint retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcGetGLString: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -143,6 +192,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_numAttribs =  sizeof(uint32_t);
 	 unsigned char *ptr;
@@ -157,12 +207,23 @@
 
 	*(unsigned int *)(ptr) = __size_numAttribs; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(numAttribs, __size_numAttribs);
+	if (useChecksum) checksumCalculator->addBuffer(numAttribs, __size_numAttribs);
 
 	EGLint retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcGetNumConfigs: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -172,6 +233,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_buffer =  bufSize;
 	 unsigned char *ptr;
@@ -187,12 +249,23 @@
 		memcpy(ptr, &bufSize, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_buffer; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(buffer, __size_buffer);
+	if (useChecksum) checksumCalculator->addBuffer(buffer, __size_buffer);
 
 	EGLint retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcGetConfigs: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -202,6 +275,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_attribs =  attribs_size;
 	const unsigned int __size_configs = ((configs != NULL) ?  configs_size*sizeof(uint32_t) : 0);
@@ -221,12 +295,25 @@
 	*(unsigned int *)(ptr) = __size_configs; ptr += 4;
 		memcpy(ptr, &configs_size, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
-	if (configs != NULL) stream->readback(configs, __size_configs);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
+	if (configs != NULL) {
+		stream->readback(configs, __size_configs);
+		if (useChecksum) checksumCalculator->addBuffer(configs, __size_configs);
+	}
 
 	EGLint retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcChooseConfig: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -236,6 +323,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -249,11 +337,21 @@
 
 		memcpy(ptr, &param, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	EGLint retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcGetFBParam: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -263,6 +361,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -278,11 +377,21 @@
 		memcpy(ptr, &share, 4); ptr += 4;
 		memcpy(ptr, &glVersion, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	uint32_t retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcCreateContext: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -292,6 +401,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -305,8 +415,9 @@
 
 		memcpy(ptr, &context, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 uint32_t rcCreateWindowSurface_enc(void *self , uint32_t config, uint32_t width, uint32_t height)
@@ -315,6 +426,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -330,11 +442,21 @@
 		memcpy(ptr, &width, 4); ptr += 4;
 		memcpy(ptr, &height, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	uint32_t retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcCreateWindowSurface: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -344,6 +466,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -357,8 +480,9 @@
 
 		memcpy(ptr, &windowSurface, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 uint32_t rcCreateColorBuffer_enc(void *self , uint32_t width, uint32_t height, GLenum internalFormat)
@@ -367,6 +491,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -382,11 +507,21 @@
 		memcpy(ptr, &height, 4); ptr += 4;
 		memcpy(ptr, &internalFormat, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	uint32_t retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcCreateColorBuffer: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -396,6 +531,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -409,8 +545,9 @@
 
 		memcpy(ptr, &colorbuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void rcCloseColorBuffer_enc(void *self , uint32_t colorbuffer)
@@ -419,6 +556,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -432,8 +570,9 @@
 
 		memcpy(ptr, &colorbuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->flush();
 }
 
@@ -443,6 +582,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -457,8 +597,9 @@
 		memcpy(ptr, &windowSurface, 4); ptr += 4;
 		memcpy(ptr, &colorBuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 int rcFlushWindowColorBuffer_enc(void *self , uint32_t windowSurface)
@@ -467,6 +608,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -480,11 +622,21 @@
 
 		memcpy(ptr, &windowSurface, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	int retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcFlushWindowColorBuffer: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -494,6 +646,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -509,11 +662,21 @@
 		memcpy(ptr, &drawSurf, 4); ptr += 4;
 		memcpy(ptr, &readSurf, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	EGLint retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcMakeCurrent: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -523,6 +686,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -536,8 +700,9 @@
 
 		memcpy(ptr, &colorBuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void rcFBSetSwapInterval_enc(void *self , EGLint interval)
@@ -546,6 +711,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -559,8 +725,9 @@
 
 		memcpy(ptr, &interval, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void rcBindTexture_enc(void *self , uint32_t colorBuffer)
@@ -569,6 +736,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -582,8 +750,9 @@
 
 		memcpy(ptr, &colorBuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 void rcBindRenderbuffer_enc(void *self , uint32_t colorBuffer)
@@ -592,6 +761,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -605,8 +775,9 @@
 
 		memcpy(ptr, &colorBuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 EGLint rcColorBufferCacheFlush_enc(void *self , uint32_t colorbuffer, EGLint postCount, int forRead)
@@ -615,6 +786,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -630,11 +802,21 @@
 		memcpy(ptr, &postCount, 4); ptr += 4;
 		memcpy(ptr, &forRead, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	EGLint retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcColorBufferCacheFlush: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -644,6 +826,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_pixels =  (((glUtilsPixelBitSize(format, type) * width) >> 3) * height);
 	 unsigned char *ptr;
@@ -665,9 +848,19 @@
 		memcpy(ptr, &type, 4); ptr += 4;
 	*(unsigned int *)(ptr) = __size_pixels; ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 	stream->readback(pixels, __size_pixels);
+	if (useChecksum) checksumCalculator->addBuffer(pixels, __size_pixels);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcReadColorBuffer: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 }
 
 int rcUpdateColorBuffer_enc(void *self , uint32_t colorbuffer, GLint x, GLint y, GLint width, GLint height, GLenum format, GLenum type, void* pixels)
@@ -676,6 +869,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	const unsigned int __size_pixels =  (((glUtilsPixelBitSize(format, type) * width) >> 3) * height);
 	 unsigned char *ptr;
@@ -696,17 +890,27 @@
 		memcpy(ptr, &format, 4); ptr += 4;
 		memcpy(ptr, &type, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
 	stream->flush();
 	stream->writeFully(&__size_pixels,4);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(&__size_pixels,4);
+	if (useChecksum) checksumCalculator->addBuffer(&__size_pixels,4);
 		stream->writeFully(pixels, __size_pixels);
-		if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(pixels, __size_pixels);
+		if (useChecksum) checksumCalculator->addBuffer(pixels, __size_pixels);
 	buf = stream->alloc(checksumSize);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(buf, checksumSize);
+	if (useChecksum) checksumCalculator->writeChecksum(buf, checksumSize);
+
 
 	int retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcUpdateColorBuffer: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -716,6 +920,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -729,11 +934,21 @@
 
 		memcpy(ptr, &colorbuffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	int retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcOpenColorBuffer2: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -743,6 +958,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -758,11 +974,21 @@
 		memcpy(ptr, &target, 4); ptr += 4;
 		memcpy(ptr, &buffer, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	uint32_t retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcCreateClientImage: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -772,6 +998,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -785,11 +1012,21 @@
 
 		memcpy(ptr, &image, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 
 	int retval;
 	stream->readback(&retval, 4);
+	if (useChecksum) checksumCalculator->addBuffer(&retval, 4);
+	if (useChecksum) {
+		std::unique_ptr<unsigned char[]> checksumBuf(new unsigned char[checksumSize]);
+		stream->readback(checksumBuf.get(), checksumSize);
+		if (!checksumCalculator->validate(checksumBuf.get(), checksumSize)) {
+			ALOGE("rcDestroyClientImage: GL communication error, please report this issue to b.android.com.\n");
+			abort();
+		}
+	}
 	return retval;
 }
 
@@ -799,6 +1036,7 @@
 	renderControl_encoder_context_t *ctx = (renderControl_encoder_context_t *)self;
 	IOStream *stream = ctx->m_stream;
 	ChecksumCalculator *checksumCalculator = ctx->m_checksumCalculator;
+	bool useChecksum = checksumCalculator->getVersion() > 0;
 
 	 unsigned char *ptr;
 	 unsigned char *buf;
@@ -813,8 +1051,9 @@
 		memcpy(ptr, &newProtocol, 4); ptr += 4;
 		memcpy(ptr, &reserved, 4); ptr += 4;
 
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->addBuffer(buf, ptr-buf);
-	if (checksumCalculator->getVersion() > 0) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+	if (useChecksum) checksumCalculator->addBuffer(buf, ptr-buf);
+	if (useChecksum) checksumCalculator->writeChecksum(ptr, checksumSize); ptr += checksumSize;
+
 }
 
 }  // namespace